diff --git a/404.html b/404.html
index 11ea084..dd4cb15 100644
--- a/404.html
+++ b/404.html
@@ -32,12 +32,12 @@
       }
     </script>
     <meta property="og:url" content="https://pleshevski.ru/404.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":""}</script><title>Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-Bx7ih_OI.css" as="style"><link rel="stylesheet" href="/assets/style-Bx7ih_OI.css">
-    <link rel="modulepreload" href="/assets/app-C1Pl5wYU.js"><link rel="modulepreload" href="/assets/404.html-B7Rc-wnV.js">
-    <link rel="prefetch" href="/assets/index.html-CFL_msbV.js" as="script"><link rel="prefetch" href="/assets/works.html-DdmH6Pwy.js" as="script"><link rel="prefetch" href="/assets/index.html-DuNptnFv.js" as="script"><link rel="prefetch" href="/assets/works.html-wSGj1IPW.js" as="script">
+    <link rel="preload" href="/assets/style-CGM4yktK.css" as="style"><link rel="stylesheet" href="/assets/style-CGM4yktK.css">
+    <link rel="modulepreload" href="/assets/app-CjizGj8p.js"><link rel="modulepreload" href="/assets/404.html-DsBiW9Ow.js">
+    <link rel="prefetch" href="/assets/index.html-gDP15nKv.js" as="script"><link rel="prefetch" href="/assets/works.html-Dmdhrt6x.js" as="script"><link rel="prefetch" href="/assets/index.html-DuKevBia.js" as="script"><link rel="prefetch" href="/assets/works.html-MtxAU7JF.js" as="script">
   </head>
   <body>
-    <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-9cd7902c><main class="page" data-v-9cd7902c><div vp-content data-v-9cd7902c><h1 data-v-9cd7902c>404</h1><blockquote data-v-9cd7902c>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-9cd7902c>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-C1Pl5wYU.js" defer></script>
+    <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-0b944fad><main class="page" data-v-0b944fad><div vp-content data-v-0b944fad><h1 data-v-0b944fad>404</h1><blockquote data-v-0b944fad>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-0b944fad>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
+    <script type="module" src="/assets/app-CjizGj8p.js" defer></script>
   </body>
 </html>
diff --git a/assets/404.html-B7Rc-wnV.js b/assets/404.html-DsBiW9Ow.js
similarity index 91%
rename from assets/404.html-B7Rc-wnV.js
rename to assets/404.html-DsBiW9Ow.js
index 8cac35e..869205a 100644
--- a/assets/404.html-B7Rc-wnV.js
+++ b/assets/404.html-DsBiW9Ow.js
@@ -1 +1 @@
-import{_ as e,c as o,a,o as n}from"./app-C1Pl5wYU.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
+import{_ as e,c as o,a,o as n}from"./app-CjizGj8p.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
diff --git a/assets/app-C1Pl5wYU.js b/assets/app-CjizGj8p.js
similarity index 77%
rename from assets/app-C1Pl5wYU.js
rename to assets/app-CjizGj8p.js
index b0d1500..9df0440 100644
--- a/assets/app-C1Pl5wYU.js
+++ b/assets/app-CjizGj8p.js
@@ -15,14 +15,14 @@
 * @vue/runtime-dom v3.5.13
 * (c) 2018-present Yuxi (Evan) You and Vue contributors
 * @license MIT
-**/let Wo;const ni=typeof window<"u"&&window.trustedTypes;if(ni)try{Wo=ni.createPolicy("vue",{createHTML:e=>e})}catch{}const da=Wo?e=>Wo.createHTML(e):e=>e,cf="http://www.w3.org/2000/svg",uf="http://www.w3.org/1998/Math/MathML",Ct=typeof document<"u"?document:null,ri=Ct&&Ct.createElement("template"),ff={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ct.createElementNS(cf,e):t==="mathml"?Ct.createElementNS(uf,e):n?Ct.createElement(e,{is:n}):Ct.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ri.innerHTML=da(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=ri.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$t="transition",$n="animation",or=Symbol("_vtc"),pa={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},df=Ne({},Ml,pa),pf=e=>(e.displayName="Transition",e.props=df,e),hs=pf((e,{slots:t})=>ve(tu,hf(e),t)),Qt=(e,t=[])=>{ee(e)?e.forEach(n=>n(...t)):e&&e(...t)},oi=e=>e?ee(e)?e.some(t=>t.length>1):e.length>1:!1;function hf(e){const t={};for(const C in e)C in pa||(t[C]=e[C]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=gf(o),_=m&&m[0],w=m&&m[1],{onBeforeEnter:E,onEnter:S,onEnterCancelled:v,onLeave:b,onLeaveCancelled:$,onBeforeAppear:q=E,onAppear:O=S,onAppearCancelled:Y=v}=t,I=(C,F,se,me)=>{C._enterCancelled=me,Xt(C,F?u:l),Xt(C,F?c:i),se&&se()},T=(C,F)=>{C._isLeaving=!1,Xt(C,f),Xt(C,h),Xt(C,p),F&&F()},L=C=>(F,se)=>{const me=C?O:S,G=()=>I(F,C,se);Qt(me,[F,G]),si(()=>{Xt(F,C?a:s),wt(F,C?u:l),oi(me)||ii(F,r,_,G)})};return Ne(t,{onBeforeEnter(C){Qt(E,[C]),wt(C,s),wt(C,i)},onBeforeAppear(C){Qt(q,[C]),wt(C,a),wt(C,c)},onEnter:L(!1),onAppear:L(!0),onLeave(C,F){C._isLeaving=!0;const se=()=>T(C,F);wt(C,f),C._enterCancelled?(wt(C,p),ci()):(ci(),wt(C,p)),si(()=>{C._isLeaving&&(Xt(C,f),wt(C,h),oi(b)||ii(C,r,w,se))}),Qt(b,[C,se])},onEnterCancelled(C){I(C,!1,void 0,!0),Qt(v,[C])},onAppearCancelled(C){I(C,!0,void 0,!0),Qt(Y,[C])},onLeaveCancelled(C){T(C),Qt($,[C])}})}function gf(e){if(e==null)return null;if(Ee(e))return[Eo(e.enter),Eo(e.leave)];{const t=Eo(e);return[t,t]}}function Eo(e){return dc(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[or]||(e[or]=new Set)).add(t)}function Xt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[or];n&&(n.delete(t),n.size||(e[or]=void 0))}function si(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let vf=0;function ii(e,t,n,r){const o=e._endId=++vf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=mf(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,p),s()},p=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,p)}function mf(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||"").split(", "),o=r(`${$t}Delay`),s=r(`${$t}Duration`),i=li(o,s),l=r(`${$n}Delay`),a=r(`${$n}Duration`),c=li(l,a);let u=null,f=0,p=0;t===$t?i>0&&(u=$t,f=i,p=s.length):t===$n?c>0&&(u=$n,f=c,p=a.length):(f=Math.max(i,c),u=f>0?i>c?$t:$n:null,p=u?u===$t?s.length:a.length:0);const h=u===$t&&/\b(transform|all)(,|$)/.test(r(`${$t}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:h}}function li(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>ai(n)+ai(e[r])))}function ai(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ci(){return document.body.offsetHeight}function _f(e,t,n){const r=e[or];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Kr=Symbol("_vod"),ha=Symbol("_vsh"),qr={beforeMount(e,{value:t},{transition:n}){e[Kr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Nn(e,!0),r.enter(e)):r.leave(e,()=>{Nn(e,!1)}):Nn(e,t))},beforeUnmount(e,{value:t}){Nn(e,t)}};function Nn(e,t){e.style.display=t?e[Kr]:"none",e[ha]=!t}const bf=Symbol(""),yf=/(^|;)\s*display\s*:/;function Sf(e,t,n){const r=e.style,o=Oe(n);let s=!1;if(n&&!o){if(t)if(Oe(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ir(r,l,"")}else for(const i in t)n[i]==null&&Ir(r,i,"");for(const i in n)i==="display"&&(s=!0),Ir(r,i,n[i])}else if(o){if(t!==n){const i=r[bf];i&&(n+=";"+i),r.cssText=n,s=yf.test(n)}}else t&&e.removeAttribute("style");Kr in e&&(e[Kr]=s?r.display:"",e[ha]&&(r.display="none"))}const ui=/\s*!important$/;function Ir(e,t,n){if(ee(n))n.forEach(r=>Ir(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=wf(e,t);ui.test(n)?e.setProperty(qt(r),n.replace(ui,""),"important"):e[r]=n}}const fi=["Webkit","Moz","ms"],Po={};function wf(e,t){const n=Po[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return Po[t]=r;r=ur(r);for(let o=0;o<fi.length;o++){const s=fi[o]+r;if(s in e)return Po[t]=s}return t}const di="http://www.w3.org/1999/xlink";function pi(e,t,n,r,o,s=_c(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(di,t.slice(6,t.length)):e.setAttributeNS(di,t,n):n==null||s&&!sl(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Dt(n)?String(n):n)}function hi(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?da(n):n);return}const s=e.tagName;if(t==="value"&&s!=="PROGRESS"&&!s.includes("-")){const l=s==="OPTION"?e.getAttribute("value")||"":e.value,a=n==null?e.type==="checkbox"?"on":"":String(n);(l!==a||!("_value"in e))&&(e.value=a),n==null&&e.removeAttribute(t),e._value=n;return}let i=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=sl(n):n==null&&l==="string"?(n="",i=!0):l==="number"&&(n=0,i=!0)}try{e[t]=n}catch{}i&&e.removeAttribute(o||t)}function Ef(e,t,n,r){e.addEventListener(t,n,r)}function Pf(e,t,n,r){e.removeEventListener(t,n,r)}const gi=Symbol("_vei");function xf(e,t,n,r,o=null){const s=e[gi]||(e[gi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Cf(t);if(r){const c=s[t]=Lf(r,o);Ef(e,l,c,a)}else i&&(Pf(e,l,i,a),s[t]=void 0)}}const vi=/(?:Once|Passive|Capture)$/;function Cf(e){let t;if(vi.test(e)){t={};let r;for(;r=e.match(vi);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):qt(e.slice(2)),t]}let xo=0;const Tf=Promise.resolve(),kf=()=>xo||(Tf.then(()=>xo=0),xo=Date.now());function Lf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;pt(Af(r,n.value),t,5,[r])};return n.value=e,n.attached=kf(),n}function Af(e,t){if(ee(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const mi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Rf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?_f(e,r,i):t==="style"?Sf(e,n,r):cr(t)?Yo(t)||xf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Df(e,t,r,i))?(hi(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&pi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?hi(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),pi(e,t,r,i))};function Df(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&mi(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return mi(t)&&Oe(n)?!1:t in e}const Of={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},If=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=qt(o.key);if(t.some(i=>i===s||Of[i]===s))return e(o)})},Mf=Ne({patchProp:Rf},ff);let Co,_i=!1;function $f(){return Co=_i?Co:$u(Mf),_i=!0,Co}const Nf=(...e)=>{const t=$f().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Vf(r);if(o)return n(o,!0,Hf(o))},t};function Hf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Vf(e){return Oe(e)?document.querySelector(e):e}var gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),jf=/.md((\?|#).*)?$/,Ff=(e,t="/")=>gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!jf.test(e),ro=e=>/^(https?:)?\/\//.test(e),bi=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},Bf="http://.",Wf=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return bi(new URL(`${n}/${e}`,Bf).pathname)}return bi(e)},Uf=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},Kf=/(#|\?)/,ga=e=>{const[t,...n]=e.split(Kf);return{pathname:t,hashAndQueries:n.join("")}},qf=["link","meta","script","style","noscript","template"],zf=["title","base"],Gf=([e,t,n])=>zf.includes(e)?e:qf.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Jf=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=Gf(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},Yf=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,va=e=>e.endsWith("/")?e.slice(0,-1):e,ma=e=>e.startsWith("/")?e.slice(1):e,gs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const Qf="modulepreload",Xf=function(e){return"/"+e},yi={},Hn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=Xf(s),s in yi)return;yi[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Qf,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,u)=>{a.addEventListener("load",c),a.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},Zf=JSON.parse("{}"),ed=Object.fromEntries([["/",{loader:()=>Hn(()=>import("./index.html-CFL_msbV.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Hn(()=>import("./works.html-DdmH6Pwy.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Hn(()=>import("./index.html-DuNptnFv.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Hn(()=>import("./works.html-wSGj1IPW.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Hn(()=>import("./404.html-B7Rc-wnV.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*!
+**/let Wo;const ni=typeof window<"u"&&window.trustedTypes;if(ni)try{Wo=ni.createPolicy("vue",{createHTML:e=>e})}catch{}const da=Wo?e=>Wo.createHTML(e):e=>e,cf="http://www.w3.org/2000/svg",uf="http://www.w3.org/1998/Math/MathML",Ct=typeof document<"u"?document:null,ri=Ct&&Ct.createElement("template"),ff={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ct.createElementNS(cf,e):t==="mathml"?Ct.createElementNS(uf,e):n?Ct.createElement(e,{is:n}):Ct.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ri.innerHTML=da(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=ri.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$t="transition",$n="animation",or=Symbol("_vtc"),pa={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},df=Ne({},Ml,pa),pf=e=>(e.displayName="Transition",e.props=df,e),hs=pf((e,{slots:t})=>ve(tu,hf(e),t)),Qt=(e,t=[])=>{ee(e)?e.forEach(n=>n(...t)):e&&e(...t)},oi=e=>e?ee(e)?e.some(t=>t.length>1):e.length>1:!1;function hf(e){const t={};for(const C in e)C in pa||(t[C]=e[C]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=gf(o),_=m&&m[0],w=m&&m[1],{onBeforeEnter:E,onEnter:S,onEnterCancelled:v,onLeave:b,onLeaveCancelled:$,onBeforeAppear:q=E,onAppear:O=S,onAppearCancelled:Y=v}=t,I=(C,F,se,me)=>{C._enterCancelled=me,Xt(C,F?u:l),Xt(C,F?c:i),se&&se()},T=(C,F)=>{C._isLeaving=!1,Xt(C,f),Xt(C,h),Xt(C,p),F&&F()},L=C=>(F,se)=>{const me=C?O:S,G=()=>I(F,C,se);Qt(me,[F,G]),si(()=>{Xt(F,C?a:s),wt(F,C?u:l),oi(me)||ii(F,r,_,G)})};return Ne(t,{onBeforeEnter(C){Qt(E,[C]),wt(C,s),wt(C,i)},onBeforeAppear(C){Qt(q,[C]),wt(C,a),wt(C,c)},onEnter:L(!1),onAppear:L(!0),onLeave(C,F){C._isLeaving=!0;const se=()=>T(C,F);wt(C,f),C._enterCancelled?(wt(C,p),ci()):(ci(),wt(C,p)),si(()=>{C._isLeaving&&(Xt(C,f),wt(C,h),oi(b)||ii(C,r,w,se))}),Qt(b,[C,se])},onEnterCancelled(C){I(C,!1,void 0,!0),Qt(v,[C])},onAppearCancelled(C){I(C,!0,void 0,!0),Qt(Y,[C])},onLeaveCancelled(C){T(C),Qt($,[C])}})}function gf(e){if(e==null)return null;if(Ee(e))return[Eo(e.enter),Eo(e.leave)];{const t=Eo(e);return[t,t]}}function Eo(e){return dc(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[or]||(e[or]=new Set)).add(t)}function Xt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[or];n&&(n.delete(t),n.size||(e[or]=void 0))}function si(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let vf=0;function ii(e,t,n,r){const o=e._endId=++vf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=mf(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,p),s()},p=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,p)}function mf(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||"").split(", "),o=r(`${$t}Delay`),s=r(`${$t}Duration`),i=li(o,s),l=r(`${$n}Delay`),a=r(`${$n}Duration`),c=li(l,a);let u=null,f=0,p=0;t===$t?i>0&&(u=$t,f=i,p=s.length):t===$n?c>0&&(u=$n,f=c,p=a.length):(f=Math.max(i,c),u=f>0?i>c?$t:$n:null,p=u?u===$t?s.length:a.length:0);const h=u===$t&&/\b(transform|all)(,|$)/.test(r(`${$t}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:h}}function li(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>ai(n)+ai(e[r])))}function ai(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ci(){return document.body.offsetHeight}function _f(e,t,n){const r=e[or];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Kr=Symbol("_vod"),ha=Symbol("_vsh"),qr={beforeMount(e,{value:t},{transition:n}){e[Kr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Nn(e,!0),r.enter(e)):r.leave(e,()=>{Nn(e,!1)}):Nn(e,t))},beforeUnmount(e,{value:t}){Nn(e,t)}};function Nn(e,t){e.style.display=t?e[Kr]:"none",e[ha]=!t}const bf=Symbol(""),yf=/(^|;)\s*display\s*:/;function Sf(e,t,n){const r=e.style,o=Oe(n);let s=!1;if(n&&!o){if(t)if(Oe(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Ir(r,l,"")}else for(const i in t)n[i]==null&&Ir(r,i,"");for(const i in n)i==="display"&&(s=!0),Ir(r,i,n[i])}else if(o){if(t!==n){const i=r[bf];i&&(n+=";"+i),r.cssText=n,s=yf.test(n)}}else t&&e.removeAttribute("style");Kr in e&&(e[Kr]=s?r.display:"",e[ha]&&(r.display="none"))}const ui=/\s*!important$/;function Ir(e,t,n){if(ee(n))n.forEach(r=>Ir(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=wf(e,t);ui.test(n)?e.setProperty(qt(r),n.replace(ui,""),"important"):e[r]=n}}const fi=["Webkit","Moz","ms"],Po={};function wf(e,t){const n=Po[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return Po[t]=r;r=ur(r);for(let o=0;o<fi.length;o++){const s=fi[o]+r;if(s in e)return Po[t]=s}return t}const di="http://www.w3.org/1999/xlink";function pi(e,t,n,r,o,s=_c(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(di,t.slice(6,t.length)):e.setAttributeNS(di,t,n):n==null||s&&!sl(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Dt(n)?String(n):n)}function hi(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?da(n):n);return}const s=e.tagName;if(t==="value"&&s!=="PROGRESS"&&!s.includes("-")){const l=s==="OPTION"?e.getAttribute("value")||"":e.value,a=n==null?e.type==="checkbox"?"on":"":String(n);(l!==a||!("_value"in e))&&(e.value=a),n==null&&e.removeAttribute(t),e._value=n;return}let i=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=sl(n):n==null&&l==="string"?(n="",i=!0):l==="number"&&(n=0,i=!0)}try{e[t]=n}catch{}i&&e.removeAttribute(o||t)}function Ef(e,t,n,r){e.addEventListener(t,n,r)}function Pf(e,t,n,r){e.removeEventListener(t,n,r)}const gi=Symbol("_vei");function xf(e,t,n,r,o=null){const s=e[gi]||(e[gi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Cf(t);if(r){const c=s[t]=Lf(r,o);Ef(e,l,c,a)}else i&&(Pf(e,l,i,a),s[t]=void 0)}}const vi=/(?:Once|Passive|Capture)$/;function Cf(e){let t;if(vi.test(e)){t={};let r;for(;r=e.match(vi);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):qt(e.slice(2)),t]}let xo=0;const Tf=Promise.resolve(),kf=()=>xo||(Tf.then(()=>xo=0),xo=Date.now());function Lf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;pt(Af(r,n.value),t,5,[r])};return n.value=e,n.attached=kf(),n}function Af(e,t){if(ee(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const mi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Rf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?_f(e,r,i):t==="style"?Sf(e,n,r):cr(t)?Yo(t)||xf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Df(e,t,r,i))?(hi(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&pi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?hi(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),pi(e,t,r,i))};function Df(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&mi(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return mi(t)&&Oe(n)?!1:t in e}const Of={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},If=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=qt(o.key);if(t.some(i=>i===s||Of[i]===s))return e(o)})},Mf=Ne({patchProp:Rf},ff);let Co,_i=!1;function $f(){return Co=_i?Co:$u(Mf),_i=!0,Co}const Nf=(...e)=>{const t=$f().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Vf(r);if(o)return n(o,!0,Hf(o))},t};function Hf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Vf(e){return Oe(e)?document.querySelector(e):e}var gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),jf=/.md((\?|#).*)?$/,Ff=(e,t="/")=>gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!jf.test(e),ro=e=>/^(https?:)?\/\//.test(e),bi=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},Bf="http://.",Wf=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return bi(new URL(`${n}/${e}`,Bf).pathname)}return bi(e)},Uf=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},Kf=/(#|\?)/,ga=e=>{const[t,...n]=e.split(Kf);return{pathname:t,hashAndQueries:n.join("")}},qf=["link","meta","script","style","noscript","template"],zf=["title","base"],Gf=([e,t,n])=>zf.includes(e)?e:qf.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Jf=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=Gf(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},Yf=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,va=e=>e.endsWith("/")?e.slice(0,-1):e,ma=e=>e.startsWith("/")?e.slice(1):e,gs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const Qf="modulepreload",Xf=function(e){return"/"+e},yi={},Hn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=Xf(s),s in yi)return;yi[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Qf,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,u)=>{a.addEventListener("load",c),a.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},Zf=JSON.parse("{}"),ed=Object.fromEntries([["/",{loader:()=>Hn(()=>import("./index.html-gDP15nKv.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Hn(()=>import("./works.html-Dmdhrt6x.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Hn(()=>import("./index.html-DuKevBia.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Hn(()=>import("./works.html-MtxAU7JF.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Hn(()=>import("./404.html-DsBiW9Ow.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*!
   * vue-router v4.5.0
   * (c) 2024 Eduardo San Martin Morote
   * @license MIT
   */const mn=typeof document<"u";function _a(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function td(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&_a(e.default)}const pe=Object.assign;function To(e,t){const n={};for(const r in t){const o=t[r];n[r]=ht(o)?o.map(e):e(o)}return n}const Jn=()=>{},ht=Array.isArray,ba=/#/g,nd=/&/g,rd=/\//g,od=/=/g,sd=/\?/g,ya=/\+/g,id=/%5B/g,ld=/%5D/g,Sa=/%5E/g,ad=/%60/g,wa=/%7B/g,cd=/%7C/g,Ea=/%7D/g,ud=/%20/g;function vs(e){return encodeURI(""+e).replace(cd,"|").replace(id,"[").replace(ld,"]")}function fd(e){return vs(e).replace(wa,"{").replace(Ea,"}").replace(Sa,"^")}function Uo(e){return vs(e).replace(ya,"%2B").replace(ud,"+").replace(ba,"%23").replace(nd,"%26").replace(ad,"`").replace(wa,"{").replace(Ea,"}").replace(Sa,"^")}function dd(e){return Uo(e).replace(od,"%3D")}function pd(e){return vs(e).replace(ba,"%23").replace(sd,"%3F")}function hd(e){return e==null?"":pd(e).replace(rd,"%2F")}function sr(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const gd=/\/$/,vd=e=>e.replace(gd,"");function ko(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l<a&&l>=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=yd(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:sr(i)}}function md(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Si(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function _d(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&Tn(t.matched[r],n.matched[o])&&Pa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Pa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!bd(e[n],t[n]))return!1;return!0}function bd(e,t){return ht(e)?wi(e,t):ht(t)?wi(t,e):e===t}function wi(e,t){return ht(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function yd(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i<r.length;i++)if(l=r[i],l!==".")if(l==="..")s>1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}const xt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var ir;(function(e){e.pop="pop",e.push="push"})(ir||(ir={}));var Yn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Yn||(Yn={}));function Sd(e){if(!e)if(mn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),vd(e)}const wd=/^[^#]+#/;function Ed(e,t){return e.replace(wd,"#")+t}function Pd(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const oo=()=>({left:window.scrollX,top:window.scrollY});function xd(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Pd(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ei(e,t){return(history.state?history.state.position-t:-1)+e}const Ko=new Map;function Cd(e,t){Ko.set(e,t)}function Td(e){const t=Ko.get(e);return Ko.delete(e),t}let kd=()=>location.protocol+"//"+location.host;function xa(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),Si(a,"")}return Si(n,e)+r+o}function Ld(e,t,n,r){let o=[],s=[],i=null;const l=({state:p})=>{const h=xa(e,location),m=n.value,_=t.value;let w=0;if(p){if(n.value=h,t.value=p,i&&i===m){i=null;return}w=_?p.position-_.position:0}else r(h);o.forEach(E=>{E(n.value,m,{delta:w,type:ir.pop,direction:w?w>0?Yn.forward:Yn.back:Yn.unknown})})};function a(){i=n.value}function c(p){o.push(p);const h=()=>{const m=o.indexOf(p);m>-1&&o.splice(m,1)};return s.push(h),h}function u(){const{history:p}=window;p.state&&p.replaceState(pe({},p.state,{scroll:oo()}),"")}function f(){for(const p of s)p();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:a,listen:c,destroy:f}}function Pi(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?oo():null}}function Ad(e){const{history:t,location:n}=window,r={value:xa(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,c,u){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:kd()+e+a;try{t[u?"replaceState":"pushState"](c,"",p),o.value=c}catch(h){console.error(h),n[u?"replace":"assign"](p)}}function i(a,c){const u=pe({},t.state,Pi(o.value.back,a,o.value.forward,!0),c,{position:o.value.position});s(a,u,!0),r.value=a}function l(a,c){const u=pe({},o.value,t.state,{forward:a,scroll:oo()});s(u.current,u,!0);const f=pe({},Pi(r.value,a,null),{position:u.position+1},c);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Rd(e){e=Sd(e);const t=Ad(e),n=Ld(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=pe({location:"",base:e,go:r,createHref:Ed.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Dd(e){return typeof e=="string"||e&&typeof e=="object"}function Ca(e){return typeof e=="string"||typeof e=="symbol"}const Ta=Symbol("");var xi;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(xi||(xi={}));function kn(e,t){return pe(new Error,{type:e,[Ta]:!0},t)}function Et(e,t){return e instanceof Error&&Ta in e&&(t==null||!!(e.type&t))}const Ci="[^/]+?",Od={sensitive:!1,strict:!1,start:!0,end:!0},Id=/[.+*?^${}()[\]/\\]/g;function Md(e,t){const n=pe({},Od,t),r=[];let o=n.start?"^":"";const s=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let f=0;f<c.length;f++){const p=c[f];let h=40+(n.sensitive?.25:0);if(p.type===0)f||(o+="/"),o+=p.value.replace(Id,"\\$&"),h+=40;else if(p.type===1){const{value:m,repeatable:_,optional:w,regexp:E}=p;s.push({name:m,repeatable:_,optional:w});const S=E||Ci;if(S!==Ci){h+=10;try{new RegExp(`(${S})`)}catch(b){throw new Error(`Invalid custom RegExp for param "${m}" (${S}): `+b.message)}}let v=_?`((?:${S})(?:/(?:${S}))*)`:`(${S})`;f||(v=w&&c.length<2?`(?:/${v})`:"/"+v),w&&(v+="?"),o+=v,h+=20,w&&(h+=-8),_&&(h+=-20),S===".*"&&(h+=-50)}u.push(h)}r.push(u)}if(n.strict&&n.end){const c=r.length-1;r[c][r[c].length-1]+=.7000000000000001}n.strict||(o+="/?"),n.end?o+="$":n.strict&&!o.endsWith("/")&&(o+="(?:/|$)");const i=new RegExp(o,n.sensitive?"":"i");function l(c){const u=c.match(i),f={};if(!u)return null;for(let p=1;p<u.length;p++){const h=u[p]||"",m=s[p-1];f[m.name]=h&&m.repeatable?h.split("/"):h}return f}function a(c){let u="",f=!1;for(const p of e){(!f||!u.endsWith("/"))&&(u+="/"),f=!1;for(const h of p)if(h.type===0)u+=h.value;else if(h.type===1){const{value:m,repeatable:_,optional:w}=h,E=m in c?c[m]:"";if(ht(E)&&!_)throw new Error(`Provided param "${m}" is an array but it is not repeatable (* or + modifiers)`);const S=ht(E)?E.join("/"):E;if(!S)if(w)p.length<2&&(u.endsWith("/")?u=u.slice(0,-1):f=!0);else throw new Error(`Missing required param "${m}"`);u+=S}}return u||"/"}return{re:i,score:r,keys:s,parse:l,stringify:a}}function $d(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===80?-1:1:e.length>t.length?t.length===1&&t[0]===80?1:-1:0}function ka(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const s=$d(r[n],o[n]);if(s)return s;n++}if(Math.abs(o.length-r.length)===1){if(Ti(r))return 1;if(Ti(o))return-1}return o.length-r.length}function Ti(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const Nd={type:0,value:""},Hd=/[a-zA-Z0-9_]/;function Vd(e){if(!e)return[[]];if(e==="/")return[[Nd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${n})/"${c}": ${h}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,c="",u="";function f(){c&&(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=a}for(;l<e.length;){if(a=e[l++],a==="\\"&&n!==2){r=n,n=4;continue}switch(n){case 0:a==="/"?(c&&f(),i()):a===":"?(f(),n=1):p();break;case 4:p(),n=r;break;case 1:a==="("?n=2:Hd.test(a)?p():(f(),n=0,a!=="*"&&a!=="?"&&a!=="+"&&l--);break;case 2:a===")"?u[u.length-1]=="\\"?u=u.slice(0,-1)+a:n=3:u+=a;break;case 3:f(),n=0,a!=="*"&&a!=="?"&&a!=="+"&&l--,u="";break;default:t("Unknown state");break}}return n===2&&t(`Unfinished custom RegExp for param "${c}"`),f(),i(),o}function jd(e,t,n){const r=Md(Vd(e.path),n),o=pe(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Fd(e,t){const n=[],r=new Map;t=Ri({strict:!1,end:!0,sensitive:!1},t);function o(f){return r.get(f)}function s(f,p,h){const m=!h,_=Li(f);_.aliasOf=h&&h.record;const w=Ri(t,f),E=[_];if("alias"in f){const b=typeof f.alias=="string"?[f.alias]:f.alias;for(const $ of b)E.push(Li(pe({},_,{components:h?h.record.components:_.components,path:$,aliasOf:h?h.record:_})))}let S,v;for(const b of E){const{path:$}=b;if(p&&$[0]!=="/"){const q=p.record.path,O=q[q.length-1]==="/"?"":"/";b.path=p.record.path+($&&O+$)}if(S=jd(b,p,w),h?h.alias.push(S):(v=v||S,v!==S&&v.alias.push(S),m&&f.name&&!Ai(S)&&i(f.name)),La(S)&&a(S),_.children){const q=_.children;for(let O=0;O<q.length;O++)s(q[O],S,h&&h.children[O])}h=h||S}return v?()=>{i(v)}:Jn}function i(f){if(Ca(f)){const p=r.get(f);p&&(r.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&r.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const p=Ud(f,n);n.splice(p,0,f),f.record.name&&!Ai(f)&&r.set(f.record.name,f)}function c(f,p){let h,m={},_,w;if("name"in f&&f.name){if(h=r.get(f.name),!h)throw kn(1,{location:f});w=h.record.name,m=pe(ki(p.params,h.keys.filter(v=>!v.optional).concat(h.parent?h.parent.keys.filter(v=>v.optional):[]).map(v=>v.name)),f.params&&ki(f.params,h.keys.map(v=>v.name))),_=h.stringify(m)}else if(f.path!=null)_=f.path,h=n.find(v=>v.re.test(_)),h&&(m=h.parse(_),w=h.record.name);else{if(h=p.name?r.get(p.name):n.find(v=>v.re.test(p.path)),!h)throw kn(1,{location:f,currentLocation:p});w=h.record.name,m=pe({},p.params,f.params),_=h.stringify(m)}const E=[];let S=h;for(;S;)E.unshift(S.record),S=S.parent;return{name:w,path:_,params:m,matched:E,meta:Wd(E)}}e.forEach(f=>s(f));function u(){n.length=0,r.clear()}return{addRoute:s,resolve:c,removeRoute:i,clearRoutes:u,getRoutes:l,getRecordMatcher:o}}function ki(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Li(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Bd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Bd(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Ai(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Wd(e){return e.reduce((t,n)=>pe(t,n.meta),{})}function Ri(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ud(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;ka(e,t[s])<0?r=s:n=s+1}const o=Kd(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function Kd(e){let t=e;for(;t=t.parent;)if(La(t)&&ka(e,t)===0)return t}function La({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function qd(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;o<r.length;++o){const s=r[o].replace(ya," "),i=s.indexOf("="),l=sr(i<0?s:s.slice(0,i)),a=i<0?null:sr(s.slice(i+1));if(l in t){let c=t[l];ht(c)||(c=t[l]=[c]),c.push(a)}else t[l]=a}return t}function Di(e){let t="";for(let n in e){const r=e[n];if(n=dd(n),r==null){r!==void 0&&(t+=(t.length?"&":"")+n);continue}(ht(r)?r.map(s=>s&&Uo(s)):[r&&Uo(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function zd(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ht(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Gd=Symbol(""),Oi=Symbol(""),so=Symbol(""),ms=Symbol(""),qo=Symbol("");function Vn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function jt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const c=p=>{p===!1?a(kn(4,{from:n,to:t})):p instanceof Error?a(p):Dd(p)?a(kn(2,{from:t,to:p})):(i&&r.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),l())},u=s(()=>e.call(r&&r.instances[o],t,n,c));let f=Promise.resolve(u);e.length<3&&(f=f.then(c)),f.catch(p=>a(p))})}function Lo(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(_a(a)){const u=(a.__vccOpts||a)[t];u&&s.push(jt(u,n,r,i,l,o))}else{let c=a();s.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=td(u)?u.default:u;i.mods[l]=u,i.components[l]=f;const h=(f.__vccOpts||f)[t];return h&&jt(h,n,r,i,l,o)()}))}}return s}function Ii(e){const t=qe(so),n=qe(ms),r=R(()=>{const a=Lt(e.to);return t.resolve(a)}),o=R(()=>{const{matched:a}=r.value,{length:c}=a,u=a[c-1],f=n.matched;if(!u||!f.length)return-1;const p=f.findIndex(Tn.bind(null,u));if(p>-1)return p;const h=Mi(a[c-2]);return c>1&&Mi(u)===h&&f[f.length-1].path!==h?f.findIndex(Tn.bind(null,a[c-2])):p}),s=R(()=>o.value>-1&&Zd(n.params,r.value.params)),i=R(()=>o.value>-1&&o.value===n.matched.length-1&&Pa(n.params,r.value.params));function l(a={}){if(Xd(a)){const c=t[Lt(e.replace)?"replace":"push"](Lt(e.to)).catch(Jn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:r,href:R(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}function Jd(e){return e.length===1?e[0]:e}const Yd=ue({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:Ii,setup(e,{slots:t}){const n=an(Ii(e)),{options:r}=qe(so),o=R(()=>({[$i(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[$i(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&Jd(t.default(n));return e.custom?s:ve("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Qd=Yd;function Xd(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 Zd(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ht(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Mi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const $i=(e,t,n)=>e??t??n,ep=ue({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=qe(qo),o=R(()=>e.route||r.value),s=qe(Oi,0),i=R(()=>{let c=Lt(s);const{matched:u}=o.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),l=R(()=>o.value.matched[i.value]);Wt(Oi,R(()=>i.value+1)),Wt(Gd,l),Wt(qo,o);const a=ke();return je(()=>[a.value,l.value,e.name],([c,u,f],[p,h,m])=>{u&&(u.instances[f]=c,h&&h!==u&&c&&c===p&&(u.leaveGuards.size||(u.leaveGuards=h.leaveGuards),u.updateGuards.size||(u.updateGuards=h.updateGuards))),c&&u&&(!h||!Tn(u,h)||!p)&&(u.enterCallbacks[f]||[]).forEach(_=>_(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,f=l.value,p=f&&f.components[u];if(!p)return Ni(n.default,{Component:p,route:c});const h=f.props[u],m=h?h===!0?c.params:typeof h=="function"?h(c):h:null,w=ve(p,pe({},m,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(f.instances[u]=null)},ref:a}));return Ni(n.default,{Component:w,route:c})||w}}});function Ni(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const tp=ep;function np(e){const t=Fd(e.routes,e),n=e.parseQuery||qd,r=e.stringifyQuery||Di,o=e.history,s=Vn(),i=Vn(),l=Vn(),a=De(xt);let c=xt;mn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=To.bind(null,x=>""+x),f=To.bind(null,hd),p=To.bind(null,sr);function h(x,U){let B,J;return Ca(x)?(B=t.getRecordMatcher(x),J=U):J=x,t.addRoute(J,B)}function m(x){const U=t.getRecordMatcher(x);U&&t.removeRoute(U)}function _(){return t.getRoutes().map(x=>x.record)}function w(x){return!!t.getRecordMatcher(x)}function E(x,U){if(U=pe({},U||a.value),typeof x=="string"){const g=ko(n,x,U.path),y=t.resolve({path:g.path},U),k=o.createHref(g.fullPath);return pe(g,y,{params:p(y.params),hash:sr(g.hash),redirectedFrom:void 0,href:k})}let B;if(x.path!=null)B=pe({},x,{path:ko(n,x.path,U.path).path});else{const g=pe({},x.params);for(const y in g)g[y]==null&&delete g[y];B=pe({},x,{params:f(g)}),U.params=f(U.params)}const J=t.resolve(B,U),de=x.hash||"";J.params=u(p(J.params));const Ce=md(r,pe({},x,{hash:fd(de),path:J.path})),d=o.createHref(Ce);return pe({fullPath:Ce,hash:de,query:r===Di?zd(x.query):x.query||{}},J,{redirectedFrom:void 0,href:d})}function S(x){return typeof x=="string"?ko(n,x,a.value.path):pe({},x)}function v(x,U){if(c!==x)return kn(8,{from:U,to:x})}function b(x){return O(x)}function $(x){return b(pe(S(x),{replace:!0}))}function q(x){const U=x.matched[x.matched.length-1];if(U&&U.redirect){const{redirect:B}=U;let J=typeof B=="function"?B(x):B;return typeof J=="string"&&(J=J.includes("?")||J.includes("#")?J=S(J):{path:J},J.params={}),pe({query:x.query,hash:x.hash,params:J.path!=null?{}:x.params},J)}}function O(x,U){const B=c=E(x),J=a.value,de=x.state,Ce=x.force,d=x.replace===!0,g=q(B);if(g)return O(pe(S(g),{state:typeof g=="object"?pe({},de,g.state):de,force:Ce,replace:d}),U||B);const y=B;y.redirectedFrom=U;let k;return!Ce&&_d(r,J,B)&&(k=kn(16,{to:y,from:J}),gt(J,J,!0,!1)),(k?Promise.resolve(k):T(y,J)).catch(P=>Et(P)?Et(P,2)?P:Mt(P):z(P,y,J)).then(P=>{if(P){if(Et(P,2))return O(pe({replace:d},S(P.to),{state:typeof P.to=="object"?pe({},de,P.to.state):de,force:Ce}),U||y)}else P=C(y,J,!0,d,de);return L(y,J,P),P})}function Y(x,U){const B=v(x,U);return B?Promise.reject(B):Promise.resolve()}function I(x){const U=pn.values().next().value;return U&&typeof U.runWithContext=="function"?U.runWithContext(x):x()}function T(x,U){let B;const[J,de,Ce]=rp(x,U);B=Lo(J.reverse(),"beforeRouteLeave",x,U);for(const g of J)g.leaveGuards.forEach(y=>{B.push(jt(y,x,U))});const d=Y.bind(null,x,U);return B.push(d),st(B).then(()=>{B=[];for(const g of s.list())B.push(jt(g,x,U));return B.push(d),st(B)}).then(()=>{B=Lo(de,"beforeRouteUpdate",x,U);for(const g of de)g.updateGuards.forEach(y=>{B.push(jt(y,x,U))});return B.push(d),st(B)}).then(()=>{B=[];for(const g of Ce)if(g.beforeEnter)if(ht(g.beforeEnter))for(const y of g.beforeEnter)B.push(jt(y,x,U));else B.push(jt(g.beforeEnter,x,U));return B.push(d),st(B)}).then(()=>(x.matched.forEach(g=>g.enterCallbacks={}),B=Lo(Ce,"beforeRouteEnter",x,U,I),B.push(d),st(B))).then(()=>{B=[];for(const g of i.list())B.push(jt(g,x,U));return B.push(d),st(B)}).catch(g=>Et(g,8)?g:Promise.reject(g))}function L(x,U,B){l.list().forEach(J=>I(()=>J(x,U,B)))}function C(x,U,B,J,de){const Ce=v(x,U);if(Ce)return Ce;const d=U===xt,g=mn?history.state:{};B&&(J||d?o.replace(x.fullPath,pe({scroll:d&&g&&g.scroll},de)):o.push(x.fullPath,de)),a.value=x,gt(x,U,B,d),Mt()}let F;function se(){F||(F=o.listen((x,U,B)=>{if(!mr.listening)return;const J=E(x),de=q(J);if(de){O(pe(de,{replace:!0,force:!0}),J).catch(Jn);return}c=J;const Ce=a.value;mn&&Cd(Ei(Ce.fullPath,B.delta),oo()),T(J,Ce).catch(d=>Et(d,12)?d:Et(d,2)?(O(pe(S(d.to),{force:!0}),J).then(g=>{Et(g,20)&&!B.delta&&B.type===ir.pop&&o.go(-1,!1)}).catch(Jn),Promise.reject()):(B.delta&&o.go(-B.delta,!1),z(d,J,Ce))).then(d=>{d=d||C(J,Ce,!1),d&&(B.delta&&!Et(d,8)?o.go(-B.delta,!1):B.type===ir.pop&&Et(d,20)&&o.go(-1,!1)),L(J,Ce,d)}).catch(Jn)}))}let me=Vn(),G=Vn(),te;function z(x,U,B){Mt(x);const J=G.list();return J.length?J.forEach(de=>de(x,U,B)):console.error(x),Promise.reject(x)}function Ae(){return te&&a.value!==xt?Promise.resolve():new Promise((x,U)=>{me.add([x,U])})}function Mt(x){return te||(te=!x,se(),me.list().forEach(([U,B])=>x?B(x):U()),me.reset()),x}function gt(x,U,B,J){const{scrollBehavior:de}=e;if(!mn||!de)return Promise.resolve();const Ce=!B&&Td(Ei(x.fullPath,0))||(J||!B)&&history.state&&history.state.scroll||null;return fn().then(()=>de(x,U,Ce)).then(d=>d&&xd(d)).catch(d=>z(d,x,U))}const Qe=x=>o.go(x);let dn;const pn=new Set,mr={currentRoute:a,listening:!0,addRoute:h,removeRoute:m,clearRoutes:t.clearRoutes,hasRoute:w,getRoutes:_,resolve:E,options:e,push:b,replace:$,go:Qe,back:()=>Qe(-1),forward:()=>Qe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:G.add,isReady:Ae,install(x){const U=this;x.component("RouterLink",Qd),x.component("RouterView",tp),x.config.globalProperties.$router=U,Object.defineProperty(x.config.globalProperties,"$route",{enumerable:!0,get:()=>Lt(a)}),mn&&!dn&&a.value===xt&&(dn=!0,b(o.location).catch(de=>{}));const B={};for(const de in xt)Object.defineProperty(B,de,{get:()=>a.value[de],enumerable:!0});x.provide(so,U),x.provide(ms,El(B)),x.provide(qo,a);const J=x.unmount;pn.add(x),x.unmount=function(){pn.delete(x),pn.size<1&&(c=xt,F&&F(),F=null,a.value=xt,dn=!1,te=!1),J()}}};function st(x){return x.reduce((U,B)=>U.then(()=>I(B)),Promise.resolve())}return mr}function rp(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;i<s;i++){const l=t.matched[i];l&&(e.matched.find(c=>Tn(c,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>Tn(c,a))||o.push(a))}return[n,r,o]}function vr(){return qe(so)}function Dn(e){return qe(ms)}var _s=Symbol(""),yt=()=>{const e=qe(_s);if(!e)throw new Error("useClientData() is called without provider.");return e},op=()=>yt().pageComponent,bs=()=>yt().pageFrontmatter,sp=()=>yt().pageHead,ip=()=>yt().pageLang,lp=()=>yt().pageLayout,ap=()=>yt().routeLocale,Aa=()=>yt().routePath,cp=()=>yt().routes,up=()=>yt().siteData,Mr=De([]),io=e=>{Mr.value.push(e),eo(()=>{Mr.value=Mr.value.filter(t=>t!==e)})},fp=Symbol(""),zo=De(Zf),En=De(ed),Ra=(e,t)=>{const n=Wf(e,t);if(En.value[n])return n;const r=encodeURI(n);if(En.value[r])return r;const o=zo.value[n]||zo.value[r];return o||n},lr=(e,t)=>{const{pathname:n,hashAndQueries:r}=ga(e),o=Ra(n,t),s=o+r;return En.value[o]?{...En.value[o],path:s,notFound:!1}:{...En.value["/404.html"],path:s,notFound:!0}},dp=(e,t)=>{const{pathname:n,hashAndQueries:r}=ga(e);return Ra(n,t)+r},pp=e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget){const t=e.currentTarget.getAttribute("target");if(t!=null&&t.match(/\b_blank\b/i))return}return e.preventDefault(),!0}},lo=ue({name:"RouteLink",props:{to:{type:String,required:!0},active:Boolean,activeClass:{type:String,default:"route-link-active"}},slots:Object,setup(e,{slots:t}){const n=vr(),r=Dn(),o=R(()=>e.to.startsWith("#")||e.to.startsWith("?")?e.to:`/${dp(e.to,r.path).substring(1)}`);return()=>ve("a",{class:["route-link",{[e.activeClass]:e.active}],href:o.value,onClick:(s={})=>{pp(s)&&n.push(e.to).catch()}},t.default())}}),hp=ue({name:"AutoLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=kl(e,"config"),r=Dn(),o=up(),s=R(()=>gr(n.value.link)),i=R(()=>n.value.target||(s.value?"_blank":void 0)),l=R(()=>i.value==="_blank"),a=R(()=>!s.value&&!l.value),c=R(()=>n.value.rel||(l.value?"noopener noreferrer":null)),u=R(()=>n.value.ariaLabel??n.value.text),f=R(()=>{if(n.value.exact)return!1;const h=Object.keys(o.value.locales);return h.length?h.every(m=>m!==n.value.link):n.value.link!=="/"}),p=R(()=>a.value?n.value.activeMatch?(n.value.activeMatch instanceof RegExp?n.value.activeMatch:new RegExp(n.value.activeMatch,"u")).test(r.path):f.value?r.path.startsWith(n.value.link):r.path===n.value.link:!1);return()=>{const{before:h,after:m,default:_}=t,w=(_==null?void 0:_(n.value))??[h==null?void 0:h(n.value),n.value.text,m==null?void 0:m(n.value)];return a.value?ve(lo,{class:"auto-link",to:n.value.link,active:p.value,"aria-label":u.value},()=>w):ve("a",{class:"auto-link external-link",href:n.value.link,"aria-label":u.value,rel:c.value,target:i.value},w)}}}),ys=ue({name:"ClientOnly",setup(e,t){const n=ke(!1);return Ze(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),Pr=e=>{Mr.value.forEach(t=>t(e))},Ss=ue({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=op(),n=R(()=>{if(!e.path)return t.value;const o=lr(e.path);return lu(async()=>o.loader().then(({comp:s})=>s))}),r=bs();return je(r,()=>{Pr("updated")},{deep:!0,flush:"post"}),()=>ve(n.value,{onVnodeMounted:()=>{Pr("mounted")},onVnodeUpdated:()=>{Pr("updated")},onVnodeBeforeUnmount:()=>{Pr("beforeUnmount")}})}}),gp="Layout",vp="en-US",Zt=an({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageHead:(e,t,n)=>{const r=dt(t.description)?t.description:n.description,o=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Jf(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||vp,resolvePageLayout:(e,t)=>{const n=dt(e.frontmatter.layout)?e.frontmatter.layout:gp;if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>Uf(e,decodeURI(t)),resolveSiteLocaleData:({base:e,locales:t,...n},r)=>{var o;return{...n,...t[r],head:[...((o=t[r])==null?void 0:o.head)??[],...n.head]}}}),It=(e={})=>e,ws=e=>ro(e)?e:`/${ma(e)}`,mp=Object.defineProperty,_p=(e,t)=>{for(var n in t)mp(e,n,{get:t[n],enumerable:!0})},bp={};_p(bp,{COMPONENT_STATE_TYPE:()=>yp,INSPECTOR_ID:()=>Sp,INSPECTOR_LABEL:()=>wp,INSPECTOR_NODES:()=>Ep,INSPECTOR_STATE_SECTION_NAME:()=>Pp,PLUGIN_ID:()=>Da,PLUGIN_LABEL:()=>Es});var Da="org.vuejs.vuepress",Es="VuePress",yp=Es,Sp=Da,wp=Es,Hi={id:"INTERNAL",label:"Internal",keys:["layouts","routes","redirects"]},Vi={id:"SITE",label:"Site",keys:["siteData","siteLocaleData"]},ji={id:"ROUTE",label:"Route",keys:["routePath","routeLocale"]},Fi={id:"PAGE",label:"Page",keys:["pageData","pageFrontmatter","pageLang","pageHead","pageHeadTitle","pageLayout","pageComponent"]},Ep={[Hi.id]:Hi,[Vi.id]:Vi,[ji.id]:ji,[Fi.id]:Fi},Pp="State";function Ps(e){return Zo()?(al(e),!0):!1}const Pn=new WeakMap,Oa=(...e)=>{var t;const n=e[0],r=(t=Jt())==null?void 0:t.proxy;if(r==null&&!Ul())throw new Error("injectLocal must be called in setup");return r&&Pn.has(r)&&n in Pn.get(r)?Pn.get(r)[n]:qe(...e)},xp=(e,t)=>{var n;const r=(n=Jt())==null?void 0:n.proxy;if(r==null)throw new Error("provideLocal must be called in setup");Pn.has(r)||Pn.set(r,Object.create(null));const o=Pn.get(r);o[e]=t,Wt(e,t)},xs=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Cp=Object.prototype.toString,Tp=e=>Cp.call(e)==="[object Object]",un=()=>{};function Cs(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const Ia=e=>e();function kp(e,t={}){let n,r,o=un;const s=a=>{clearTimeout(a),o(),o=un};let i;return a=>{const c=Te(e),u=Te(t.maxWait);return n&&s(n),c<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise((f,p)=>{o=t.rejectOnCancel?p:f,i=a,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,f(i())},u)),n=setTimeout(()=>{r&&s(r),r=null,f(a())},c)})}}function Lp(...e){let t=0,n,r=!0,o=un,s,i,l,a,c;!$e(e[0])&&typeof e[0]=="object"?{delay:i,trailing:l=!0,leading:a=!0,rejectOnCancel:c=!1}=e[0]:[i,l=!0,a=!0,c=!1]=e;const u=()=>{n&&(clearTimeout(n),n=void 0,o(),o=un)};return p=>{const h=Te(i),m=Date.now()-t,_=()=>s=p();return u(),h<=0?(t=Date.now(),_()):(m>h&&(a||!r)?(t=Date.now(),_()):l&&(s=new Promise((w,E)=>{o=c?E:w,n=setTimeout(()=>{t=Date.now(),r=!0,w(_()),u()},Math.max(0,h-m))})),!a&&!n&&(n=setTimeout(()=>r=!0,h)),r=!1,s)}}function Ap(e=Ia,t={}){const{initialState:n="active"}=t,r=Op(n==="active");function o(){r.value=!1}function s(){r.value=!0}const i=(...l)=>{r.value&&e(...l)};return{isActive:Rn(r),pause:o,resume:s,eventFilter:i}}function Rp(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const r=t;t=void 0,r&&await r},n}function Bi(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Dp(e){return Jt()}function $r(e){return Array.isArray(e)?e:[e]}function Op(...e){if(e.length!==1)return kl(...e);const t=e[0];return typeof t=="function"?Rn(Cl(()=>({get:t,set:un}))):ke(t)}function Ma(e,t=200,n={}){return Cs(kp(t,n),e)}function Ip(e,t=200,n=!1,r=!0,o=!1){return Cs(Lp(t,n,r,o),e)}function Mp(e,t,n={}){const{eventFilter:r=Ia,...o}=n;return je(e,Cs(r,t),o)}function $p(e,t,n={}){const{eventFilter:r,initialState:o="active",...s}=n,{eventFilter:i,pause:l,resume:a,isActive:c}=Ap(r,{initialState:o});return{stop:Mp(e,t,{...s,eventFilter:i}),pause:l,resume:a,isActive:c}}function ao(e,t=!0,n){Dp()?Ze(e,n):t?e():fn(e)}function Np(e,t,n={}){const{immediate:r=!0,immediateCallback:o=!1}=n,s=De(!1);let i=null;function l(){i&&(clearTimeout(i),i=null)}function a(){s.value=!1,l()}function c(...u){o&&e(),l(),s.value=!0,i=setTimeout(()=>{s.value=!1,i=null,e(...u)},Te(t))}return r&&(s.value=!0,xs&&c()),Ps(a),{isPending:Rn(s),start:c,stop:a}}function $a(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=$e(e),s=ke(e);function i(l){if(arguments.length)return s.value=l,s.value;{const a=Te(n);return s.value=s.value===a?Te(r):a,s.value}}return o?i:[s,i]}function Ts(e,t,n){return je(e,t,{...n,immediate:!0})}const Rt=xs?window:void 0,Na=xs?window.navigator:void 0;function Ft(e){var t;const n=Te(e);return(t=n==null?void 0:n.$el)!=null?t:n}function ze(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},r=(l,a,c,u)=>(l.addEventListener(a,c,u),()=>l.removeEventListener(a,c,u)),o=R(()=>{const l=$r(Te(e[0])).filter(a=>a!=null);return l.every(a=>typeof a!="string")?l:void 0}),s=Ts(()=>{var l,a;return[(a=(l=o.value)==null?void 0:l.map(c=>Ft(c)))!=null?a:[Rt].filter(c=>c!=null),$r(Te(o.value?e[1]:e[0])),$r(Lt(o.value?e[2]:e[1])),Te(o.value?e[3]:e[2])]},([l,a,c,u])=>{if(n(),!(l!=null&&l.length)||!(a!=null&&a.length)||!(c!=null&&c.length))return;const f=Tp(u)?{...u}:u;t.push(...l.flatMap(p=>a.flatMap(h=>c.map(m=>r(p,h,m,f)))))},{flush:"post"}),i=()=>{s(),n()};return Ps(n),i}function Hp(){const e=De(!1),t=Jt();return t&&Ze(()=>{e.value=!0},t),e}function co(e){const t=Hp();return R(()=>(t.value,!!e()))}const Vp=Symbol("vueuse-ssr-width");function jp(){const e=Ul()?Oa(Vp,null):null;return typeof e=="number"?e:void 0}function ks(e,t={}){const{window:n=Rt,ssrWidth:r=jp()}=t,o=co(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),s=ke(typeof r=="number"),i=De(),l=De(!1),a=c=>{l.value=c.matches};return Fu(()=>{if(s.value){s.value=!o.value;const c=Te(e).split(",");l.value=c.some(u=>{const f=u.includes("not all"),p=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),h=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let m=!!(p||h);return p&&m&&(m=r>=Bi(p[1])),h&&m&&(m=r<=Bi(h[1])),f?!m:m});return}o.value&&(i.value=n.matchMedia(Te(e)),l.value=i.value.matches)}),ze(i,"change",a,{passive:!0}),R(()=>l.value)}function Wi(e,t={}){const{controls:n=!1,navigator:r=Na}=t,o=co(()=>r&&"permissions"in r),s=De(),i=typeof e=="string"?{name:e}:e,l=De(),a=()=>{var u,f;l.value=(f=(u=s.value)==null?void 0:u.state)!=null?f:"prompt"};ze(s,"change",a,{passive:!0});const c=Rp(async()=>{if(o.value){if(!s.value)try{s.value=await r.permissions.query(i)}catch{s.value=void 0}finally{a()}if(n)return ce(s.value)}});return c(),n?{state:l,isSupported:o,query:c}:l}function Fp(e={}){const{navigator:t=Na,read:n=!1,source:r,copiedDuring:o=1500,legacy:s=!1}=e,i=co(()=>t&&"clipboard"in t),l=Wi("clipboard-read"),a=Wi("clipboard-write"),c=R(()=>i.value||s),u=De(""),f=De(!1),p=Np(()=>f.value=!1,o,{immediate:!1});function h(){let S=!(i.value&&E(l.value));if(!S)try{t.clipboard.readText().then(v=>{u.value=v})}catch{S=!0}S&&(u.value=w())}c.value&&n&&ze(["copy","cut"],h,{passive:!0});async function m(S=Te(r)){if(c.value&&S!=null){let v=!(i.value&&E(a.value));if(!v)try{await t.clipboard.writeText(S)}catch{v=!0}v&&_(S),u.value=S,f.value=!0,p.start()}}function _(S){const v=document.createElement("textarea");v.value=S??"",v.style.position="absolute",v.style.opacity="0",document.body.appendChild(v),v.select(),document.execCommand("copy"),v.remove()}function w(){var S,v,b;return(b=(v=(S=document==null?void 0:document.getSelection)==null?void 0:S.call(document))==null?void 0:v.toString())!=null?b:""}function E(S){return S==="granted"||S==="prompt"}return{isSupported:c,text:u,copied:f,copy:m}}const xr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Cr="__vueuse_ssr_handlers__",Bp=Wp();function Wp(){return Cr in xr||(xr[Cr]=xr[Cr]||{}),xr[Cr]}function Up(e,t){return Bp[e]||t}function Kp(e){return ks("(prefers-color-scheme: dark)",e)}function qp(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"}const zp={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()}},Ui="vueuse-storage";function Ls(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=Rt,eventFilter:p,onError:h=L=>{console.error(L)},initOnMounted:m}=r,_=(u?De:ke)(typeof t=="function"?t():t),w=R(()=>Te(e));if(!n)try{n=Up("getDefaultStorage",()=>{var L;return(L=Rt)==null?void 0:L.localStorage})()}catch(L){h(L)}if(!n)return _;const E=Te(t),S=qp(E),v=(o=r.serializer)!=null?o:zp[S],{pause:b,resume:$}=$p(_,()=>O(_.value),{flush:s,deep:i,eventFilter:p});je(w,()=>I(),{flush:s}),f&&l&&ao(()=>{n instanceof Storage?ze(f,"storage",I,{passive:!0}):ze(f,Ui,T),m&&I()}),m||I();function q(L,C){if(f){const F={key:w.value,oldValue:L,newValue:C,storageArea:n};f.dispatchEvent(n instanceof Storage?new StorageEvent("storage",F):new CustomEvent(Ui,{detail:F}))}}function O(L){try{const C=n.getItem(w.value);if(L==null)q(C,null),n.removeItem(w.value);else{const F=v.write(L);C!==F&&(n.setItem(w.value,F),q(C,F))}}catch(C){h(C)}}function Y(L){const C=L?L.newValue:n.getItem(w.value);if(C==null)return a&&E!=null&&n.setItem(w.value,v.write(E)),E;if(!L&&c){const F=v.read(C);return typeof c=="function"?c(F,E):S==="object"&&!Array.isArray(F)?{...E,...F}:F}else return typeof C!="string"?C:v.read(C)}function I(L){if(!(L&&L.storageArea!==n)){if(L&&L.key==null){_.value=E;return}if(!(L&&L.key!==w.value)){b();try{(L==null?void 0:L.newValue)!==v.write(_.value)&&(_.value=Y(L))}catch(C){h(C)}finally{L?fn($):$()}}}}function T(L){I(L.detail)}return _}function Gp(e,t,n={}){const{window:r=Rt,...o}=n;let s;const i=co(()=>r&&"ResizeObserver"in r),l=()=>{s&&(s.disconnect(),s=void 0)},a=R(()=>{const f=Te(e);return Array.isArray(f)?f.map(p=>Ft(p)):[Ft(f)]}),c=je(a,f=>{if(l(),i.value&&r){s=new ResizeObserver(t);for(const p of f)p&&s.observe(p,o)}},{immediate:!0,flush:"post"}),u=()=>{l(),c()};return Ps(u),{isSupported:i,stop:u}}function Jp(e,t={width:0,height:0},n={}){const{window:r=Rt,box:o="content-box"}=n,s=R(()=>{var f,p;return(p=(f=Ft(e))==null?void 0:f.namespaceURI)==null?void 0:p.includes("svg")}),i=ke(t.width),l=ke(t.height),{stop:a}=Gp(e,([f])=>{const p=o==="border-box"?f.borderBoxSize:o==="content-box"?f.contentBoxSize:f.devicePixelContentBoxSize;if(r&&s.value){const h=Ft(e);if(h){const m=h.getBoundingClientRect();i.value=m.width,l.value=m.height}}else if(p){const h=$r(p);i.value=h.reduce((m,{inlineSize:_})=>m+_,0),l.value=h.reduce((m,{blockSize:_})=>m+_,0)}else i.value=f.contentRect.width,l.value=f.contentRect.height},n);ao(()=>{const f=Ft(e);f&&(i.value="offsetWidth"in f?f.offsetWidth:t.width,l.value="offsetHeight"in f?f.offsetHeight:t.height)});const c=je(()=>Ft(e),f=>{i.value=f?t.width:0,l.value=f?t.height:0});function u(){a(),c()}return{width:i,height:l,stop:u}}const Ki=1;function Yp(e,t={}){const{throttle:n=0,idle:r=200,onStop:o=un,onScroll:s=un,offset:i={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:a="auto",window:c=Rt,onError:u=O=>{console.error(O)}}=t,f=De(0),p=De(0),h=R({get(){return f.value},set(O){_(O,void 0)}}),m=R({get(){return p.value},set(O){_(void 0,O)}});function _(O,Y){var I,T,L,C;if(!c)return;const F=Te(e);if(!F)return;(L=F instanceof Document?c.document.body:F)==null||L.scrollTo({top:(I=Te(Y))!=null?I:m.value,left:(T=Te(O))!=null?T:h.value,behavior:Te(a)});const se=((C=F==null?void 0:F.document)==null?void 0:C.documentElement)||(F==null?void 0:F.documentElement)||F;h!=null&&(f.value=se.scrollLeft),m!=null&&(p.value=se.scrollTop)}const w=De(!1),E=an({left:!0,right:!1,top:!0,bottom:!1}),S=an({left:!1,right:!1,top:!1,bottom:!1}),v=O=>{w.value&&(w.value=!1,S.left=!1,S.right=!1,S.top=!1,S.bottom=!1,o(O))},b=Ma(v,n+r),$=O=>{var Y;if(!c)return;const I=((Y=O==null?void 0:O.document)==null?void 0:Y.documentElement)||(O==null?void 0:O.documentElement)||Ft(O),{display:T,flexDirection:L,direction:C}=getComputedStyle(I),F=C==="rtl"?-1:1,se=I.scrollLeft;S.left=se<f.value,S.right=se>f.value;const me=se*F<=(i.left||0),G=se*F+I.clientWidth>=I.scrollWidth-(i.right||0)-Ki;T==="flex"&&L==="row-reverse"?(E.left=G,E.right=me):(E.left=me,E.right=G),f.value=se;let te=I.scrollTop;O===c.document&&!te&&(te=c.document.body.scrollTop),S.top=te<p.value,S.bottom=te>p.value;const z=te<=(i.top||0),Ae=te+I.clientHeight>=I.scrollHeight-(i.bottom||0)-Ki;T==="flex"&&L==="column-reverse"?(E.top=Ae,E.bottom=z):(E.top=z,E.bottom=Ae),p.value=te},q=O=>{var Y;if(!c)return;const I=(Y=O.target.documentElement)!=null?Y:O.target;$(I),w.value=!0,b(O),s(O)};return ze(e,"scroll",n?Ip(q,n,!0,!1):q,l),ao(()=>{try{const O=Te(e);if(!O)return;$(O)}catch(O){u(O)}}),ze(e,"scrollend",v,l),{x:h,y:m,isScrolling:w,arrivedState:E,directions:S,measure(){const O=Te(e);c&&O&&$(O)}}}function Qp(e={}){const{window:t=Rt,...n}=e;return Yp(t,n)}function Xp(e={}){const{window:t=Rt,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:o=!0,includeScrollbar:s=!0,type:i="inner"}=e,l=ke(n),a=ke(r),c=()=>{if(t)if(i==="outer")l.value=t.outerWidth,a.value=t.outerHeight;else if(i==="visual"&&t.visualViewport){const{width:f,height:p,scale:h}=t.visualViewport;l.value=Math.round(f*h),a.value=Math.round(p*h)}else s?(l.value=t.innerWidth,a.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,a.value=t.document.documentElement.clientHeight)};c(),ao(c);const u={passive:!0};if(ze("resize",c,u),t&&i==="visual"&&t.visualViewport&&ze(t.visualViewport,"resize",c,u),o){const f=ks("(orientation: portrait)");je(f,()=>c())}return{width:l,height:a}}const qi=async(e,t)=>{const{path:n,query:r}=e.currentRoute.value,{scrollBehavior:o}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:r,hash:t}),e.options.scrollBehavior=o},Zp=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=vr();ze("scroll",Ma(()=>{var m,_;const i=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(i-0)<r){qi(o,"");return}const a=window.innerHeight+i,c=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),u=Math.abs(c-a)<r,f=Array.from(document.querySelectorAll(e)),h=Array.from(document.querySelectorAll(t)).filter(w=>f.some(E=>E.hash===w.hash));for(let w=0;w<h.length;w++){const E=h[w],S=h[w+1],v=i>=(((m=E.parentElement)==null?void 0:m.offsetTop)??0)-r,b=!S||i<(((_=S.parentElement)==null?void 0:_.offsetTop)??0)-r;if(!(v&&b))continue;const q=decodeURIComponent(o.currentRoute.value.hash),O=decodeURIComponent(E.hash);if(q===O)return;if(u){for(let Y=w+1;Y<h.length;Y++)if(q===decodeURIComponent(h[Y].hash))return}qi(o,O);return}},n))},eh="a.vp-sidebar-item",th=".header-anchor",nh=300,rh=5,oh=It({setup(){Zp({headerLinkSelector:eh,headerAnchorSelector:th,delay:nh,offset:rh})}}),sh=Object.freeze(Object.defineProperty({__proto__:null,default:oh},Symbol.toStringTag,{value:"Module"})),Ha=[...new Array(6)].map((e,t)=>`[vp-content] h${t+1}`).join(","),ih=(e,t=2)=>{if(t===!1)return[];const[n,r]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t,o=e.filter(i=>i.level>=n&&i.level<=r),s=[];e:for(let i=0;i<o.length;i++){const l=o[i];if(i===0)s.push(l);else{for(let a=i-1;a>=0;a--){const c=o[a];if(c.level<l.level){c.children.push(l);continue e}}s.push(l)}}return s},lh=(e,t=[])=>{let n;if(t.length){const r=e.cloneNode(!0);r.querySelectorAll(t.join(",")).forEach(o=>{o.remove()}),n=r.textContent||""}else n=e.textContent||"";return n.trim()},ah=(e=Ha,t=[])=>Array.from(document.querySelectorAll(e)).filter(n=>n.id&&n.hasChildNodes()).map(n=>({element:n,title:lh(n,t),link:`#${n.id}`,slug:n.id,level:Number(n.tagName[1]),children:[]})),ch=({selector:e=Ha,levels:t=2,ignore:n=[]}={})=>ih(ah(e,n),t),Va=(e,t)=>{var r;const n=(r=Jt())==null?void 0:r.appContext.components;return n?e in n||Xe(e)in n||ur(Xe(e))in n:!1},ja=e=>{const t=ap();return R(()=>Te(e)[t.value]??{})},uh=()=>{const e=cp();return R(()=>Object.keys(e.value))},fh=e=>typeof e<"u",Fa=(e,t)=>dt(e)&&e.startsWith(t),{keys:dh}=Object,Ba=e=>Fa(e,"/")&&e[1]!=="/",Wa=e=>!Ff(e)&&!gr(e);var ph={"/":{backToTop:"Вернуться к началу"},"/eng/":{backToTop:"Back to top"}};const hh=ue({name:"BackToTop",setup(){const e=bs(),t=ja(ph),n=De(),{height:r}=Jp(n),{height:o}=Xp(),{y:s}=Qp(),i=R(()=>e.value.backToTop!==!1&&s.value>100),l=R(()=>s.value/(r.value-o.value)*100);return Ze(()=>{n.value=document.body}),()=>ve(hs,{name:"back-to-top"},()=>i.value?ve("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[ve("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":l.value},ve("svg",ve("circle",{cx:"26",cy:"26",r:"24",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-dasharray":`${Math.PI*l.value*.48} ${Math.PI*(100-l.value)*.48}`}))),ve("div",{class:"back-to-top-icon"})]):null)}}),gh=It({rootComponents:[hh]}),vh=Object.freeze(Object.defineProperty({__proto__:null,default:gh},Symbol.toStringTag,{value:"Module"})),mh=/language-(shellscript|shell|bash|sh|zsh)/,_h=({duration:e=2e3,locales:t,selector:n,showInMobile:r,ignoreSelector:o=[],transform:s})=>{const i=ks("(max-width: 419px)"),l=R(()=>!i.value||r),a=ja(t),c=m=>{var w;if(m.hasAttribute("copy-code"))return;const _=document.createElement("button");_.type="button",_.classList.add("vp-copy-code-button"),_.setAttribute("aria-label",a.value.copy),_.setAttribute("data-copied",a.value.copied),(w=m.parentElement)==null||w.insertBefore(_,m),m.setAttribute("copy-code","")},u=()=>{document.body.classList.toggle("no-copy-code",!l.value),l.value&&document.querySelectorAll(n.join(",")).forEach(c)};Ts(l,u,{flush:"post"}),io(m=>{m!=="beforeUnmount"&&u()});const{copy:f}=Fp({legacy:!0}),p=new WeakMap,h=async(m,_,w)=>{const E=_.cloneNode(!0);o.length&&E.querySelectorAll(o.join(",")).forEach(b=>{b.remove()}),s&&s(E);let S=E.textContent||"";if(mh.test(m.className)&&(S=S.replace(/^ *(\$|>) /gm,"")),await f(S),e<=0)return;w.classList.add("copied"),clearTimeout(p.get(w));const v=setTimeout(()=>{w.classList.remove("copied"),w.blur(),p.delete(w)},e);p.set(w,v)};ze("click",m=>{const _=m.target;if(l.value&&_.matches('div[class*="language-"] > button.vp-copy-code-button')){const w=_.parentElement,E=_.nextElementSibling;if(!w||!E)return;h(w,E,_)}})};var bh=[],yh={"/":{copy:"Скопировать код",copied:"Скопировано"},"/eng/":{copy:"Copy code",copied:"Copied"}},Sh=['[vp-content] div[class*="language-"] pre'];const wh=It({setup:()=>{_h({selector:Sh,ignoreSelector:bh,locales:yh,duration:2e3,showInMobile:!1})}}),Eh=Object.freeze(Object.defineProperty({__proto__:null,default:wh},Symbol.toStringTag,{value:"Module"})),Ph=It({setup(){ze("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})}}),xh=Object.freeze(Object.defineProperty({__proto__:null,default:Ph},Symbol.toStringTag,{value:"Module"}));/**
  * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
  * @license MIT
- */const zi=(e,t)=>{e.classList.add(t)},Gi=(e,t)=>{e.classList.remove(t)},Ch=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Ao=(e,t,n)=>e<t?t:e>n?n:e,Ji=e=>(-1+e)*100,Th=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),kh=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Tr=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=s=>{const{style:i}=document.body;if(s in i)return s;const l=s.charAt(0).toUpperCase()+s.slice(1);let a=e.length;for(;a--;){const c=`${e[a]}${l}`;if(c in i)return c}return s},r=s=>{const i=kh(s);return t[i]??(t[i]=n(i))},o=(s,i,l)=>{s.style[r(i)]=l};return(s,i)=>{for(const l in i){const a=i[l];Object.hasOwn(i,l)&&fh(a)&&o(s,l,a)}}})(),Pt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'<div class="bar" role="bar"></div>'},Re={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Pt,r=Re.isStarted(),o=Ao(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,Th(l=>{Tr(i,{transform:`translate3d(${Ji(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Tr(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Tr(s,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Re.remove(),l()},t)},t)):setTimeout(()=>{l()},t)}),Re},isStarted:()=>typeof Re.percent=="number",start:()=>{Re.percent||Re.set(0);const e=()=>{setTimeout(()=>{Re.percent&&(Re.trickle(),e())},Pt.trickleSpeed)};return e(),Re},done:e=>!e&&!Re.percent?Re:Re.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Re;return t?(t=Ao(t+(typeof e=="number"?e:(1-t)*Ao(Math.random()*t,.1,.95)),0,.994),Re.set(t)):Re.start()},trickle:()=>Re.increase(Math.random()*Pt.trickleRate),render:e=>{if(Re.isRendered())return document.getElementById("nprogress");zi(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Pt.template;const n=t.querySelector(Pt.barSelector),r=document.querySelector(Pt.parent),o=e?"-100":Ji(Re.percent??0);return Tr(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&zi(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{Gi(document.documentElement,"nprogress-busy"),Gi(document.querySelector(Pt.parent),"nprogress-custom-parent"),Ch(document.getElementById("nprogress"))}},Lh=()=>{Ze(()=>{const e=vr(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Re.start()}),e.afterEach(n=>{t.add(n.path),Re.done()})})},Ah=It({setup(){Lh()}}),Rh=Object.freeze(Object.defineProperty({__proto__:null,default:Ah},Symbol.toStringTag,{value:"Module"})),Dh=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{ze("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}})},Oh={setup(){Dh()}},Ih=Object.freeze(Object.defineProperty({__proto__:null,default:Oh},Symbol.toStringTag,{value:"Module"})),Mh="VUEPRESS_CODE_TAB_STORE",kr=Ls(Mh,{}),$h=ue({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=ke(e.active),r=De([]),o=()=>{e.tabId&&(kr.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),e.tabId&&(kr.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>kr.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&kr.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?ve("div",{class:"vp-code-tabs"},[ve("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return ve("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return ve("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[ve("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),Nh="VUEPRESS_TAB_STORE",Ro=Ls(Nh,{}),Hh=ue({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=ke(e.active),r=De([]),o=()=>{e.tabId&&(Ro.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),o()},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Ro.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Ro.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?ve("div",{class:"vp-tabs"},[ve("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return ve("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return ve("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[ve("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),Vh={enhance:({app:e})=>{e.component("CodeTabs",$h),e.component("Tabs",Hh)}},jh=Object.freeze(Object.defineProperty({__proto__:null,default:Vh},Symbol.toStringTag,{value:"Module"})),Fh=JSON.parse(`{"repo":"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru","locales":{"/":{"selectLanguageName":"Русский","navbar":["/","/works"],"notFound":["Верните страницу!","Мы потеряли страницу...","Вы заблокированы в лабиринте.","Искали кота?","Страница украдена.","Ошиблись в параллельной вселенной."],"backToHome":"Вернуться на главную","worksTable":{"name":"Название","description":"Описание","role":"Роль","technologies":"Технологии","status":"Статус","dates":"Даты"}},"/eng/":{"selectLanguageName":"English","navbar":["/eng/","/eng/works"],"notFound":["Return the page!","We lost a page...","You're blocked in a labyrinth.","Looking for a cat?","The page has been stolen.","Wrong turn in parallel universe."],"backToHome":"Back to home","worksTable":{"name":"Name","description":"Description","role":"Role","technologies":"Technologies","status":"Status","dates":"Dates"}}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","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"}`),Bh=ke(Fh),Ua=()=>Bh,Ka=Symbol(""),Wh=()=>{const e=qe(Ka);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Uh=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Kh=It({enhance({app:e}){const t=Ua(),n=e._context.provides[_s],r=R(()=>Uh(t.value,n.routeLocale.value));e.provide(Ka,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),qh=Object.freeze(Object.defineProperty({__proto__:null,default:Kh},Symbol.toStringTag,{value:"Module"})),Me=()=>{const{pageData:e,pageFrontmatter:t,pageLang:n,siteData:r,siteLocaleData:o,...s}=yt();return{...s,page:e,frontmatter:t,lang:n,site:r,siteLocale:o,theme:Ua(),themeLocale:Wh()}},qa=Symbol(""),zh=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{Ts(e,t)}),eo(()=>{t()})},As=()=>{const e=qe(qa);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Gh=()=>{const{themeLocale:e}=Me(),t=Kp(),n=Ls("vuepress-color-scheme",e.value.colorMode),r=R({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(qa,r),zh(r)},za=Symbol("headers"),Jh=()=>{const e=Oa(za);if(!e)throw new Error("useHeaders() is called without provider.");return e},Yh=()=>{const{frontmatter:e,themeLocale:t}=Me(),n=ke([]),r=R(()=>e.value.sidebarDepth??t.value.sidebarDepth??2),o=()=>{if(r.value<=0){n.value=[];return}n.value=ch({levels:[2,r.value+1],ignore:[".vp-badge"]})};xp(za,n),io(s=>{s==="beforeUnmount"?n.value=[]:o()})};let Do=null,jn=null;const Qh={wait:()=>Do,pending:()=>{Do=new Promise(e=>{jn=e})},resolve:()=>{jn==null||jn(),Do=null,jn=null}},Ga=()=>Qh,Ln=(e,t)=>{const{notFound:n,meta:r,path:o}=lr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},xn=(e="",t="")=>Ba(t)||gr(t)?t:`${Yf(e)}${t}`,Xh=e=>({text:e.title,link:e.link,children:Rs(e.children)}),Rs=e=>e?e.map(t=>Xh(t)):[],Ja=(e,t)=>[{text:e.title,children:Rs(t)}],Ya=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Ln(xn(i,s)):dt(s.link)?{...s,link:Wa(s.link)?Ln(xn(i,s.link)).link:s.link}:s;if("children"in l)return{...l,children:l.children.map(c=>o(c,xn(i,l.prefix)))};if(l.link===n){const c=((a=t[0])==null?void 0:a.level)===1?t[0].children:t;return{...l,children:Rs(c)}}return l};return e.map(s=>o(s,r))},Zh=(e,t,n,r)=>{const o=dh(e).sort((s,i)=>i.length-s.length);for(const s of o)if(Fa(decodeURI(r),s)){const i=e[s];return i?i==="heading"?Ja(t,n):Ya(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},Qa=Symbol("sidebarItems"),Ds=()=>{const e=qe(Qa);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},eg=(e,t,n,r,o)=>e===!1?[]:e==="heading"?Ja(t,o):Array.isArray(e)?Ya(e,o,n,r):gs(e)?Zh(e,t,o,n):[],tg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=Me(),o=Jh(),s=Aa(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>eg(i.value,t.value,s.value,n.value,o.value));Wt(Qa,l)},ng=ue({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ye=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function rg(e,t,n,r,o,s){return V(),X("span",{class:Ke(["vp-badge",n.type]),style:An({verticalAlign:n.vertical})},[Pe(e.$slots,"default",{},()=>[Kt(ae(n.text),1)])],6)}const og=ye(ng,[["render",rg],["__file","Badge.vue"]]),sg=ue({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function ig(e,t,n,r,o,s){return V(),Le(hs,{name:"vp-fade-slide-y",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:xe(()=>[Pe(e.$slots,"default")]),_:3})}const lg=ye(sg,[["render",ig],["__file","VPFadeSlideYTransition.vue"]]),ag=ue({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const{frontmatter:n}=Me(),r=R(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),cg={key:0,class:"vp-features"};function ug(e,t,n,r,o,s){return r.features.length?(V(),X("div",cg,[(V(!0),X(be,null,At(r.features,i=>(V(),X("div",{key:i.title,class:"vp-feature"},[K("h2",null,ae(i.title),1),K("p",null,ae(i.details),1)]))),128))])):Ie("",!0)}const fg=ye(ag,[["render",ug],["__file","VPHomeFeatures.vue"]]),dg=ue({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=bs(),r=R(()=>n.value.footer),o=R(()=>n.value.footerHtml),s={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),pg=["innerHTML"],hg=["textContent"];function gg(e,t,n,r,o,s){return r.footer?(V(),X(be,{key:0},[r.footerHtml?(V(),X("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,pg)):(V(),X("div",{key:1,class:"vp-footer","vp-footer":"",textContent:ae(r.footer)},null,8,hg))],64)):Ie("",!0)}const vg=ye(dg,[["render",gg],["__file","VPHomeFooter.vue"]]),mg=ue({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return hp}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function _g(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},Su({before:xe(()=>[Pe(e.$slots,"before",po(Or(n.config)))]),after:xe(()=>[Pe(e.$slots,"after",po(Or(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:xe(()=>[Pe(e.$slots,"default",po(Or(n.config)))]),key:"0"}:void 0]),1032,["config"])}const On=ye(mg,[["render",_g],["__file","VPAutoLink.vue"]]),bg=ue({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=Me(),o=As(),s=R(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),i=R(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),l=R(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),a=R(()=>n.value.heroAlt||s.value||"hero"),c=R(()=>n.value.heroHeight??280),u=R(()=>Array.isArray(n.value.actions)?n.value.actions.map(({type:h="primary",...m})=>({type:h,...m})):[]),p={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:s,tagline:i,heroImage:l,heroAlt:a,heroHeight:c,actions:u,HomeHeroImage:()=>{if(!l.value)return null;const h=ve("img",{class:"vp-hero-image",src:ws(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?h:ve(ys,()=>h)},VPAutoLink:On};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),yg={class:"vp-hero"},Sg={key:0,id:"main-title"},wg={key:1,class:"vp-hero-description"},Eg={key:2,class:"vp-hero-actions"};function Pg(e,t,n,r,o,s){return V(),X("header",yg,[ne(r.HomeHeroImage),r.heroText?(V(),X("h1",Sg,ae(r.heroText),1)):Ie("",!0),r.tagline?(V(),X("p",wg,ae(r.tagline),1)):Ie("",!0),r.actions.length?(V(),X("p",Eg,[(V(!0),X(be,null,At(r.actions,i=>(V(),Le(r.VPAutoLink,{key:i.text,class:Ke(["vp-hero-action-button",[i.type]]),config:i},null,8,["class","config"]))),128))])):Ie("",!0)])}const xg=ye(bg,[["render",Pg],["__file","VPHomeHero.vue"]]),Cg=ue({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:fg,VPHomeFooter:vg,VPHomeHero:xg,get Content(){return Ss}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Tg={class:"vp-home"},kg={"vp-content":""};function Lg(e,t,n,r,o,s){return V(),X("main",Tg,[ne(r.VPHomeHero),ne(r.VPHomeFeatures),K("div",kg,[ne(r.Content)]),ne(r.VPHomeFooter)])}const Ag=ye(Cg,[["render",Lg],["__file","VPHome.vue"]]),Rg=ue({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=Me(),s=As(),i=R(()=>o.value.home||n.value),l=R(()=>r.value.title),a=R(()=>s.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),c=R(()=>o.value.logoAlt??l.value),u=R(()=>l.value.toLocaleUpperCase().trim()===c.value.toLocaleUpperCase().trim()),p={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:s,navbarBrandLink:i,navbarBrandTitle:l,navbarBrandLogo:a,navbarBrandLogoAlt:c,navBarLogoAltMatchesTitle:u,NavbarBrandLogo:()=>{if(!a.value)return null;const h=ve("img",{class:"vp-site-logo",src:ws(a.value),alt:c.value});return o.value.logoDark===void 0?h:ve(ys,()=>h)},get RouteLink(){return lo}};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Dg=["aria-hidden"];function Og(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:xe(()=>[ne(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),X("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},ae(r.navbarBrandTitle),11,Dg)):Ie("",!0)]),_:1},8,["to"])}const Ig=ye(Rg,[["render",Og],["__file","VPNavbarBrand.vue"]]),Mg=ue({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:s=>{s.style.height=`${s.scrollHeight}px`},unsetHeight:s=>{s.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function $g(e,t,n,r,o,s){return V(),Le(hs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:xe(()=>[Pe(e.$slots,"default")]),_:3})}const Xa=ye(Mg,[["render",$g],["__file","VPDropdownTransition.vue"]]),Ng=ue({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Tl(n),[o,s]=$a(!1),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};io(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:On,VPDropdownTransition:Xa};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Hg=["aria-label"],Vg={class:"title"},jg=["aria-label"],Fg={class:"title"},Bg={class:"vp-navbar-dropdown"},Wg={class:"vp-navbar-dropdown-subtitle"},Ug={key:1},Kg={class:"vp-navbar-dropdown-subitem-wrapper"};function qg(e,t,n,r,o,s){return V(),X("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[K("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[K("span",Vg,ae(r.config.text),1),t[1]||(t[1]=K("span",{class:"arrow down"},null,-1))],8,Hg),K("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[K("span",Fg,ae(r.config.text),1),K("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,jg),ne(r.VPDropdownTransition,null,{default:xe(()=>[Br(K("ul",Bg,[(V(!0),X(be,null,At(r.config.children,i=>(V(),X("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),X(be,{key:0},[K("h4",Wg,[i.link?(V(),Le(r.VPAutoLink,{key:0,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&i.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(V(),X("span",Ug,ae(i.text),1))]),K("ul",Kg,[(V(!0),X(be,null,At(i.children,l=>(V(),X("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[ne(r.VPAutoLink,{config:l,onFocusout:()=>{r.isLastItemOfArray(l,i.children)&&r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(V(),Le(r.VPAutoLink,{key:1,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[qr,r.open]])]),_:1})],2)}const zg=ye(Ng,[["render",qg],["__file","VPNavbarDropdown.vue"]]),Za=(e,t="")=>dt(e)?Ln(xn(t,e)):"children"in e?{...e,children:e.children.map(n=>Za(n,xn(t,e.prefix)))}:{...e,link:Wa(e.link)?Ln(xn(t,e.link)).link:e.link},Gg=()=>{const{themeLocale:e}=Me();return R(()=>(e.value.navbar||[]).map(t=>Za(t)))},ec=e=>!ro(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,Jg=()=>{const{themeLocale:e}=Me(),t=R(()=>e.value.repo),n=R(()=>t.value?ec(t.value):null),r=R(()=>t.value&&!ro(t.value)?`https://github.com/${t.value}`:t.value),o=R(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return R(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},Yg=()=>{const e=Dn(),t=uh(),{routeLocale:n,site:r,siteLocale:o,theme:s,themeLocale:i}=Me();return R(()=>{const l=Object.keys(r.value.locales);if(l.length<2)return[];const a=e.path,c=e.fullPath;return[{text:`${i.value.selectLanguageText}`,ariaLabel:`${i.value.selectLanguageAriaLabel??i.value.selectLanguageText}`,children:l.map(f=>{var E,S;const p=((E=r.value.locales)==null?void 0:E[f])??{},h=((S=s.value.locales)==null?void 0:S[f])??{},m=`${p.lang}`,_=h.selectLanguageName??m;if(m===o.value.lang)return{text:_,activeMatch:".",link:e.fullPath};const w=a.replace(n.value,f);return{text:_,link:t.value.some(v=>v===w)?c.replace(a,w):h.home??f}})}]})},Qg="719px",Xg={mobile:Qg};var ar;(function(e){e.Mobile="mobile"})(ar||(ar={}));const Zg={[ar.Mobile]:Number.parseInt(Xg.mobile.replace("px",""),10)},tc=(e,t)=>{const n=Zg[e];Number.isInteger(n)&&(ze("orientationchange",()=>{t(n)},!1),ze("resize",()=>{t(n)},!1),Ze(()=>{t(n)}))},ev=ue({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=Gg(),o=Yg(),s=Jg(),i=ke(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);tc(ar.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:On,VPNavbarDropdown:zg};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),tv=["aria-label"];function nv(e,t,n,r,o,s){return r.navbarLinks.length?(V(),X("nav",{key:0,class:"vp-navbar-items","aria-label":r.navbarLabel},[(V(!0),X(be,null,At(r.navbarLinks,i=>(V(),X("div",{key:i.text,class:"vp-navbar-item"},["children"in i?(V(),Le(r.VPNavbarDropdown,{key:0,class:Ke({mobile:r.isMobile}),config:i},null,8,["class","config"])):(V(),Le(r.VPAutoLink,{key:1,config:i},null,8,["config"]))]))),128))],8,tv)):Ie("",!0)}const nc=ye(ev,[["render",nv],["__file","VPNavbarItems.vue"]]),rv={},ov={class:"dark-icon",viewBox:"0 0 32 32"};function sv(e,t){return V(),X("svg",ov,t[0]||(t[0]=[K("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)]))}const iv=ye(rv,[["render",sv],["__file","VPDarkIcon.vue"]]),lv={},av={class:"light-icon",viewBox:"0 0 32 32"};function cv(e,t){return V(),X("svg",av,t[0]||(t[0]=[Yu('<path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path>',9)]))}const uv=ye(lv,[["render",cv],["__file","VPLightIcon.vue"]]),fv=ue({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=As(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:iv,VPLightIcon:uv};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),dv=["title"];function pv(e,t,n,r,o,s){return V(),X("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[Br(ne(r.VPLightIcon,null,null,512),[[qr,!r.isDarkMode]]),Br(ne(r.VPDarkIcon,null,null,512),[[qr,r.isDarkMode]])],8,dv)}const hv=ye(fv,[["render",pv],["__file","VPToggleColorModeButton.vue"]]),gv=ue({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r={themeLocale:n};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),vv=["title"];function mv(e,t,n,r,o,s){return V(),X("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=i=>e.$emit("toggle"))},t[1]||(t[1]=[K("div",{class:"icon","aria-hidden":"true"},[K("span"),K("span"),K("span")],-1)]),8,vv)}const _v=ye(gv,[["render",mv],["__file","VPToggleSidebarButton.vue"]]),bv=ue({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=Va("SearchBox")?cs("SearchBox"):()=>null,{themeLocale:r}=Me(),o=Fs("navbar"),s=Fs("navbar-brand"),i=ke(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var m;const p=(m=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:m.getComputedStyle(u,null)[f],h=Number.parseInt(p,10);return Number.isNaN(h)?0:h};tc(ar.Mobile,u=>{var p;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((p=s.value)==null?void 0:p.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:Ig,VPNavbarItems:nc,VPToggleColorModeButton:hv,VPToggleSidebarButton:_v};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),yv={ref:"navbar",class:"vp-navbar","vp-navbar":""},Sv={ref:"navbar-brand"};function wv(e,t,n,r,o,s){return V(),X("header",yv,[ne(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),K("span",Sv,[ne(r.VPNavbarBrand)],512),K("div",{class:"vp-navbar-items-wrapper",style:An(r.linksWrapperStyle)},[Pe(e.$slots,"before"),ne(r.VPNavbarItems,{class:"vp-hide-mobile"}),Pe(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):Ie("",!0),ne(r.SearchBox)],4)],512)}const Ev=ye(bv,[["render",wv],["__file","VPNavbar.vue"]]),Pv={},xv={class:"edit-icon",viewBox:"0 0 1024 1024"};function Cv(e,t){return V(),X("svg",xv,t[0]||(t[0]=[K("g",{fill:"currentColor"},[K("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),K("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const Tv=ye(Pv,[["render",Cv],["__file","VPEditIcon.vue"]]),kv=()=>{const{themeLocale:e,page:t,frontmatter:n}=Me();return R(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})},Lv={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"},Av=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=ec(e);return n!==null?Lv[n]:null},Rv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=Av({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,ro(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ma(`${va(n)}/${r}`)):null},Dv=()=>{const{frontmatter:e,page:t,themeLocale:n}=Me();return R(()=>{if(!(e.value.editLink??n.value.editLink??!0))return null;const{repo:o,docsRepo:s=o,docsBranch:i="main",docsDir:l="",editLinkText:a}=n.value;if(!s)return null;const c=Rv({docsRepo:s,docsBranch:i,docsDir:l,filePathRelative:t.value.filePathRelative,editLinkPattern:e.value.editLinkPattern??n.value.editLinkPattern});return c?{text:a??"Edit this page",link:c}:null})},Ov=()=>{const{frontmatter:e,page:t,themeLocale:n}=Me();return R(()=>{var s;return!(e.value.lastUpdated??n.value.lastUpdated??!0)||!((s=t.value.git)!=null&&s.updatedTime)?null:new Date(t.value.git.updatedTime).toLocaleString()})},Iv=ue({__name:"VPPageMeta",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=Dv(),o=Ov(),s=kv(),i={themeLocale:n,editLink:r,lastUpdated:o,contributors:s,VPAutoLink:On,VPEditIcon:Tv};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),Mv={class:"vp-page-meta"},$v={key:0,class:"vp-meta-item edit-link"},Nv={class:"vp-meta-item git-info"},Hv={key:0,class:"vp-meta-item last-updated"},Vv={class:"meta-item-label"},jv={class:"meta-item-info"},Fv={key:1,class:"vp-meta-item contributors"},Bv={class:"meta-item-label"},Wv={class:"meta-item-info"},Uv=["title"];function Kv(e,t,n,r,o,s){const i=cs("ClientOnly");return V(),X("footer",Mv,[r.editLink?(V(),X("div",$v,[ne(r.VPAutoLink,{class:"label",config:r.editLink},{before:xe(()=>[ne(r.VPEditIcon)]),_:1},8,["config"])])):Ie("",!0),K("div",Nv,[r.lastUpdated?(V(),X("div",Hv,[K("span",Vv,ae(r.themeLocale.lastUpdatedText)+": ",1),ne(i,null,{default:xe(()=>[K("span",jv,ae(r.lastUpdated),1)]),_:1})])):Ie("",!0),r.contributors&&r.contributors.length?(V(),X("div",Fv,[K("span",Bv,ae(r.themeLocale.contributorsText)+": ",1),K("span",Wv,[(V(!0),X(be,null,At(r.contributors,(l,a)=>(V(),X(be,{key:a},[K("span",{class:"contributor",title:`email: ${l.email}`},ae(l.name),9,Uv),a!==r.contributors.length-1?(V(),X(be,{key:0},[Kt(", ")],64)):Ie("",!0)],64))),128))])])):Ie("",!0)])])}const qv=ye(Iv,[["render",Kv],["__file","VPPageMeta.vue"]]),zv=()=>{const e=vr(),t=Dn();return n=>{n&&(Ba(n)?t.fullPath!==n&&e.push(n):gr(n)?window.open(n):e.push(encodeURI(n)))}},Yi=(e,t)=>e===!1?!1:dt(e)?Ln(e,t):gs(e)?{...e,link:Ln(e.link,t).link}:null,Go=(e,t,n)=>{const r=e.findIndex(s=>s.link===t);if(r!==-1){const s=e[r+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Go(s.children,t,n);if(i)return i}const o=e.findIndex(s=>"prefix"in s&&s.prefix===t);if(o!==-1){const s=e[o+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},Gv=()=>{const{frontmatter:e,themeLocale:t}=Me(),n=Ds(),r=Aa(),o=R(()=>{const i=Yi(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Go(n.value,r.value,-1))}),s=R(()=>{const i=Yi(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Go(n.value,r.value,1))});return{prevLink:o,nextLink:s}},Jv=ue({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=zv(),{prevLink:o,nextLink:s}=Gv(),i=R(()=>n.value.pageNavbarLabel??"page navigation");ze("keydown",a=>{a.altKey&&(a.key==="ArrowRight"?s.value&&(r(s.value.link),a.preventDefault()):a.key==="ArrowLeft"&&o.value&&(r(o.value.link),a.preventDefault()))});const l={themeLocale:n,navigate:r,prevLink:o,nextLink:s,navbarLabel:i,VPAutoLink:On};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),Yv=["aria-label"],Qv={class:"hint"},Xv={class:"link"},Zv={class:"external-link"},em={class:"hint"},tm={class:"link"},nm={class:"external-link"};function rm(e,t,n,r,o,s){return r.prevLink||r.nextLink?(V(),X("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(V(),Le(r.VPAutoLink,{key:0,class:"prev",config:r.prevLink},{default:xe(()=>[K("div",Qv,[t[0]||(t[0]=K("span",{class:"arrow left"},null,-1)),Kt(" "+ae(r.themeLocale.prev??"Prev"),1)]),K("div",Xv,[K("span",Zv,ae(r.prevLink.text),1)])]),_:1},8,["config"])):Ie("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:xe(()=>[K("div",em,[Kt(ae(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=K("span",{class:"arrow right"},null,-1))]),K("div",tm,[K("span",nm,ae(r.nextLink.text),1)])]),_:1},8,["config"])):Ie("",!0)],8,Yv)):Ie("",!0)}const om=ye(Jv,[["render",rm],["__file","VPPageNav.vue"]]),sm=ue({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:qv,VPPageNav:om,get Content(){return Ss}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),im={class:"vp-page"},lm={"vp-content":""};function am(e,t,n,r,o,s){return V(),X("main",im,[Pe(e.$slots,"top"),K("div",lm,[Pe(e.$slots,"content-top"),ne(r.Content),Pe(e.$slots,"content-bottom")]),ne(r.VPPageMeta),ne(r.VPPageNav),Pe(e.$slots,"bottom")])}const cm=ye(sm,[["render",am],["__file","VPPage.vue"]]),Qi=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),um=(e,t)=>{if(t.hash===e)return!0;const n=Qi(t.path),r=Qi(e);return n===r},rc=(e,t)=>e.link&&um(e.link,t)?!0:"children"in e?e.children.some(n=>rc(n,t)):!1,fm=ue({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Tl(n),s=Dn(),i=vr(),l=R(()=>r.value.collapsible),a=R(()=>rc(r.value,s)),c=R(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:a.value,collapsible:l.value})),u=R(()=>l.value?a.value:!0),[f,p]=$a(u.value),h=w=>{l.value&&(w.preventDefault(),p())},m=i.afterEach(()=>{fn(()=>{f.value=u.value})});as(()=>{m()});const _={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:p,onClick:h,unregisterRouterHook:m,VPAutoLink:On,VPDropdownTransition:Xa};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}}),dm={class:"vp-sidebar-children"};function pm(e,t,n,r,o,s){const i=cs("VPSidebarItem",!0);return V(),X("li",null,[r.item.link?(V(),Le(r.VPAutoLink,{key:0,class:Ke(r.itemClass),config:r.item},{after:xe(()=>[r.collapsible?(V(),X("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):Ie("",!0)]),_:1},8,["class","config"])):(V(),X("p",{key:1,tabindex:"0",class:Ke(r.itemClass),onClick:r.onClick,onKeydown:If(r.onClick,["enter"])},[Kt(ae(r.item.text)+" ",1),r.collapsible?(V(),X("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):Ie("",!0)],34)),"children"in r.item&&r.item.children.length?(V(),Le(r.VPDropdownTransition,{key:2},{default:xe(()=>[Br(K("ul",dm,[(V(!0),X(be,null,At(r.item.children,l=>(V(),Le(i,{key:`${r.depth}${l.text}${l.link}`,item:l,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[qr,r.isOpen]])]),_:1})):Ie("",!0)])}const hm=ye(fm,[["render",pm],["__file","VPSidebarItem.vue"]]),gm=ue({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=Dn(),r=Ds();Ze(()=>{je(()=>n.hash,s=>{const i=document.querySelector(".vp-sidebar");if(!i)return;const l=document.querySelector(`.vp-sidebar .vp-sidebar-item.auto-link[href="${n.path}${s}"]`);if(!l)return;const{top:a,height:c}=i.getBoundingClientRect(),{top:u,height:f}=l.getBoundingClientRect();u<a?l.scrollIntoView(!0):u+f>a+c&&l.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:hm};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),vm={key:0,class:"vp-sidebar-items"};function mm(e,t,n,r,o,s){return r.sidebarItems.length?(V(),X("ul",vm,[(V(!0),X(be,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):Ie("",!0)}const _m=ye(gm,[["render",mm],["__file","VPSidebarItems.vue"]]),bm=ue({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:nc,VPSidebarItems:_m};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ym={class:"vp-sidebar","vp-sidebar":""};function Sm(e,t,n,r,o,s){return V(),X("aside",ym,[ne(r.VPNavbarItems),Pe(e.$slots,"top"),ne(r.VPSidebarItems),Pe(e.$slots,"bottom")])}const wm=ye(bm,[["render",Sm],["__file","VPSidebar.vue"]]),Em=ue({__name:"Layout",setup(e,{expose:t}){t();const{frontmatter:n,page:r,themeLocale:o}=Me(),s=R(()=>n.value.navbar!==!1&&o.value.navbar!==!1),i=Ds(),l=ke(!1),a=S=>{l.value=typeof S=="boolean"?S:!l.value},c={x:0,y:0},u=S=>{c.x=S.changedTouches[0].clientX,c.y=S.changedTouches[0].clientY},f=S=>{const v=S.changedTouches[0].clientX-c.x,b=S.changedTouches[0].clientY-c.y;Math.abs(v)>Math.abs(b)&&Math.abs(v)>40&&(v>0&&c.x<=80?a(!0):a(!1))},p=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),h=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":p.value},n.value.pageClass]);io(()=>{a(!1)});const m=Ga(),_=m.resolve,w=m.pending,E={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:p,containerClass:h,scrollPromise:m,onBeforeEnter:_,onBeforeLeave:w,VPFadeSlideYTransition:lg,VPHome:Ag,VPNavbar:Ev,VPPage:cm,VPSidebar:wm};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});function Pm(e,t,n,r,o,s){return V(),X("div",{class:Ke(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[Pe(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:xe(()=>[Pe(e.$slots,"navbar-before")]),after:xe(()=>[Pe(e.$slots,"navbar-after")]),_:3})):Ie("",!0)]),K("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),Pe(e.$slots,"sidebar",{},()=>[ne(r.VPSidebar,null,{top:xe(()=>[Pe(e.$slots,"sidebar-top")]),bottom:xe(()=>[Pe(e.$slots,"sidebar-bottom")]),_:3})]),Pe(e.$slots,"page",{},()=>[ne(r.VPFadeSlideYTransition,{onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:xe(()=>[r.frontmatter.home?(V(),Le(r.VPHome,{key:0})):(V(),Le(r.VPPage,{key:r.page.path},{top:xe(()=>[Pe(e.$slots,"page-top")]),"content-top":xe(()=>[Pe(e.$slots,"page-content-top")]),"content-bottom":xe(()=>[Pe(e.$slots,"page-content-bottom")]),bottom:xe(()=>[Pe(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const oc=ye(Em,[["render",Pm],["__file","Layout.vue"]]),xm=ue({__name:"NotFound",setup(e,{expose:t}){t();const{routeLocale:n,themeLocale:r}=Me(),o=R(()=>r.value.notFound??["Not Found"]),s=()=>o.value[Math.floor(Math.random()*o.value.length)],i=R(()=>r.value.home??n.value),l=R(()=>r.value.backToHome??"Back to home"),a={routeLocale:n,themeLocale:r,messages:o,getMsg:s,homeLink:i,homeText:l,get RouteLink(){return lo}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Cm={class:"vp-theme-container","vp-container":""},Tm={class:"page"},km={"vp-content":""};function Lm(e,t,n,r,o,s){return V(),X("div",Cm,[K("main",Tm,[K("div",km,[t[0]||(t[0]=K("h1",null,"404",-1)),K("blockquote",null,ae(r.getMsg()),1),ne(r.RouteLink,{to:r.homeLink},{default:xe(()=>[Kt(ae(r.homeText),1)]),_:1},8,["to"])])])])}const Am=ye(xm,[["render",Lm],["__scopeId","data-v-9cd7902c"],["__file","NotFound.vue"]]),Rm=It({enhance({app:e,router:t}){Va("Badge")||e.component("Badge",og);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Ga().wait(),n(...r))},setup(){Gh(),Yh(),tg()},layouts:{Layout:oc,NotFound:Am}}),Dm=Object.freeze(Object.defineProperty({__proto__:null,default:Rm},Symbol.toStringTag,{value:"Module"}));function Om(e){return Zo()?(al(e),!0):!1}function Os(e){return typeof e=="function"?e():Lt(e)}const Im=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Mm=Object.prototype.toString,$m=e=>Mm.call(e)==="[object Object]",Nm=()=>{};function Hm(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const sc=e=>e();function Vm(e=sc){const t=ke(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:o}}function jm(e){return Jt()}function Fm(e,t,n={}){const{eventFilter:r=sc,...o}=n;return je(e,Hm(r,t),o)}function Bm(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=Vm(r);return{stop:Fm(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function Wm(e,t=!0,n){jm()?Ze(e,n):t?e():fn(e)}function Um(e){var t;const n=Os(e);return(t=n==null?void 0:n.$el)!=null?t:n}const zr=Im?window:void 0;function Xi(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=zr):[t,n,r,o]=e,!t)return Nm;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,p,h)=>(u.addEventListener(f,p,h),()=>u.removeEventListener(f,p,h)),a=je(()=>[Um(t),Os(o)],([u,f])=>{if(i(),!u)return;const p=$m(f)?{...f}:f;s.push(...n.flatMap(h=>r.map(m=>l(u,h,m,p))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return Om(c),c}const Lr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ar="__vueuse_ssr_handlers__",Km=qm();function qm(){return Ar in Lr||(Lr[Ar]=Lr[Ar]||{}),Lr[Ar]}function zm(e,t){return Km[e]||t}function Gm(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"}const Jm={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()}},Zi="vueuse-storage";function Ym(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=zr,eventFilter:p,onError:h=T=>{console.error(T)},initOnMounted:m}=r,_=(u?De:ke)(typeof t=="function"?t():t);if(!n)try{n=zm("getDefaultStorage",()=>{var T;return(T=zr)==null?void 0:T.localStorage})()}catch(T){h(T)}if(!n)return _;const w=Os(t),E=Gm(w),S=(o=r.serializer)!=null?o:Jm[E],{pause:v,resume:b}=Bm(_,()=>q(_.value),{flush:s,deep:i,eventFilter:p});f&&l&&Wm(()=>{Xi(f,"storage",Y),Xi(f,Zi,I),m&&Y()}),m||Y();function $(T,L){f&&f.dispatchEvent(new CustomEvent(Zi,{detail:{key:e,oldValue:T,newValue:L,storageArea:n}}))}function q(T){try{const L=n.getItem(e);if(T==null)$(L,null),n.removeItem(e);else{const C=S.write(T);L!==C&&(n.setItem(e,C),$(L,C))}}catch(L){h(L)}}function O(T){const L=T?T.newValue:n.getItem(e);if(L==null)return a&&w!=null&&n.setItem(e,S.write(w)),w;if(!T&&c){const C=S.read(L);return typeof c=="function"?c(C,w):E==="object"&&!Array.isArray(C)?{...w,...C}:C}else return typeof L!="string"?L:S.read(L)}function Y(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){_.value=w;return}if(!(T&&T.key!==e)){v();try{(T==null?void 0:T.newValue)!==S.write(_.value)&&(_.value=O(T))}catch(L){h(L)}finally{T?fn(b):b()}}}}function I(T){Y(T.detail)}return _}function Qm(e,t,n={}){const{window:r=zr}=n;return Ym(e,t,r==null?void 0:r.sessionStorage,n)}const Xm=Object.entries;var Zm={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const e_=Zm;Xm(e_.localeConfig);Qm("VUEPRESS_REDIRECT_LOCALES",{});const t_=It({setup(){},rootComponents:[]}),n_=Object.freeze(Object.defineProperty({__proto__:null,default:t_},Symbol.toStringTag,{value:"Module"}));var ie=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech&nbsp;lead",e.TeamLead="team&nbsp;lead",e.Developer="developer",e))(ie||{}),fe=(e=>(e.ActiveDeveloped="actively-developed",e.PassivelyMaintained="passively-maintained",e.AsIs="as-is",e.Experimental="experimental",e.LookingForMaintainer="looking-for-maintainer",e.Deprecated="deprecated",e))(fe||{}),M=(e=>(e.C="C",e.Go="Go",e.JavaScript="JS",e.TypeScript="TS",e.Rust="Rust",e.Python="Python",e.Php="PHP",e.Deno="Deno",e.NodeJS="NodeJS",e.Flask="Flask",e.React="React",e.Antd="Antd",e.Postgresql="PostgreSQL",e.Docker="Docker",e.Drone="Drone CI",e.Woodpecker="Woodpecker CI",e.Bash="Bash",e.TreeSitter="TreeSitter",e.Nix="Nix",e.Lua="Lua",e.Sqlite="Sqlite",e.Vue="Vue",e.Vuepress="Vuepress",e.Godot="Godot",e.Haskell="Haskell",e))(M||{});const r_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[ie.Author],technologies:[M.Nix],startDate:new Date("2024-04-24"),status:fe.ActiveDeveloped},{name:"picsg",url:"/pleshevskiy/picsg",description:"A tool for steganographing information in a picture encoded using the Vernam cipher.",roles:[ie.Author],technologies:[M.Haskell],startDate:new Date("2024-04-13"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"Mindustry tools",url:"/pleshevskiy/mindustry-tools",description:"Tools for the Mindustry game",roles:[ie.Author],technologies:[M.Nix,M.Godot],startDate:new Date("2024-01-07"),status:fe.PassivelyMaintained},{name:"Master Progress Rosmintrud tools",url:"https://rosmintrud.masterprogress.ru",description:"Internal service to prepare documents for the rosmintrud (SPA)",roles:[ie.TechLead],technologies:[M.Deno,M.Sqlite,M.TypeScript,M.Vue,M.Docker,M.Woodpecker,M.Nix],startDate:new Date("2023-07-03"),status:fe.PassivelyMaintained},{name:"yandexgpt_tg_bot",url:"/pleshevskiy/yandexgpt_tg_bot",description:"The Telegram bot to describe article with link by YandexGPT.",roles:[ie.Author],technologies:[M.JavaScript,M.NodeJS,M.Nix],startDate:new Date("2023-06-27"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"tree-sitter-plpgsql",url:"/pleshevskiy/tree-sitter-plpgsql",description:"plpgsql grammar for tree-sitter",roles:[ie.Author],technologies:[M.C,M.JavaScript,M.TreeSitter,M.Nix],startDate:new Date("2023-01-05"),status:fe.PassivelyMaintained},{name:"wd2",url:"/pleshevskiy/wd2",description:"A wrapper over d2 which allows to use additional configs from d2 file",roles:[ie.Author],technologies:[M.Bash,M.Nix],startDate:new Date("2022-12-12"),endDate:new Date("2023-07-31"),status:fe.AsIs},{name:"tree-sitter-d2",url:"/pleshevskiy/tree-sitter-d2",description:"d2 grammar for tree-sitter",roles:[ie.Author],technologies:[M.C,M.JavaScript,M.TreeSitter,M.Nix],startDate:new Date("2022-12-04"),status:fe.ActiveDeveloped},{name:"nix2lua",url:"/mynix/nix2lua",description:"This is a small but functional library that converts your nix configurations into lua format.",roles:[ie.Author],technologies:[M.Nix,M.Lua],startDate:new Date("2022-11-22"),status:fe.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-29"),status:fe.PassivelyMaintained},{name:"estring",url:"/pleshevskiy/estring",description:"A simple way to parse a string using type annotations.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-23"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"enve",url:"/pleshevskiy/enve",description:"It helps you work with environment variables and convert it to any type using only type annotations",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-18"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"docker stack drone plugin",url:"/pleshevskiy/docker_stack",description:"Deploy to production using `docker stack deploy`",roles:[ie.Author],technologies:[M.Docker,M.Drone,M.Woodpecker],startDate:new Date("2022-06-06"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"dexios",url:"/github/dexios",description:"Dexios is a fast, secure, and open source command-line encryption tool.",roles:[ie.Collaborator],technologies:[M.Rust],startDate:new Date("2022-06-01"),endDate:new Date("2023-02-28")},{name:"recipes",url:"/pleshevskiy/recipes",description:"Site with recipes which cares about privacy",roles:[ie.Author],technologies:[M.TypeScript,M.Deno,M.Rust],startDate:new Date("2022-05-04"),status:fe.PassivelyMaintained},{name:"pleshevski.ru",url:"/pleshevskiy/pleshevski.ru",description:"Source code of my personal site",roles:[ie.Author],technologies:[M.TypeScript,M.Vue,M.Vuepress,M.Nix],startDate:new Date("2022-03-16"),status:fe.PassivelyMaintained},{name:"paren",url:"/pleshevskiy/paren",description:"Library for parsing and rendering information.",roles:[ie.Author],technologies:[M.TypeScript,M.Deno],startDate:new Date("2022-03-14"),endDate:new Date("2024-07-25"),status:fe.Experimental},{name:"hwt",url:"/pleshevskiy/hwt",description:"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-02-04"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"ood_persistence",url:"/pleshevskiy/ood_persistence",description:"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2021-10-12"),endDate:new Date("2021-10-21"),status:fe.Deprecated},{name:"migra",url:"/pleshevskiy/migra",description:"Simple SQL migration manager for your project.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2021-01-31"),endDate:new Date("2022-03-17"),status:fe.AsIs},{name:"espruino-starter",url:"/pleshevskiy/espruino-starter",description:"Quickly start creating your new project on the espruino board or a board based on it.",roles:[ie.Author],technologies:[M.JavaScript],startDate:new Date("2021-08-23"),status:fe.AsIs},{name:"react-rest-request",url:"/pleshevskiy/react-rest-request",description:"Minimalistic REST API client for React inspired by Apollo.",roles:[ie.Author],technologies:[M.TypeScript,M.React],startDate:new Date("2020-10-04"),endDate:new Date("2023-03-02"),status:fe.Deprecated},{name:"sonic-channel",url:"/pleshevskiy/sonic-channel",description:"Rust client for sonic search backend.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2020-07-18"),status:fe.PassivelyMaintained},{name:"itconfig",url:"/pleshevskiy/itconfig",description:"Easy build a configs from environment variables and use it in globally.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2019-12-22"),endDate:new Date("2022-07-24"),status:fe.Deprecated},{name:"it-fsm",url:"/pleshevskiy/it-fsm",description:"Simple full-featured finite state machine for your project",roles:[ie.Author],technologies:[M.TypeScript,M.NodeJS,M.Deno],startDate:new Date("2019-10-11"),status:fe.PassivelyMaintained},{name:"Cabinet Master Progress",url:"https://cabinet.masterprogress.ru",description:"Student's cabinet of the educational center Master Progress (SSR + SPA)",roles:[ie.TechLead],technologies:[M.Python,M.Flask,M.Postgresql,M.TypeScript,M.React,M.Docker,M.Woodpecker,M.Nix],startDate:new Date("2019-09-22"),status:fe.PassivelyMaintained},{name:"genrss",url:"/pleshevskiy/genrss",description:"RSS generator for python",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2019-07-23"),status:fe.AsIs},{name:"marshmallow_pageinfo",url:"/pleshevskiy/marshmallow_pageinfo",description:"Page info marshmallow schema for api",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2019-10-05"),endDate:new Date("2023-03-02"),status:fe.AsIs},{name:"Binary Management",url:"https://www.binarymanagement.com",description:"Project management tool for interior designers",roles:[ie.Developer,ie.TechLead,ie.TeamLead],technologies:[M.TypeScript,M.NodeJS,M.React,M.Antd,M.Docker,M.Drone,M.Rust,M.Nix],startDate:new Date("2018-09-15"),status:fe.ActiveDeveloped},{name:"Core Spirit",url:"https://corespirit.com",description:"Social platform focusing on human and planetary enhancement",roles:[ie.Developer],technologies:[M.TypeScript,M.NodeJS,M.Go,M.Python,M.React,M.Docker,M.Drone],startDate:new Date("2018-09-05"),endDate:new Date("2019-12-31")},{name:"Master Progress",url:"https://masterprogress.ru",description:"Main website of the educational center Master Progress (SSR + Forms)",roles:[ie.TechLead],technologies:[M.Python,M.Flask,M.JavaScript,M.Nix],startDate:new Date("2018-04-10"),status:fe.PassivelyMaintained},{name:"ictmpl",url:"/pleshevskiy/ictmpl",description:"Generate projects from templates",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:fe.AsIs}];function o_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const s_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),i_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:s_},Symbol.toStringTag,{value:"Module"}));function Fn(e){return(e==null?void 0:e.valueOf())??1/0}const l_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},a_=ue({...l_,setup(e,{expose:t}){t();const n=R(()=>r_.concat().sort((o,s)=>Fn(s.endDate)-Fn(o.endDate)||Fn(s.startDate)-Fn(o.startDate))),r={date2num:Fn,works:n,get renderDate(){return o_},get w(){return i_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),c_=["href"],u_=["innerHTML"],f_={key:0};function d_(e,t,n,r,o,s){return V(),X("table",null,[K("thead",null,[K("tr",null,[K("th",null,ae(s.tableTheme.name),1),K("th",null,ae(s.tableTheme.description),1),K("th",null,ae(s.tableTheme.role),1),K("th",null,ae(s.tableTheme.technologies),1),K("th",null,ae(s.tableTheme.status),1),K("th",null,ae(s.tableTheme.dates),1)])]),K("tbody",null,[(V(!0),X(be,null,At(r.works,i=>(V(),X("tr",null,[K("td",null,[K("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},ae(i.name),9,c_)]),K("td",null,ae(i.description),1),K("td",{innerHTML:i.roles.join(", ")},null,8,u_),K("td",null,ae(i.technologies.join(", ")),1),K("td",null,ae(i.status),1),K("td",null,[K("div",null,[K("small",{class:Ke({grey:i.endDate})},ae(r.renderDate(i.startDate)),3)]),i.endDate?(V(),X("div",f_,[K("small",null,ae(r.renderDate(i.endDate)),1)])):Ie("",!0)])]))),256))])])}const p_=ye(a_,[["render",d_],["__file","ChronologicalWorksTable.vue"]]),h_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:oc,get ChronologicalWorksTable(){return p_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},g_={class:"works-table-wrapper"};function v_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":xe(()=>[K("div",g_,[ne(r.ChronologicalWorksTable)])]),_:1})}const m_=ye(h_,[["render",v_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),__=It({layouts:{WorksPage:m_}}),b_=Object.freeze(Object.defineProperty({__proto__:null,default:__},Symbol.toStringTag,{value:"Module"})),Rr=[sh,vh,Eh,xh,Rh,Ih,jh,qh,Dm,n_,b_].map(e=>e.default).filter(Boolean),y_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Wn=De(y_),S_=Rd,w_=()=>{const e=np({history:S_(va("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===xt){const r=lr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},E_=e=>{e.component("ClientOnly",ys),e.component("Content",Ss),e.component("RouteLink",lo)},P_=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=Cl((w,E)=>({get(){return w(),t.currentRoute.value.meta._pageChunk},set(S){t.currentRoute.value.meta._pageChunk=S,E()}})),s=R(()=>Zt.resolveLayouts(n)),i=R(()=>Zt.resolveRouteLocale(Wn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Wn.value,i.value)),a=R(()=>o.value.comp),c=R(()=>o.value.data),u=R(()=>c.value.frontmatter),f=R(()=>Zt.resolvePageHeadTitle(c.value,l.value)),p=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),h=R(()=>Zt.resolvePageLang(c.value,l.value)),m=R(()=>Zt.resolvePageLayout(c.value,s.value)),_={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:p,pageHeadTitle:f,pageLang:h,pageLayout:m,redirects:zo,routeLocale:i,routePath:r,routes:En,siteData:Wn,siteLocaleData:l};return e.provide(_s,_),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>p.value},$headTitle:{get:()=>f.value},$lang:{get:()=>h.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Wn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>ws}}),_},x_=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>dt(a)?`[${l}=${JSON.stringify(a)}]`:a?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)??null},C_=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return gs(t)&&Object.entries(t).forEach(([o,s])=>{dt(s)?r.setAttribute(o,s):s&&r.setAttribute(o,"")}),dt(n)&&r.appendChild(document.createTextNode(n)),r},T_=()=>{const e=sp(),t=ip();let n=[];const r=()=>{e.value.forEach(i=>{const l=x_(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=C_(l);a&&i.push(a)}),i},s=()=>{document.documentElement.lang=t.value;const i=o();n.forEach((l,a)=>{const c=i.findIndex(u=>l.isEqualNode(u));c===-1?(l.remove(),delete n[a]):i.splice(c,1)}),i.forEach(l=>document.head.appendChild(l)),n=[...n.filter(l=>!!l),...i]};Wt(fp,s),Ze(()=>{r(),je(e,s,{immediate:!1})})},k_=Nf,L_=async()=>{var n;const e=k_({name:"Vuepress",setup(){var s;T_();for(const i of Rr)(s=i.setup)==null||s.call(i);const r=Rr.flatMap(({rootComponents:i=[]})=>i.map(l=>ve(l))),o=lp();return()=>[ve(o.value),r]}}),t=w_();E_(e),P_(e,t,Rr);for(const r of Rr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Wn}));return e.use(t),{app:e,router:t}};L_().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{ye as _,K as a,Kt as b,X as c,L_ as createVueApp,ne as d,Yu as e,V as o,cs as r,xe as w};
+ */const zi=(e,t)=>{e.classList.add(t)},Gi=(e,t)=>{e.classList.remove(t)},Ch=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Ao=(e,t,n)=>e<t?t:e>n?n:e,Ji=e=>(-1+e)*100,Th=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),kh=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Tr=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=s=>{const{style:i}=document.body;if(s in i)return s;const l=s.charAt(0).toUpperCase()+s.slice(1);let a=e.length;for(;a--;){const c=`${e[a]}${l}`;if(c in i)return c}return s},r=s=>{const i=kh(s);return t[i]??(t[i]=n(i))},o=(s,i,l)=>{s.style[r(i)]=l};return(s,i)=>{for(const l in i){const a=i[l];Object.hasOwn(i,l)&&fh(a)&&o(s,l,a)}}})(),Pt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'<div class="bar" role="bar"></div>'},Re={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Pt,r=Re.isStarted(),o=Ao(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,Th(l=>{Tr(i,{transform:`translate3d(${Ji(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Tr(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Tr(s,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Re.remove(),l()},t)},t)):setTimeout(()=>{l()},t)}),Re},isStarted:()=>typeof Re.percent=="number",start:()=>{Re.percent||Re.set(0);const e=()=>{setTimeout(()=>{Re.percent&&(Re.trickle(),e())},Pt.trickleSpeed)};return e(),Re},done:e=>!e&&!Re.percent?Re:Re.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Re;return t?(t=Ao(t+(typeof e=="number"?e:(1-t)*Ao(Math.random()*t,.1,.95)),0,.994),Re.set(t)):Re.start()},trickle:()=>Re.increase(Math.random()*Pt.trickleRate),render:e=>{if(Re.isRendered())return document.getElementById("nprogress");zi(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Pt.template;const n=t.querySelector(Pt.barSelector),r=document.querySelector(Pt.parent),o=e?"-100":Ji(Re.percent??0);return Tr(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&zi(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{Gi(document.documentElement,"nprogress-busy"),Gi(document.querySelector(Pt.parent),"nprogress-custom-parent"),Ch(document.getElementById("nprogress"))}},Lh=()=>{Ze(()=>{const e=vr(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Re.start()}),e.afterEach(n=>{t.add(n.path),Re.done()})})},Ah=It({setup(){Lh()}}),Rh=Object.freeze(Object.defineProperty({__proto__:null,default:Ah},Symbol.toStringTag,{value:"Module"})),Dh=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{ze("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}})},Oh={setup(){Dh()}},Ih=Object.freeze(Object.defineProperty({__proto__:null,default:Oh},Symbol.toStringTag,{value:"Module"})),Mh="VUEPRESS_CODE_TAB_STORE",kr=Ls(Mh,{}),$h=ue({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=ke(e.active),r=De([]),o=()=>{e.tabId&&(kr.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),e.tabId&&(kr.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>kr.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&kr.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?ve("div",{class:"vp-code-tabs"},[ve("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return ve("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return ve("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[ve("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),Nh="VUEPRESS_TAB_STORE",Ro=Ls(Nh,{}),Hh=ue({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=ke(e.active),r=De([]),o=()=>{e.tabId&&(Ro.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),o()},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Ro.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Ro.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?ve("div",{class:"vp-tabs"},[ve("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return ve("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return ve("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[ve("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),Vh={enhance:({app:e})=>{e.component("CodeTabs",$h),e.component("Tabs",Hh)}},jh=Object.freeze(Object.defineProperty({__proto__:null,default:Vh},Symbol.toStringTag,{value:"Module"})),Fh=JSON.parse(`{"repo":"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru","locales":{"/":{"selectLanguageName":"Русский","navbar":["/","/works"],"notFound":["Верните страницу!","Мы потеряли страницу...","Вы заблокированы в лабиринте.","Искали кота?","Страница украдена.","Ошиблись в параллельной вселенной."],"backToHome":"Вернуться на главную","worksTable":{"name":"Название","description":"Описание","role":"Роль","technologies":"Технологии","status":"Статус","dates":"Даты"}},"/eng/":{"selectLanguageName":"English","navbar":["/eng/","/eng/works"],"notFound":["Return the page!","We lost a page...","You're blocked in a labyrinth.","Looking for a cat?","The page has been stolen.","Wrong turn in parallel universe."],"backToHome":"Back to home","worksTable":{"name":"Name","description":"Description","role":"Role","technologies":"Technologies","status":"Status","dates":"Dates"}}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","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"}`),Bh=ke(Fh),Ua=()=>Bh,Ka=Symbol(""),Wh=()=>{const e=qe(Ka);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Uh=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Kh=It({enhance({app:e}){const t=Ua(),n=e._context.provides[_s],r=R(()=>Uh(t.value,n.routeLocale.value));e.provide(Ka,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),qh=Object.freeze(Object.defineProperty({__proto__:null,default:Kh},Symbol.toStringTag,{value:"Module"})),Me=()=>{const{pageData:e,pageFrontmatter:t,pageLang:n,siteData:r,siteLocaleData:o,...s}=yt();return{...s,page:e,frontmatter:t,lang:n,site:r,siteLocale:o,theme:Ua(),themeLocale:Wh()}},qa=Symbol(""),zh=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{Ts(e,t)}),eo(()=>{t()})},As=()=>{const e=qe(qa);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Gh=()=>{const{themeLocale:e}=Me(),t=Kp(),n=Ls("vuepress-color-scheme",e.value.colorMode),r=R({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(qa,r),zh(r)},za=Symbol("headers"),Jh=()=>{const e=Oa(za);if(!e)throw new Error("useHeaders() is called without provider.");return e},Yh=()=>{const{frontmatter:e,themeLocale:t}=Me(),n=ke([]),r=R(()=>e.value.sidebarDepth??t.value.sidebarDepth??2),o=()=>{if(r.value<=0){n.value=[];return}n.value=ch({levels:[2,r.value+1],ignore:[".vp-badge"]})};xp(za,n),io(s=>{s==="beforeUnmount"?n.value=[]:o()})};let Do=null,jn=null;const Qh={wait:()=>Do,pending:()=>{Do=new Promise(e=>{jn=e})},resolve:()=>{jn==null||jn(),Do=null,jn=null}},Ga=()=>Qh,Ln=(e,t)=>{const{notFound:n,meta:r,path:o}=lr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},xn=(e="",t="")=>Ba(t)||gr(t)?t:`${Yf(e)}${t}`,Xh=e=>({text:e.title,link:e.link,children:Rs(e.children)}),Rs=e=>e?e.map(t=>Xh(t)):[],Ja=(e,t)=>[{text:e.title,children:Rs(t)}],Ya=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Ln(xn(i,s)):dt(s.link)?{...s,link:Wa(s.link)?Ln(xn(i,s.link)).link:s.link}:s;if("children"in l)return{...l,children:l.children.map(c=>o(c,xn(i,l.prefix)))};if(l.link===n){const c=((a=t[0])==null?void 0:a.level)===1?t[0].children:t;return{...l,children:Rs(c)}}return l};return e.map(s=>o(s,r))},Zh=(e,t,n,r)=>{const o=dh(e).sort((s,i)=>i.length-s.length);for(const s of o)if(Fa(decodeURI(r),s)){const i=e[s];return i?i==="heading"?Ja(t,n):Ya(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},Qa=Symbol("sidebarItems"),Ds=()=>{const e=qe(Qa);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},eg=(e,t,n,r,o)=>e===!1?[]:e==="heading"?Ja(t,o):Array.isArray(e)?Ya(e,o,n,r):gs(e)?Zh(e,t,o,n):[],tg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=Me(),o=Jh(),s=Aa(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>eg(i.value,t.value,s.value,n.value,o.value));Wt(Qa,l)},ng=ue({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ye=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function rg(e,t,n,r,o,s){return V(),X("span",{class:Ke(["vp-badge",n.type]),style:An({verticalAlign:n.vertical})},[Pe(e.$slots,"default",{},()=>[Kt(ae(n.text),1)])],6)}const og=ye(ng,[["render",rg],["__file","Badge.vue"]]),sg=ue({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function ig(e,t,n,r,o,s){return V(),Le(hs,{name:"vp-fade-slide-y",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:xe(()=>[Pe(e.$slots,"default")]),_:3})}const lg=ye(sg,[["render",ig],["__file","VPFadeSlideYTransition.vue"]]),ag=ue({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const{frontmatter:n}=Me(),r=R(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),cg={key:0,class:"vp-features"};function ug(e,t,n,r,o,s){return r.features.length?(V(),X("div",cg,[(V(!0),X(be,null,At(r.features,i=>(V(),X("div",{key:i.title,class:"vp-feature"},[K("h2",null,ae(i.title),1),K("p",null,ae(i.details),1)]))),128))])):Ie("",!0)}const fg=ye(ag,[["render",ug],["__file","VPHomeFeatures.vue"]]),dg=ue({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=bs(),r=R(()=>n.value.footer),o=R(()=>n.value.footerHtml),s={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),pg=["innerHTML"],hg=["textContent"];function gg(e,t,n,r,o,s){return r.footer?(V(),X(be,{key:0},[r.footerHtml?(V(),X("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,pg)):(V(),X("div",{key:1,class:"vp-footer","vp-footer":"",textContent:ae(r.footer)},null,8,hg))],64)):Ie("",!0)}const vg=ye(dg,[["render",gg],["__file","VPHomeFooter.vue"]]),mg=ue({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return hp}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function _g(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},Su({before:xe(()=>[Pe(e.$slots,"before",po(Or(n.config)))]),after:xe(()=>[Pe(e.$slots,"after",po(Or(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:xe(()=>[Pe(e.$slots,"default",po(Or(n.config)))]),key:"0"}:void 0]),1032,["config"])}const On=ye(mg,[["render",_g],["__file","VPAutoLink.vue"]]),bg=ue({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=Me(),o=As(),s=R(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),i=R(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),l=R(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),a=R(()=>n.value.heroAlt||s.value||"hero"),c=R(()=>n.value.heroHeight??280),u=R(()=>Array.isArray(n.value.actions)?n.value.actions.map(({type:h="primary",...m})=>({type:h,...m})):[]),p={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:s,tagline:i,heroImage:l,heroAlt:a,heroHeight:c,actions:u,HomeHeroImage:()=>{if(!l.value)return null;const h=ve("img",{class:"vp-hero-image",src:ws(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?h:ve(ys,()=>h)},VPAutoLink:On};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),yg={class:"vp-hero"},Sg={key:0,id:"main-title"},wg={key:1,class:"vp-hero-description"},Eg={key:2,class:"vp-hero-actions"};function Pg(e,t,n,r,o,s){return V(),X("header",yg,[ne(r.HomeHeroImage),r.heroText?(V(),X("h1",Sg,ae(r.heroText),1)):Ie("",!0),r.tagline?(V(),X("p",wg,ae(r.tagline),1)):Ie("",!0),r.actions.length?(V(),X("p",Eg,[(V(!0),X(be,null,At(r.actions,i=>(V(),Le(r.VPAutoLink,{key:i.text,class:Ke(["vp-hero-action-button",[i.type]]),config:i},null,8,["class","config"]))),128))])):Ie("",!0)])}const xg=ye(bg,[["render",Pg],["__file","VPHomeHero.vue"]]),Cg=ue({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:fg,VPHomeFooter:vg,VPHomeHero:xg,get Content(){return Ss}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Tg={class:"vp-home"},kg={"vp-content":""};function Lg(e,t,n,r,o,s){return V(),X("main",Tg,[ne(r.VPHomeHero),ne(r.VPHomeFeatures),K("div",kg,[ne(r.Content)]),ne(r.VPHomeFooter)])}const Ag=ye(Cg,[["render",Lg],["__file","VPHome.vue"]]),Rg=ue({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=Me(),s=As(),i=R(()=>o.value.home||n.value),l=R(()=>r.value.title),a=R(()=>s.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),c=R(()=>o.value.logoAlt??l.value),u=R(()=>l.value.toLocaleUpperCase().trim()===c.value.toLocaleUpperCase().trim()),p={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:s,navbarBrandLink:i,navbarBrandTitle:l,navbarBrandLogo:a,navbarBrandLogoAlt:c,navBarLogoAltMatchesTitle:u,NavbarBrandLogo:()=>{if(!a.value)return null;const h=ve("img",{class:"vp-site-logo",src:ws(a.value),alt:c.value});return o.value.logoDark===void 0?h:ve(ys,()=>h)},get RouteLink(){return lo}};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Dg=["aria-hidden"];function Og(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:xe(()=>[ne(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),X("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},ae(r.navbarBrandTitle),11,Dg)):Ie("",!0)]),_:1},8,["to"])}const Ig=ye(Rg,[["render",Og],["__file","VPNavbarBrand.vue"]]),Mg=ue({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:s=>{s.style.height=`${s.scrollHeight}px`},unsetHeight:s=>{s.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function $g(e,t,n,r,o,s){return V(),Le(hs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:xe(()=>[Pe(e.$slots,"default")]),_:3})}const Xa=ye(Mg,[["render",$g],["__file","VPDropdownTransition.vue"]]),Ng=ue({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Tl(n),[o,s]=$a(),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};io(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:On,VPDropdownTransition:Xa};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Hg=["aria-label"],Vg={class:"title"},jg=["aria-label"],Fg={class:"title"},Bg={class:"vp-navbar-dropdown"},Wg={class:"vp-navbar-dropdown-subtitle"},Ug={key:1},Kg={class:"vp-navbar-dropdown-subitem-wrapper"};function qg(e,t,n,r,o,s){return V(),X("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[K("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[K("span",Vg,ae(r.config.text),1),t[1]||(t[1]=K("span",{class:"arrow down"},null,-1))],8,Hg),K("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[K("span",Fg,ae(r.config.text),1),K("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,jg),ne(r.VPDropdownTransition,null,{default:xe(()=>[Br(K("ul",Bg,[(V(!0),X(be,null,At(r.config.children,i=>(V(),X("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),X(be,{key:0},[K("h4",Wg,[i.link?(V(),Le(r.VPAutoLink,{key:0,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&i.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(V(),X("span",Ug,ae(i.text),1))]),K("ul",Kg,[(V(!0),X(be,null,At(i.children,l=>(V(),X("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[ne(r.VPAutoLink,{config:l,onFocusout:()=>{r.isLastItemOfArray(l,i.children)&&r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(V(),Le(r.VPAutoLink,{key:1,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[qr,r.open]])]),_:1})],2)}const zg=ye(Ng,[["render",qg],["__file","VPNavbarDropdown.vue"]]),Za=(e,t="")=>dt(e)?Ln(xn(t,e)):"children"in e?{...e,children:e.children.map(n=>Za(n,xn(t,e.prefix)))}:{...e,link:Wa(e.link)?Ln(xn(t,e.link)).link:e.link},Gg=()=>{const{themeLocale:e}=Me();return R(()=>(e.value.navbar||[]).map(t=>Za(t)))},ec=e=>!ro(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,Jg=()=>{const{themeLocale:e}=Me(),t=R(()=>e.value.repo),n=R(()=>t.value?ec(t.value):null),r=R(()=>t.value&&!ro(t.value)?`https://github.com/${t.value}`:t.value),o=R(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return R(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},Yg=()=>{const e=Dn(),t=uh(),{routeLocale:n,site:r,siteLocale:o,theme:s,themeLocale:i}=Me();return R(()=>{const l=Object.keys(r.value.locales);if(l.length<2)return[];const a=e.path,c=e.fullPath;return[{text:`${i.value.selectLanguageText}`,ariaLabel:`${i.value.selectLanguageAriaLabel??i.value.selectLanguageText}`,children:l.map(f=>{var E,S;const p=((E=r.value.locales)==null?void 0:E[f])??{},h=((S=s.value.locales)==null?void 0:S[f])??{},m=`${p.lang}`,_=h.selectLanguageName??m;if(m===o.value.lang)return{text:_,activeMatch:".",link:e.fullPath};const w=a.replace(n.value,f);return{text:_,link:t.value.some(v=>v===w)?c.replace(a,w):h.home??f}})}]})},Qg="719px",Xg={mobile:Qg};var ar;(function(e){e.Mobile="mobile"})(ar||(ar={}));const Zg={[ar.Mobile]:Number.parseInt(Xg.mobile.replace("px",""),10)},tc=(e,t)=>{const n=Zg[e];Number.isInteger(n)&&(ze("orientationchange",()=>{t(n)},!1),ze("resize",()=>{t(n)},!1),Ze(()=>{t(n)}))},ev=ue({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=Gg(),o=Yg(),s=Jg(),i=ke(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);tc(ar.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:On,VPNavbarDropdown:zg};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),tv=["aria-label"];function nv(e,t,n,r,o,s){return r.navbarLinks.length?(V(),X("nav",{key:0,class:"vp-navbar-items","aria-label":r.navbarLabel},[(V(!0),X(be,null,At(r.navbarLinks,i=>(V(),X("div",{key:i.text,class:"vp-navbar-item"},["children"in i?(V(),Le(r.VPNavbarDropdown,{key:0,class:Ke({mobile:r.isMobile}),config:i},null,8,["class","config"])):(V(),Le(r.VPAutoLink,{key:1,config:i},null,8,["config"]))]))),128))],8,tv)):Ie("",!0)}const nc=ye(ev,[["render",nv],["__file","VPNavbarItems.vue"]]),rv={},ov={class:"dark-icon",viewBox:"0 0 32 32"};function sv(e,t){return V(),X("svg",ov,t[0]||(t[0]=[K("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)]))}const iv=ye(rv,[["render",sv],["__file","VPDarkIcon.vue"]]),lv={},av={class:"light-icon",viewBox:"0 0 32 32"};function cv(e,t){return V(),X("svg",av,t[0]||(t[0]=[Yu('<path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path>',9)]))}const uv=ye(lv,[["render",cv],["__file","VPLightIcon.vue"]]),fv=ue({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=As(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:iv,VPLightIcon:uv};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),dv=["title"];function pv(e,t,n,r,o,s){return V(),X("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[Br(ne(r.VPLightIcon,null,null,512),[[qr,!r.isDarkMode]]),Br(ne(r.VPDarkIcon,null,null,512),[[qr,r.isDarkMode]])],8,dv)}const hv=ye(fv,[["render",pv],["__file","VPToggleColorModeButton.vue"]]),gv=ue({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r={themeLocale:n};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),vv=["title"];function mv(e,t,n,r,o,s){return V(),X("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=i=>e.$emit("toggle"))},t[1]||(t[1]=[K("div",{class:"icon","aria-hidden":"true"},[K("span"),K("span"),K("span")],-1)]),8,vv)}const _v=ye(gv,[["render",mv],["__file","VPToggleSidebarButton.vue"]]),bv=ue({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=Va("SearchBox")?cs("SearchBox"):()=>null,{themeLocale:r}=Me(),o=Fs("navbar"),s=Fs("navbar-brand"),i=ke(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var m;const p=(m=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:m.getComputedStyle(u,null)[f],h=Number.parseInt(p,10);return Number.isNaN(h)?0:h};tc(ar.Mobile,u=>{var p;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((p=s.value)==null?void 0:p.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:Ig,VPNavbarItems:nc,VPToggleColorModeButton:hv,VPToggleSidebarButton:_v};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),yv={ref:"navbar",class:"vp-navbar","vp-navbar":""},Sv={ref:"navbar-brand"};function wv(e,t,n,r,o,s){return V(),X("header",yv,[ne(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),K("span",Sv,[ne(r.VPNavbarBrand)],512),K("div",{class:"vp-navbar-items-wrapper",style:An(r.linksWrapperStyle)},[Pe(e.$slots,"before"),ne(r.VPNavbarItems,{class:"vp-hide-mobile"}),Pe(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):Ie("",!0),ne(r.SearchBox)],4)],512)}const Ev=ye(bv,[["render",wv],["__file","VPNavbar.vue"]]),Pv={},xv={class:"edit-icon",viewBox:"0 0 1024 1024"};function Cv(e,t){return V(),X("svg",xv,t[0]||(t[0]=[K("g",{fill:"currentColor"},[K("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),K("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const Tv=ye(Pv,[["render",Cv],["__file","VPEditIcon.vue"]]),kv=()=>{const{themeLocale:e,page:t,frontmatter:n}=Me();return R(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})},Lv={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"},Av=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=ec(e);return n!==null?Lv[n]:null},Rv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=Av({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,ro(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ma(`${va(n)}/${r}`)):null},Dv=()=>{const{frontmatter:e,page:t,themeLocale:n}=Me();return R(()=>{if(!(e.value.editLink??n.value.editLink??!0))return null;const{repo:o,docsRepo:s=o,docsBranch:i="main",docsDir:l="",editLinkText:a}=n.value;if(!s)return null;const c=Rv({docsRepo:s,docsBranch:i,docsDir:l,filePathRelative:t.value.filePathRelative,editLinkPattern:e.value.editLinkPattern??n.value.editLinkPattern});return c?{text:a??"Edit this page",link:c}:null})},Ov=()=>{const{frontmatter:e,page:t,themeLocale:n}=Me();return R(()=>{var s;return!(e.value.lastUpdated??n.value.lastUpdated??!0)||!((s=t.value.git)!=null&&s.updatedTime)?null:new Date(t.value.git.updatedTime).toLocaleString()})},Iv=ue({__name:"VPPageMeta",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=Dv(),o=Ov(),s=kv(),i={themeLocale:n,editLink:r,lastUpdated:o,contributors:s,VPAutoLink:On,VPEditIcon:Tv};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),Mv={class:"vp-page-meta"},$v={key:0,class:"vp-meta-item edit-link"},Nv={class:"vp-meta-item git-info"},Hv={key:0,class:"vp-meta-item last-updated"},Vv={class:"meta-item-label"},jv={class:"meta-item-info"},Fv={key:1,class:"vp-meta-item contributors"},Bv={class:"meta-item-label"},Wv={class:"meta-item-info"},Uv=["title"];function Kv(e,t,n,r,o,s){const i=cs("ClientOnly");return V(),X("footer",Mv,[r.editLink?(V(),X("div",$v,[ne(r.VPAutoLink,{class:"label",config:r.editLink},{before:xe(()=>[ne(r.VPEditIcon)]),_:1},8,["config"])])):Ie("",!0),K("div",Nv,[r.lastUpdated?(V(),X("div",Hv,[K("span",Vv,ae(r.themeLocale.lastUpdatedText)+": ",1),ne(i,null,{default:xe(()=>[K("span",jv,ae(r.lastUpdated),1)]),_:1})])):Ie("",!0),r.contributors&&r.contributors.length?(V(),X("div",Fv,[K("span",Bv,ae(r.themeLocale.contributorsText)+": ",1),K("span",Wv,[(V(!0),X(be,null,At(r.contributors,(l,a)=>(V(),X(be,{key:a},[K("span",{class:"contributor",title:`email: ${l.email}`},ae(l.name),9,Uv),a!==r.contributors.length-1?(V(),X(be,{key:0},[Kt(", ")],64)):Ie("",!0)],64))),128))])])):Ie("",!0)])])}const qv=ye(Iv,[["render",Kv],["__file","VPPageMeta.vue"]]),zv=()=>{const e=vr(),t=Dn();return n=>{n&&(Ba(n)?t.fullPath!==n&&e.push(n):gr(n)?window.open(n):e.push(encodeURI(n)))}},Yi=(e,t)=>e===!1?!1:dt(e)?Ln(e,t):gs(e)?{...e,link:Ln(e.link,t).link}:null,Go=(e,t,n)=>{const r=e.findIndex(s=>s.link===t);if(r!==-1){const s=e[r+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Go(s.children,t,n);if(i)return i}const o=e.findIndex(s=>"prefix"in s&&s.prefix===t);if(o!==-1){const s=e[o+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},Gv=()=>{const{frontmatter:e,themeLocale:t}=Me(),n=Ds(),r=Aa(),o=R(()=>{const i=Yi(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Go(n.value,r.value,-1))}),s=R(()=>{const i=Yi(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Go(n.value,r.value,1))});return{prevLink:o,nextLink:s}},Jv=ue({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=Me(),r=zv(),{prevLink:o,nextLink:s}=Gv(),i=R(()=>n.value.pageNavbarLabel??"page navigation");ze("keydown",a=>{a.altKey&&(a.key==="ArrowRight"?s.value&&(r(s.value.link),a.preventDefault()):a.key==="ArrowLeft"&&o.value&&(r(o.value.link),a.preventDefault()))});const l={themeLocale:n,navigate:r,prevLink:o,nextLink:s,navbarLabel:i,VPAutoLink:On};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),Yv=["aria-label"],Qv={class:"hint"},Xv={class:"link"},Zv={class:"external-link"},em={class:"hint"},tm={class:"link"},nm={class:"external-link"};function rm(e,t,n,r,o,s){return r.prevLink||r.nextLink?(V(),X("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(V(),Le(r.VPAutoLink,{key:0,class:"prev",config:r.prevLink},{default:xe(()=>[K("div",Qv,[t[0]||(t[0]=K("span",{class:"arrow left"},null,-1)),Kt(" "+ae(r.themeLocale.prev??"Prev"),1)]),K("div",Xv,[K("span",Zv,ae(r.prevLink.text),1)])]),_:1},8,["config"])):Ie("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:xe(()=>[K("div",em,[Kt(ae(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=K("span",{class:"arrow right"},null,-1))]),K("div",tm,[K("span",nm,ae(r.nextLink.text),1)])]),_:1},8,["config"])):Ie("",!0)],8,Yv)):Ie("",!0)}const om=ye(Jv,[["render",rm],["__file","VPPageNav.vue"]]),sm=ue({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:qv,VPPageNav:om,get Content(){return Ss}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),im={class:"vp-page"},lm={"vp-content":""};function am(e,t,n,r,o,s){return V(),X("main",im,[Pe(e.$slots,"top"),K("div",lm,[Pe(e.$slots,"content-top"),ne(r.Content),Pe(e.$slots,"content-bottom")]),ne(r.VPPageMeta),ne(r.VPPageNav),Pe(e.$slots,"bottom")])}const cm=ye(sm,[["render",am],["__file","VPPage.vue"]]),Qi=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),um=(e,t)=>{if(t.hash===e)return!0;const n=Qi(t.path),r=Qi(e);return n===r},rc=(e,t)=>e.link&&um(e.link,t)?!0:"children"in e?e.children.some(n=>rc(n,t)):!1,fm=ue({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Tl(n),s=Dn(),i=vr(),l=R(()=>r.value.collapsible),a=R(()=>rc(r.value,s)),c=R(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:a.value,collapsible:l.value})),u=R(()=>l.value?a.value:!0),[f,p]=$a(u.value),h=w=>{l.value&&(w.preventDefault(),p())},m=i.afterEach(()=>{fn(()=>{f.value=u.value})});as(()=>{m()});const _={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:p,onClick:h,unregisterRouterHook:m,VPAutoLink:On,VPDropdownTransition:Xa};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}}),dm={class:"vp-sidebar-children"};function pm(e,t,n,r,o,s){const i=cs("VPSidebarItem",!0);return V(),X("li",null,[r.item.link?(V(),Le(r.VPAutoLink,{key:0,class:Ke(r.itemClass),config:r.item},{after:xe(()=>[r.collapsible?(V(),X("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):Ie("",!0)]),_:1},8,["class","config"])):(V(),X("p",{key:1,tabindex:"0",class:Ke(r.itemClass),onClick:r.onClick,onKeydown:If(r.onClick,["enter"])},[Kt(ae(r.item.text)+" ",1),r.collapsible?(V(),X("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):Ie("",!0)],34)),"children"in r.item&&r.item.children.length?(V(),Le(r.VPDropdownTransition,{key:2},{default:xe(()=>[Br(K("ul",dm,[(V(!0),X(be,null,At(r.item.children,l=>(V(),Le(i,{key:`${r.depth}${l.text}${l.link}`,item:l,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[qr,r.isOpen]])]),_:1})):Ie("",!0)])}const hm=ye(fm,[["render",pm],["__file","VPSidebarItem.vue"]]),gm=ue({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=Dn(),r=Ds();Ze(()=>{je(()=>n.hash,s=>{const i=document.querySelector(".vp-sidebar");if(!i)return;const l=document.querySelector(`.vp-sidebar .vp-sidebar-item.auto-link[href="${n.path}${s}"]`);if(!l)return;const{top:a,height:c}=i.getBoundingClientRect(),{top:u,height:f}=l.getBoundingClientRect();u<a?l.scrollIntoView(!0):u+f>a+c&&l.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:hm};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),vm={key:0,class:"vp-sidebar-items"};function mm(e,t,n,r,o,s){return r.sidebarItems.length?(V(),X("ul",vm,[(V(!0),X(be,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):Ie("",!0)}const _m=ye(gm,[["render",mm],["__file","VPSidebarItems.vue"]]),bm=ue({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:nc,VPSidebarItems:_m};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ym={class:"vp-sidebar","vp-sidebar":""};function Sm(e,t,n,r,o,s){return V(),X("aside",ym,[ne(r.VPNavbarItems),Pe(e.$slots,"top"),ne(r.VPSidebarItems),Pe(e.$slots,"bottom")])}const wm=ye(bm,[["render",Sm],["__file","VPSidebar.vue"]]),Em=ue({__name:"Layout",setup(e,{expose:t}){t();const{frontmatter:n,page:r,themeLocale:o}=Me(),s=R(()=>n.value.navbar!==!1&&o.value.navbar!==!1),i=Ds(),l=ke(!1),a=S=>{l.value=typeof S=="boolean"?S:!l.value},c={x:0,y:0},u=S=>{c.x=S.changedTouches[0].clientX,c.y=S.changedTouches[0].clientY},f=S=>{const v=S.changedTouches[0].clientX-c.x,b=S.changedTouches[0].clientY-c.y;Math.abs(v)>Math.abs(b)&&Math.abs(v)>40&&(v>0&&c.x<=80?a(!0):a(!1))},p=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),h=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":p.value},n.value.pageClass]);io(()=>{a(!1)});const m=Ga(),_=m.resolve,w=m.pending,E={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:p,containerClass:h,scrollPromise:m,onBeforeEnter:_,onBeforeLeave:w,VPFadeSlideYTransition:lg,VPHome:Ag,VPNavbar:Ev,VPPage:cm,VPSidebar:wm};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});function Pm(e,t,n,r,o,s){return V(),X("div",{class:Ke(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[Pe(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:xe(()=>[Pe(e.$slots,"navbar-before")]),after:xe(()=>[Pe(e.$slots,"navbar-after")]),_:3})):Ie("",!0)]),K("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),Pe(e.$slots,"sidebar",{},()=>[ne(r.VPSidebar,null,{top:xe(()=>[Pe(e.$slots,"sidebar-top")]),bottom:xe(()=>[Pe(e.$slots,"sidebar-bottom")]),_:3})]),Pe(e.$slots,"page",{},()=>[ne(r.VPFadeSlideYTransition,{onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:xe(()=>[r.frontmatter.home?(V(),Le(r.VPHome,{key:0})):(V(),Le(r.VPPage,{key:r.page.path},{top:xe(()=>[Pe(e.$slots,"page-top")]),"content-top":xe(()=>[Pe(e.$slots,"page-content-top")]),"content-bottom":xe(()=>[Pe(e.$slots,"page-content-bottom")]),bottom:xe(()=>[Pe(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const oc=ye(Em,[["render",Pm],["__file","Layout.vue"]]),xm=ue({__name:"NotFound",setup(e,{expose:t}){t();const{routeLocale:n,themeLocale:r}=Me(),o=R(()=>r.value.notFound??["Not Found"]),s=()=>o.value[Math.floor(Math.random()*o.value.length)],i=R(()=>r.value.home??n.value),l=R(()=>r.value.backToHome??"Back to home"),a={routeLocale:n,themeLocale:r,messages:o,getMsg:s,homeLink:i,homeText:l,get RouteLink(){return lo}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Cm={class:"vp-theme-container","vp-container":""},Tm={class:"page"},km={"vp-content":""};function Lm(e,t,n,r,o,s){return V(),X("div",Cm,[K("main",Tm,[K("div",km,[t[0]||(t[0]=K("h1",null,"404",-1)),K("blockquote",null,ae(r.getMsg()),1),ne(r.RouteLink,{to:r.homeLink},{default:xe(()=>[Kt(ae(r.homeText),1)]),_:1},8,["to"])])])])}const Am=ye(xm,[["render",Lm],["__scopeId","data-v-0b944fad"],["__file","NotFound.vue"]]),Rm=It({enhance({app:e,router:t}){Va("Badge")||e.component("Badge",og);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Ga().wait(),n(...r))},setup(){Gh(),Yh(),tg()},layouts:{Layout:oc,NotFound:Am}}),Dm=Object.freeze(Object.defineProperty({__proto__:null,default:Rm},Symbol.toStringTag,{value:"Module"}));function Om(e){return Zo()?(al(e),!0):!1}function Os(e){return typeof e=="function"?e():Lt(e)}const Im=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Mm=Object.prototype.toString,$m=e=>Mm.call(e)==="[object Object]",Nm=()=>{};function Hm(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const sc=e=>e();function Vm(e=sc){const t=ke(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:o}}function jm(e){return Jt()}function Fm(e,t,n={}){const{eventFilter:r=sc,...o}=n;return je(e,Hm(r,t),o)}function Bm(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=Vm(r);return{stop:Fm(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function Wm(e,t=!0,n){jm()?Ze(e,n):t?e():fn(e)}function Um(e){var t;const n=Os(e);return(t=n==null?void 0:n.$el)!=null?t:n}const zr=Im?window:void 0;function Xi(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=zr):[t,n,r,o]=e,!t)return Nm;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,p,h)=>(u.addEventListener(f,p,h),()=>u.removeEventListener(f,p,h)),a=je(()=>[Um(t),Os(o)],([u,f])=>{if(i(),!u)return;const p=$m(f)?{...f}:f;s.push(...n.flatMap(h=>r.map(m=>l(u,h,m,p))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return Om(c),c}const Lr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ar="__vueuse_ssr_handlers__",Km=qm();function qm(){return Ar in Lr||(Lr[Ar]=Lr[Ar]||{}),Lr[Ar]}function zm(e,t){return Km[e]||t}function Gm(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"}const Jm={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()}},Zi="vueuse-storage";function Ym(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=zr,eventFilter:p,onError:h=T=>{console.error(T)},initOnMounted:m}=r,_=(u?De:ke)(typeof t=="function"?t():t);if(!n)try{n=zm("getDefaultStorage",()=>{var T;return(T=zr)==null?void 0:T.localStorage})()}catch(T){h(T)}if(!n)return _;const w=Os(t),E=Gm(w),S=(o=r.serializer)!=null?o:Jm[E],{pause:v,resume:b}=Bm(_,()=>q(_.value),{flush:s,deep:i,eventFilter:p});f&&l&&Wm(()=>{Xi(f,"storage",Y),Xi(f,Zi,I),m&&Y()}),m||Y();function $(T,L){f&&f.dispatchEvent(new CustomEvent(Zi,{detail:{key:e,oldValue:T,newValue:L,storageArea:n}}))}function q(T){try{const L=n.getItem(e);if(T==null)$(L,null),n.removeItem(e);else{const C=S.write(T);L!==C&&(n.setItem(e,C),$(L,C))}}catch(L){h(L)}}function O(T){const L=T?T.newValue:n.getItem(e);if(L==null)return a&&w!=null&&n.setItem(e,S.write(w)),w;if(!T&&c){const C=S.read(L);return typeof c=="function"?c(C,w):E==="object"&&!Array.isArray(C)?{...w,...C}:C}else return typeof L!="string"?L:S.read(L)}function Y(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){_.value=w;return}if(!(T&&T.key!==e)){v();try{(T==null?void 0:T.newValue)!==S.write(_.value)&&(_.value=O(T))}catch(L){h(L)}finally{T?fn(b):b()}}}}function I(T){Y(T.detail)}return _}function Qm(e,t,n={}){const{window:r=zr}=n;return Ym(e,t,r==null?void 0:r.sessionStorage,n)}const Xm=Object.entries;var Zm={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const e_=Zm;Xm(e_.localeConfig);Qm("VUEPRESS_REDIRECT_LOCALES",{});const t_=It({setup(){},rootComponents:[]}),n_=Object.freeze(Object.defineProperty({__proto__:null,default:t_},Symbol.toStringTag,{value:"Module"}));var ie=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech&nbsp;lead",e.TeamLead="team&nbsp;lead",e.Developer="developer",e))(ie||{}),fe=(e=>(e.ActiveDeveloped="actively-developed",e.PassivelyMaintained="passively-maintained",e.AsIs="as-is",e.Experimental="experimental",e.LookingForMaintainer="looking-for-maintainer",e.Deprecated="deprecated",e))(fe||{}),M=(e=>(e.C="C",e.Go="Go",e.JavaScript="JS",e.TypeScript="TS",e.Rust="Rust",e.Python="Python",e.Php="PHP",e.Deno="Deno",e.NodeJS="NodeJS",e.Flask="Flask",e.React="React",e.Antd="Antd",e.Postgresql="PostgreSQL",e.Docker="Docker",e.Drone="Drone CI",e.Woodpecker="Woodpecker CI",e.Bash="Bash",e.TreeSitter="TreeSitter",e.Nix="Nix",e.Lua="Lua",e.Sqlite="Sqlite",e.Vue="Vue",e.Vuepress="Vuepress",e.Godot="Godot",e.Haskell="Haskell",e))(M||{});const r_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[ie.Author],technologies:[M.Nix],startDate:new Date("2024-04-24"),status:fe.ActiveDeveloped},{name:"picsg",url:"/pleshevskiy/picsg",description:"A tool for steganographing information in a picture encoded using the Vernam cipher.",roles:[ie.Author],technologies:[M.Haskell],startDate:new Date("2024-04-13"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"Mindustry tools",url:"/pleshevskiy/mindustry-tools",description:"Tools for the Mindustry game",roles:[ie.Author],technologies:[M.Nix,M.Godot],startDate:new Date("2024-01-07"),status:fe.PassivelyMaintained},{name:"Master Progress Rosmintrud tools",url:"https://rosmintrud.masterprogress.ru",description:"Internal service to prepare documents for the rosmintrud (SPA)",roles:[ie.TechLead],technologies:[M.Deno,M.Sqlite,M.TypeScript,M.Vue,M.Docker,M.Woodpecker,M.Nix],startDate:new Date("2023-07-03"),status:fe.PassivelyMaintained},{name:"yandexgpt_tg_bot",url:"/pleshevskiy/yandexgpt_tg_bot",description:"The Telegram bot to describe article with link by YandexGPT.",roles:[ie.Author],technologies:[M.JavaScript,M.NodeJS,M.Nix],startDate:new Date("2023-06-27"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"tree-sitter-plpgsql",url:"/pleshevskiy/tree-sitter-plpgsql",description:"plpgsql grammar for tree-sitter",roles:[ie.Author],technologies:[M.C,M.JavaScript,M.TreeSitter,M.Nix],startDate:new Date("2023-01-05"),status:fe.PassivelyMaintained},{name:"wd2",url:"/pleshevskiy/wd2",description:"A wrapper over d2 which allows to use additional configs from d2 file",roles:[ie.Author],technologies:[M.Bash,M.Nix],startDate:new Date("2022-12-12"),endDate:new Date("2023-07-31"),status:fe.AsIs},{name:"tree-sitter-d2",url:"/pleshevskiy/tree-sitter-d2",description:"d2 grammar for tree-sitter",roles:[ie.Author],technologies:[M.C,M.JavaScript,M.TreeSitter,M.Nix],startDate:new Date("2022-12-04"),status:fe.ActiveDeveloped},{name:"nix2lua",url:"/mynix/nix2lua",description:"This is a small but functional library that converts your nix configurations into lua format.",roles:[ie.Author],technologies:[M.Nix,M.Lua],startDate:new Date("2022-11-22"),status:fe.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-29"),status:fe.PassivelyMaintained},{name:"estring",url:"/pleshevskiy/estring",description:"A simple way to parse a string using type annotations.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-23"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"enve",url:"/pleshevskiy/enve",description:"It helps you work with environment variables and convert it to any type using only type annotations",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-07-18"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"docker stack drone plugin",url:"/pleshevskiy/docker_stack",description:"Deploy to production using `docker stack deploy`",roles:[ie.Author],technologies:[M.Docker,M.Drone,M.Woodpecker],startDate:new Date("2022-06-06"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"dexios",url:"/github/dexios",description:"Dexios is a fast, secure, and open source command-line encryption tool.",roles:[ie.Collaborator],technologies:[M.Rust],startDate:new Date("2022-06-01"),endDate:new Date("2023-02-28")},{name:"recipes",url:"/pleshevskiy/recipes",description:"Site with recipes which cares about privacy",roles:[ie.Author],technologies:[M.TypeScript,M.Deno,M.Rust],startDate:new Date("2022-05-04"),status:fe.PassivelyMaintained},{name:"pleshevski.ru",url:"/pleshevskiy/pleshevski.ru",description:"Source code of my personal site",roles:[ie.Author],technologies:[M.TypeScript,M.Vue,M.Vuepress,M.Nix],startDate:new Date("2022-03-16"),status:fe.PassivelyMaintained},{name:"paren",url:"/pleshevskiy/paren",description:"Library for parsing and rendering information.",roles:[ie.Author],technologies:[M.TypeScript,M.Deno],startDate:new Date("2022-03-14"),endDate:new Date("2024-07-25"),status:fe.Experimental},{name:"hwt",url:"/pleshevskiy/hwt",description:"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2022-02-04"),endDate:new Date("2024-07-25"),status:fe.AsIs},{name:"ood_persistence",url:"/pleshevskiy/ood_persistence",description:"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2021-10-12"),endDate:new Date("2021-10-21"),status:fe.Deprecated},{name:"migra",url:"/pleshevskiy/migra",description:"Simple SQL migration manager for your project.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2021-01-31"),endDate:new Date("2022-03-17"),status:fe.AsIs},{name:"espruino-starter",url:"/pleshevskiy/espruino-starter",description:"Quickly start creating your new project on the espruino board or a board based on it.",roles:[ie.Author],technologies:[M.JavaScript],startDate:new Date("2021-08-23"),status:fe.AsIs},{name:"react-rest-request",url:"/pleshevskiy/react-rest-request",description:"Minimalistic REST API client for React inspired by Apollo.",roles:[ie.Author],technologies:[M.TypeScript,M.React],startDate:new Date("2020-10-04"),endDate:new Date("2023-03-02"),status:fe.Deprecated},{name:"sonic-channel",url:"/pleshevskiy/sonic-channel",description:"Rust client for sonic search backend.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2020-07-18"),status:fe.PassivelyMaintained},{name:"itconfig",url:"/pleshevskiy/itconfig",description:"Easy build a configs from environment variables and use it in globally.",roles:[ie.Author],technologies:[M.Rust],startDate:new Date("2019-12-22"),endDate:new Date("2022-07-24"),status:fe.Deprecated},{name:"it-fsm",url:"/pleshevskiy/it-fsm",description:"Simple full-featured finite state machine for your project",roles:[ie.Author],technologies:[M.TypeScript,M.NodeJS,M.Deno],startDate:new Date("2019-10-11"),status:fe.PassivelyMaintained},{name:"Cabinet Master Progress",url:"https://cabinet.masterprogress.ru",description:"Student's cabinet of the educational center Master Progress (SSR + SPA)",roles:[ie.TechLead],technologies:[M.Python,M.Flask,M.Postgresql,M.TypeScript,M.React,M.Docker,M.Woodpecker,M.Nix],startDate:new Date("2019-09-22"),status:fe.PassivelyMaintained},{name:"genrss",url:"/pleshevskiy/genrss",description:"RSS generator for python",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2019-07-23"),status:fe.AsIs},{name:"marshmallow_pageinfo",url:"/pleshevskiy/marshmallow_pageinfo",description:"Page info marshmallow schema for api",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2019-10-05"),endDate:new Date("2023-03-02"),status:fe.AsIs},{name:"Binary Management",url:"https://www.binarymanagement.com",description:"Project management tool for interior designers",roles:[ie.Developer,ie.TechLead,ie.TeamLead],technologies:[M.TypeScript,M.NodeJS,M.React,M.Antd,M.Docker,M.Drone,M.Rust,M.Nix],startDate:new Date("2018-09-15"),status:fe.ActiveDeveloped},{name:"Core Spirit",url:"https://corespirit.com",description:"Social platform focusing on human and planetary enhancement",roles:[ie.Developer],technologies:[M.TypeScript,M.NodeJS,M.Go,M.Python,M.React,M.Docker,M.Drone],startDate:new Date("2018-09-05"),endDate:new Date("2019-12-31")},{name:"Master Progress",url:"https://masterprogress.ru",description:"Main website of the educational center Master Progress (SSR + Forms)",roles:[ie.TechLead],technologies:[M.Python,M.Flask,M.JavaScript,M.Nix],startDate:new Date("2018-04-10"),status:fe.PassivelyMaintained},{name:"ictmpl",url:"/pleshevskiy/ictmpl",description:"Generate projects from templates",roles:[ie.Author],technologies:[M.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:fe.AsIs}];function o_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const s_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),i_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:s_},Symbol.toStringTag,{value:"Module"}));function Fn(e){return(e==null?void 0:e.valueOf())??1/0}const l_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},a_=ue({...l_,setup(e,{expose:t}){t();const n=R(()=>r_.concat().sort((o,s)=>Fn(s.endDate)-Fn(o.endDate)||Fn(s.startDate)-Fn(o.startDate))),r={date2num:Fn,works:n,get renderDate(){return o_},get w(){return i_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),c_=["href"],u_=["innerHTML"],f_={key:0};function d_(e,t,n,r,o,s){return V(),X("table",null,[K("thead",null,[K("tr",null,[K("th",null,ae(s.tableTheme.name),1),K("th",null,ae(s.tableTheme.description),1),K("th",null,ae(s.tableTheme.role),1),K("th",null,ae(s.tableTheme.technologies),1),K("th",null,ae(s.tableTheme.status),1),K("th",null,ae(s.tableTheme.dates),1)])]),K("tbody",null,[(V(!0),X(be,null,At(r.works,i=>(V(),X("tr",null,[K("td",null,[K("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},ae(i.name),9,c_)]),K("td",null,ae(i.description),1),K("td",{innerHTML:i.roles.join(", ")},null,8,u_),K("td",null,ae(i.technologies.join(", ")),1),K("td",null,ae(i.status),1),K("td",null,[K("div",null,[K("small",{class:Ke({grey:i.endDate})},ae(r.renderDate(i.startDate)),3)]),i.endDate?(V(),X("div",f_,[K("small",null,ae(r.renderDate(i.endDate)),1)])):Ie("",!0)])]))),256))])])}const p_=ye(a_,[["render",d_],["__file","ChronologicalWorksTable.vue"]]),h_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:oc,get ChronologicalWorksTable(){return p_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},g_={class:"works-table-wrapper"};function v_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":xe(()=>[K("div",g_,[ne(r.ChronologicalWorksTable)])]),_:1})}const m_=ye(h_,[["render",v_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),__=It({layouts:{WorksPage:m_}}),b_=Object.freeze(Object.defineProperty({__proto__:null,default:__},Symbol.toStringTag,{value:"Module"})),Rr=[sh,vh,Eh,xh,Rh,Ih,jh,qh,Dm,n_,b_].map(e=>e.default).filter(Boolean),y_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Wn=De(y_),S_=Rd,w_=()=>{const e=np({history:S_(va("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===xt){const r=lr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},E_=e=>{e.component("ClientOnly",ys),e.component("Content",Ss),e.component("RouteLink",lo)},P_=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=Cl((w,E)=>({get(){return w(),t.currentRoute.value.meta._pageChunk},set(S){t.currentRoute.value.meta._pageChunk=S,E()}})),s=R(()=>Zt.resolveLayouts(n)),i=R(()=>Zt.resolveRouteLocale(Wn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Wn.value,i.value)),a=R(()=>o.value.comp),c=R(()=>o.value.data),u=R(()=>c.value.frontmatter),f=R(()=>Zt.resolvePageHeadTitle(c.value,l.value)),p=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),h=R(()=>Zt.resolvePageLang(c.value,l.value)),m=R(()=>Zt.resolvePageLayout(c.value,s.value)),_={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:p,pageHeadTitle:f,pageLang:h,pageLayout:m,redirects:zo,routeLocale:i,routePath:r,routes:En,siteData:Wn,siteLocaleData:l};return e.provide(_s,_),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>p.value},$headTitle:{get:()=>f.value},$lang:{get:()=>h.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Wn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>ws}}),_},x_=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>dt(a)?`[${l}=${JSON.stringify(a)}]`:a?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)??null},C_=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return gs(t)&&Object.entries(t).forEach(([o,s])=>{dt(s)?r.setAttribute(o,s):s&&r.setAttribute(o,"")}),dt(n)&&r.appendChild(document.createTextNode(n)),r},T_=()=>{const e=sp(),t=ip();let n=[];const r=()=>{e.value.forEach(i=>{const l=x_(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=C_(l);a&&i.push(a)}),i},s=()=>{document.documentElement.lang=t.value;const i=o();n.forEach((l,a)=>{const c=i.findIndex(u=>l.isEqualNode(u));c===-1?(l.remove(),delete n[a]):i.splice(c,1)}),i.forEach(l=>document.head.appendChild(l)),n=[...n.filter(l=>!!l),...i]};Wt(fp,s),Ze(()=>{r(),je(e,s,{immediate:!1})})},k_=Nf,L_=async()=>{var n;const e=k_({name:"Vuepress",setup(){var s;T_();for(const i of Rr)(s=i.setup)==null||s.call(i);const r=Rr.flatMap(({rootComponents:i=[]})=>i.map(l=>ve(l))),o=lp();return()=>[ve(o.value),r]}}),t=w_();E_(e),P_(e,t,Rr);for(const r of Rr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Wn}));return e.use(t),{app:e,router:t}};L_().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{ye as _,K as a,Kt as b,X as c,L_ as createVueApp,ne as d,Yu as e,V as o,cs as r,xe as w};
 function __vite__mapDeps(indexes) {
   if (!__vite__mapDeps.viteFileDeps) {
     __vite__mapDeps.viteFileDeps = []
diff --git a/assets/index.html-CFL_msbV.js b/assets/index.html-CFL_msbV.js
deleted file mode 100644
index d6c82d5..0000000
--- a/assets/index.html-CFL_msbV.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as a,c as t,a as o,b as i,d as r,w as s,e as n,r as d,o as c}from"./app-C1Pl5wYU.js";const p={};function h(m,e){const l=d("RouteLink");return c(),t("div",null,[o("p",null,[e[1]||(e[1]=i("Всегда актуальная ссылка на ")),r(l,{to:"/"},{default:s(()=>e[0]||(e[0]=[i("резюме")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=n('<h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий разработчик програмного обеспечения, архитектор, руководитель команды, а так же ментор.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul>',30))])}const k=a(p,[["render",h],["__file","index.html.vue"]]),y=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-09-05T22:11:51.000Z"}],["meta",{"property":"article:modified_time","content":"2024-09-05T22:11:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1725574311000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":8},{"name":"janabhumi","username":"janabhumi","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":13}]},"filePathRelative":"index.md"}');export{k as comp,y as data};
diff --git a/assets/index.html-DuNptnFv.js b/assets/index.html-DuKevBia.js
similarity index 57%
rename from assets/index.html-DuNptnFv.js
rename to assets/index.html-DuKevBia.js
index 242d1aa..fc589fa 100644
--- a/assets/index.html-DuNptnFv.js
+++ b/assets/index.html-DuKevBia.js
@@ -1 +1 @@
-import{_ as a,c as r,a as s,b as i,d as o,w as t,e as n,r as d,o as p}from"./app-C1Pl5wYU.js";const c={};function h(m,e){const l=d("RouteLink");return p(),r("div",null,[s("p",null,[e[1]||(e[1]=i("Always up-to-date link to ")),o(l,{to:"/eng/"},{default:t(()=>e[0]||(e[0]=[i("resume")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=n('<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>I&#39;m an open source software enthusiast, a lead software developer, architect, team leader and also mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul>',30))])}const y=a(c,[["render",h],["__file","index.html.vue"]]),x=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-09-05T22:11:51.000Z"}],["meta",{"property":"article:modified_time","content":"2024-09-05T22:11:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1725574311000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":8},{"name":"janabhumi","username":"janabhumi","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":13}]},"filePathRelative":"eng/index.md"}');export{y as comp,x as data};
+import{_ as s,c as r,a as t,b as a,d as l,w as d,e as o,r as c,o as n}from"./app-CjizGj8p.js";const h={};function p(m,e){const i=c("RouteLink");return n(),r("div",null,[t("p",null,[e[1]||(e[1]=a("Always up-to-date link to ")),l(i,{to:"/eng/"},{default:d(()=>e[0]||(e[0]=[a("resume")])),_:1}),e[2]||(e[2]=a("."))]),e[3]||(e[3]=o('<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>I&#39;m an open source software enthusiast, a lead software developer, architect, team leader and also mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul>',30))])}const u=s(h,[["render",p],["__file","index.html.vue"]]),f=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-09-05T22:11:51.000Z"}],["meta",{"property":"article:modified_time","content":"2024-09-05T22:11:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1725574311000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":8},{"name":"janabhumi","username":"janabhumi","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":13}],"changelog":[{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","date":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","date":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","date":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","date":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","date":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","date":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","date":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","date":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","date":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","date":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","date":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","date":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","date":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","date":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","date":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","date":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","date":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","date":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","date":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","date":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","date":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","date":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"eng/index.md"}');export{u as comp,f as data};
diff --git a/assets/index.html-gDP15nKv.js b/assets/index.html-gDP15nKv.js
new file mode 100644
index 0000000..4374ac3
--- /dev/null
+++ b/assets/index.html-gDP15nKv.js
@@ -0,0 +1 @@
+import{_ as s,c as t,a as l,b as a,d,w as r,e as o,r as c,o as h}from"./app-CjizGj8p.js";const n={};function m(p,e){const i=c("RouteLink");return h(),t("div",null,[l("p",null,[e[1]||(e[1]=a("Всегда актуальная ссылка на ")),d(i,{to:"/"},{default:r(()=>e[0]||(e[0]=[a("резюме")])),_:1}),e[2]||(e[2]=a("."))]),e[3]||(e[3]=o('<h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий разработчик програмного обеспечения, архитектор, руководитель команды, а так же ментор.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul>',30))])}const f=s(n,[["render",m],["__file","index.html.vue"]]),y=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-09-05T22:11:51.000Z"}],["meta",{"property":"article:modified_time","content":"2024-09-05T22:11:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1725574311000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":8},{"name":"janabhumi","username":"janabhumi","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":13}],"changelog":[{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","date":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","date":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","date":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","date":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","date":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","date":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","date":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","date":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","date":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","date":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","date":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","date":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","date":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","date":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","date":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","date":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","date":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","date":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","date":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","date":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","date":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","date":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"index.md"}');export{f as comp,y as data};
diff --git a/assets/style-Bx7ih_OI.css b/assets/style-Bx7ih_OI.css
deleted file mode 100644
index 03a562b..0000000
--- a/assets/style-Bx7ih_OI.css
+++ /dev/null
@@ -1 +0,0 @@
-.vp-back-to-top-button{position:fixed!important;inset-inline-end:1rem;bottom:4rem;z-index:100;width:48px;height:48px;padding:12px;border-width:0;border-radius:50%;background:var(--back-to-top-c-bg);color:var(--back-to-top-c-accent-bg);box-shadow:2px 2px 10px 4px var(--back-to-top-c-shadow);cursor:pointer}@media (max-width: 959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-c-accent-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:24px;height:24px;margin:0 auto;background:var(--back-to-top-c-icon);-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.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{--back-to-top-z-index: 5;--back-to-top-icon: url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='4'%20d='M24.008%2014.1V42M12%2026l12-12l12%2012M12%206h24'%20/%3e%3c/svg%3e");--back-to-top-c-bg: var(--vp-c-bg);--back-to-top-c-accent-bg: var(--vp-c-accent-bg);--back-to-top-c-accent-hover: var(--vp-c-accent-hover);--back-to-top-c-shadow: var(--vp-c-shadow);--back-to-top-c-icon: currentcolor}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:#0000;outline:none;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button:before{content:"";display:inline-block;width:1.25rem;height:1.25rem;padding:.625rem;background:currentcolor;color:var(--copy-code-c-text);font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.vp-copy-code-button:focus,.vp-copy-code-button.copied{opacity:1}.vp-copy-code-button:hover,.vp-copy-code-button.copied{background:var(--copy-code-c-hover)}.vp-copy-code-button.copied:before{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--copy-code-c-hover);color:var(--copy-code-c-text);font-weight:500;line-height:1.25rem;white-space:nowrap}.no-copy-code .vp-copy-code-button{display:none}body:not(.no-copy-code) div[class*=language-]:hover:before{display:none}body:not(.no-copy-code) div[class*=language-]:hover .vp-copy-code-button{opacity:1}:root{--code-copy-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2' /%3e%3c/svg%3e");--code-copied-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4' /%3e%3c/svg%3e");--copy-code-c-text: var(--code-c-line-number);--copy-code-c-hover: var(--code-c-highlight-bg)}.hint-container{position:relative;background:var(--hint-c-soft);transition:background var(--vp-t-color),color var(--vp-t-color)}@media print{.hint-container{page-break-inside:avoid}}.hint-container>.hint-container-title{color:var(--hint-c-title)}.hint-container :not(pre)>code{background:var(--hint-c-soft)}.hint-container .hint-container-title{position:relative;margin-block:.75em;font-weight:600;line-height:1.25}.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{margin-block:.75rem;padding:.25em 1em;border-radius:.5em;color:inherit;font-size:var(--hint-font-size)}@media print{.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{border-inline-start-width:.25em;border-inline-start-style:solid}}.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:1.75em}@media print{.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:0}}.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{content:" ";position:absolute;inset-inline-start:0;top:calc(50% - .6125em);width:1.25em;height:1.25em;font-size:1.25em}@media print{.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{display:none}}.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.caution p{line-height:1.5}.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.caution a{color:var(--vp-c-accent)}.hint-container.important{--hint-c-accent: var(--important-c-accent);--hint-c-title: var(--important-c-text);--hint-c-soft: var(--important-c-soft)}.hint-container.important>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.info{--hint-c-accent: var(--info-c-accent);--hint-c-title: var(--info-c-text);--hint-c-soft: var(--info-c-soft)}.hint-container.info>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.note{--hint-c-accent: var(--note-c-accent);--hint-c-title: var(--note-c-text);--hint-c-soft: var(--note-c-soft)}.hint-container.note>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.tip{--hint-c-accent: var(--tip-c-accent);--hint-c-title: var(--tip-c-text);--hint-c-soft: var(--tip-c-soft)}.hint-container.tip>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.warning{--hint-c-accent: var(--warning-c-accent);--hint-c-title: var(--warning-c-text);--hint-c-soft: var(--warning-c-soft)}.hint-container.warning>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.caution{--hint-c-accent: var(--caution-c-accent);--hint-c-title: var(--caution-c-text);--hint-c-soft: var(--caution-c-soft)}.hint-container.caution>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.details{position:relative;display:block;margin-block:.75rem;padding:1.25rem 1rem;border-radius:.5rem;background:var(--detail-c-bg);transition:background var(--vp-t-transform),color var(--vp-t-transform)}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-c-accent)}.hint-container.details :not(pre)>code{background:var(--detail-c-soft)}.hint-container.details summary{position:relative;margin:-1rem;padding-block:1em;padding-inline:3em 1.5em;list-style:none;font-size:var(--hint-font-size);cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:#0000;font-size:0}.hint-container.details summary:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:" ";position:absolute;inset-inline-start:.8em;top:calc(50% - .5em);width:1em;height:1em;font-size:1.25rem;line-height:normal;transition:color,var(--vp-t-color),transform var(--vp-t-transform);transform:rotate(90deg)}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:before{transform:rotate(180deg)}:root{--hint-font-size: .92rem;--important-c-accent: var(--vp-c-purple-bg);--important-c-text: var(--vp-c-purple-text);--important-c-soft: var(--vp-c-purple-soft);--info-c-accent: var(--vp-c-blue-bg);--info-c-text: var(--vp-c-blue-text);--info-c-soft: var(--vp-c-blue-soft);--note-c-accent: var(--vp-c-grey-bg);--note-c-text: var(--vp-c-grey-text);--note-c-soft: var(--vp-c-grey-soft);--tip-c-accent: var(--vp-c-green-bg);--tip-c-text: var(--vp-c-green-text);--tip-c-soft: var(--vp-c-green-soft);--warning-c-accent: var(--vp-c-yellow-bg);--warning-c-text: var(--vp-c-yellow-text);--warning-c-soft: var(--vp-c-yellow-soft);--caution-c-accent: var(--vp-c-red-bg);--caution-c-text: var(--vp-c-red-text);--caution-c-soft: var(--vp-c-red-soft);--detail-c-bg: var(--vp-c-control);--detail-c-icon: var(--vp-c-border);--detail-c-soft: var(--vp-c-grey-soft)}:root{--nprogress-c: var(--vp-c-accent);--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{position:fixed;top:0;left:0;z-index:var(--nprogress-z-index);width:100%;height:2px;background:var(--nprogress-c)}:root{--code-padding-x: 1.25rem;--code-padding-y: 1rem;--code-border-radius: 6px;--code-line-height: 1.6;--code-font-size: 14px;--code-font-family: consolas, monaco, "Andale Mono", "Ubuntu Mono", monospace}div[class*=language-]{position:relative;border-radius:var(--code-border-radius);background-color:var(--code-c-bg)}div[class*=language-]:before{content:attr(data-title);position:absolute;top:.8em;right:1em;z-index:3;color:var(--code-c-text);font-size:.75rem}div[class*=language-] pre{position:relative;z-index:1;overflow-x:auto;margin:0;border-radius:var(--code-border-radius);font-size:var(--code-font-size);font-family:var(--code-font-family);line-height:var(--code-line-height)}div[class*=language-] pre code{display:block;box-sizing:border-box;width:-moz-fit-content;width:fit-content;min-width:100%;padding:var(--code-padding-y) var(--code-padding-x);background-color:#0000!important;color:var(--code-c-text);overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--code-c-text: #f8f8f2;--code-c-bg: #2e3440;--code-c-highlight-bg: rgb(51.6454545455, 60.5484848485, 78.3545454545);--code-c-line-number: rgba(248, 248, 242, .67)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a3be8c}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#81a1c1}.token.atrule,.token.attr-value,.token.function,.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,.token.important{color:#ebcb8b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--code-line-number-width: 3rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-line-number-width);height:100%;border-right:1px solid var(--code-c-highlight-bg, var(--code-c-text));border-radius:var(--code-border-radius) 0 0 var(--code-border-radius);transition:border var(--vp-t-color)}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--code-line-number-width)}div[class*=language-].line-numbers-mode code{padding-left:1rem}div[class*=language-].line-numbers-mode .line-numbers{counter-reset:line-number;position:absolute;top:0;width:var(--code-line-number-width);padding-top:var(--code-padding-y);color:var(--code-c-line-number, var(--code-c-text));font-size:var(--code-font-size);line-height:var(--code-line-height);text-align:center}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:3;font-family:var(--code-font-family);-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);counter-increment:line-number}div[class*=language-] .line.highlighted{display:inline-block;width:100%;margin:0 calc(-1*var(--code-padding-x));padding:0 var(--code-padding-x);background-color:var(--code-c-highlight-bg)}@property --vp-collapsed-lines-bg{inherits:false;initial-value:#fff;syntax:"<color>"}@keyframes code-collapsed-lines{0%{opacity:.3;transform:translateY(-2px) rotate(var(--vp-collapsed-lines-rotate))}to{opacity:1;transform:translateY(2px) rotate(var(--vp-collapsed-lines-rotate))}}div[class*=language-].has-collapsed-lines .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg);--vp-collapsed-lines-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='m18 12l-6 6l-6-6m12-6l-6 6l-6-6'/%3E%3C/svg%3E");--vp-collapsed-lines-rotate: 0deg;position:absolute;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;height:28px;background:linear-gradient(to bottom,transparent 0%,var(--vp-collapsed-lines-bg) 55%,var(--vp-collapsed-lines-bg) 100%);cursor:pointer;transition:--vp-collapsed-lines-bg var(--vp-t-color)}div[class*=language-].has-collapsed-lines .collapsed-lines:hover{--vp-collapsed-lines-bg: var(--code-c-highlight-bg)}div[class*=language-].has-collapsed-lines .collapsed-lines:before{content:"";display:inline-block;width:24px;height:24px;background-color:var(--code-c-text);-webkit-mask-image:var(--vp-collapsed-lines-icon);mask-image:var(--vp-collapsed-lines-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:20px;mask-size:20px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;animation:code-collapsed-lines 1.2s infinite alternate-reverse ease-in-out}div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-light-bg))}[data-theme=dark] div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-dark-bg))}div[class*=language-].has-collapsed-lines.collapsed{overflow-y:hidden;height:calc(var(--vp-collapsed-lines)*var(--code-line-height)*var(--code-font-size) + var(--code-padding-y) + 28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) code{padding-bottom:max(var(--code-padding-y),28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines{--vp-collapsed-lines-rotate: 180deg}.vp-code-tabs-nav{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-c-bg);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{position:relative;min-width:3rem;margin:0;padding:6px 12px;border-width:0;border-radius:6px 6px 0 0;background:#0000;color:var(--code-tabs-c-text);font-weight:600;font-size:.875em;line-height:1.4;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-code-tab-nav:hover{background:var(--code-tabs-c-hover)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-c-bg, var(--vp-c-bg-alt))}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav:first-child:before{display:none}[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.75rem -1.5rem;border-radius:0}}.vp-code-tab div[class*=language-].line-numbers-mode:after{border-top-left-radius:0}.vp-code-tab div[class*=language-] pre{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-] pre{border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.vp-tabs{margin:1.5rem 0;border:1px solid var(--vp-c-border);border-radius:8px}@media (max-width: 419px){[vp-content]>.vp-tabs{margin-inline:-1.5rem;border:none;border-bottom:1px solid var(--vp-c-border);border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:.5rem .5rem 0 0;background:var(--tab-c-bg-nav);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{position:relative;min-width:4rem;margin:0;padding:.5em 1em;border:none;border-radius:.5rem .5rem 0 0;background:#0000;color:var(--tab-c-nav);font-weight:600;font-size:.875em;line-height:1.75;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-tab-nav:hover{background:var(--tab-c-bg-nav-hover)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-c-bg)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;border-radius:0 0 .5rem .5rem;background:var(--tab-c-bg);transition:background var(--vp-t-color)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(n+2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-c-border);font-weight:500}@media print{.vp-tab-title{display:block}}:root{--code-tabs-c-text: var(--code-c-text);--code-tabs-c-bg: var(--code-c-highlight-bg);--code-tabs-c-hover: var(--code-c-bg, var(--vp-c-bg-alt));--tab-c-bg: var(--vp-c-bg);--tab-c-nav: var(--vp-c-text);--tab-c-bg-nav: var(--vp-c-grey-bg);--tab-c-bg-nav-hover: var(--vp-c-control-hover)}.vp-badge{display:inline-block;vertical-align:top;height:18px;padding:0 6px;border-radius:3px;background:var(--vp-c-accent-soft);color:var(--vp-c-accent);font-size:14px;line-height:18px;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-badge+.vp-badge{margin-inline-start:5px}.vp-badge.tip{background:var(--badge-c-tip-bg);color:var(--badge-c-tip-text)}.vp-badge.warning{background:var(--badge-c-warning-bg);color:var(--badge-c-warning-text)}.vp-badge.danger{background:var(--badge-c-danger-bg);color:var(--badge-c-danger-text)}.vp-badge.important{background:var(--badge-c-important-bg);color:var(--badge-c-important-text)}.vp-badge.info{background:var(--badge-c-info-bg);color:var(--badge-c-info-text)}.vp-badge.note{background:var(--badge-c-note-bg);color:var(--badge-c-note-text)}.vp-fade-slide-y-enter-active{transition:all .2s ease}.vp-fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.vp-fade-slide-y-enter-from,.vp-fade-slide-y-leave-to{opacity:0;transform:translateY(-10px)}.vp-features{display:flex;flex-wrap:wrap;place-content:stretch space-between;align-items:flex-start;margin-top:2.5rem;padding:1.2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-features{flex-direction:column}}.vp-feature{flex-grow:1;flex-basis:30%;max-width:30%}@media (max-width: 719px){.vp-feature{max-width:100%;padding:0 2.5rem}}.vp-feature h2{padding-bottom:0;border-bottom:none;font-weight:500;font-size:1.4rem}@media (max-width: 419px){.vp-feature h2{font-size:1.25rem}}.vp-feature p{color:var(--vp-c-text-mute)}.vp-footer{padding:2.5rem;border-top:1px solid var(--vp-c-border);color:var(--vp-c-text-mute);text-align:center;transition:border-color var(--vp-t-color)}.vp-hero{text-align:center}.vp-hero-image{display:block;max-width:100%;max-height:280px;margin:3rem auto 1.5rem}@media (max-width: 419px){.vp-hero-image{max-height:210px;margin:2rem auto 1.2rem}}#main-title{font-size:3rem}@media (max-width: 419px){#main-title{font-size:2rem}}#main-title,.vp-hero-description,.vp-hero-actions{margin:1.8rem auto}@media (max-width: 419px){#main-title,.vp-hero-description,.vp-hero-actions{margin:1.2rem auto}}.vp-hero-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.vp-hero-description{max-width:35rem;color:var(--vp-c-text-mute);font-size:1.6rem;line-height:1.3}@media (max-width: 419px){.vp-hero-description{font-size:1.2rem}}.vp-hero-action-button{display:inline-block;box-sizing:border-box;padding:.8rem 1.6rem;border:2px solid var(--vp-c-accent-bg);border-radius:4px;background-color:var(--vp-c-bg);color:var(--vp-c-accent);font-size:1.2rem;transition:background-color border-color color var(--vp-t-color)}@media (max-width: 419px){.vp-hero-action-button{padding:.6rem 1.2rem;font-size:1rem}}.vp-hero-action-button:hover{color:var(--vp-c-accent-text)}.vp-hero-action-button.primary{background-color:var(--vp-c-accent-bg);color:var(--vp-c-accent-text)}.vp-hero-action-button.primary:hover{border-color:var(--vp-c-accent-hover);background-color:var(--vp-c-accent-hover)}.vp-home{display:block;max-width:var(--homepage-width);margin:0 auto;padding:var(--navbar-height) 2rem 0}@media (max-width: 419px){.vp-home{padding-right:1.5rem;padding-left:1.5rem}}.vp-home [vp-content]{margin:0;padding:0}.vp-site-logo{vertical-align:top;height:var(--navbar-line-height);margin-right:var(--navbar-padding-v)}.vp-site-name{position:relative;color:var(--vp-c-text);font-weight:600;font-size:1.3rem}@media screen and (max-width: 719px){.vp-site-name{display:block;overflow:hidden;width:calc(100vw - 11rem);text-overflow:ellipsis;white-space:nowrap}}.vp-dropdown-enter-from,.vp-dropdown-leave-to{height:0!important;opacity:0}.vp-dropdown-enter-active{transition:height .3s ease-in-out,opacity .6s ease-out}.vp-navbar-dropdown-wrapper{cursor:pointer}.vp-navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.vp-navbar-dropdown-wrapper:not(.mobile):hover .vp-navbar-dropdown,.vp-navbar-dropdown-wrapper:not(.mobile).open .vp-navbar-dropdown{display:block!important}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown{overflow:hidden;transition:height .1s ease-out;padding-top:.5rem}.vp-navbar-dropdown-wrapper:not(.mobile) .vp-navbar-dropdown{position:absolute;top:100%;right:0;display:none;overflow-y:auto;box-sizing:border-box;height:auto!important;max-height:calc(100vh - 2.7rem);margin:0;padding:.6rem 0;border:1px solid var(--vp-c-gutter);border-radius:.5rem;background-color:var(--vp-c-bg-elv);text-align:left;white-space:nowrap}.vp-navbar-dropdown-title{display:block;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:500;font-size:.9rem;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title{display:none}.vp-navbar-dropdown-title:hover{border-color:transparent}.vp-navbar-dropdown-title-mobile{display:none;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:600;font-size:inherit;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title-mobile{display:block}.vp-navbar-dropdown-title-mobile:hover{color:var(--vp-c-accent)}.vp-navbar-dropdown-item{color:inherit;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link{position:relative;display:block;margin-bottom:0;padding:0 1.25rem;border-bottom:none;font-weight:400;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link:hover,.vp-navbar-dropdown-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-dropdown-item .auto-link.auto-link-active:after{content:"";position:absolute;top:calc(50% - 2px);left:9px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:5px solid var(--vp-c-accent)}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-item>a{font-size:15px;line-height:2rem}.vp-navbar-dropdown-subtitle{margin:.45rem 0 0;padding:1rem 0 .45rem;border-top:1px solid var(--vp-c-gutter);font-size:.9rem}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;padding-bottom:0;border-top:0;font-size:15px;line-height:2rem}.vp-navbar-dropdown-item:first-child .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.vp-navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.vp-navbar-dropdown-subtitle>.auto-link{font-weight:inherit}.vp-navbar-dropdown-subtitle>.auto-link.auto-link-active:after{display:none}.vp-navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.vp-navbar-dropdown-subitem{font-size:.9em}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subitem{padding-left:1rem;font-size:14px}.vp-navbar-items{display:inline-block}@media print{.vp-navbar-items{display:none}}.vp-navbar-items .auto-link{color:inherit;line-height:1.4rem}.vp-navbar-items .auto-link:hover,.vp-navbar-items .auto-link.auto-link-active{color:var(--vp-c-text)}.vp-navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}@media (max-width: 719px){.vp-navbar-item{margin-left:0}}.vp-navbar-item:first-child{margin-left:0}.vp-navbar-item .auto-link:hover,.vp-navbar-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-item>.auto-link{display:inline-block}.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:-2px;border-bottom:2px solid var(--vp-c-accent)}@media (max-width: 719px){.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:0;border-bottom:none}}.vp-toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--vp-c-text);opacity:.8;cursor:pointer}@media print{.vp-toggle-color-mode-button{display:none}}.vp-toggle-color-mode-button:hover{opacity:1}.vp-toggle-color-mode-button .light-icon,.vp-toggle-color-mode-button .dark-icon{width:1.25rem;height:1.25rem}.vp-toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block}}.vp-toggle-sidebar-button .icon{display:flex;flex-direction:column;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;cursor:inherit}.vp-toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--vp-c-text);transition:transform var(--vp-t-transform)}.vp-toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1),.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );position:fixed;top:0;right:0;left:0;z-index:20;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-padding-v) var(--navbar-padding-h);border-bottom:1px solid var(--vp-c-border);background-color:var(--vp-navbar-c-bg);line-height:var(--navbar-line-height);transition:background-color var(--vp-t-color),border-color var(--vp-t-color)}@media screen and (max-width: 719px){.vp-navbar{padding-left:4rem}}.vp-navbar-items-wrapper{position:absolute;top:var(--navbar-padding-v);right:var(--navbar-padding-h);display:flex;box-sizing:border-box;height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);font-size:.9rem;white-space:nowrap}.vp-page-meta{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page-meta{padding:2rem}}@media (max-width: 419px){.vp-page-meta{padding:1.5rem}}.vp-page-meta{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media print{.vp-page-meta{margin:0!important;padding-right:0!important;padding-left:0!important}}@media (max-width: 719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--vp-c-text-mute)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--vp-c-text-mute);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-right:.5rem;margin-bottom:.25rem;font-size:14px}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .edit-icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-right:.25em}.vp-page-meta .last-updated,.vp-page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width: 719px){.vp-page-meta .last-updated,.vp-page-meta .contributors{font-size:13px;text-align:start}}.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-top:0;margin-right:auto;margin-left:auto;padding:1rem 2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-top var(--vp-t-color)}@media (max-width: 959px){.vp-page-nav{padding-right:1rem;padding-left:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .auto-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--vp-c-gutter);border-radius:.25rem}.vp-page-nav .auto-link:hover{background:var(--vp-c-control)}.vp-page-nav .auto-link.external-link:after{display:none}.vp-page-nav .auto-link:not(.external-link) .external-link:after{display:none}.vp-page-nav .auto-link .hint{color:var(--vp-c-text-mute);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end}.vp-page{display:block;padding-top:var(--navbar-height);padding-bottom:2rem;padding-left:var(--sidebar-width)}@media (max-width: 959px){.vp-page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.vp-page{padding-left:0}}.vp-page [vp-content]{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page [vp-content]{padding:2rem}}@media (max-width: 419px){.vp-page [vp-content]{padding:1.5rem}}.vp-page [vp-content]{padding-top:0}.vp-sidebar-item{border-left:.25rem solid transparent;color:var(--vp-c-text);cursor:default}.vp-sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.vp-sidebar-item.vp-sidebar-heading{box-sizing:border-box;width:100%;margin:0;padding:.35rem 1.5rem .35rem 1.25rem;font-weight:700;font-size:1.1em;transition:color .15s ease}.vp-sidebar-item.vp-sidebar-heading+.vp-sidebar-children{overflow:hidden;transition:height .1s ease-out;margin-bottom:.75rem}.vp-sidebar-item.collapsible{cursor:pointer}.vp-sidebar-item:not(.vp-sidebar-heading){display:inline-block;box-sizing:border-box;width:100%;margin:0;padding:.35rem 1rem .35rem 2rem;font-weight:400;font-size:1em;line-height:1.4}.vp-sidebar-item:not(.vp-sidebar-heading)+.vp-sidebar-children{padding-left:1rem;font-size:.95em}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-left-color:transparent;font-weight:500}a.vp-sidebar-heading+.vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-left-color:transparent}.vp-sidebar-item.active:not(p.vp-sidebar-heading){border-left-color:var(--vp-c-accent);color:var(--vp-c-accent);font-weight:600}.vp-sidebar-item .auto-link{display:block}.vp-sidebar-item.auto-link{display:block;cursor:pointer}.vp-sidebar-item.auto-link:hover{color:var(--vp-c-accent)}.vp-sidebar-items{margin:0;padding:1.5rem 0;list-style-type:none}@media (max-width: 719px){.vp-sidebar-items{padding:1rem 0}}.vp-sidebar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar{position:fixed;top:var(--navbar-height);bottom:0;left:0;z-index:10;overflow-y:auto;box-sizing:border-box;width:var(--sidebar-width);margin:0;border-right:1px solid var(--vp-c-border);background-color:var(--vp-sidebar-c-bg);font-size:16px;transition:transform var(--vp-t-transform),background-color var(--vp-t-color),border-color var(--vp-t-color);scrollbar-color:var(--vp-c-accent-bg) var(--vp-c-gutter);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{width:var(--sidebar-width-mobile);font-size:15px}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}}.vp-sidebar::-webkit-scrollbar{width:7px}.vp-sidebar::-webkit-scrollbar-track{background-color:var(--vp-c-gutter)}.vp-sidebar::-webkit-scrollbar-thumb{background-color:var(--vp-c-accent-bg)}.vp-sidebar .vp-navbar-items{display:none;padding:.5rem 0 .75rem;border-bottom:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-sidebar .vp-navbar-items{display:block}.vp-sidebar .vp-navbar-items .vp-navbar-dropdown-item .route-link-active:after{top:calc(1rem - 2px)}}.vp-sidebar .vp-navbar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar .vp-navbar-items .auto-link{font-weight:600}.vp-sidebar .vp-navbar-item{display:block;padding:.5rem 0 .5rem 1.5rem;font-size:1.1em;line-height:1.25rem}.vp-sidebar-mask{position:fixed;top:0;left:0;z-index:9;display:none;width:100vw;height:100vh}.vp-theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.vp-theme-container.no-navbar .vp-sidebar{padding-top:0}}.vp-theme-container.no-navbar .vp-page{padding-top:0}.vp-theme-container.no-navbar [vp-content] h1,.vp-theme-container.no-navbar [vp-content] h2,.vp-theme-container.no-navbar [vp-content] h3,.vp-theme-container.no-navbar [vp-content] h4,.vp-theme-container.no-navbar [vp-content] h5,.vp-theme-container.no-navbar [vp-content] h6{margin-top:1.5rem;padding-top:0}.vp-theme-container.no-sidebar .vp-sidebar{display:none}@media (max-width: 719px){.vp-theme-container.no-sidebar .vp-sidebar{display:block}}.vp-theme-container.no-sidebar .vp-page{padding-left:0}@media (max-width: 719px){.vp-theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.vp-theme-container.sidebar-open .vp-sidebar-mask{display:block}}.vp-theme-container[data-v-9cd7902c]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-9cd7902c]{padding:2rem}}:root{--vp-c-white: #fff;--vp-c-black: #000;--vp-c-grey-text: #656869;--vp-c-grey-hover: #e4e4e9;--vp-c-grey-bg: #ebebef;--vp-c-grey-soft: rgb(142 150 170 / 14%);--vp-c-indigo-text: #3451b2;--vp-c-indigo-hover: #3a5ccc;--vp-c-indigo-bg: #5672cd;--vp-c-indigo-soft: rgb(100 108 255 / 14%);--vp-c-purple-text: #6f42c1;--vp-c-purple-hover: #7e4cc9;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 14%);--vp-c-blue-text: #2888a7;--vp-c-blue-hover: #2d98ba;--vp-c-blue-bg: #2fa1c5;--vp-c-blue-soft: rgb(27 178 229 / 14%);--vp-c-green-text: #18794e;--vp-c-green-hover: #299764;--vp-c-green-bg: #30a46c;--vp-c-green-soft: rgb(16 185 129 / 14%);--vp-c-yellow-text: #915930;--vp-c-yellow-hover: #946300;--vp-c-yellow-bg: #c28100;--vp-c-yellow-soft: rgb(234 179 8 / 14%);--vp-c-red-text: #b8272c;--vp-c-red-hover: #d5393e;--vp-c-red-bg: #e0575b;--vp-c-red-soft: rgb(244 63 94 / 14%)}[data-theme=dark]{--vp-c-white: #000;--vp-c-black: #fff;--vp-c-grey-text: #939499;--vp-c-grey-hover: #414853;--vp-c-grey-bg: #32363f;--vp-c-grey-soft: rgb(101 117 133 / 16%);--vp-c-indigo-text: #a8b1ff;--vp-c-indigo-hover: #5c73e7;--vp-c-indigo-bg: #3e63dd;--vp-c-indigo-soft: rgb(100 108 255 / 16%);--vp-c-blue-text: #c9e8f2;--vp-c-blue-hover: #a6d9ea;--vp-c-blue-bg: #2785a3;--vp-c-blue-soft: rgb(27 178 229 / 16%);--vp-c-purple-text: #c8abfa;--vp-c-purple-hover: #a879e6;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 16%);--vp-c-green-text: #3dd68c;--vp-c-green-hover: #30a46c;--vp-c-green-bg: #298459;--vp-c-green-soft: rgb(16 185 129 / 16%);--vp-c-yellow-text: #f9b44e;--vp-c-yellow-hover: #da8b17;--vp-c-yellow-bg: #a46a0a;--vp-c-yellow-soft: rgb(234 179 8 / 16%);--vp-c-red-text: #f66f81;--vp-c-red-hover: #f14158;--vp-c-red-bg: #b62a3c;--vp-c-red-soft: rgb(244 63 94 / 16%)}:root{color-scheme:light}[data-theme=dark]{color-scheme:dark}html,body{background:var(--vp-c-bg, #fff);accent-color:var(--vp-c-accent, #299764);transition:background-color var(--vp-t-color)}html{font-size:16px;font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}@media print{html{font-size:12pt}}html[data-theme=dark]{color-scheme:dark}body{min-height:100vh;margin:0;padding:0;color:var(--vp-c-text, rgb(60, 60, 67));font-size:1rem;font-synthesis:style}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{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);font-size:1.65rem;transition:border-color var(--vp-t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}a{color:var(--vp-c-accent, #299764);font-weight:500;text-decoration:none;overflow-wrap:break-word}a.header-anchor{position:relative;color:inherit;text-decoration:none}a.header-anchor:before{content:"¶";position:absolute;top:.4167em;left:-.75em;display:none;color:var(--vp-c-accent, #299764);font-size:.75em}[dir=rtl] a.header-anchor:before{right:-.75em}a.header-anchor:hover:before{display:block}a.header-anchor:focus-visible{outline:none}a.header-anchor:focus-visible:before{display:block;outline:auto}strong{font-weight:600}blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;border-inline-start:.2rem solid var(--vp-c-border-hard, #b8b8ba);color:var(--vp-c-text-mute, rgba(60, 60, 67, .78));font-size:1rem;overflow-wrap:break-word;transition:border-color var(--vp-t-color),color var(--vp-t-color)}blockquote>p{margin:0}hr{border:0;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);transition:border-color var(--vp-t-color)}:not(pre)>code{margin:0;padding:3px 6px;border-radius:4px;background:var(--vp-c-grey-soft, rgba(142, 150, 170, .14));font-size:.875em;overflow-wrap:break-word;transition:background-color var(--vp-t-color),color var(--vp-t-color)}p a code{color:var(--vp-c-accent, #299764);font-weight:400}table code{padding:.1rem .4rem}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid var(--vp-c-border, #c2c2c4);border-radius:.25em;box-shadow:1px 1px 4px 0 var(--vp-c-shadow, rgba(0, 0, 0, .15));line-height:1;letter-spacing:-.1em;text-align:center}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tbody tr:nth-child(odd){background:var(--vp-c-bg-alt, #f6f8fa);transition:background-color var(--vp-t-color)}th,td{padding:.6em 1em;border:1px solid var(--vp-c-border-hard, #d1d4d7);transition:border-color var(--vp-t-color)}pre{text-align:left;direction:ltr;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}@media print{pre{white-space:pre-wrap}}pre code{padding:0;border-radius:0}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a.header-anchor{text-decoration:none}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@media (prefers-reduced-motion: reduce){*,:before,:after{background-attachment:initial!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important}}:root{--vp-c-accent: #299764;--vp-c-accent-bg: #3eaf7c;--vp-c-accent-hover: #4abf8a;--vp-c-accent-text: var(--vp-c-white);--vp-c-accent-soft: rgb(16 185 129 / 14%);--vp-c-bg: #fff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #fff;--vp-c-text: rgb(60 60 67);--vp-c-text-mute: rgb(60 60 67 / 78%);--vp-c-text-subtle: rgb(60 60 67 / 56%);--vp-c-gutter: #e2e2e3;--vp-c-border: #c2c2c4;--vp-c-border-hard: #b8b8ba;--vp-c-shadow: rgb(0 0 0 / 15%);--vp-c-control: rgb(142 150 170 / 10%);--vp-c-control-hover: rgb(142 150 170 / 16%);--vp-c-control-disabled: #eaeaea;--vp-navbar-c-bg: var(--vp-c-bg);--vp-sidebar-c-bg: var(--vp-c-bg);--vp-c-code-tab-title: var(--code-c-text, rgb(255 255 255 / 90%));--vp-c-code-tab-bg: var(--code-bg-color, var(--code-c-bg));--vp-c-code-tab-active: var(--vp-c-accent);--badge-c-tip-text: var(--vp-c-green-text);--badge-c-tip-bg: var(--vp-c-green-soft);--badge-c-warning-text: var(--vp-c-yellow-text);--badge-c-warning-bg: var(--vp-c-yellow-soft);--badge-c-danger-text: var(--vp-c-red-text);--badge-c-danger-bg: var(--vp-c-red-soft);--badge-c-important-text: var(--vp-c-purple-text);--badge-c-important-bg: var(--vp-c-purple-soft);--badge-c-info-text: var(--vp-c-indigo-text);--badge-c-info-bg: var(--vp-c-indigo-soft);--badge-c-note-text: var(--vp-c-grey-text);--badge-c-note-bg: var(--vp-c-grey-soft);--font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--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;--header-offset: var(--navbar-height);--vp-t-color: .3s ease;--vp-t-transform: .3s ease;--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z'/%3E%3C/svg%3E");--external-link-c-icon: var(--vp-c-text-mute)}[data-theme=dark]{--vp-c-accent: #3dd68c;--vp-c-accent-bg: #3aa675;--vp-c-accent-hover: #349469;--vp-c-accent-soft: rgb(16 185 129 / 16%);--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-text: rgb(235 235 245 / 86%);--vp-c-text-mute: rgb(235 235 245 / 60%);--vp-c-text-subtle: rgb(235 235 245 / 38%);--vp-c-gutter: #000;--vp-c-border: #3c3f44;--vp-c-border-hard: #45484e;--vp-c-shadow: rgb(0 0 0 / 30%);--vp-c-control: rgb(101 117 133 / 12%);--vp-c-control-hover: rgb(101 117 133 / 18%);--vp-c-control-disabled: #363636}body{font-family:var(--font-family)}code{font-family:var(--code-font-family)}[vp-content] h1,[vp-content] h2,[vp-content] h3,[vp-content] h4,[vp-content] h5,[vp-content] h6{margin-top:calc(.5rem - var(--header-offset));margin-bottom:0;padding-top:calc(1rem + var(--header-offset))}[vp-content] h1:first-child,[vp-content] h2:first-child,[vp-content] h3:first-child,[vp-content] h4:first-child,[vp-content] h5:first-child,[vp-content] h6:first-child{margin-bottom:1rem}[vp-content] h1:first-child+p,[vp-content] h1:first-child+pre,[vp-content] h1:first-child+.custom-container,[vp-content] h2:first-child+p,[vp-content] h2:first-child+pre,[vp-content] h2:first-child+.custom-container,[vp-content] h3:first-child+p,[vp-content] h3:first-child+pre,[vp-content] h3:first-child+.custom-container,[vp-content] h4:first-child+p,[vp-content] h4:first-child+pre,[vp-content] h4:first-child+.custom-container,[vp-content] h5:first-child+p,[vp-content] h5:first-child+pre,[vp-content] h5:first-child+.custom-container,[vp-content] h6:first-child+p,[vp-content] h6:first-child+pre,[vp-content] h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 419px){[vp-content] h1{font-size:1.9rem}}[vp-content] a:not(.header-anchor){text-decoration:underline}[vp-content] img{max-width:100%}div[class*=language-]{margin:.75rem 0;transition:background-color var(--vp-t-color),color var(--vp-t-color)}@media (max-width: 419px){div[class*=language-]{--code-border-radius: 0;margin:.75rem -1.5rem}}div[class*=language-] .line.diff,div[class*=language-] .line.highlighted{transition:background-color var(--vp-t-color)}.table-of-contents .vp-badge{vertical-align:middle}.arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}[data-theme=dark] .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}.arrow.left{transform:rotate(-90deg)}.vp-external-link-icon:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .external-link:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon [vp-content] a[href*="://"]:not(.no-external-link-icon):after,.external-link-icon [vp-content] a[target=_blank]:not(.no-external-link-icon):after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}:root{scroll-behavior:smooth}@media screen and (max-width: 719px){.vp-hide-mobile{display:none}}.vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-comment{padding:2rem}}@media (max-width: 419px){.vp-comment{padding:1.5rem}}.vp-navbar .DocSearch{transition:background-color var(--vp-t-color)}.vp-navbar .search-box{vertical-align:top;flex:0 0 auto}@media screen and (max-width: 719px){.hint-container{margin-inline:-.75rem}}.lang-modal-fade-enter-active,.lang-modal-fade-leave-active{transition:opacity .5s}.lang-modal-fade-enter,.lang-modal-fade-leave-to{opacity:0}.lang-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1499;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}@media print{.lang-modal-mask{display:none}}.lang-modal-wrapper{position:relative;z-index:1500;overflow:hidden;max-width:80vw;padding:1rem 2rem;border-radius:8px;background:var(--vp-bg);box-shadow:0 2px 6px 0 var(--card-shadow)}.lang-modal-action{display:block;width:100%;margin:1rem 0;padding:.5rem .75rem;border:none;border-radius:8px;background-color:var(--vp-bglt);color:var(--vp-c);cursor:pointer}.lang-modal-action:hover{background-color:var(--vp-bgl)}.lang-modal-action.primary{background-color:var(--vp-tc);color:var(--white)}.lang-modal-action.primary:hover{background-color:var(--vp-tcl)}.grey{color:#0006}.works-table-wrapper[data-v-765855fb]{margin:0 auto;padding:0 2rem;max-width:1224px;box-sizing:border-box}.works-table-wrapper[data-v-765855fb] table{width:100%}:root{--content-width: 960px}.vp-page .theme-default-content{padding-bottom:0!important}.vp-page-meta{display:none}
diff --git a/assets/style-CGM4yktK.css b/assets/style-CGM4yktK.css
new file mode 100644
index 0000000..40dad57
--- /dev/null
+++ b/assets/style-CGM4yktK.css
@@ -0,0 +1 @@
+.vp-back-to-top-button{position:fixed!important;inset-inline-end:1rem;bottom:4rem;z-index:100;width:48px;height:48px;padding:12px;border-width:0;border-radius:50%;background:var(--back-to-top-c-bg);color:var(--back-to-top-c-accent-bg);box-shadow:2px 2px 10px 4px var(--back-to-top-c-shadow);cursor:pointer}@media (max-width: 959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-c-accent-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:24px;height:24px;margin:0 auto;background:var(--back-to-top-c-icon);-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;inset-inline-end:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.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{--back-to-top-z-index: 5;--back-to-top-icon: url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='4'%20d='M24.008%2014.1V42M12%2026l12-12l12%2012M12%206h24'%20/%3e%3c/svg%3e");--back-to-top-c-bg: var(--vp-c-bg);--back-to-top-c-accent-bg: var(--vp-c-accent-bg);--back-to-top-c-accent-hover: var(--vp-c-accent-hover);--back-to-top-c-shadow: var(--vp-c-shadow);--back-to-top-c-icon: currentcolor}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:#0000;outline:none;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button:before{content:"";display:inline-block;width:1.25rem;height:1.25rem;padding:.625rem;background:currentcolor;color:var(--copy-code-c-text);font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.vp-copy-code-button:focus,.vp-copy-code-button.copied{opacity:1}.vp-copy-code-button:hover,.vp-copy-code-button.copied{background:var(--copy-code-c-hover)}.vp-copy-code-button.copied:before{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--copy-code-c-hover);color:var(--copy-code-c-text);font-weight:500;line-height:1.25rem;white-space:nowrap}.no-copy-code .vp-copy-code-button{display:none}body:not(.no-copy-code) div[class*=language-]:hover:before{display:none}body:not(.no-copy-code) div[class*=language-]:hover .vp-copy-code-button{opacity:1}:root{--code-copy-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2' /%3e%3c/svg%3e");--code-copied-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4' /%3e%3c/svg%3e");--copy-code-c-text: var(--code-c-line-number);--copy-code-c-hover: var(--code-c-highlight-bg)}.hint-container{position:relative;background:var(--hint-c-soft);transition:background var(--vp-t-color),color var(--vp-t-color)}@media print{.hint-container{page-break-inside:avoid}}.hint-container>.hint-container-title{color:var(--hint-c-title)}.hint-container :not(pre)>code{background:var(--hint-c-soft)}.hint-container .hint-container-title{position:relative;margin-block:.75em;font-weight:600;line-height:1.25}.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{margin-block:.75rem;padding:.25em 1em;border-radius:.5em;color:inherit;font-size:var(--hint-font-size)}@media print{.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{border-inline-start-width:.25em;border-inline-start-style:solid}}.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:1.75em}@media print{.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:0}}.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{content:" ";position:absolute;inset-inline-start:0;top:calc(50% - .6125em);width:1.25em;height:1.25em;font-size:1.25em}@media print{.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{display:none}}.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.caution p{line-height:1.5}.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.caution a{color:var(--vp-c-accent)}.hint-container.important{--hint-c-accent: var(--important-c-accent);--hint-c-title: var(--important-c-text);--hint-c-soft: var(--important-c-soft)}.hint-container.important>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.info{--hint-c-accent: var(--info-c-accent);--hint-c-title: var(--info-c-text);--hint-c-soft: var(--info-c-soft)}.hint-container.info>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.note{--hint-c-accent: var(--note-c-accent);--hint-c-title: var(--note-c-text);--hint-c-soft: var(--note-c-soft)}.hint-container.note>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.tip{--hint-c-accent: var(--tip-c-accent);--hint-c-title: var(--tip-c-text);--hint-c-soft: var(--tip-c-soft)}.hint-container.tip>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.warning{--hint-c-accent: var(--warning-c-accent);--hint-c-title: var(--warning-c-text);--hint-c-soft: var(--warning-c-soft)}.hint-container.warning>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.caution{--hint-c-accent: var(--caution-c-accent);--hint-c-title: var(--caution-c-text);--hint-c-soft: var(--caution-c-soft)}.hint-container.caution>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.details{position:relative;display:block;margin-block:.75rem;padding:1.25rem 1rem;border-radius:.5rem;background:var(--detail-c-bg);transition:background var(--vp-t-transform),color var(--vp-t-transform)}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-c-accent)}.hint-container.details :not(pre)>code{background:var(--detail-c-soft)}.hint-container.details summary{position:relative;margin:-1rem;padding-block:1em;padding-inline:3em 1.5em;list-style:none;font-size:var(--hint-font-size);cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:#0000;font-size:0}.hint-container.details summary:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:" ";position:absolute;inset-inline-start:.8em;top:calc(50% - .5em);width:1em;height:1em;font-size:1.25rem;line-height:normal;transition:color,var(--vp-t-color),transform var(--vp-t-transform);transform:rotate(90deg)}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:before{transform:rotate(180deg)}:root{--hint-font-size: .92rem;--important-c-accent: var(--vp-c-purple-bg);--important-c-text: var(--vp-c-purple-text);--important-c-soft: var(--vp-c-purple-soft);--info-c-accent: var(--vp-c-blue-bg);--info-c-text: var(--vp-c-blue-text);--info-c-soft: var(--vp-c-blue-soft);--note-c-accent: var(--vp-c-grey-bg);--note-c-text: var(--vp-c-grey-text);--note-c-soft: var(--vp-c-grey-soft);--tip-c-accent: var(--vp-c-green-bg);--tip-c-text: var(--vp-c-green-text);--tip-c-soft: var(--vp-c-green-soft);--warning-c-accent: var(--vp-c-yellow-bg);--warning-c-text: var(--vp-c-yellow-text);--warning-c-soft: var(--vp-c-yellow-soft);--caution-c-accent: var(--vp-c-red-bg);--caution-c-text: var(--vp-c-red-text);--caution-c-soft: var(--vp-c-red-soft);--detail-c-bg: var(--vp-c-control);--detail-c-icon: var(--vp-c-border);--detail-c-soft: var(--vp-c-grey-soft)}:root{--nprogress-c: var(--vp-c-accent);--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{position:fixed;top:0;left:0;z-index:var(--nprogress-z-index);width:100%;height:2px;background:var(--nprogress-c)}:root{--code-padding-x: 1.25rem;--code-padding-y: 1rem;--code-border-radius: 6px;--code-line-height: 1.6;--code-font-size: .875em;--code-font-family: consolas, monaco, "Andale Mono", "Ubuntu Mono", monospace}div[class*=language-]{position:relative;border-radius:var(--code-border-radius);background-color:var(--code-c-bg)}div[class*=language-]:before{content:attr(data-ext);position:absolute;top:.8em;right:1em;z-index:3;color:var(--code-c-text);font-size:.75rem}div[class*=language-] pre{position:relative;z-index:1;overflow-x:auto;margin:0;border-radius:var(--code-border-radius);font-size:var(--code-font-size);font-family:var(--code-font-family);line-height:var(--code-line-height)}div[class*=language-] pre code{display:block;box-sizing:border-box;width:-moz-fit-content;width:fit-content;min-width:100%;padding:var(--code-padding-y) var(--code-padding-x);background-color:#0000!important;color:var(--code-c-text);overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--code-c-text: #f8f8f2;--code-c-bg: #2e3440;--code-c-highlight-bg: rgb(51.6454545455, 60.5484848485, 78.3545454545);--code-c-line-number: rgba(248, 248, 242, .67)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a3be8c}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#81a1c1}.token.atrule,.token.attr-value,.token.function,.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,.token.important{color:#ebcb8b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--code-line-number-width: 3rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-line-number-width);height:100%;border-right:1px solid var(--code-c-highlight-bg, var(--code-c-text));border-radius:var(--code-border-radius) 0 0 var(--code-border-radius);transition:border var(--vp-t-color)}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--code-line-number-width)}div[class*=language-].line-numbers-mode code{padding-left:1rem}div[class*=language-].line-numbers-mode .line-numbers{counter-reset:line-number;position:absolute;top:0;left:0;width:var(--code-line-number-width);padding-top:var(--code-padding-y);color:var(--code-c-line-number, var(--code-c-text));font-size:var(--code-font-size);line-height:var(--code-line-height);text-align:center}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:3;font-family:var(--code-font-family);-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);counter-increment:line-number}div[class*=language-] .line.highlighted{display:inline-block;width:100%;margin:0 calc(-1*var(--code-padding-x));padding:0 var(--code-padding-x);background-color:var(--code-c-highlight-bg)}@property --vp-collapsed-lines-bg{inherits:false;initial-value:#fff;syntax:"<color>"}@keyframes code-collapsed-lines{0%{opacity:.3;transform:translateY(-2px) rotate(var(--vp-collapsed-lines-rotate))}to{opacity:1;transform:translateY(2px) rotate(var(--vp-collapsed-lines-rotate))}}div[class*=language-].has-collapsed-lines .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg);--vp-collapsed-lines-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='m18 12l-6 6l-6-6m12-6l-6 6l-6-6'/%3E%3C/svg%3E");--vp-collapsed-lines-rotate: 0deg;position:absolute;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;height:28px;background:linear-gradient(to bottom,transparent 0%,var(--vp-collapsed-lines-bg) 55%,var(--vp-collapsed-lines-bg) 100%);cursor:pointer;transition:--vp-collapsed-lines-bg var(--vp-t-color)}div[class*=language-].has-collapsed-lines .collapsed-lines:hover{--vp-collapsed-lines-bg: var(--code-c-highlight-bg)}div[class*=language-].has-collapsed-lines .collapsed-lines:before{content:"";display:inline-block;width:24px;height:24px;background-color:var(--code-c-text);-webkit-mask-image:var(--vp-collapsed-lines-icon);mask-image:var(--vp-collapsed-lines-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:20px;mask-size:20px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;animation:code-collapsed-lines 1.2s infinite alternate-reverse ease-in-out}div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-light-bg))}[data-theme=dark] div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-dark-bg))}div[class*=language-].has-collapsed-lines.collapsed{overflow-y:hidden;height:calc(var(--vp-collapsed-lines)*var(--code-line-height)*var(--code-font-size) + var(--code-padding-y) + 28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) code{padding-bottom:max(var(--code-padding-y),28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines{--vp-collapsed-lines-rotate: 180deg}:root{--code-title-c-text: var(--vp-c-text-mute);--code-title-c-bg: var(--code-c-bg);--code-title-divider: var(--code-c-highlight-bg, var(--code-c-text))}.code-block-title div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}.code-block-title .code-block-title-bar{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0 12px;border-bottom:solid 1px var(--code-title-divider);border-radius:6px 6px 0 0;background:var(--code-title-c-bg);white-space:nowrap;transition:background var(--vp-t-color)}@media (max-width: 419px){.code-block-title .code-block-title-bar{margin:.75rem -1.5rem -.75rem;border-radius:0}}.code-block-title .code-block-title-bar .title{position:relative;display:inline-block;margin:0;padding:8px 12px;color:var(--code-title-c-text);font-weight:500;font-size:.875em;line-height:1.7;transition:background var(--vp-t-color)}.vp-code-tabs-nav{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-c-bg);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{position:relative;min-width:3rem;margin:0;padding:6px 12px;border-width:0;border-radius:6px 6px 0 0;background:#0000;color:var(--code-tabs-c-text);font-weight:600;font-size:.875em;line-height:1.4;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-code-tab-nav:hover{background:var(--code-tabs-c-hover)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-c-bg, var(--vp-c-bg-alt))}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav:first-child:before{display:none}[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.75rem -1.5rem;border-radius:0}}.vp-code-tab div[class*=language-].line-numbers-mode:after{border-top-left-radius:0}.vp-code-tab div[class*=language-] pre{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-] pre{border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.vp-tabs{margin:1.5rem 0;border:1px solid var(--vp-c-border);border-radius:8px}@media (max-width: 419px){[vp-content]>.vp-tabs{margin-inline:-1.5rem;border:none;border-bottom:1px solid var(--vp-c-border);border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:.5rem .5rem 0 0;background:var(--tab-c-bg-nav);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{position:relative;min-width:4rem;margin:0;padding:.5em 1em;border:none;border-radius:.5rem .5rem 0 0;background:#0000;color:var(--tab-c-nav);font-weight:600;font-size:.875em;line-height:1.75;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-tab-nav:hover{background:var(--tab-c-bg-nav-hover)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-c-bg)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;border-radius:0 0 .5rem .5rem;background:var(--tab-c-bg);transition:background var(--vp-t-color)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(n+2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-c-border);font-weight:500}@media print{.vp-tab-title{display:block}}:root{--code-tabs-c-text: var(--code-c-text);--code-tabs-c-bg: var(--code-c-highlight-bg);--code-tabs-c-hover: var(--code-c-bg, var(--vp-c-bg-alt));--tab-c-bg: var(--vp-c-bg);--tab-c-nav: var(--vp-c-text);--tab-c-bg-nav: var(--vp-c-grey-bg);--tab-c-bg-nav-hover: var(--vp-c-control-hover)}.vp-badge{display:inline-block;vertical-align:top;height:1.3em;padding:0 6px;border-radius:3px;background:var(--vp-c-accent-soft);color:var(--vp-c-accent);font-size:.875em;line-height:1.3;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-badge+.vp-badge{margin-inline-start:5px}.vp-badge.tip{background:var(--badge-c-tip-bg);color:var(--badge-c-tip-text)}.vp-badge.warning{background:var(--badge-c-warning-bg);color:var(--badge-c-warning-text)}.vp-badge.danger{background:var(--badge-c-danger-bg);color:var(--badge-c-danger-text)}.vp-badge.important{background:var(--badge-c-important-bg);color:var(--badge-c-important-text)}.vp-badge.info{background:var(--badge-c-info-bg);color:var(--badge-c-info-text)}.vp-badge.note{background:var(--badge-c-note-bg);color:var(--badge-c-note-text)}.vp-fade-slide-y-enter-active{transition:all .2s ease}.vp-fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.vp-fade-slide-y-enter-from,.vp-fade-slide-y-leave-to{opacity:0;transform:translateY(-10px)}.vp-features{display:flex;flex-wrap:wrap;place-content:stretch space-between;align-items:flex-start;margin-top:2.5rem;padding:1.2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-features{flex-direction:column}}.vp-feature{flex-grow:1;flex-basis:30%;max-width:30%}@media (max-width: 719px){.vp-feature{max-width:100%;padding:0 2.5rem}}.vp-feature h2{padding-bottom:0;border-bottom:none;font-weight:500;font-size:1.4rem}@media (max-width: 419px){.vp-feature h2{font-size:1.25rem}}.vp-feature p{color:var(--vp-c-text-mute)}.vp-footer{padding:2.5rem;border-top:1px solid var(--vp-c-border);color:var(--vp-c-text-mute);text-align:center;transition:border-color var(--vp-t-color)}.vp-hero{text-align:center}.vp-hero-image{display:block;max-width:100%;max-height:280px;margin:3rem auto 1.5rem}@media (max-width: 419px){.vp-hero-image{max-height:210px;margin:2rem auto 1.2rem}}#main-title{font-size:3rem}@media (max-width: 419px){#main-title{font-size:2rem}}#main-title,.vp-hero-description,.vp-hero-actions{margin:1.8rem auto}@media (max-width: 419px){#main-title,.vp-hero-description,.vp-hero-actions{margin:1.2rem auto}}.vp-hero-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.vp-hero-description{max-width:35rem;color:var(--vp-c-text-mute);font-size:1.6rem;line-height:1.3}@media (max-width: 419px){.vp-hero-description{font-size:1.2rem}}.vp-hero-action-button{display:inline-block;box-sizing:border-box;padding:.8rem 1.6rem;border:2px solid var(--vp-c-accent-bg);border-radius:4px;background-color:var(--vp-c-bg);color:var(--vp-c-accent);font-size:1.2rem;transition:background-color border-color color var(--vp-t-color)}@media (max-width: 419px){.vp-hero-action-button{padding:.6rem 1.2rem;font-size:1rem}}.vp-hero-action-button:hover{color:var(--vp-c-accent-text)}.vp-hero-action-button.primary{background-color:var(--vp-c-accent-bg);color:var(--vp-c-accent-text)}.vp-hero-action-button.primary:hover{border-color:var(--vp-c-accent-hover);background-color:var(--vp-c-accent-hover)}.vp-home{display:block;max-width:var(--homepage-width);margin:0 auto;padding:var(--navbar-height) 2rem 0}@media (max-width: 419px){.vp-home{padding-inline:1.5rem}}.vp-home [vp-content]{margin:0;padding:0}.vp-site-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:var(--navbar-padding-v)}.vp-site-name{position:relative;color:var(--vp-c-text);font-weight:600;font-size:1.3rem}@media screen and (max-width: 719px){.vp-site-name{display:block;overflow:hidden;width:calc(100vw - 11rem);text-overflow:ellipsis;white-space:nowrap}}.vp-dropdown-enter-from,.vp-dropdown-leave-to{height:0!important;opacity:0}.vp-dropdown-enter-active{transition:height .3s ease-in-out,opacity .6s ease-out}.vp-navbar-dropdown-wrapper{cursor:pointer}.vp-navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.vp-navbar-dropdown-wrapper:not(.mobile):hover .vp-navbar-dropdown,.vp-navbar-dropdown-wrapper:not(.mobile).open .vp-navbar-dropdown{display:block!important}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown{overflow:hidden;transition:height .1s ease-out;padding-top:.5rem}.vp-navbar-dropdown-wrapper:not(.mobile) .vp-navbar-dropdown{position:absolute;inset-inline-end:0;top:100%;display:none;overflow-y:auto;box-sizing:border-box;height:auto!important;max-height:calc(100vh - 2.7rem);margin:0;padding:.6rem 0;border:1px solid var(--vp-c-gutter);border-radius:.5rem;background-color:var(--vp-c-bg-elv);text-align:start;white-space:nowrap}.vp-navbar-dropdown-title{display:block;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:500;font-size:.9rem;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title{display:none}.vp-navbar-dropdown-title:hover{border-color:transparent}.vp-navbar-dropdown-title-mobile{display:none;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:600;font-size:inherit;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title-mobile{display:block}.vp-navbar-dropdown-title-mobile:hover{color:var(--vp-c-accent)}.vp-navbar-dropdown-item{color:inherit;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link{position:relative;display:block;margin-bottom:0;padding:0 1.25rem;border-bottom:none;font-weight:400;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link:hover,.vp-navbar-dropdown-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-dropdown-item .auto-link.auto-link-active:after{content:"";position:absolute;inset-inline-start:9px;top:calc(50% - 2px);width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-inline-start:5px solid var(--vp-c-accent)}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-item>a{line-height:2rem}.vp-navbar-dropdown-subtitle{margin:.45rem 0 0;padding:1rem 0 .45rem;border-top:1px solid var(--vp-c-gutter);font-size:.9rem}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;padding-bottom:0;border-top:0;line-height:2rem}.vp-navbar-dropdown-item:first-child .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.vp-navbar-dropdown-subtitle>span{padding-inline:1.25rem 1.5rem}.vp-navbar-dropdown-subtitle>.auto-link{font-weight:inherit}.vp-navbar-dropdown-subtitle>.auto-link.auto-link-active:after{display:none}.vp-navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.vp-navbar-dropdown-subitem{font-size:.9em}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subitem{padding-inline-start:1rem}.vp-navbar-items{display:inline-block}@media print{.vp-navbar-items{display:none}}.vp-navbar-items .auto-link{color:inherit;line-height:1.4rem}.vp-navbar-items .auto-link:hover,.vp-navbar-items .auto-link.auto-link-active{color:var(--vp-c-text)}.vp-navbar-item{position:relative;display:inline-block;margin-inline-start:1.5rem;line-height:var(--navbar-line-height)}@media (max-width: 719px){.vp-navbar-item{margin-inline-start:0}}.vp-navbar-item:first-child{margin-inline-start:0}.vp-navbar-item .auto-link:hover,.vp-navbar-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-item>.auto-link{display:inline-block}.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:-2px;border-bottom:2px solid var(--vp-c-accent)}@media (max-width: 719px){.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:0;border-bottom:none}}.vp-toggle-color-mode-button{display:flex;margin:auto;margin-inline-start:1rem;border:0;background:none;color:var(--vp-c-text);opacity:.8;cursor:pointer}@media print{.vp-toggle-color-mode-button{display:none}}.vp-toggle-color-mode-button:hover{opacity:1}.vp-toggle-color-mode-button .light-icon,.vp-toggle-color-mode-button .dark-icon{width:1.25rem;height:1.25rem}.vp-toggle-sidebar-button{position:absolute;inset-inline-start:1rem;top:.6rem;display:none;padding:.6rem;cursor:pointer}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block}}.vp-toggle-sidebar-button .icon{display:flex;flex-direction:column;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;cursor:inherit}.vp-toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--vp-c-text);transition:transform var(--vp-t-transform)}.vp-toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1),.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );position:fixed;top:0;right:0;left:0;z-index:20;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-padding-v) var(--navbar-padding-h);border-bottom:1px solid var(--vp-c-border);background-color:var(--vp-navbar-c-bg);line-height:var(--navbar-line-height);transition:background-color var(--vp-t-color),border-color var(--vp-t-color)}@media screen and (max-width: 719px){.vp-navbar{padding-inline-start:4rem}}.vp-navbar-items-wrapper{position:absolute;inset-inline-end:var(--navbar-padding-h);top:var(--navbar-padding-v);display:flex;box-sizing:border-box;height:var(--navbar-line-height);padding-inline-start:var(--navbar-padding-h);font-size:.9rem;white-space:nowrap}.vp-page-meta{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page-meta{padding:2rem}}@media (max-width: 419px){.vp-page-meta{padding:1.5rem}}.vp-page-meta{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media print{.vp-page-meta{margin:0!important;padding-inline:0!important}}@media (max-width: 719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--vp-c-text-mute)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--vp-c-text-mute);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:.875em}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .edit-icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.vp-page-meta .last-updated,.vp-page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:.875em}@media (max-width: 719px){.vp-page-meta .last-updated,.vp-page-meta .contributors{font-size:.825em;text-align:start}}.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-inline:auto;margin-top:0;padding:1rem 2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-top var(--vp-t-color)}@media (max-width: 959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .auto-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--vp-c-gutter);border-radius:.25rem}.vp-page-nav .auto-link:hover{background:var(--vp-c-control)}.vp-page-nav .auto-link.external-link:after{display:none}.vp-page-nav .auto-link:not(.external-link) .external-link:after{display:none}.vp-page-nav .auto-link .hint{color:var(--vp-c-text-mute);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end}.vp-page{display:block;padding-top:var(--navbar-height);padding-bottom:2rem;padding-inline-start:var(--sidebar-width)}@media (max-width: 959px){.vp-page{padding-inline-start:var(--sidebar-width-mobile)}}@media (max-width: 719px){.vp-page{padding-inline-start:0}}.vp-page [vp-content]{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page [vp-content]{padding:2rem}}@media (max-width: 419px){.vp-page [vp-content]{padding:1.5rem}}.vp-page [vp-content]{padding-top:0}.vp-sidebar-item{border-inline-start:.25rem solid transparent;color:var(--vp-c-text);cursor:default}.vp-sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.vp-sidebar-item.vp-sidebar-heading{box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:1.25rem 1.5rem;font-weight:700;font-size:1.1em;transition:color .15s ease}.vp-sidebar-item.vp-sidebar-heading+.vp-sidebar-children{overflow:hidden;transition:height .1s ease-out;margin-bottom:.75rem}.vp-sidebar-item.collapsible{cursor:pointer}.vp-sidebar-item:not(.vp-sidebar-heading){display:inline-block;box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:2rem 1rem;font-weight:400;font-size:1em;line-height:1.4}.vp-sidebar-item:not(.vp-sidebar-heading)+.vp-sidebar-children{padding-inline-start:1rem;font-size:.95em}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading){padding-block:.25rem;padding-inline:1.75rem 1rem}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent;font-weight:500}a.vp-sidebar-heading+.vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent}.vp-sidebar-item.active:not(p.vp-sidebar-heading){border-inline-start-color:var(--vp-c-accent);color:var(--vp-c-accent);font-weight:600}.vp-sidebar-item .auto-link{display:block}.vp-sidebar-item.auto-link{display:block;cursor:pointer}.vp-sidebar-item.auto-link:hover{color:var(--vp-c-accent)}.vp-sidebar-items{margin:0;padding:1.5rem 0;list-style-type:none}@media (max-width: 719px){.vp-sidebar-items{padding:1rem 0}}.vp-sidebar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar{position:fixed;inset-inline-start:0;top:var(--navbar-height);bottom:0;z-index:10;overflow-y:auto;box-sizing:border-box;width:var(--sidebar-width);margin:0;border-inline-end:1px solid var(--vp-c-border);background-color:var(--vp-sidebar-c-bg);font-size:1rem;transition:transform var(--vp-t-transform),background-color var(--vp-t-color),border-color var(--vp-t-color);scrollbar-color:var(--vp-c-accent-bg) var(--vp-c-gutter);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{width:var(--sidebar-width-mobile);font-size:.9rem}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}[dir=rtl] .vp-sidebar{transform:translate(100%)}}.vp-sidebar::-webkit-scrollbar{width:7px}.vp-sidebar::-webkit-scrollbar-track{background-color:var(--vp-c-gutter)}.vp-sidebar::-webkit-scrollbar-thumb{background-color:var(--vp-c-accent-bg)}.vp-sidebar .vp-navbar-items{display:none;padding:.5rem 0 .75rem;border-bottom:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-sidebar .vp-navbar-items{display:block}.vp-sidebar .vp-navbar-items .vp-navbar-dropdown-item .route-link-active:after{top:calc(1rem - 2px)}}.vp-sidebar .vp-navbar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar .vp-navbar-items .auto-link{font-weight:600}.vp-sidebar .vp-navbar-item{display:block;padding-block:.5rem;padding-inline:1.5rem 0;font-size:1.1em;line-height:1.25rem}.vp-sidebar-mask{position:fixed;top:0;left:0;z-index:9;display:none;width:100vw;height:100vh}.vp-theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.vp-theme-container.no-navbar .vp-sidebar{padding-top:0}}.vp-theme-container.no-navbar .vp-page{padding-top:0}.vp-theme-container.no-navbar [vp-content] h1,.vp-theme-container.no-navbar [vp-content] h2,.vp-theme-container.no-navbar [vp-content] h3,.vp-theme-container.no-navbar [vp-content] h4,.vp-theme-container.no-navbar [vp-content] h5,.vp-theme-container.no-navbar [vp-content] h6{margin-top:1.5rem;padding-top:0}.vp-theme-container.no-sidebar .vp-sidebar{display:none}@media (max-width: 719px){.vp-theme-container.no-sidebar .vp-sidebar{display:block}}.vp-theme-container.no-sidebar .vp-page{padding-inline-start:0}@media (max-width: 719px){.vp-theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.vp-theme-container.sidebar-open .vp-sidebar-mask{display:block}}.vp-theme-container[data-v-0b944fad]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-0b944fad]{padding:2rem}}:root{--vp-c-white: #fff;--vp-c-black: #000;--vp-c-grey-text: #656869;--vp-c-grey-hover: #e4e4e9;--vp-c-grey-bg: #ebebef;--vp-c-grey-soft: rgb(142 150 170 / 14%);--vp-c-indigo-text: #3451b2;--vp-c-indigo-hover: #3a5ccc;--vp-c-indigo-bg: #5672cd;--vp-c-indigo-soft: rgb(100 108 255 / 14%);--vp-c-purple-text: #6f42c1;--vp-c-purple-hover: #7e4cc9;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 14%);--vp-c-blue-text: #2888a7;--vp-c-blue-hover: #2d98ba;--vp-c-blue-bg: #2fa1c5;--vp-c-blue-soft: rgb(27 178 229 / 14%);--vp-c-green-text: #18794e;--vp-c-green-hover: #299764;--vp-c-green-bg: #30a46c;--vp-c-green-soft: rgb(16 185 129 / 14%);--vp-c-yellow-text: #915930;--vp-c-yellow-hover: #946300;--vp-c-yellow-bg: #c28100;--vp-c-yellow-soft: rgb(234 179 8 / 14%);--vp-c-red-text: #b8272c;--vp-c-red-hover: #d5393e;--vp-c-red-bg: #e0575b;--vp-c-red-soft: rgb(244 63 94 / 14%)}[data-theme=dark]{--vp-c-white: #000;--vp-c-black: #fff;--vp-c-grey-text: #939499;--vp-c-grey-hover: #414853;--vp-c-grey-bg: #32363f;--vp-c-grey-soft: rgb(101 117 133 / 16%);--vp-c-indigo-text: #a8b1ff;--vp-c-indigo-hover: #5c73e7;--vp-c-indigo-bg: #3e63dd;--vp-c-indigo-soft: rgb(100 108 255 / 16%);--vp-c-blue-text: #c9e8f2;--vp-c-blue-hover: #a6d9ea;--vp-c-blue-bg: #2785a3;--vp-c-blue-soft: rgb(27 178 229 / 16%);--vp-c-purple-text: #c8abfa;--vp-c-purple-hover: #a879e6;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 16%);--vp-c-green-text: #3dd68c;--vp-c-green-hover: #30a46c;--vp-c-green-bg: #298459;--vp-c-green-soft: rgb(16 185 129 / 16%);--vp-c-yellow-text: #f9b44e;--vp-c-yellow-hover: #da8b17;--vp-c-yellow-bg: #a46a0a;--vp-c-yellow-soft: rgb(234 179 8 / 16%);--vp-c-red-text: #f66f81;--vp-c-red-hover: #f14158;--vp-c-red-bg: #b62a3c;--vp-c-red-soft: rgb(244 63 94 / 16%)}:root{color-scheme:light}[data-theme=dark]{color-scheme:dark}html,body{background:var(--vp-c-bg, #fff);accent-color:var(--vp-c-accent, #299764);transition:background-color var(--vp-t-color)}html{font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}@media print{html{font-size:12pt}}html[data-theme=dark]{color-scheme:dark}body{min-height:100vh;margin:0;padding:0;color:var(--vp-c-text, rgb(60, 60, 67));font-size:1rem;font-synthesis:style}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{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);font-size:1.65rem;transition:border-color var(--vp-t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}a{color:var(--vp-c-accent, #299764);font-weight:500;text-decoration:none;overflow-wrap:break-word}a.header-anchor{position:relative;color:inherit;text-decoration:none}a.header-anchor:before{content:"¶";position:absolute;top:.4167em;left:-.75em;display:none;color:var(--vp-c-accent, #299764);font-size:.75em}[dir=rtl] a.header-anchor:before{right:-.75em}a.header-anchor:hover:before{display:block}a.header-anchor:focus-visible{outline:none}a.header-anchor:focus-visible:before{display:block;outline:auto}strong{font-weight:600}blockquote{margin:1rem 0;padding-block:.25rem;padding-inline:1rem 0;border-inline-start:.2rem solid var(--vp-c-border-hard, #b8b8ba);color:var(--vp-c-text-mute, rgba(60, 60, 67, .78));font-size:1rem;overflow-wrap:break-word;transition:border-color var(--vp-t-color),color var(--vp-t-color)}blockquote>p{margin:0}hr{border:0;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);transition:border-color var(--vp-t-color)}:not(pre)>code{margin:0;padding:3px 6px;border-radius:4px;background:var(--vp-c-grey-soft, rgba(142, 150, 170, .14));font-size:.875em;overflow-wrap:break-word;transition:background-color var(--vp-t-color),color var(--vp-t-color)}p a code{color:var(--vp-c-accent, #299764);font-weight:400}table code{padding:.1rem .4rem}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid var(--vp-c-border, #c2c2c4);border-radius:.25em;box-shadow:1px 1px 4px 0 var(--vp-c-shadow, rgba(0, 0, 0, .15));line-height:1;letter-spacing:-.1em;text-align:center}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tbody tr:nth-child(odd){background:var(--vp-c-bg-alt, #f6f8fa);transition:background-color var(--vp-t-color)}th,td{padding:.6em 1em;border:1px solid var(--vp-c-border-hard, #d1d4d7);transition:border-color var(--vp-t-color)}pre{text-align:left;direction:ltr;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}@media print{pre{white-space:pre-wrap}}pre code{padding:0;border-radius:0}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a.header-anchor{text-decoration:none}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@media (prefers-reduced-motion: reduce){*,:before,:after{background-attachment:initial!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important}}:root{--vp-c-accent: #299764;--vp-c-accent-bg: #3eaf7c;--vp-c-accent-hover: #4abf8a;--vp-c-accent-text: var(--vp-c-white);--vp-c-accent-soft: rgb(16 185 129 / 14%);--vp-c-bg: #fff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #fff;--vp-c-text: rgb(60 60 67);--vp-c-text-mute: rgb(60 60 67 / 78%);--vp-c-text-subtle: rgb(60 60 67 / 56%);--vp-c-gutter: #e2e2e3;--vp-c-border: #c2c2c4;--vp-c-border-hard: #b8b8ba;--vp-c-shadow: rgb(0 0 0 / 15%);--vp-c-control: rgb(142 150 170 / 10%);--vp-c-control-hover: rgb(142 150 170 / 16%);--vp-c-control-disabled: #eaeaea;--vp-navbar-c-bg: var(--vp-c-bg);--vp-sidebar-c-bg: var(--vp-c-bg);--vp-c-code-tab-title: var(--code-c-text, rgb(255 255 255 / 90%));--vp-c-code-tab-bg: var(--code-bg-color, var(--code-c-bg));--vp-c-code-tab-active: var(--vp-c-accent);--badge-c-tip-text: var(--vp-c-green-text);--badge-c-tip-bg: var(--vp-c-green-soft);--badge-c-warning-text: var(--vp-c-yellow-text);--badge-c-warning-bg: var(--vp-c-yellow-soft);--badge-c-danger-text: var(--vp-c-red-text);--badge-c-danger-bg: var(--vp-c-red-soft);--badge-c-important-text: var(--vp-c-purple-text);--badge-c-important-bg: var(--vp-c-purple-soft);--badge-c-info-text: var(--vp-c-indigo-text);--badge-c-info-bg: var(--vp-c-indigo-soft);--badge-c-note-text: var(--vp-c-grey-text);--badge-c-note-bg: var(--vp-c-grey-soft);--font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--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;--header-offset: var(--navbar-height);--vp-t-color: .3s ease;--vp-t-transform: .3s ease;--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z'/%3E%3C/svg%3E");--external-link-c-icon: var(--vp-c-text-mute)}[data-theme=dark]{--vp-c-accent: #3dd68c;--vp-c-accent-bg: #3aa675;--vp-c-accent-hover: #349469;--vp-c-accent-soft: rgb(16 185 129 / 16%);--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-text: rgb(235 235 245 / 86%);--vp-c-text-mute: rgb(235 235 245 / 60%);--vp-c-text-subtle: rgb(235 235 245 / 38%);--vp-c-gutter: #000;--vp-c-border: #3c3f44;--vp-c-border-hard: #45484e;--vp-c-shadow: rgb(0 0 0 / 30%);--vp-c-control: rgb(101 117 133 / 12%);--vp-c-control-hover: rgb(101 117 133 / 18%);--vp-c-control-disabled: #363636}body{font-family:var(--font-family)}code{font-family:var(--code-font-family)}[vp-content] h1,[vp-content] h2,[vp-content] h3,[vp-content] h4,[vp-content] h5,[vp-content] h6{margin-top:calc(.5rem - var(--header-offset));margin-bottom:0;padding-top:calc(1rem + var(--header-offset))}[vp-content] h1:first-child,[vp-content] h2:first-child,[vp-content] h3:first-child,[vp-content] h4:first-child,[vp-content] h5:first-child,[vp-content] h6:first-child{margin-bottom:1rem}[vp-content] h1:first-child+p,[vp-content] h1:first-child+pre,[vp-content] h1:first-child+.custom-container,[vp-content] h2:first-child+p,[vp-content] h2:first-child+pre,[vp-content] h2:first-child+.custom-container,[vp-content] h3:first-child+p,[vp-content] h3:first-child+pre,[vp-content] h3:first-child+.custom-container,[vp-content] h4:first-child+p,[vp-content] h4:first-child+pre,[vp-content] h4:first-child+.custom-container,[vp-content] h5:first-child+p,[vp-content] h5:first-child+pre,[vp-content] h5:first-child+.custom-container,[vp-content] h6:first-child+p,[vp-content] h6:first-child+pre,[vp-content] h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 419px){[vp-content] h1{font-size:1.9rem}}[vp-content] a:not(.header-anchor){text-decoration:underline}[vp-content] img{max-width:100%}div[class*=language-]{margin:.75rem 0;transition:background-color var(--vp-t-color),color var(--vp-t-color)}@media (max-width: 419px){div[class*=language-]{--code-border-radius: 0;margin:.75rem -1.5rem}}div[class*=language-] .line.diff,div[class*=language-] .line.highlighted{transition:background-color var(--vp-t-color)}.table-of-contents .vp-badge{vertical-align:middle}.arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}[data-theme=dark] .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}[dir=rtl] .arrow.right,.arrow.left{transform:rotate(-90deg)}[dir=rtl] .arrow.left{transform:rotate(90deg)}.vp-external-link-icon:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .external-link:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon [vp-content] a[href*="://"]:not(.no-external-link-icon):after,.external-link-icon [vp-content] a[target=_blank]:not(.no-external-link-icon):after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}:root{scroll-behavior:smooth}@media screen and (max-width: 719px){.vp-hide-mobile{display:none}}.vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-comment{padding:2rem}}@media (max-width: 419px){.vp-comment{padding:1.5rem}}.vp-navbar .DocSearch{transition:background-color var(--vp-t-color)}.vp-navbar .search-box{vertical-align:top;flex:0 0 auto}@media screen and (max-width: 719px){.hint-container{margin-inline:-.75rem}}.lang-modal-fade-enter-active,.lang-modal-fade-leave-active{transition:opacity .5s}.lang-modal-fade-enter,.lang-modal-fade-leave-to{opacity:0}.lang-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1499;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}@media print{.lang-modal-mask{display:none}}.lang-modal-wrapper{position:relative;z-index:1500;overflow:hidden;max-width:80vw;padding:1rem 2rem;border-radius:8px;background:var(--vp-bg);box-shadow:0 2px 6px 0 var(--card-shadow)}.lang-modal-action{display:block;width:100%;margin:1rem 0;padding:.5rem .75rem;border:none;border-radius:8px;background-color:var(--vp-bglt);color:var(--vp-c);cursor:pointer}.lang-modal-action:hover{background-color:var(--vp-bgl)}.lang-modal-action.primary{background-color:var(--vp-tc);color:var(--white)}.lang-modal-action.primary:hover{background-color:var(--vp-tcl)}.grey{color:#0006}.works-table-wrapper[data-v-765855fb]{margin:0 auto;padding:0 2rem;max-width:1224px;box-sizing:border-box}.works-table-wrapper[data-v-765855fb] table{width:100%}:root{--content-width: 960px}.vp-page .theme-default-content{padding-bottom:0!important}.vp-page-meta{display:none}
diff --git a/assets/works.html-DdmH6Pwy.js b/assets/works.html-Dmdhrt6x.js
similarity index 83%
rename from assets/works.html-DdmH6Pwy.js
rename to assets/works.html-Dmdhrt6x.js
index 937db15..2d70254 100644
--- a/assets/works.html-DdmH6Pwy.js
+++ b/assets/works.html-Dmdhrt6x.js
@@ -1 +1 @@
-import{_ as r,c as i,e as l,o as a}from"./app-C1Pl5wYU.js";const t={};function o(n,e){return a(),i("div",null,e[0]||(e[0]=[l('<h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p>',37)]))}const c=r(t,[["render",o],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-10-15T14:10:49.000Z"}],["meta",{"property":"article:modified_time","content":"2024-10-15T14:10:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]},{"level":3,"title":"MERLION","slug":"merlion","link":"#merlion","children":[]}]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1729001449000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":8}]},"filePathRelative":"works.md"}');export{c as comp,d as data};
+import{_ as i,c as a,e as r,o as t}from"./app-CjizGj8p.js";const l={};function s(o,e){return t(),a("div",null,e[0]||(e[0]=[r('<h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p>',37)]))}const d=i(l,[["render",s],["__file","works.html.vue"]]),n=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-10-15T14:10:49.000Z"}],["meta",{"property":"article:modified_time","content":"2024-10-15T14:10:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]},{"level":3,"title":"MERLION","slug":"merlion","link":"#merlion","children":[]}]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1729001449000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":8}],"changelog":[{"hash":"cda6a85b70639418db2fe08a106ec89a104c8ece","date":1729001449000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix typo"},{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","date":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","date":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"f75ed3d2f6d602399e472e3ced7dc62e0e01e5e9","date":1721915974000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add pre-commit hook"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","date":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","date":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","date":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","date":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","date":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"works.md"}');export{d as comp,n as data};
diff --git a/assets/works.html-wSGj1IPW.js b/assets/works.html-MtxAU7JF.js
similarity index 83%
rename from assets/works.html-wSGj1IPW.js
rename to assets/works.html-MtxAU7JF.js
index 1527721..28485da 100644
--- a/assets/works.html-wSGj1IPW.js
+++ b/assets/works.html-MtxAU7JF.js
@@ -1 +1 @@
-import{_ as t,c as r,e as a,o as i}from"./app-C1Pl5wYU.js";const o={};function n(l,e){return i(),r("div",null,e[0]||(e[0]=[a('<h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p>',37)]))}const c=t(o,[["render",n],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]}]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":6}]},"filePathRelative":"eng/works.md"}');export{c as comp,d as data};
+import{_ as t,c as a,e as r,o as i}from"./app-CjizGj8p.js";const o={};function s(n,e){return i(),a("div",null,e[0]||(e[0]=[r('<h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p>',37)]))}const c=t(o,[["render",s],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]}]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@ideascup.me","commits":1},{"name":"Dmitriy Pleshevskiy","username":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":6}],"changelog":[{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","date":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","date":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","date":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","date":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","date":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","date":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","date":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"eng/works.md"}');export{c as comp,d as data};
diff --git a/eng/index.html b/eng/index.html
index e678688..2423074 100644
--- a/eng/index.html
+++ b/eng/index.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="ru-ru" href="https://pleshevski.ru/"><meta property="og:url" content="https://pleshevski.ru/eng/"><meta property="og:site_name" content="Dmitriy Pleshevskiy"><meta property="og:title" content="Resume"><meta property="og:type" content="website"><meta property="og:locale" content="en-US"><meta property="og:locale:alternate" content="ru-RU"><meta property="og:updated_time" content="2024-09-05T22:11:51.000Z"><meta property="article:modified_time" content="2024-09-05T22:11:51.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Resume"}</script><title>Resume | Dmitriy Pleshevskiy</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-Bx7ih_OI.css" as="style"><link rel="stylesheet" href="/assets/style-Bx7ih_OI.css">
-    <link rel="modulepreload" href="/assets/app-C1Pl5wYU.js"><link rel="modulepreload" href="/assets/index.html-DuNptnFv.js">
-    <link rel="prefetch" href="/assets/index.html-CFL_msbV.js" as="script"><link rel="prefetch" href="/assets/works.html-DdmH6Pwy.js" as="script"><link rel="prefetch" href="/assets/works.html-wSGj1IPW.js" as="script"><link rel="prefetch" href="/assets/404.html-B7Rc-wnV.js" as="script">
+    <link rel="preload" href="/assets/style-CGM4yktK.css" as="style"><link rel="stylesheet" href="/assets/style-CGM4yktK.css">
+    <link rel="modulepreload" href="/assets/app-CjizGj8p.js"><link rel="modulepreload" href="/assets/index.html-DuKevBia.js">
+    <link rel="prefetch" href="/assets/index.html-gDP15nKv.js" as="script"><link rel="prefetch" href="/assets/works.html-Dmdhrt6x.js" as="script"><link rel="prefetch" href="/assets/works.html-MtxAU7JF.js" as="script"><link rel="prefetch" href="/assets/404.html-DsBiW9Ow.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/eng/"><!----><span class="vp-site-name" aria-hidden="true">Dmitriy Pleshevskiy</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><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"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-home"><header class="vp-hero"><!----><!----><p class="vp-hero-description"> </p><!----></header><!----><div vp-content><div><p>Always up-to-date link to <a class="route-link" href="/eng/">resume</a>.</p><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>I&#39;m an open source software enthusiast, a lead software developer, architect, team leader and also mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul></div></div><!----></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-C1Pl5wYU.js" defer></script>
+    <script type="module" src="/assets/app-CjizGj8p.js" defer></script>
   </body>
 </html>
diff --git a/eng/works.html b/eng/works.html
index 7f6e6da..22d46af 100644
--- a/eng/works.html
+++ b/eng/works.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="ru-ru" href="https://pleshevski.ru/works.html"><meta property="og:url" content="https://pleshevski.ru/eng/works.html"><meta property="og:site_name" content="Dmitriy Pleshevskiy"><meta property="og:title" content="Works"><meta property="og:type" content="website"><meta property="og:locale" content="en-US"><meta property="og:locale:alternate" content="ru-RU"><meta property="og:updated_time" content="2024-08-07T08:48:54.000Z"><meta property="article:modified_time" content="2024-08-07T08:48:54.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Works"}</script><title>Works | Dmitriy Pleshevskiy</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-Bx7ih_OI.css" as="style"><link rel="stylesheet" href="/assets/style-Bx7ih_OI.css">
-    <link rel="modulepreload" href="/assets/app-C1Pl5wYU.js"><link rel="modulepreload" href="/assets/works.html-wSGj1IPW.js">
-    <link rel="prefetch" href="/assets/index.html-CFL_msbV.js" as="script"><link rel="prefetch" href="/assets/works.html-DdmH6Pwy.js" as="script"><link rel="prefetch" href="/assets/index.html-DuNptnFv.js" as="script"><link rel="prefetch" href="/assets/404.html-B7Rc-wnV.js" as="script">
+    <link rel="preload" href="/assets/style-CGM4yktK.css" as="style"><link rel="stylesheet" href="/assets/style-CGM4yktK.css">
+    <link rel="modulepreload" href="/assets/app-CjizGj8p.js"><link rel="modulepreload" href="/assets/works.html-MtxAU7JF.js">
+    <link rel="prefetch" href="/assets/index.html-gDP15nKv.js" as="script"><link rel="prefetch" href="/assets/works.html-Dmdhrt6x.js" as="script"><link rel="prefetch" href="/assets/index.html-DuKevBia.js" as="script"><link rel="prefetch" href="/assets/404.html-DsBiW9Ow.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container data-v-765855fb><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/eng/"><!----><span class="vp-site-name" aria-hidden="true">Dmitriy Pleshevskiy</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><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"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Last Updated: </span><!----></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: dmitriy@ideascup.me">Dmitriy Pleshevskiy</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: dmitriy@pleshevski.ru">Dmitriy Pleshevskiy</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><div class="works-table-wrapper" data-v-765855fb><table data-v-765855fb><thead><tr><th>Name</th><th>Description</th><th>Role</th><th>Technologies</th><th>Status</th><th>Dates</th></tr></thead><tbody><!--[--><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/nixeovim">nixeovim</a></td><td>Configure and build neovim editor using nix</td><td>author</td><td>Nix</td><td>actively-developed</td><td><div><small class="">04/24/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/mindustry-tools">Mindustry tools</a></td><td>Tools for the Mindustry game</td><td>author</td><td>Nix, Godot</td><td>passively-maintained</td><td><div><small class="">01/07/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://rosmintrud.masterprogress.ru">Master Progress Rosmintrud tools</a></td><td>Internal service to prepare documents for the rosmintrud (SPA)</td><td>tech&nbsp;lead</td><td>Deno, Sqlite, TS, Vue, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">07/03/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-plpgsql">tree-sitter-plpgsql</a></td><td>plpgsql grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>passively-maintained</td><td><div><small class="">01/05/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-d2">tree-sitter-d2</a></td><td>d2 grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>actively-developed</td><td><div><small class="">12/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/mynix/nix2lua">nix2lua</a></td><td>This is a small but functional library that converts your nix configurations into lua format.</td><td>author</td><td>Nix, Lua</td><td>passively-maintained</td><td><div><small class="">11/22/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/vnetod">vnetod</a></td><td>Dotenv section switcher</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/29/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/recipes">recipes</a></td><td>Site with recipes which cares about privacy</td><td>author</td><td>TS, Deno, Rust</td><td>passively-maintained</td><td><div><small class="">05/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru">pleshevski.ru</a></td><td>Source code of my personal site</td><td>author</td><td>TS, Vue, Vuepress, Nix</td><td>passively-maintained</td><td><div><small class="">03/16/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/espruino-starter">espruino-starter</a></td><td>Quickly start creating your new project on the espruino board or a board based on it.</td><td>author</td><td>JS</td><td>as-is</td><td><div><small class="">08/23/2021</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/sonic-channel">sonic-channel</a></td><td>Rust client for sonic search backend.</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/18/2020</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/it-fsm">it-fsm</a></td><td>Simple full-featured finite state machine for your project</td><td>author</td><td>TS, NodeJS, Deno</td><td>passively-maintained</td><td><div><small class="">10/11/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://cabinet.masterprogress.ru">Cabinet Master Progress</a></td><td>Student&#39;s cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech&nbsp;lead</td><td>Python, Flask, PostgreSQL, TS, React, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">09/22/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/genrss">genrss</a></td><td>RSS generator for python</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="">07/23/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://www.binarymanagement.com">Binary Management</a></td><td>Project management tool for interior designers</td><td>developer, tech&nbsp;lead, team&nbsp;lead</td><td>TS, NodeJS, React, Antd, Docker, Drone CI, Rust, Nix</td><td>actively-developed</td><td><div><small class="">09/15/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://masterprogress.ru">Master Progress</a></td><td>Main website of the educational center Master Progress (SSR + Forms)</td><td>tech&nbsp;lead</td><td>Python, Flask, JS, Nix</td><td>passively-maintained</td><td><div><small class="">04/10/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/picsg">picsg</a></td><td>A tool for steganographing information in a picture encoded using the Vernam cipher.</td><td>author</td><td>Haskell</td><td>as-is</td><td><div><small class="grey">04/13/2024</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/yandexgpt_tg_bot">yandexgpt_tg_bot</a></td><td>The Telegram bot to describe article with link by YandexGPT.</td><td>author</td><td>JS, NodeJS, Nix</td><td>as-is</td><td><div><small class="grey">06/27/2023</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/estring">estring</a></td><td>A simple way to parse a string using type annotations.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/23/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/enve">enve</a></td><td>It helps you work with environment variables and convert it to any type using only type annotations</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/18/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/docker_stack">docker stack drone plugin</a></td><td>Deploy to production using `docker stack deploy`</td><td>author</td><td>Docker, Drone CI, Woodpecker CI</td><td>as-is</td><td><div><small class="grey">06/06/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/paren">paren</a></td><td>Library for parsing and rendering information.</td><td>author</td><td>TS, Deno</td><td>experimental</td><td><div><small class="grey">03/14/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/hwt">hwt</a></td><td>healthy workaholic timer – A tool that keeps you from breaking your health by working all day.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">02/04/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/wd2">wd2</a></td><td>A wrapper over d2 which allows to use additional configs from d2 file</td><td>author</td><td>Bash, Nix</td><td>as-is</td><td><div><small class="grey">12/12/2022</small></div><div><small>07/31/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/react-rest-request">react-rest-request</a></td><td>Minimalistic REST API client for React inspired by Apollo.</td><td>author</td><td>TS, React</td><td>deprecated</td><td><div><small class="grey">10/04/2020</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/marshmallow_pageinfo">marshmallow_pageinfo</a></td><td>Page info marshmallow schema for api</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">10/05/2019</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ictmpl">ictmpl</a></td><td>Generate projects from templates</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">06/30/2018</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/github/dexios">dexios</a></td><td>Dexios is a fast, secure, and open source command-line encryption tool.</td><td>collaborator</td><td>Rust</td><td></td><td><div><small class="grey">06/01/2022</small></div><div><small>02/28/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/itconfig">itconfig</a></td><td>Easy build a configs from environment variables and use it in globally.</td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">12/22/2019</small></div><div><small>07/24/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/migra">migra</a></td><td>Simple SQL migration manager for your project.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">01/31/2021</small></div><div><small>03/17/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ood_persistence">ood_persistence</a></td><td>Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture </td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">10/12/2021</small></div><div><small>10/21/2021</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://corespirit.com">Core Spirit</a></td><td>Social platform focusing on human and planetary enhancement</td><td>developer</td><td>TS, NodeJS, Go, Python, React, Docker, Drone CI</td><td></td><td><div><small class="grey">09/05/2018</small></div><div><small>12/31/2019</small></div></td></tr><!--]--></tbody></table></div><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-C1Pl5wYU.js" defer></script>
+    <script type="module" src="/assets/app-CjizGj8p.js" defer></script>
   </body>
 </html>
diff --git a/index.html b/index.html
index bc7eaee..bfa5e80 100644
--- a/index.html
+++ b/index.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="en-us" href="https://pleshevski.ru/eng/"><meta property="og:url" content="https://pleshevski.ru/"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:title" content="Резюме"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><meta property="og:locale:alternate" content="en-US"><meta property="og:updated_time" content="2024-09-05T22:11:51.000Z"><meta property="article:modified_time" content="2024-09-05T22:11:51.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Резюме"}</script><title>Резюме | Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-Bx7ih_OI.css" as="style"><link rel="stylesheet" href="/assets/style-Bx7ih_OI.css">
-    <link rel="modulepreload" href="/assets/app-C1Pl5wYU.js"><link rel="modulepreload" href="/assets/index.html-CFL_msbV.js">
-    <link rel="prefetch" href="/assets/works.html-DdmH6Pwy.js" as="script"><link rel="prefetch" href="/assets/index.html-DuNptnFv.js" as="script"><link rel="prefetch" href="/assets/works.html-wSGj1IPW.js" as="script"><link rel="prefetch" href="/assets/404.html-B7Rc-wnV.js" as="script">
+    <link rel="preload" href="/assets/style-CGM4yktK.css" as="style"><link rel="stylesheet" href="/assets/style-CGM4yktK.css">
+    <link rel="modulepreload" href="/assets/app-CjizGj8p.js"><link rel="modulepreload" href="/assets/index.html-gDP15nKv.js">
+    <link rel="prefetch" href="/assets/works.html-Dmdhrt6x.js" as="script"><link rel="prefetch" href="/assets/index.html-DuKevBia.js" as="script"><link rel="prefetch" href="/assets/works.html-MtxAU7JF.js" as="script"><link rel="prefetch" href="/assets/404.html-DsBiW9Ow.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><!----><span class="vp-site-name" aria-hidden="true">Дмитрий Плешевский</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><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"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-home"><header class="vp-hero"><!----><!----><p class="vp-hero-description"> </p><!----></header><!----><div vp-content><div><p>Всегда актуальная ссылка на <a class="route-link" href="/">резюме</a>.</p><h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий разработчик програмного обеспечения, архитектор, руководитель команды, а так же ментор.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Reddis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul></div></div><!----></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-C1Pl5wYU.js" defer></script>
+    <script type="module" src="/assets/app-CjizGj8p.js" defer></script>
   </body>
 </html>
diff --git a/sitemap.xsl b/sitemap.xsl
index a76881a..c0c4be9 100644
--- a/sitemap.xsl
+++ b/sitemap.xsl
@@ -37,10 +37,6 @@
             background: var(--bg-color);
           }
 
-          html {
-            font-size: 14px;
-          }
-
           body {
             min-height: 100vh;
             color: var(--text-color);
@@ -71,7 +67,7 @@
 
           table {
             width: 100%;
-            border-radius: 8px;
+            border-radius: 0.5rem;
             border-collapse: collapse;
             text-align: center;
             overflow: hidden;
@@ -84,19 +80,19 @@
           }
 
           th {
-            min-width: 56px;
+            min-width: 3.5em;
             padding: 0.6em 1em;
 
             background-color: var(--brand-color);
             color: var(--bg-color);
 
             font-weight: bold;
-            font-size: 16px;
+            font-size: 1rem;
           }
 
           @media (max-width: 719px) {
             th {
-              font-size: 14px;
+              font-size: 0.875rem;
             }
           }
 
@@ -124,7 +120,7 @@
 
           @media (max-width: 719px) {
             td {
-              font-size: 12px;
+              font-size: 0.75rem;
             }
           }
 
@@ -133,12 +129,12 @@
           }
 
           footer {
-            margin-top: 10px;
-            padding: 4px;
+            margin-top: 0.75rem;
+            padding: 0.25rem;
 
             color: #888;
 
-            font-size: 12px;
+            font-size: 0.75rem;
             text-align: center;
           }
         </style>
diff --git a/works.html b/works.html
index 4ff7afb..6a3a860 100644
--- a/works.html
+++ b/works.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="en-us" href="https://pleshevski.ru/eng/works.html"><meta property="og:url" content="https://pleshevski.ru/works.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:title" content="Работы"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><meta property="og:locale:alternate" content="en-US"><meta property="og:updated_time" content="2024-10-15T14:10:49.000Z"><meta property="article:modified_time" content="2024-10-15T14:10:49.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Работы"}</script><title>Работы | Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-Bx7ih_OI.css" as="style"><link rel="stylesheet" href="/assets/style-Bx7ih_OI.css">
-    <link rel="modulepreload" href="/assets/app-C1Pl5wYU.js"><link rel="modulepreload" href="/assets/works.html-DdmH6Pwy.js">
-    <link rel="prefetch" href="/assets/index.html-CFL_msbV.js" as="script"><link rel="prefetch" href="/assets/index.html-DuNptnFv.js" as="script"><link rel="prefetch" href="/assets/works.html-wSGj1IPW.js" as="script"><link rel="prefetch" href="/assets/404.html-B7Rc-wnV.js" as="script">
+    <link rel="preload" href="/assets/style-CGM4yktK.css" as="style"><link rel="stylesheet" href="/assets/style-CGM4yktK.css">
+    <link rel="modulepreload" href="/assets/app-CjizGj8p.js"><link rel="modulepreload" href="/assets/works.html-Dmdhrt6x.js">
+    <link rel="prefetch" href="/assets/index.html-gDP15nKv.js" as="script"><link rel="prefetch" href="/assets/index.html-DuKevBia.js" as="script"><link rel="prefetch" href="/assets/works.html-MtxAU7JF.js" as="script"><link rel="prefetch" href="/assets/404.html-DsBiW9Ow.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container data-v-765855fb><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><!----><span class="vp-site-name" aria-hidden="true">Дмитрий Плешевский</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><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"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Last Updated: </span><!----></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: dmitriy@ideascup.me">Dmitriy Pleshevskiy</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: dmitriy@pleshevski.ru">Dmitriy Pleshevskiy</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><div class="works-table-wrapper" data-v-765855fb><table data-v-765855fb><thead><tr><th>Название</th><th>Описание</th><th>Роль</th><th>Технологии</th><th>Статус</th><th>Даты</th></tr></thead><tbody><!--[--><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/nixeovim">nixeovim</a></td><td>Configure and build neovim editor using nix</td><td>author</td><td>Nix</td><td>actively-developed</td><td><div><small class="">04/24/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/mindustry-tools">Mindustry tools</a></td><td>Tools for the Mindustry game</td><td>author</td><td>Nix, Godot</td><td>passively-maintained</td><td><div><small class="">01/07/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://rosmintrud.masterprogress.ru">Master Progress Rosmintrud tools</a></td><td>Internal service to prepare documents for the rosmintrud (SPA)</td><td>tech&nbsp;lead</td><td>Deno, Sqlite, TS, Vue, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">07/03/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-plpgsql">tree-sitter-plpgsql</a></td><td>plpgsql grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>passively-maintained</td><td><div><small class="">01/05/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-d2">tree-sitter-d2</a></td><td>d2 grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>actively-developed</td><td><div><small class="">12/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/mynix/nix2lua">nix2lua</a></td><td>This is a small but functional library that converts your nix configurations into lua format.</td><td>author</td><td>Nix, Lua</td><td>passively-maintained</td><td><div><small class="">11/22/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/vnetod">vnetod</a></td><td>Dotenv section switcher</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/29/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/recipes">recipes</a></td><td>Site with recipes which cares about privacy</td><td>author</td><td>TS, Deno, Rust</td><td>passively-maintained</td><td><div><small class="">05/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru">pleshevski.ru</a></td><td>Source code of my personal site</td><td>author</td><td>TS, Vue, Vuepress, Nix</td><td>passively-maintained</td><td><div><small class="">03/16/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/espruino-starter">espruino-starter</a></td><td>Quickly start creating your new project on the espruino board or a board based on it.</td><td>author</td><td>JS</td><td>as-is</td><td><div><small class="">08/23/2021</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/sonic-channel">sonic-channel</a></td><td>Rust client for sonic search backend.</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/18/2020</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/it-fsm">it-fsm</a></td><td>Simple full-featured finite state machine for your project</td><td>author</td><td>TS, NodeJS, Deno</td><td>passively-maintained</td><td><div><small class="">10/11/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://cabinet.masterprogress.ru">Cabinet Master Progress</a></td><td>Student&#39;s cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech&nbsp;lead</td><td>Python, Flask, PostgreSQL, TS, React, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">09/22/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/genrss">genrss</a></td><td>RSS generator for python</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="">07/23/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://www.binarymanagement.com">Binary Management</a></td><td>Project management tool for interior designers</td><td>developer, tech&nbsp;lead, team&nbsp;lead</td><td>TS, NodeJS, React, Antd, Docker, Drone CI, Rust, Nix</td><td>actively-developed</td><td><div><small class="">09/15/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://masterprogress.ru">Master Progress</a></td><td>Main website of the educational center Master Progress (SSR + Forms)</td><td>tech&nbsp;lead</td><td>Python, Flask, JS, Nix</td><td>passively-maintained</td><td><div><small class="">04/10/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/picsg">picsg</a></td><td>A tool for steganographing information in a picture encoded using the Vernam cipher.</td><td>author</td><td>Haskell</td><td>as-is</td><td><div><small class="grey">04/13/2024</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/yandexgpt_tg_bot">yandexgpt_tg_bot</a></td><td>The Telegram bot to describe article with link by YandexGPT.</td><td>author</td><td>JS, NodeJS, Nix</td><td>as-is</td><td><div><small class="grey">06/27/2023</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/estring">estring</a></td><td>A simple way to parse a string using type annotations.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/23/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/enve">enve</a></td><td>It helps you work with environment variables and convert it to any type using only type annotations</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/18/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/docker_stack">docker stack drone plugin</a></td><td>Deploy to production using `docker stack deploy`</td><td>author</td><td>Docker, Drone CI, Woodpecker CI</td><td>as-is</td><td><div><small class="grey">06/06/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/paren">paren</a></td><td>Library for parsing and rendering information.</td><td>author</td><td>TS, Deno</td><td>experimental</td><td><div><small class="grey">03/14/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/hwt">hwt</a></td><td>healthy workaholic timer – A tool that keeps you from breaking your health by working all day.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">02/04/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/wd2">wd2</a></td><td>A wrapper over d2 which allows to use additional configs from d2 file</td><td>author</td><td>Bash, Nix</td><td>as-is</td><td><div><small class="grey">12/12/2022</small></div><div><small>07/31/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/react-rest-request">react-rest-request</a></td><td>Minimalistic REST API client for React inspired by Apollo.</td><td>author</td><td>TS, React</td><td>deprecated</td><td><div><small class="grey">10/04/2020</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/marshmallow_pageinfo">marshmallow_pageinfo</a></td><td>Page info marshmallow schema for api</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">10/05/2019</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ictmpl">ictmpl</a></td><td>Generate projects from templates</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">06/30/2018</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/github/dexios">dexios</a></td><td>Dexios is a fast, secure, and open source command-line encryption tool.</td><td>collaborator</td><td>Rust</td><td></td><td><div><small class="grey">06/01/2022</small></div><div><small>02/28/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/itconfig">itconfig</a></td><td>Easy build a configs from environment variables and use it in globally.</td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">12/22/2019</small></div><div><small>07/24/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/migra">migra</a></td><td>Simple SQL migration manager for your project.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">01/31/2021</small></div><div><small>03/17/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ood_persistence">ood_persistence</a></td><td>Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture </td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">10/12/2021</small></div><div><small>10/21/2021</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://corespirit.com">Core Spirit</a></td><td>Social platform focusing on human and planetary enhancement</td><td>developer</td><td>TS, NodeJS, Go, Python, React, Docker, Drone CI</td><td></td><td><div><small class="grey">09/05/2018</small></div><div><small>12/31/2019</small></div></td></tr><!--]--></tbody></table></div><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-C1Pl5wYU.js" defer></script>
+    <script type="module" src="/assets/app-CjizGj8p.js" defer></script>
   </body>
 </html>