diff --git a/404.html b/404.html index 1d472b7..9fce243 100644 --- a/404.html +++ b/404.html @@ -6,14 +6,14 @@ 404 | EyeTrackVR Docs - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

- - + + \ No newline at end of file diff --git a/about/index.html b/about/index.html index bc697f2..6639f05 100644 --- a/about/index.html +++ b/about/index.html @@ -6,16 +6,16 @@ EyeTrackVR Docs | EyeTrackVR Docs - - - + + + -
Skip to content

Our Team

The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below.

EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality.

Prohurtz

Prohurtz

Creator / Lead Software Developer / Documentor / Hardware Developer

Summer

Summer

Machine Learning Engineer / Data Scientist / App Developer

lorow

lorow

Lead Firmware Developer / App Developer

DaOfficialWizard

DaOfficialWizard

Firmware Developer / Documentation Manager / App Developer

Contributors

Those who have actively contributed to development.
Community Support

Philosophy

The guides on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use.

Here, we hope you may find something useful to you.

We advocate the Open Source model.

This is why we strive to make our work open to other people for consultation, replication and reuse.

Released under the MIT License.

- - +
Skip to content

Our Team

The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below.

EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality.

Prohurtz

Prohurtz

Creator / Lead Software Developer / Documentor / Hardware Developer

Summer

Summer

Machine Learning Engineer / Data Scientist / App Developer

lorow

lorow

Lead Firmware Developer / App Developer

DaOfficialWizard

DaOfficialWizard

Firmware Developer / Documentation Manager / App Developer

Contributors

Those who have actively contributed to development.
Community Support

Philosophy

The guides on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use.

Here, we hope you may find something useful to you.

We advocate the Open Source model.

This is why we strive to make our work open to other people for consultation, replication and reuse.

Released under the MIT License.

+ + \ No newline at end of file diff --git a/archive/fox_ir_v2_build_instructions/index.html b/archive/fox_ir_v2_build_instructions/index.html index 651050c..02dd9d0 100644 --- a/archive/fox_ir_v2_build_instructions/index.html +++ b/archive/fox_ir_v2_build_instructions/index.html @@ -6,17 +6,17 @@ Fox IR V2 Buil dInstructions | EyeTrackVR Docs - - - - + + + + -
Skip to content
On this page

Fox IR V2 Buil dInstructions

Step 15: Prepare to solder IR LED PCB V2s

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.

'img'

698ohm resistors and V2 PCBs

Here are the PCB pin-out labels:

'img'

V2

LED labels:

'img'

The green markings and notched corners mark the positive sides of the LEDs pictured above.

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

'img'

Tin the resistor pads.

'img'

Hold the resistor in place.

'img'

Solder one end.

'img'

Flip to the other side of the resistor and solder it.

'img'

Solder LEDs on PCB V2

'img'

Tin the pads

'img'

Place the resistor on the pads in the correct orientation.

'img'

Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is 230C with a max of 245C.

'img'

The LED is flipped in this Image, the green dot should face AWAY from the PCB.

Wire up the PCBs V2

Basic full wiring diagram of IR PCBs V2.

'drawing'

The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.

Released under the MIT License.

- - +
Skip to content
On this page

Fox IR V2 Buil dInstructions

Step 15: Prepare to solder IR LED PCB V2s

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.

'img'

698ohm resistors and V2 PCBs

Here are the PCB pin-out labels:

'img'

V2

LED labels:

'img'

The green markings and notched corners mark the positive sides of the LEDs pictured above.

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

'img'

Tin the resistor pads.

'img'

Hold the resistor in place.

'img'

Solder one end.

'img'

Flip to the other side of the resistor and solder it.

'img'

Solder LEDs on PCB V2

'img'

Tin the pads

'img'

Place the resistor on the pads in the correct orientation.

'img'

Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is 230C with a max of 245C.

'img'

The LED is flipped in this Image, the green dot should face AWAY from the PCB.

Wire up the PCBs V2

Basic full wiring diagram of IR PCBs V2.

'drawing'

The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.

Released under the MIT License.

+ + \ No newline at end of file diff --git a/assets/about.md.a8923db4.js b/assets/about.md.3352f48a.js similarity index 97% rename from assets/about.md.a8923db4.js rename to assets/about.md.3352f48a.js index 0910a9a..4da8f35 100644 --- a/assets/about.md.a8923db4.js +++ b/assets/about.md.3352f48a.js @@ -1 +1 @@ -import{o as i,c as r,a as n,w as a,u as o,V as u,b as e,d as s,e as l,f as c,g as t}from"./app.24a1fc0a.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),D=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","lastUpdated":1673640425000}'),P={name:"about.md"},x=Object.assign(P,{setup(V){return(S,N)=>(i(),r("div",null,[n(o(c),null,{default:a(()=>[n(o(u),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,D,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default}; +import{o as i,c as r,a as n,w as a,u as o,V as u,b as e,d as s,e as l,f as c,g as t}from"./app.ffc675f3.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),D=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","lastUpdated":1673640425000}'),P={name:"about.md"},x=Object.assign(P,{setup(V){return(S,N)=>(i(),r("div",null,[n(o(c),null,{default:a(()=>[n(o(u),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,D,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default}; diff --git a/assets/about.md.a8923db4.lean.js b/assets/about.md.3352f48a.lean.js similarity index 97% rename from assets/about.md.a8923db4.lean.js rename to assets/about.md.3352f48a.lean.js index 0910a9a..4da8f35 100644 --- a/assets/about.md.a8923db4.lean.js +++ b/assets/about.md.3352f48a.lean.js @@ -1 +1 @@ -import{o as i,c as r,a as n,w as a,u as o,V as u,b as e,d as s,e as l,f as c,g as t}from"./app.24a1fc0a.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),D=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","lastUpdated":1673640425000}'),P={name:"about.md"},x=Object.assign(P,{setup(V){return(S,N)=>(i(),r("div",null,[n(o(c),null,{default:a(()=>[n(o(u),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,D,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default}; +import{o as i,c as r,a as n,w as a,u as o,V as u,b as e,d as s,e as l,f as c,g as t}from"./app.ffc675f3.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),D=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","lastUpdated":1673640425000}'),P={name:"about.md"},x=Object.assign(P,{setup(V){return(S,N)=>(i(),r("div",null,[n(o(c),null,{default:a(()=>[n(o(u),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,D,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default}; diff --git a/assets/app.24a1fc0a.js b/assets/app.ffc675f3.js similarity index 70% rename from assets/app.24a1fc0a.js rename to assets/app.ffc675f3.js index 29117e3..a73e2ac 100644 --- a/assets/app.24a1fc0a.js +++ b/assets/app.ffc675f3.js @@ -1,8 +1,8 @@ -function Xs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function ts(e){if(Q(e)){const t={};for(let n=0;n{if(n){const s=n.split(Zr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function de(e){let t="";if(ye(e))t=e;else if(Q(e))for(let n=0;nye(e)?e:e==null?"":Q(e)||ve(e)&&(e.toString===Hi||!ne(e.toString))?JSON.stringify(e,Oi,2):String(e),Oi=(e,t)=>t&&t.__v_isRef?Oi(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Bi(t)?{[`Set(${t.size})`]:[...t.values()]}:ve(t)&&!Q(t)&&!Di(t)?String(t):t,ge={},Bt=[],Ye=()=>{},ol=()=>!1,il=/^on[^a-z]/,wn=e=>il.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Zs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},rl=Object.prototype.hasOwnProperty,ae=(e,t)=>rl.call(e,t),Q=Array.isArray,Ft=e=>ns(e)==="[object Map]",Bi=e=>ns(e)==="[object Set]",ne=e=>typeof e=="function",ye=e=>typeof e=="string",eo=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",Fi=e=>ve(e)&&ne(e.then)&&ne(e.catch),Hi=Object.prototype.toString,ns=e=>Hi.call(e),ll=e=>ns(e).slice(8,-1),Di=e=>ns(e)==="[object Object]",to=e=>ye(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,rn=Xs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ss=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},cl=/-(\w)/g,st=ss(e=>e.replace(cl,(t,n)=>n?n.toUpperCase():"")),al=/\B([A-Z])/g,Yt=ss(e=>e.replace(al,"-$1").toLowerCase()),os=ss(e=>e.charAt(0).toUpperCase()+e.slice(1)),ws=ss(e=>e?`on${os(e)}`:""),_n=(e,t)=>!Object.is(e,t),Bn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},pn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ao;const ul=()=>Ao||(Ao=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Oe;class fl{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Oe;try{return Oe=this,t()}finally{Oe=n}}}on(){Oe=this}off(){Oe=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Ri=e=>(e.w&mt)>0,zi=e=>(e.n&mt)>0,pl=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(r.get(n)),t){case"add":Q(e)?to(n)&&l.push(r.get("length")):(l.push(r.get(Lt)),Ft(e)&&l.push(r.get(Os)));break;case"delete":Q(e)||(l.push(r.get(Lt)),Ft(e)&&l.push(r.get(Os)));break;case"set":Ft(e)&&l.push(r.get(Lt));break}if(l.length===1)l[0]&&Bs(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Bs(no(c))}}function Bs(e,t){const n=Q(e)?e:[...e];for(const s of n)s.computed&&No(s);for(const s of n)s.computed||No(s)}function No(e,t){(e!==We||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const gl=Xs("__proto__,__v_isRef,__isVue"),qi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(eo)),vl=oo(),bl=oo(!1,!0),yl=oo(!0),Oo=xl();function xl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let i=0,r=this.length;i{e[t]=function(...n){Qt();const s=fe(this)[t].apply(this,n);return Xt(),s}}),e}function oo(e=!1,t=!1){return function(s,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?Bl:Qi:t?Yi:Gi).get(s))return s;const r=Q(s);if(!e&&r&&ae(Oo,o))return Reflect.get(Oo,o,i);const l=Reflect.get(s,o,i);return(eo(o)?qi.has(o):gl(o))||(e||He(s,"get",o),t)?l:Ve(l)?r&&to(o)?l:l.value:ve(l)?e?lo(l):rs(l):l}}const wl=Ki(),$l=Ki(!0);function Ki(e=!1){return function(n,s,o,i){let r=n[s];if(qt(r)&&Ve(r)&&!Ve(o))return!1;if(!e&&(!zn(o)&&!qt(o)&&(r=fe(r),o=fe(o)),!Q(n)&&Ve(r)&&!Ve(o)))return r.value=o,!0;const l=Q(n)&&to(s)?Number(s)e,is=e=>Reflect.getPrototypeOf(e);function Cn(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),i=fe(t);n||(t!==i&&He(o,"get",t),He(o,"get",i));const{has:r}=is(o),l=s?io:n?ao:mn;if(r.call(o,t))return l(e.get(t));if(r.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function Sn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&He(s,"has",e),He(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Tn(e,t=!1){return e=e.__v_raw,!t&&He(fe(e),"iterate",Lt),Reflect.get(e,"size",e)}function Bo(e){e=fe(e);const t=fe(this);return is(t).has.call(t,e)||(t.add(e),rt(t,"add",e,e)),this}function Fo(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=is(n);let i=s.call(n,e);i||(e=fe(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?_n(t,r)&&rt(n,"set",e,t):rt(n,"add",e,t),this}function Ho(e){const t=fe(this),{has:n,get:s}=is(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&rt(t,"delete",e,void 0),i}function Do(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&rt(e,"clear",void 0,void 0),n}function Vn(e,t){return function(s,o){const i=this,r=i.__v_raw,l=fe(r),c=t?io:e?ao:mn;return!e&&He(l,"iterate",Lt),r.forEach((a,f)=>s.call(o,c(a),c(f),i))}}function En(e,t,n){return function(...s){const o=this.__v_raw,i=fe(o),r=Ft(i),l=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,a=o[e](...s),f=n?io:t?ao:mn;return!t&&He(i,"iterate",c?Os:Lt),{next(){const{value:_,done:p}=a.next();return p?{value:_,done:p}:{value:l?[f(_[0]),f(_[1])]:f(_),done:p}},[Symbol.iterator](){return this}}}}function at(e){return function(...t){return e==="delete"?!1:this}}function Vl(){const e={get(i){return Cn(this,i)},get size(){return Tn(this)},has:Sn,add:Bo,set:Fo,delete:Ho,clear:Do,forEach:Vn(!1,!1)},t={get(i){return Cn(this,i,!1,!0)},get size(){return Tn(this)},has:Sn,add:Bo,set:Fo,delete:Ho,clear:Do,forEach:Vn(!1,!0)},n={get(i){return Cn(this,i,!0)},get size(){return Tn(this,!0)},has(i){return Sn.call(this,i,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:Vn(!0,!1)},s={get(i){return Cn(this,i,!0,!0)},get size(){return Tn(this,!0)},has(i){return Sn.call(this,i,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=En(i,!1,!1),n[i]=En(i,!0,!1),t[i]=En(i,!1,!0),s[i]=En(i,!0,!0)}),[e,n,t,s]}const[El,Ml,Ll,Al]=Vl();function ro(e,t){const n=t?e?Al:Ll:e?Ml:El;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ae(n,o)&&o in s?n:s,o,i)}const Il={get:ro(!1,!1)},Nl={get:ro(!1,!0)},Ol={get:ro(!0,!1)},Gi=new WeakMap,Yi=new WeakMap,Qi=new WeakMap,Bl=new WeakMap;function Fl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Hl(e){return e.__v_skip||!Object.isExtensible(e)?0:Fl(ll(e))}function rs(e){return qt(e)?e:co(e,!1,Wi,Il,Gi)}function Dl(e){return co(e,!1,Tl,Nl,Yi)}function lo(e){return co(e,!0,Sl,Ol,Qi)}function co(e,t,n,s,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Hl(e);if(r===0)return e;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function Ht(e){return qt(e)?Ht(e.__v_raw):!!(e&&e.__v_isReactive)}function qt(e){return!!(e&&e.__v_isReadonly)}function zn(e){return!!(e&&e.__v_isShallow)}function Xi(e){return Ht(e)||qt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function ln(e){return Rn(e,"__v_skip",!0),e}const mn=e=>ve(e)?rs(e):e,ao=e=>ve(e)?lo(e):e;function Ji(e){_t&&We&&(e=fe(e),ji(e.dep||(e.dep=no())))}function Zi(e,t){e=fe(e),e.dep&&Bs(e.dep)}function Ve(e){return!!(e&&e.__v_isRef===!0)}function le(e){return er(e,!1)}function Rl(e){return er(e,!0)}function er(e,t){return Ve(e)?e:new zl(e,t)}class zl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:mn(t)}get value(){return Ji(this),this._value}set value(t){const n=this.__v_isShallow||zn(t)||qt(t);t=n?t:fe(t),_n(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:mn(t),Zi(this))}}function b(e){return Ve(e)?e.value:e}const Ul={get:(e,t,n)=>b(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Ve(o)&&!Ve(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function tr(e){return Ht(e)?e:new Proxy(e,Ul)}var nr;class jl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[nr]=!1,this._dirty=!0,this.effect=new so(t,()=>{this._dirty||(this._dirty=!0,Zi(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Ji(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}nr="__v_isReadonly";function ql(e,t,n=!1){let s,o;const i=ne(e);return i?(s=e,o=Ye):(s=e.get,o=e.set),new jl(s,o,i||!o,n)}function pt(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){ls(i,t,n)}return o}function ze(e,t,n,s){if(ne(e)){const i=pt(e,t,n,s);return i&&Fi(i)&&i.catch(r=>{ls(r,t,n)}),i}const o=[];for(let i=0;i>>1;vn(Te[s])tt&&Te.splice(t,1)}function Yl(e){Q(e)?Dt.push(...e):(!it||!it.includes(e,e.allowRecurse?St+1:St))&&Dt.push(e),or()}function Ro(e,t=gn?tt+1:0){for(;tvn(n)-vn(s)),St=0;Ste.id==null?1/0:e.id,Ql=(e,t)=>{const n=vn(e)-vn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ir(e){Fs=!1,gn=!0,Te.sort(Ql);const t=Ye;try{for(tt=0;ttye(v)?v.trim():v)),_&&(o=n.map(pn))}let l,c=s[l=ws(t)]||s[l=ws(st(t))];!c&&i&&(c=s[l=ws(Yt(t))]),c&&ze(c,e,6,o);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,ze(a,e,6,o)}}function rr(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},l=!1;if(!ne(e)){const c=a=>{const f=rr(a,t,!0);f&&(l=!0,Pe(r,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ve(e)&&s.set(e,null),null):(Q(i)?i.forEach(c=>r[c]=null):Pe(r,i),ve(e)&&s.set(e,r),r)}function cs(e,t){return!e||!wn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ae(e,t[0].toLowerCase()+t.slice(1))||ae(e,Yt(t))||ae(e,t))}let ke=null,as=null;function jn(e){const t=ke;return ke=e,as=e&&e.type.__scopeId||null,t}function Ue(e){as=e}function je(){as=null}function N(e,t=ke,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Zo(-1);const i=jn(t);let r;try{r=e(...o)}finally{jn(i),s._d&&Zo(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function $s(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:l,attrs:c,emit:a,render:f,renderCache:_,data:p,setupState:v,ctx:T,inheritAttrs:A}=e;let W,y;const w=jn(e);try{if(n.shapeFlag&4){const O=o||s;W=Ke(f.call(O,O,_,i,v,p,T)),y=c}else{const O=t;W=Ke(O.length>1?O(i,{attrs:c,slots:l,emit:a}):O(i,null)),y=t.props?c:Jl(c)}}catch(O){fn.length=0,ls(O,e,1),W=L(Fe)}let C=W;if(y&&A!==!1){const O=Object.keys(y),{shapeFlag:U}=C;O.length&&U&7&&(r&&O.some(Js)&&(y=Zl(y,r)),C=vt(C,y))}return n.dirs&&(C=vt(C),C.dirs=C.dirs?C.dirs.concat(n.dirs):n.dirs),n.transition&&(C.transition=n.transition),W=C,jn(w),W}const Jl=e=>{let t;for(const n in e)(n==="class"||n==="style"||wn(n))&&((t||(t={}))[n]=e[n]);return t},Zl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function ec(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?zo(s,r,a):!!r;if(c&8){const f=t.dynamicProps;for(let _=0;_e.__isSuspense;function lr(e,t){t&&t.pendingBranch?Q(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}function Rt(e,t){if($e){let n=$e.provides;const s=$e.parent&&$e.parent.provides;s===n&&(n=$e.provides=Object.create(s)),n[e]=t}}function Be(e,t,n=!1){const s=$e||ke;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&ne(t)?t.call(s.proxy):t}}function gt(e,t){return us(e,null,t)}function sc(e,t){return us(e,null,{flush:"post"})}const Mn={};function nt(e,t,n){return us(e,t,n)}function us(e,t,{immediate:n,deep:s,flush:o,onTrack:i,onTrigger:r}=ge){const l=$e;let c,a=!1,f=!1;if(Ve(e)?(c=()=>e.value,a=zn(e)):Ht(e)?(c=()=>e,s=!0):Q(e)?(f=!0,a=e.some(C=>Ht(C)||zn(C)),c=()=>e.map(C=>{if(Ve(C))return C.value;if(Ht(C))return Mt(C);if(ne(C))return pt(C,l,2)})):ne(e)?t?c=()=>pt(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return _&&_(),ze(e,l,3,[p])}:c=Ye,t&&s){const C=c;c=()=>Mt(C())}let _,p=C=>{_=y.onStop=()=>{pt(C,l,4)}},v;if(yn)if(p=Ye,t?n&&ze(t,l,3,[c(),f?[]:void 0,p]):c(),o==="sync"){const C=Jc();v=C.__watcherHandles||(C.__watcherHandles=[])}else return Ye;let T=f?new Array(e.length).fill(Mn):Mn;const A=()=>{if(y.active)if(t){const C=y.run();(s||a||(f?C.some((O,U)=>_n(O,T[U])):_n(C,T)))&&(_&&_(),ze(t,l,3,[C,T===Mn?void 0:f&&T[0]===Mn?[]:T,p]),T=C)}else y.run()};A.allowRecurse=!!t;let W;o==="sync"?W=A:o==="post"?W=()=>Le(A,l&&l.suspense):(A.pre=!0,l&&(A.id=l.uid),W=()=>ho(A));const y=new so(c,W);t?n?A():T=y.run():o==="post"?Le(y.run.bind(y),l&&l.suspense):y.run();const w=()=>{y.stop(),l&&l.scope&&Zs(l.scope.effects,y)};return v&&v.push(w),w}function oc(e,t,n){const s=this.proxy,o=ye(e)?e.includes(".")?cr(s,e):()=>s[e]:e.bind(s,s);let i;ne(t)?i=t:(i=t.handler,n=t);const r=$e;Wt(this);const l=us(o,i.bind(s),n);return r?Wt(r):At(),l}function cr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Mt(n,t)});else if(Di(e))for(const n in e)Mt(e[n],t);return e}function ic(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Qe(()=>{e.isMounted=!0}),hr(()=>{e.isUnmounting=!0}),e}const De=[Function,Array],rc={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:De,onEnter:De,onAfterEnter:De,onEnterCancelled:De,onBeforeLeave:De,onLeave:De,onAfterLeave:De,onLeaveCancelled:De,onBeforeAppear:De,onAppear:De,onAfterAppear:De,onAppearCancelled:De},setup(e,{slots:t}){const n=xo(),s=ic();let o;return()=>{const i=t.default&&fr(t.default(),!0);if(!i||!i.length)return;let r=i[0];if(i.length>1){for(const A of i)if(A.type!==Fe){r=A;break}}const l=fe(e),{mode:c}=l;if(s.isLeaving)return ks(r);const a=Uo(r);if(!a)return ks(r);const f=Hs(a,l,s,n);Ds(a,f);const _=n.subTree,p=_&&Uo(_);let v=!1;const{getTransitionKey:T}=a.type;if(T){const A=T();o===void 0?o=A:A!==o&&(o=A,v=!0)}if(p&&p.type!==Fe&&(!Tt(a,p)||v)){const A=Hs(p,l,s,n);if(Ds(p,A),c==="out-in")return s.isLeaving=!0,A.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ks(r);c==="in-out"&&a.type!==Fe&&(A.delayLeave=(W,y,w)=>{const C=ur(s,p);C[String(p.key)]=p,W._leaveCb=()=>{y(),W._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=w})}return r}}},ar=rc;function ur(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hs(e,t,n,s){const{appear:o,mode:i,persisted:r=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:_,onLeave:p,onAfterLeave:v,onLeaveCancelled:T,onBeforeAppear:A,onAppear:W,onAfterAppear:y,onAppearCancelled:w}=t,C=String(e.key),O=ur(n,e),U=(M,Y)=>{M&&ze(M,s,9,Y)},G=(M,Y)=>{const X=Y[1];U(M,Y),Q(M)?M.every(oe=>oe.length<=1)&&X():M.length<=1&&X()},Z={mode:i,persisted:r,beforeEnter(M){let Y=l;if(!n.isMounted)if(o)Y=A||l;else return;M._leaveCb&&M._leaveCb(!0);const X=O[C];X&&Tt(e,X)&&X.el._leaveCb&&X.el._leaveCb(),U(Y,[M])},enter(M){let Y=c,X=a,oe=f;if(!n.isMounted)if(o)Y=W||c,X=y||a,oe=w||f;else return;let D=!1;const ie=M._enterCb=j=>{D||(D=!0,j?U(oe,[M]):U(X,[M]),Z.delayedLeave&&Z.delayedLeave(),M._enterCb=void 0)};Y?G(Y,[M,ie]):ie()},leave(M,Y){const X=String(e.key);if(M._enterCb&&M._enterCb(!0),n.isUnmounting)return Y();U(_,[M]);let oe=!1;const D=M._leaveCb=ie=>{oe||(oe=!0,Y(),ie?U(T,[M]):U(v,[M]),M._leaveCb=void 0,O[X]===e&&delete O[X])};O[X]=e,p?G(p,[M,D]):D()},clone(M){return Hs(M,t,n,s)}};return Z}function ks(e){if(fs(e))return e=vt(e),e.children=null,e}function Uo(e){return fs(e)?e.children?e.children[0]:void 0:e}function Ds(e,t){e.shapeFlag&6&&e.component?Ds(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function fr(e,t=!1,n){let s=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,fs=e=>e.type.__isKeepAlive;function lc(e,t){dr(e,"a",t)}function cc(e,t){dr(e,"da",t)}function dr(e,t,n=$e){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)fs(o.parent.vnode)&&ac(s,t,n,o),o=o.parent}}function ac(e,t,n,s){const o=ds(t,e,s,!0);Jt(()=>{Zs(s[t],o)},n)}function ds(e,t,n=$e,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Qt(),Wt(n);const l=ze(t,n,e,r);return At(),Xt(),l});return s?o.unshift(i):o.push(i),i}}const ct=e=>(t,n=$e)=>(!yn||e==="sp")&&ds(e,(...s)=>t(...s),n),uc=ct("bm"),Qe=ct("m"),fc=ct("bu"),_o=ct("u"),hr=ct("bum"),Jt=ct("um"),dc=ct("sp"),hc=ct("rtg"),_c=ct("rtc");function pc(e,t=$e){ds("ec",e,t)}function jo(e,t){const n=ke;if(n===null)return e;const s=_s(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;it(r,l,void 0,i&&i[l]));else{const r=Object.keys(e);o=new Array(r.length);for(let l=0,c=r.length;lWn(t)?!(t.type===Fe||t.type===te&&!mr(t.children)):!0)?e:null}const Rs=e=>e?Sr(e)?_s(e)||e.proxy:Rs(e.parent):null,cn=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Rs(e.parent),$root:e=>Rs(e.root),$emit:e=>e.emit,$options:e=>go(e),$forceUpdate:e=>e.f||(e.f=()=>ho(e.update)),$nextTick:e=>e.n||(e.n=fo.bind(e.proxy)),$watch:e=>oc.bind(e)}),Ps=(e,t)=>e!==ge&&!e.__isScriptSetup&&ae(e,t),mc={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const v=r[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(Ps(s,t))return r[t]=1,s[t];if(o!==ge&&ae(o,t))return r[t]=2,o[t];if((a=e.propsOptions[0])&&ae(a,t))return r[t]=3,i[t];if(n!==ge&&ae(n,t))return r[t]=4,n[t];zs&&(r[t]=0)}}const f=cn[t];let _,p;if(f)return t==="$attrs"&&He(e,"get",t),f(e);if((_=l.__cssModules)&&(_=_[t]))return _;if(n!==ge&&ae(n,t))return r[t]=4,n[t];if(p=c.config.globalProperties,ae(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return Ps(o,t)?(o[t]=n,!0):s!==ge&&ae(s,t)?(s[t]=n,!0):ae(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let l;return!!n[r]||e!==ge&&ae(e,r)||Ps(t,r)||(l=i[0])&&ae(l,r)||ae(s,r)||ae(cn,r)||ae(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ae(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let zs=!0;function gc(e){const t=go(e),n=e.proxy,s=e.ctx;zs=!1,t.beforeCreate&&Ko(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:l,provide:c,inject:a,created:f,beforeMount:_,mounted:p,beforeUpdate:v,updated:T,activated:A,deactivated:W,beforeDestroy:y,beforeUnmount:w,destroyed:C,unmounted:O,render:U,renderTracked:G,renderTriggered:Z,errorCaptured:M,serverPrefetch:Y,expose:X,inheritAttrs:oe,components:D,directives:ie,filters:j}=t;if(a&&vc(a,s,null,e.appContext.config.unwrapInjectedRef),r)for(const be in r){const pe=r[be];ne(pe)&&(s[be]=pe.bind(n))}if(o){const be=o.call(n,n);ve(be)&&(e.data=rs(be))}if(zs=!0,i)for(const be in i){const pe=i[be],xt=ne(pe)?pe.bind(n,n):ne(pe.get)?pe.get.bind(n,n):Ye,kn=!ne(pe)&&ne(pe.set)?pe.set.bind(n):Ye,wt=se({get:xt,set:kn});Object.defineProperty(s,be,{enumerable:!0,configurable:!0,get:()=>wt.value,set:Je=>wt.value=Je})}if(l)for(const be in l)gr(l[be],s,n,be);if(c){const be=ne(c)?c.call(n):c;Reflect.ownKeys(be).forEach(pe=>{Rt(pe,be[pe])})}f&&Ko(f,e,"c");function he(be,pe){Q(pe)?pe.forEach(xt=>be(xt.bind(n))):pe&&be(pe.bind(n))}if(he(uc,_),he(Qe,p),he(fc,v),he(_o,T),he(lc,A),he(cc,W),he(pc,M),he(_c,G),he(hc,Z),he(hr,w),he(Jt,O),he(dc,Y),Q(X))if(X.length){const be=e.exposed||(e.exposed={});X.forEach(pe=>{Object.defineProperty(be,pe,{get:()=>n[pe],set:xt=>n[pe]=xt})})}else e.exposed||(e.exposed={});U&&e.render===Ye&&(e.render=U),oe!=null&&(e.inheritAttrs=oe),D&&(e.components=D),ie&&(e.directives=ie)}function vc(e,t,n=Ye,s=!1){Q(e)&&(e=Us(e));for(const o in e){const i=e[o];let r;ve(i)?"default"in i?r=Be(i.from||o,i.default,!0):r=Be(i.from||o):r=Be(i),Ve(r)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[o]=r}}function Ko(e,t,n){ze(Q(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function gr(e,t,n,s){const o=s.includes(".")?cr(n,s):()=>n[s];if(ye(e)){const i=t[e];ne(i)&&nt(o,i)}else if(ne(e))nt(o,e.bind(n));else if(ve(e))if(Q(e))e.forEach(i=>gr(i,t,n,s));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&nt(o,i,e)}}function go(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,l=i.get(t);let c;return l?c=l:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(a=>qn(c,a,r,!0)),qn(c,t,r)),ve(t)&&i.set(t,c),c}function qn(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&qn(e,i,n,!0),o&&o.forEach(r=>qn(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const l=bc[r]||n&&n[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const bc={data:Wo,props:Ct,emits:Ct,methods:Ct,computed:Ct,beforeCreate:Ee,created:Ee,beforeMount:Ee,mounted:Ee,beforeUpdate:Ee,updated:Ee,beforeDestroy:Ee,beforeUnmount:Ee,destroyed:Ee,unmounted:Ee,activated:Ee,deactivated:Ee,errorCaptured:Ee,serverPrefetch:Ee,components:Ct,directives:Ct,watch:xc,provide:Wo,inject:yc};function Wo(e,t){return t?e?function(){return Pe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function yc(e,t){return Ct(Us(e),Us(t))}function Us(e){if(Q(e)){const t={};for(let n=0;n0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let _=0;_{c=!0;const[p,v]=br(_,t,!0);Pe(r,p),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return ve(e)&&s.set(e,Bt),Bt;if(Q(i))for(let f=0;f-1,v[1]=A<0||T-1||ae(v,"default"))&&l.push(_)}}}const a=[r,l];return ve(e)&&s.set(e,a),a}function Go(e){return e[0]!=="$"}function Yo(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function Qo(e,t){return Yo(e)===Yo(t)}function Xo(e,t){return Q(t)?t.findIndex(n=>Qo(n,e)):ne(t)&&Qo(t,e)?0:-1}const yr=e=>e[0]==="_"||e==="$stable",vo=e=>Q(e)?e.map(Ke):[Ke(e)],kc=(e,t,n)=>{if(t._n)return t;const s=N((...o)=>vo(t(...o)),n);return s._c=!1,s},xr=(e,t,n)=>{const s=e._ctx;for(const o in e){if(yr(o))continue;const i=e[o];if(ne(i))t[o]=kc(o,i,s);else if(i!=null){const r=vo(i);t[o]=()=>r}}},wr=(e,t)=>{const n=vo(t);e.slots.default=()=>n},Pc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Rn(t,"_",n)):xr(t,e.slots={})}else e.slots={},t&&wr(e,t);Rn(e.slots,hs,1)},Cc=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=ge;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(Pe(o,t),!n&&l===1&&delete o._):(i=!t.$stable,xr(t,o)),r=t}else t&&(wr(e,t),r={default:1});if(i)for(const l in o)!yr(l)&&!(l in r)&&delete o[l]};function $r(){return{app:null,config:{isNativeTag:ol,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Sc=0;function Tc(e,t){return function(s,o=null){ne(s)||(s=Object.assign({},s)),o!=null&&!ve(o)&&(o=null);const i=$r(),r=new Set;let l=!1;const c=i.app={_uid:Sc++,_component:s,_props:o,_container:null,_context:i,_instance:null,version:Zc,get config(){return i.config},set config(a){},use(a,...f){return r.has(a)||(a&&ne(a.install)?(r.add(a),a.install(c,...f)):ne(a)&&(r.add(a),a(c,...f))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,f){return f?(i.components[a]=f,c):i.components[a]},directive(a,f){return f?(i.directives[a]=f,c):i.directives[a]},mount(a,f,_){if(!l){const p=L(s,o);return p.appContext=i,f&&t?t(p,a):e(p,a,_),l=!0,c._container=a,a.__vue_app__=c,_s(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return i.provides[a]=f,c}};return c}}function Kn(e,t,n,s,o=!1){if(Q(e)){e.forEach((p,v)=>Kn(p,t&&(Q(t)?t[v]:t),n,s,o));return}if(zt(s)&&!o)return;const i=s.shapeFlag&4?_s(s.component)||s.component.proxy:s.el,r=o?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===ge?l.refs={}:l.refs,_=l.setupState;if(a!=null&&a!==c&&(ye(a)?(f[a]=null,ae(_,a)&&(_[a]=null)):Ve(a)&&(a.value=null)),ne(c))pt(c,l,12,[r,f]);else{const p=ye(c),v=Ve(c);if(p||v){const T=()=>{if(e.f){const A=p?ae(_,c)?_[c]:f[c]:c.value;o?Q(A)&&Zs(A,i):Q(A)?A.includes(i)||A.push(i):p?(f[c]=[i],ae(_,c)&&(_[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else p?(f[c]=r,ae(_,c)&&(_[c]=r)):v&&(c.value=r,e.k&&(f[e.k]=r))};r?(T.id=-1,Le(T,n)):T()}}}let ut=!1;const Ln=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",An=e=>e.nodeType===8;function Vc(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:i,parentNode:r,remove:l,insert:c,createComment:a}}=e,f=(y,w)=>{if(!w.hasChildNodes()){n(null,y,w),Un(),w._vnode=y;return}ut=!1,_(w.firstChild,y,null,null,null),Un(),w._vnode=y,ut&&console.error("Hydration completed but contains mismatches.")},_=(y,w,C,O,U,G=!1)=>{const Z=An(y)&&y.data==="[",M=()=>A(y,w,C,O,U,Z),{type:Y,ref:X,shapeFlag:oe,patchFlag:D}=w;let ie=y.nodeType;w.el=y,D===-2&&(G=!1,w.dynamicChildren=null);let j=null;switch(Y){case Kt:ie!==3?w.children===""?(c(w.el=o(""),r(y),y),j=y):j=M():(y.data!==w.children&&(ut=!0,y.data=w.children),j=i(y));break;case Fe:ie!==8||Z?j=M():j=i(y);break;case un:if(Z&&(y=i(y),ie=y.nodeType),ie===1||ie===3){j=y;const Ie=!w.children.length;for(let he=0;he{G=G||!!w.dynamicChildren;const{type:Z,props:M,patchFlag:Y,shapeFlag:X,dirs:oe}=w,D=Z==="input"&&oe||Z==="option";if(D||Y!==-1){if(oe&&et(w,null,C,"created"),M)if(D||!G||Y&48)for(const j in M)(D&&j.endsWith("value")||wn(j)&&!rn(j))&&s(y,j,null,M[j],!1,void 0,C);else M.onClick&&s(y,"onClick",null,M.onClick,!1,void 0,C);let ie;if((ie=M&&M.onVnodeBeforeMount)&&Re(ie,C,w),oe&&et(w,null,C,"beforeMount"),((ie=M&&M.onVnodeMounted)||oe)&&lr(()=>{ie&&Re(ie,C,w),oe&&et(w,null,C,"mounted")},O),X&16&&!(M&&(M.innerHTML||M.textContent))){let j=v(y.firstChild,w,y,C,O,U,G);for(;j;){ut=!0;const Ie=j;j=j.nextSibling,l(Ie)}}else X&8&&y.textContent!==w.children&&(ut=!0,y.textContent=w.children)}return y.nextSibling},v=(y,w,C,O,U,G,Z)=>{Z=Z||!!w.dynamicChildren;const M=w.children,Y=M.length;for(let X=0;X{const{slotScopeIds:Z}=w;Z&&(U=U?U.concat(Z):Z);const M=r(y),Y=v(i(y),w,M,C,O,U,G);return Y&&An(Y)&&Y.data==="]"?i(w.anchor=Y):(ut=!0,c(w.anchor=a("]"),M,Y),Y)},A=(y,w,C,O,U,G)=>{if(ut=!0,w.el=null,G){const Y=W(y);for(;;){const X=i(y);if(X&&X!==Y)l(X);else break}}const Z=i(y),M=r(y);return l(y),n(null,w,M,Z,C,O,Ln(M),U),Z},W=y=>{let w=0;for(;y;)if(y=i(y),y&&An(y)&&(y.data==="["&&w++,y.data==="]")){if(w===0)return i(y);w--}return y};return[f,_]}const Le=lr;function Ec(e){return Mc(e,Vc)}function Mc(e,t){const n=ul();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:l,createComment:c,setText:a,setElementText:f,parentNode:_,nextSibling:p,setScopeId:v=Ye,insertStaticContent:T}=e,A=(u,h,x,k=null,$=null,E=null,B=!1,V=null,I=!!h.dynamicChildren)=>{if(u===h)return;u&&!Tt(u,h)&&(k=Pn(u),Je(u,$,E,!0),u=null),h.patchFlag===-2&&(I=!1,h.dynamicChildren=null);const{type:P,ref:q,shapeFlag:R}=h;switch(P){case Kt:W(u,h,x,k);break;case Fe:y(u,h,x,k);break;case un:u==null&&w(h,x,k,B);break;case te:D(u,h,x,k,$,E,B,V,I);break;default:R&1?U(u,h,x,k,$,E,B,V,I):R&6?ie(u,h,x,k,$,E,B,V,I):(R&64||R&128)&&P.process(u,h,x,k,$,E,B,V,I,It)}q!=null&&$&&Kn(q,u&&u.ref,E,h||u,!h)},W=(u,h,x,k)=>{if(u==null)s(h.el=l(h.children),x,k);else{const $=h.el=u.el;h.children!==u.children&&a($,h.children)}},y=(u,h,x,k)=>{u==null?s(h.el=c(h.children||""),x,k):h.el=u.el},w=(u,h,x,k)=>{[u.el,u.anchor]=T(u.children,h,x,k,u.el,u.anchor)},C=({el:u,anchor:h},x,k)=>{let $;for(;u&&u!==h;)$=p(u),s(u,x,k),u=$;s(h,x,k)},O=({el:u,anchor:h})=>{let x;for(;u&&u!==h;)x=p(u),o(u),u=x;o(h)},U=(u,h,x,k,$,E,B,V,I)=>{B=B||h.type==="svg",u==null?G(h,x,k,$,E,B,V,I):Y(u,h,$,E,B,V,I)},G=(u,h,x,k,$,E,B,V)=>{let I,P;const{type:q,props:R,shapeFlag:K,transition:ee,dirs:re}=u;if(I=u.el=r(u.type,E,R&&R.is,R),K&8?f(I,u.children):K&16&&M(u.children,I,null,k,$,E&&q!=="foreignObject",B,V),re&&et(u,null,k,"created"),R){for(const _e in R)_e!=="value"&&!rn(_e)&&i(I,_e,null,R[_e],E,u.children,k,$,ot);"value"in R&&i(I,"value",null,R.value),(P=R.onVnodeBeforeMount)&&Re(P,k,u)}Z(I,u,u.scopeId,B,k),re&&et(u,null,k,"beforeMount");const me=(!$||$&&!$.pendingBranch)&&ee&&!ee.persisted;me&&ee.beforeEnter(I),s(I,h,x),((P=R&&R.onVnodeMounted)||me||re)&&Le(()=>{P&&Re(P,k,u),me&&ee.enter(I),re&&et(u,null,k,"mounted")},$)},Z=(u,h,x,k,$)=>{if(x&&v(u,x),k)for(let E=0;E{for(let P=I;P{const V=h.el=u.el;let{patchFlag:I,dynamicChildren:P,dirs:q}=h;I|=u.patchFlag&16;const R=u.props||ge,K=h.props||ge;let ee;x&&$t(x,!1),(ee=K.onVnodeBeforeUpdate)&&Re(ee,x,h,u),q&&et(h,u,x,"beforeUpdate"),x&&$t(x,!0);const re=$&&h.type!=="foreignObject";if(P?X(u.dynamicChildren,P,V,x,k,re,E):B||pe(u,h,V,null,x,k,re,E,!1),I>0){if(I&16)oe(V,h,R,K,x,k,$);else if(I&2&&R.class!==K.class&&i(V,"class",null,K.class,$),I&4&&i(V,"style",R.style,K.style,$),I&8){const me=h.dynamicProps;for(let _e=0;_e{ee&&Re(ee,x,h,u),q&&et(h,u,x,"updated")},k)},X=(u,h,x,k,$,E,B)=>{for(let V=0;V{if(x!==k){if(x!==ge)for(const V in x)!rn(V)&&!(V in k)&&i(u,V,x[V],null,B,h.children,$,E,ot);for(const V in k){if(rn(V))continue;const I=k[V],P=x[V];I!==P&&V!=="value"&&i(u,V,P,I,B,h.children,$,E,ot)}"value"in k&&i(u,"value",x.value,k.value)}},D=(u,h,x,k,$,E,B,V,I)=>{const P=h.el=u?u.el:l(""),q=h.anchor=u?u.anchor:l("");let{patchFlag:R,dynamicChildren:K,slotScopeIds:ee}=h;ee&&(V=V?V.concat(ee):ee),u==null?(s(P,x,k),s(q,x,k),M(h.children,x,q,$,E,B,V,I)):R>0&&R&64&&K&&u.dynamicChildren?(X(u.dynamicChildren,K,x,$,E,B,V),(h.key!=null||$&&h===$.subTree)&&bo(u,h,!0)):pe(u,h,x,q,$,E,B,V,I)},ie=(u,h,x,k,$,E,B,V,I)=>{h.slotScopeIds=V,u==null?h.shapeFlag&512?$.ctx.activate(h,x,k,B,I):j(h,x,k,$,E,B,I):Ie(u,h,I)},j=(u,h,x,k,$,E,B)=>{const V=u.component=Uc(u,k,$);if(fs(u)&&(V.ctx.renderer=It),jc(V),V.asyncDep){if($&&$.registerDep(V,he),!u.el){const I=V.subTree=L(Fe);y(null,I,h,x)}return}he(V,u,h,x,$,E,B)},Ie=(u,h,x)=>{const k=h.component=u.component;if(ec(u,h,x))if(k.asyncDep&&!k.asyncResolved){be(k,h,x);return}else k.next=h,Gl(k.update),k.update();else h.el=u.el,k.vnode=h},he=(u,h,x,k,$,E,B)=>{const V=()=>{if(u.isMounted){let{next:q,bu:R,u:K,parent:ee,vnode:re}=u,me=q,_e;$t(u,!1),q?(q.el=re.el,be(u,q,B)):q=re,R&&Bn(R),(_e=q.props&&q.props.onVnodeBeforeUpdate)&&Re(_e,ee,q,re),$t(u,!0);const xe=$s(u),qe=u.subTree;u.subTree=xe,A(qe,xe,_(qe.el),Pn(qe),u,$,E),q.el=xe.el,me===null&&tc(u,xe.el),K&&Le(K,$),(_e=q.props&&q.props.onVnodeUpdated)&&Le(()=>Re(_e,ee,q,re),$)}else{let q;const{el:R,props:K}=h,{bm:ee,m:re,parent:me}=u,_e=zt(h);if($t(u,!1),ee&&Bn(ee),!_e&&(q=K&&K.onVnodeBeforeMount)&&Re(q,me,h),$t(u,!0),R&&xs){const xe=()=>{u.subTree=$s(u),xs(R,u.subTree,u,$,null)};_e?h.type.__asyncLoader().then(()=>!u.isUnmounted&&xe()):xe()}else{const xe=u.subTree=$s(u);A(null,xe,x,k,u,$,E),h.el=xe.el}if(re&&Le(re,$),!_e&&(q=K&&K.onVnodeMounted)){const xe=h;Le(()=>Re(q,me,xe),$)}(h.shapeFlag&256||me&&zt(me.vnode)&&me.vnode.shapeFlag&256)&&u.a&&Le(u.a,$),u.isMounted=!0,h=x=k=null}},I=u.effect=new so(V,()=>ho(P),u.scope),P=u.update=()=>I.run();P.id=u.uid,$t(u,!0),P()},be=(u,h,x)=>{h.component=u;const k=u.vnode.props;u.vnode=h,u.next=null,$c(u,h.props,k,x),Cc(u,h.children,x),Qt(),Ro(),Xt()},pe=(u,h,x,k,$,E,B,V,I=!1)=>{const P=u&&u.children,q=u?u.shapeFlag:0,R=h.children,{patchFlag:K,shapeFlag:ee}=h;if(K>0){if(K&128){kn(P,R,x,k,$,E,B,V,I);return}else if(K&256){xt(P,R,x,k,$,E,B,V,I);return}}ee&8?(q&16&&ot(P,$,E),R!==P&&f(x,R)):q&16?ee&16?kn(P,R,x,k,$,E,B,V,I):ot(P,$,E,!0):(q&8&&f(x,""),ee&16&&M(R,x,k,$,E,B,V,I))},xt=(u,h,x,k,$,E,B,V,I)=>{u=u||Bt,h=h||Bt;const P=u.length,q=h.length,R=Math.min(P,q);let K;for(K=0;Kq?ot(u,$,E,!0,!1,R):M(h,x,k,$,E,B,V,I,R)},kn=(u,h,x,k,$,E,B,V,I)=>{let P=0;const q=h.length;let R=u.length-1,K=q-1;for(;P<=R&&P<=K;){const ee=u[P],re=h[P]=I?ht(h[P]):Ke(h[P]);if(Tt(ee,re))A(ee,re,x,null,$,E,B,V,I);else break;P++}for(;P<=R&&P<=K;){const ee=u[R],re=h[K]=I?ht(h[K]):Ke(h[K]);if(Tt(ee,re))A(ee,re,x,null,$,E,B,V,I);else break;R--,K--}if(P>R){if(P<=K){const ee=K+1,re=eeK)for(;P<=R;)Je(u[P],$,E,!0),P++;else{const ee=P,re=P,me=new Map;for(P=re;P<=K;P++){const Ne=h[P]=I?ht(h[P]):Ke(h[P]);Ne.key!=null&&me.set(Ne.key,P)}let _e,xe=0;const qe=K-re+1;let Nt=!1,Eo=0;const en=new Array(qe);for(P=0;P=qe){Je(Ne,$,E,!0);continue}let Ze;if(Ne.key!=null)Ze=me.get(Ne.key);else for(_e=re;_e<=K;_e++)if(en[_e-re]===0&&Tt(Ne,h[_e])){Ze=_e;break}Ze===void 0?Je(Ne,$,E,!0):(en[Ze-re]=P+1,Ze>=Eo?Eo=Ze:Nt=!0,A(Ne,h[Ze],x,null,$,E,B,V,I),xe++)}const Mo=Nt?Lc(en):Bt;for(_e=Mo.length-1,P=qe-1;P>=0;P--){const Ne=re+P,Ze=h[Ne],Lo=Ne+1{const{el:E,type:B,transition:V,children:I,shapeFlag:P}=u;if(P&6){wt(u.component.subTree,h,x,k);return}if(P&128){u.suspense.move(h,x,k);return}if(P&64){B.move(u,h,x,It);return}if(B===te){s(E,h,x);for(let R=0;RV.enter(E),$);else{const{leave:R,delayLeave:K,afterLeave:ee}=V,re=()=>s(E,h,x),me=()=>{R(E,()=>{re(),ee&&ee()})};K?K(E,re,me):me()}else s(E,h,x)},Je=(u,h,x,k=!1,$=!1)=>{const{type:E,props:B,ref:V,children:I,dynamicChildren:P,shapeFlag:q,patchFlag:R,dirs:K}=u;if(V!=null&&Kn(V,null,x,u,!0),q&256){h.ctx.deactivate(u);return}const ee=q&1&&K,re=!zt(u);let me;if(re&&(me=B&&B.onVnodeBeforeUnmount)&&Re(me,h,u),q&6)Xr(u.component,x,k);else{if(q&128){u.suspense.unmount(x,k);return}ee&&et(u,null,h,"beforeUnmount"),q&64?u.type.remove(u,h,x,$,It,k):P&&(E!==te||R>0&&R&64)?ot(P,h,x,!1,!0):(E===te&&R&384||!$&&q&16)&&ot(I,h,x),k&&To(u)}(re&&(me=B&&B.onVnodeUnmounted)||ee)&&Le(()=>{me&&Re(me,h,u),ee&&et(u,null,h,"unmounted")},x)},To=u=>{const{type:h,el:x,anchor:k,transition:$}=u;if(h===te){Qr(x,k);return}if(h===un){O(u);return}const E=()=>{o(x),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(u.shapeFlag&1&&$&&!$.persisted){const{leave:B,delayLeave:V}=$,I=()=>B(x,E);V?V(u.el,E,I):I()}else E()},Qr=(u,h)=>{let x;for(;u!==h;)x=p(u),o(u),u=x;o(h)},Xr=(u,h,x)=>{const{bum:k,scope:$,update:E,subTree:B,um:V}=u;k&&Bn(k),$.stop(),E&&(E.active=!1,Je(B,u,h,x)),V&&Le(V,h),Le(()=>{u.isUnmounted=!0},h),h&&h.pendingBranch&&!h.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===h.pendingId&&(h.deps--,h.deps===0&&h.resolve())},ot=(u,h,x,k=!1,$=!1,E=0)=>{for(let B=E;Bu.shapeFlag&6?Pn(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),Vo=(u,h,x)=>{u==null?h._vnode&&Je(h._vnode,null,null,!0):A(h._vnode||null,u,h,null,null,null,x),Ro(),Un(),h._vnode=u},It={p:A,um:Je,m:wt,r:To,mt:j,mc:M,pc:pe,pbc:X,n:Pn,o:e};let ys,xs;return t&&([ys,xs]=t(It)),{render:Vo,hydrate:ys,createApp:Tc(Vo,ys)}}function $t({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function bo(e,t,n=!1){const s=e.children,o=t.children;if(Q(s)&&Q(o))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}const Ac=e=>e.__isTeleport,an=e=>e&&(e.disabled||e.disabled===""),Jo=e=>typeof SVGElement<"u"&&e instanceof SVGElement,qs=(e,t)=>{const n=e&&e.to;return ye(n)?t?t(n):null:n},Ic={__isTeleport:!0,process(e,t,n,s,o,i,r,l,c,a){const{mc:f,pc:_,pbc:p,o:{insert:v,querySelector:T,createText:A,createComment:W}}=a,y=an(t.props);let{shapeFlag:w,children:C,dynamicChildren:O}=t;if(e==null){const U=t.el=A(""),G=t.anchor=A("");v(U,n,s),v(G,n,s);const Z=t.target=qs(t.props,T),M=t.targetAnchor=A("");Z&&(v(M,Z),r=r||Jo(Z));const Y=(X,oe)=>{w&16&&f(C,X,oe,o,i,r,l,c)};y?Y(n,G):Z&&Y(Z,M)}else{t.el=e.el;const U=t.anchor=e.anchor,G=t.target=e.target,Z=t.targetAnchor=e.targetAnchor,M=an(e.props),Y=M?n:G,X=M?U:Z;if(r=r||Jo(G),O?(p(e.dynamicChildren,O,Y,o,i,r,l),bo(e,t,!0)):c||_(e,t,Y,X,o,i,r,l,!1),y)M||In(t,n,U,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const oe=t.target=qs(t.props,T);oe&&In(t,oe,null,a,0)}else M&&In(t,G,Z,a,1)}kr(t)},remove(e,t,n,s,{um:o,o:{remove:i}},r){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:_,props:p}=e;if(_&&i(f),(r||!an(p))&&(i(a),l&16))for(let v=0;v0?Ge||Bt:null,Bc(),bn>0&&Ge&&Ge.push(e),e}function m(e,t,n,s,o,i){return Pr(g(e,t,n,s,o,i,!0))}function J(e,t,n,s,o){return Pr(L(e,t,n,s,o,!0))}function Wn(e){return e?e.__v_isVNode===!0:!1}function Tt(e,t){return e.type===t.type&&e.key===t.key}const hs="__vInternal",Cr=({key:e})=>e??null,Fn=({ref:e,ref_key:t,ref_for:n})=>e!=null?ye(e)||Ve(e)||ne(e)?{i:ke,r:e,k:t,f:!!n}:e:null;function g(e,t=null,n=null,s=0,o=null,i=e===te?0:1,r=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Cr(t),ref:t&&Fn(t),scopeId:as,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:ke};return l?(yo(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ye(n)?8:16),bn>0&&!r&&Ge&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ge.push(c),c}const L=Fc;function Fc(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===_r)&&(e=Fe),Wn(e)){const l=vt(e,t,!0);return n&&yo(l,n),bn>0&&!i&&Ge&&(l.shapeFlag&6?Ge[Ge.indexOf(e)]=l:Ge.push(l)),l.patchFlag|=-2,l}if(Gc(e)&&(e=e.__vccOpts),t){t=Hc(t);let{class:l,style:c}=t;l&&!ye(l)&&(t.class=de(l)),ve(c)&&(Xi(c)&&!Q(c)&&(c=Pe({},c)),t.style=ts(c))}const r=ye(e)?1:nc(e)?128:Ac(e)?64:ve(e)?4:ne(e)?2:0;return g(e,t,n,s,o,r,i,!0)}function Hc(e){return e?Xi(e)||hs in e?Pe({},e):e:null}function vt(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,l=t?Hn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Cr(l),ref:t&&t.ref?n&&o?Q(o)?o.concat(Fn(t)):[o,Fn(t)]:Fn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==te?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&vt(e.ssContent),ssFallback:e.ssFallback&&vt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ce(e=" ",t=0){return L(Kt,null,e,t)}function Dc(e,t){const n=L(un,null,e);return n.staticCount=t,n}function H(e="",t=!1){return t?(d(),J(Fe,null,e)):L(Fe,null,e)}function Ke(e){return e==null||typeof e=="boolean"?L(Fe):Q(e)?L(te,null,e.slice()):typeof e=="object"?ht(e):L(Kt,null,String(e))}function ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:vt(e)}function yo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Q(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),yo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(hs in t)?t._ctx=ke:o===3&&ke&&(ke.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:ke},n=32):(t=String(t),s&64?(n=16,t=[Ce(t)]):n=8);e.children=t,e.shapeFlag|=n}function Hn(...e){const t={};for(let n=0;n$e||ke,Wt=e=>{$e=e,e.scope.on()},At=()=>{$e&&$e.scope.off(),$e=null};function Sr(e){return e.vnode.shapeFlag&4}let yn=!1;function jc(e,t=!1){yn=t;const{props:n,children:s}=e.vnode,o=Sr(e);wc(e,n,o,t),Pc(e,s);const i=o?qc(e,t):void 0;return yn=!1,i}function qc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=ln(new Proxy(e.ctx,mc));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?Vr(e):null;Wt(e),Qt();const i=pt(s,e,0,[e.props,o]);if(Xt(),At(),Fi(i)){if(i.then(At,At),t)return i.then(r=>{ei(e,r,t)}).catch(r=>{ls(r,e,0)});e.asyncDep=i}else ei(e,i,t)}else Tr(e,t)}function ei(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=tr(t)),Tr(e,n)}let ti;function Tr(e,t,n){const s=e.type;if(!e.render){if(!t&&ti&&!s.render){const o=s.template||go(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=Pe(Pe({isCustomElement:i,delimiters:l},r),c);s.render=ti(o,a)}}e.render=s.render||Ye}Wt(e),Qt(),gc(e),Xt(),At()}function Kc(e){return new Proxy(e.attrs,{get(t,n){return He(e,"get","$attrs"),t[n]}})}function Vr(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Kc(e))},slots:e.slots,emit:e.emit,expose:t}}function _s(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(tr(ln(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in cn)return cn[n](e)},has(t,n){return n in t||n in cn}}))}function Wc(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Gc(e){return ne(e)&&"__vccOpts"in e}const se=(e,t)=>ql(e,t,yn);function Yc(){return Qc().slots}function Qc(){const e=xo();return e.setupContext||(e.setupContext=Vr(e))}function Gn(e,t,n){const s=arguments.length;return s===2?ve(t)&&!Q(t)?Wn(t)?L(e,null,[t]):L(e,t):L(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Wn(n)&&(n=[n]),L(e,t,n))}const Xc=Symbol(""),Jc=()=>Be(Xc),Zc="3.2.45",ea="http://www.w3.org/2000/svg",Vt=typeof document<"u"?document:null,ni=Vt&&Vt.createElement("template"),ta={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?Vt.createElementNS(ea,e):Vt.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Vt.createTextNode(e),createComment:e=>Vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{ni.innerHTML=s?`${e}`:e;const l=ni.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function na(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function sa(e,t,n){const s=e.style,o=ye(n);if(n&&!o){for(const i in n)Ks(s,i,n[i]);if(t&&!ye(t))for(const i in t)n[i]==null&&Ks(s,i,"")}else{const i=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const si=/\s*!important$/;function Ks(e,t,n){if(Q(n))n.forEach(s=>Ks(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=oa(e,t);si.test(n)?e.setProperty(Yt(s),n.replace(si,""),"important"):e[s]=n}}const oi=["Webkit","Moz","ms"],Cs={};function oa(e,t){const n=Cs[t];if(n)return n;let s=st(t);if(s!=="filter"&&s in e)return Cs[t]=s;s=os(s);for(let o=0;oSs||(ua.then(()=>Ss=0),Ss=Date.now());function da(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;ze(ha(s,n.value),t,5,[s])};return n.value=e,n.attached=fa(),n}function ha(e,t){if(Q(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const li=/^on[a-z]/,_a=(e,t,n,s,o=!1,i,r,l,c)=>{t==="class"?na(e,s,o):t==="style"?sa(e,n,s):wn(t)?Js(t)||ca(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):pa(e,t,s,o))?ra(e,t,s,i,r,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ia(e,t,s,o))};function pa(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&li.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||li.test(t)&&ye(n)?!1:t in e}const ft="transition",tn="animation",ps=(e,{slots:t})=>Gn(ar,ma(e),t);ps.displayName="Transition";const Er={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};ps.props=Pe({},ar.props,Er);const kt=(e,t=[])=>{Q(e)?e.forEach(n=>n(...t)):e&&e(...t)},ci=e=>e?Q(e)?e.some(t=>t.length>1):e.length>1:!1;function ma(e){const t={};for(const D in e)D in Er||(t[D]=e[D]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=r,appearToClass:f=l,leaveFromClass:_=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,T=ga(o),A=T&&T[0],W=T&&T[1],{onBeforeEnter:y,onEnter:w,onEnterCancelled:C,onLeave:O,onLeaveCancelled:U,onBeforeAppear:G=y,onAppear:Z=w,onAppearCancelled:M=C}=t,Y=(D,ie,j)=>{Pt(D,ie?f:l),Pt(D,ie?a:r),j&&j()},X=(D,ie)=>{D._isLeaving=!1,Pt(D,_),Pt(D,v),Pt(D,p),ie&&ie()},oe=D=>(ie,j)=>{const Ie=D?Z:w,he=()=>Y(ie,D,j);kt(Ie,[ie,he]),ai(()=>{Pt(ie,D?c:i),dt(ie,D?f:l),ci(Ie)||ui(ie,s,A,he)})};return Pe(t,{onBeforeEnter(D){kt(y,[D]),dt(D,i),dt(D,r)},onBeforeAppear(D){kt(G,[D]),dt(D,c),dt(D,a)},onEnter:oe(!1),onAppear:oe(!0),onLeave(D,ie){D._isLeaving=!0;const j=()=>X(D,ie);dt(D,_),ya(),dt(D,p),ai(()=>{D._isLeaving&&(Pt(D,_),dt(D,v),ci(O)||ui(D,s,W,j))}),kt(O,[D,j])},onEnterCancelled(D){Y(D,!1),kt(C,[D])},onAppearCancelled(D){Y(D,!0),kt(M,[D])},onLeaveCancelled(D){X(D),kt(U,[D])}})}function ga(e){if(e==null)return null;if(ve(e))return[Ts(e.enter),Ts(e.leave)];{const t=Ts(e);return[t,t]}}function Ts(e){return pn(e)}function dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ai(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let va=0;function ui(e,t,n,s){const o=e._endId=++va,i=()=>{o===e._endId&&s()};if(n)return setTimeout(i,n);const{type:r,timeout:l,propCount:c}=ba(e,t);if(!r)return s();const a=r+"end";let f=0;const _=()=>{e.removeEventListener(a,p),i()},p=v=>{v.target===e&&++f>=c&&_()};setTimeout(()=>{f(n[T]||"").split(", "),o=s(`${ft}Delay`),i=s(`${ft}Duration`),r=fi(o,i),l=s(`${tn}Delay`),c=s(`${tn}Duration`),a=fi(l,c);let f=null,_=0,p=0;t===ft?r>0&&(f=ft,_=r,p=i.length):t===tn?a>0&&(f=tn,_=a,p=c.length):(_=Math.max(r,a),f=_>0?r>a?ft:tn:null,p=f?f===ft?i.length:c.length:0);const v=f===ft&&/\b(transform|all)(,|$)/.test(s(`${ft}Property`).toString());return{type:f,timeout:_,propCount:p,hasTransform:v}}function fi(e,t){for(;e.lengthdi(n)+di(e[s])))}function di(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function ya(){return document.body.offsetHeight}const hi=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Q(t)?n=>Bn(t,n):t};function xa(e){e.target.composing=!0}function _i(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const wa={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e._assign=hi(o);const i=s||o.props&&o.props.type==="number";Ot(e,t?"change":"input",r=>{if(r.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=pn(l)),e._assign(l)}),n&&Ot(e,"change",()=>{e.value=e.value.trim()}),t||(Ot(e,"compositionstart",xa),Ot(e,"compositionend",_i),Ot(e,"change",_i))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:o}},i){if(e._assign=hi(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(o||e.type==="number")&&pn(e.value)===t))return;const r=t??"";e.value!==r&&(e.value=r)}},$a=["ctrl","shift","alt","meta"],ka={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$a.some(n=>e[`${n}Key`]&&!t.includes(n))},Mr=(e,t)=>(n,...s)=>{for(let o=0;o{nn(e,!1)}):nn(e,t))},beforeUnmount(e,{value:t}){nn(e,t)}};function nn(e,t){e.style.display=t?e._vod:"none"}const Ca=Pe({patchProp:_a},ta);let Vs,pi=!1;function Sa(){return Vs=pi?Vs:Ec(Ca),pi=!0,Vs}const Ta=(...e)=>{const t=Sa().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Va(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function Va(e){return ye(e)?document.querySelector(e):e}const Ea=z({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>(d(),m("span",{class:de(["VPBadge",e.type??"tip"])},[S(t.$slots,"default",{},()=>[Ce(ce(e.text),1)],!0)],2))}});const F=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Ma=F(Ea,[["__scopeId","data-v-e233384c"]]),La=JSON.parse(`{"lang":"en-US","title":"EyeTrackVR Docs","description":"Official documentation for EyeTrackVR. Fully opensource and affordable VR eye tracking platform.","base":"/","head":[],"appearance":true,"themeConfig":{"logo":{"light":"/logo_light.png","dark":"/logo.svg","alt":"EyeTrackVR Logo"},"siteTitle":"EyeTrackVR Docs","footer":{"message":"Released under the MIT License.","copyright":"Copyright © 2022-present ETVR"},"nav":[{"text":"About","items":[{"text":"About Us","link":"/about"},{"text":"Development Road Map","link":"/dev_roadmap"}]},{"text":"Contact","link":"/contact"}],"sidebar":[{"text":"Getting Started","collapsible":true,"items":[{"text":"Introduction","link":"/getting_started/intro"},{"text":"Things to know before you start","link":"/getting_started/things_to_know"}]},{"text":"How to Build","collapsible":true,"items":[{"text":"Full Build Guide","link":"/how_to_build/full_build"},{"text":"Part List","link":"/how_to_build/parts_list"},{"text":"How to Create your own Camera Mount","link":"/how_to_build/creating_your_own_mount"}]},{"text":"Firmware Guide","collapsible":true,"items":[{"text":"Introduction","link":"/firmware_guide/firmware"},{"text":"Setup Visual Studio Code environment","link":"/firmware_guide/setup_vscode"},{"text":"Configuring Firmware","link":"/firmware_guide/configure_firmware"},{"text":"Firmware Environments","link":"/firmware_guide/environments"},{"text":"Upload Firmare","link":"/firmware_guide/upload_firmware"},{"text":"MDNS","link":"/firmware_guide/mdns"},{"text":"REST API","link":"/firmware_guide/rest_api"}]},{"text":"Software Guide","collapsible":true,"items":[{"text":"Installing and setting up the ETVR App","link":"/software_guide/eyetrackvr_app_guide"},{"text":"Building the app from source","link":"/software_guide/build_software"}]},{"text":"Miscellaneous","collapsible":true,"items":[{"text":"VR Chat Avatar Setup","link":"/misc/vrc_avatar_setup"},{"text":"FAQ","link":"/misc/faq"}]},{"text":"Development","collapsible":true,"items":[{"text":"Docs","link":"/development/docs/dev_docs"},{"text":"Edit Docs","link":"/development/docs/pages"},{"text":"Standards","link":"/development/docs/standards"}]},{"text":"Archive","collapsible":true,"items":[{"text":"Prepare to solder IR LED PCB V2's","link":"/archive/fox_ir_v2_build_instructions"}]}],"socialLinks":[{"icon":"github","link":"https://github.com/RedHawk989/EyeTrackVR"},{"icon":"discord","link":"https://discord.gg/kkXYbVykZX"}]},"locales":{},"langs":{},"scrollOffset":90,"cleanUrls":"with-subfolders"}`),ms=/^[a-z]+:/i,Aa=/^pathname:\/\//,mi="vitepress-theme-appearance",Se=typeof window<"u",Lr={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function Ia(e,t){t.sort((n,s)=>{const o=s.split("/").length-n.split("/").length;return o!==0?o:s.length-n.length});for(const n of t)if(e.startsWith(n))return n}function gi(e,t){const n=Ia(t,Object.keys(e));return n?e[n]:void 0}function Na(e){const{locales:t}=e.themeConfig||{},n=e.locales;return t&&n?Object.keys(t).reduce((s,o)=>(s[o]={label:t[o].label,lang:n[o].lang},s),{}):{}}function Oa(e,t){t=Fa(e,t);const n=gi(e.locales||{},t),s=gi(e.themeConfig.locales||{},t);return Object.assign({},e,n,{themeConfig:Object.assign({},e.themeConfig,s,{locales:{}}),lang:(n||e).lang,locales:{},langs:Na(e)})}function Ar(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Ba(e.title,s);return`${n}${o}`}function Ba(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Fa(e,t){if(!Se)return t;const n=e.base,s=n.endsWith("/")?n.slice(0,-1):n;return t.slice(s.length)}function Ha(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([i,r])=>i===n&&r[o[0]]===o[1])}function Da(e,t){return[...e.filter(n=>!Ha(t,n)),...t]}const Ra=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,za=/^[a-z]:/i;function vi(e){const t=za.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ra,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function Ua(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function xn(e){return ms.test(e)?e:Ua(Gt.value.base,e)}function Ir(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Se){const n="/";t=vi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];!s&&t.endsWith("_index.md")&&(t=t.slice(0,-9)+".md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${vi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Nr=Symbol(),Gt=Rl(La);function ja(e){const t=se(()=>Oa(Gt.value,e.path));return{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),lang:se(()=>t.value.lang),localePath:se(()=>{const{langs:n,lang:s}=t.value,o=Object.keys(n).find(i=>n[i].lang===s);return xn(o||"/")}),title:se(()=>Ar(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:le(!1)}}function ue(){const e=Be(Nr);if(!e)throw new Error("vitepress data not properly injected in app");return e}const Or=Symbol(),bi="http://a.com",qa=()=>({path:"/",component:null,data:Lr});function Ka(e,t){const n=rs(qa()),s={route:n,go:o};async function o(l=Se?location.href:"/"){var a,f;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,bi);Gt.value.cleanUrls==="disabled"&&!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Se&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await r(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let i=null;async function r(l,c=0,a=!1){const f=new URL(l,bi),_=i=f.pathname;try{let p=await e(_);if(i===_){i=null;const{default:v,__pageData:T}=p;if(!v)throw new Error(`Invalid route component: ${v}`);n.path=Se?_:xn(_),n.component=ln(v),n.data=ln(T),Se&&fo(()=>{if(f.hash&&!c){let A=null;try{A=document.querySelector(decodeURIComponent(f.hash))}catch(W){console.warn(W)}if(A){yi(A,f.hash);return}}window.scrollTo(0,c)})}}catch(p){if(!/fetch/.test(p.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(p),!a)try{const v=await fetch(Gt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await v.json(),await r(l,c,!0);return}catch{}i===_&&(i=null,n.path=Se?_:xn(_),n.component=t?ln(t):null,n.data=Lr)}}return Se&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&!a.download){const{href:f,origin:_,pathname:p,hash:v,search:T,target:A}=a,W=window.location,y=p.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&A!=="_blank"&&_===W.origin&&!(y&&y[0]!==".html")&&(l.preventDefault(),p===W.pathname&&T===W.search?v&&v!==W.hash&&(history.pushState(null,"",v),window.dispatchEvent(new Event("hashchange")),yi(a,v,a.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{r(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Wa(){const e=Be(Or);if(!e)throw new Error("useRouter() is called without provider.");return e}function yt(){return Wa().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=Gt.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const i=parseInt(window.getComputedStyle(s).paddingTop,10),r=window.scrollY+s.getBoundingClientRect().top-o+i;!n||Math.abs(r-window.scrollY)>window.innerHeight?window.scrollTo(0,r):window.scrollTo({left:0,top:r,behavior:"smooth"})}}const Ga=z({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=yt();return _o(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Gn("div",{style:{position:"relative"}},[t.component?Gn(t.component):null])}});var xi;const $n=typeof window<"u";$n&&((xi=window==null?void 0:window.navigator)!=null&&xi.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Ya(e){return e}function Qa(e){return hl()?(_l(e),!0):!1}function Xa(e){return typeof e=="function"?se(e):le(e)}function Ja(e,t=!0){xo()?Qe(e):t?e():fo(e)}const Za=$n?window:void 0;$n&&window.document;$n&&window.navigator;$n&&window.location;function eu(e,t=!1){const n=le(),s=()=>n.value=Boolean(e());return s(),Ja(s,t),n}function Ws(e,t={}){const{window:n=Za}=t,s=eu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const i=le(!1),r=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l))},l=()=>{s.value&&(r(),o=n.matchMedia(Xa(e).value),i.value=o.matches,"addEventListener"in o?o.addEventListener("change",l):o.addListener(l))};return gt(l),Qa(()=>r()),i}const Gs=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ys="__vueuse_ssr_handlers__";Gs[Ys]=Gs[Ys]||{};Gs[Ys];var wi;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(wi||(wi={}));var tu=Object.defineProperty,$i=Object.getOwnPropertySymbols,nu=Object.prototype.hasOwnProperty,su=Object.prototype.propertyIsEnumerable,ki=(e,t,n)=>t in e?tu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ou=(e,t)=>{for(var n in t||(t={}))nu.call(t,n)&&ki(e,n,t[n]);if($i)for(var n of $i(t))su.call(t,n)&&ki(e,n,t[n]);return e};const iu={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};ou({linear:Ya},iu);const Br=/#.*$/,ru=/(index)?\.(md|html)$/,lu=typeof window<"u",cu=le(lu?location.hash:"");function au(e){return ms.test(e)}function uu(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Zt(e,t,n=!1){if(t===void 0)return!1;if(e=Ci(`/${e}`),n)return new RegExp(t).test(e);if(Ci(t)!==e)return!1;const s=t.match(Br);return s?cu.value===s[0]:!0}function Pi(e){return/^\//.test(e)?e:`/${e}`}function Ci(e){return decodeURI(e).replace(Br,"").replace(ru,"")}function Yn(e){if(au(e))return e.replace(Aa,"");const{site:t}=ue(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),i=n.endsWith("/")||n.endsWith(".html")?e:`${n.replace(/(\.md)?$/,t.value.cleanUrls==="disabled"?".html":"")}${s}${o}`;return xn(i)}function Fr(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=Pi(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(Pi(s)));return n?e[n]:[]}function fu(e){const t=[];function n(s){for(const o of s)o.link&&t.push({...o,link:o.link}),"items"in o&&n(o.items)}for(const s of e)n(s.items);return t}function Xe(){const e=yt(),{theme:t,frontmatter:n}=ue(),s=Ws("(min-width: 960px)"),o=le(!1),i=se(()=>{const p=t.value.sidebar,v=e.data.relativePath;return p?Fr(p,v):[]}),r=se(()=>n.value.sidebar!==!1&&i.value.length>0&&n.value.layout!=="home"),l=se(()=>n.value.layout!=="home"&&n.value.aside!==!1),c=se(()=>r.value&&s.value);function a(){o.value=!0}function f(){o.value=!1}function _(){o.value?f():a()}return{isOpen:o,sidebar:i,hasSidebar:r,hasAside:l,isSidebarEnabled:c,open:a,close:f,toggle:_}}function du(e,t){let n;gt(()=>{n=e.value?document.activeElement:void 0}),Qe(()=>{window.addEventListener("keyup",s)}),Jt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}const hu=z({__name:"VPSkipLink",setup(e){const t=yt(),n=le();nt(()=>t.path,()=>n.value.focus());function s({target:o}){const i=document.querySelector(o.hash);if(i){const r=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",r)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",r),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(d(),m(te,null,[g("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),g("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const _u=F(hu,[["__scopeId","data-v-8ab7c6af"]]),pu={key:0,class:"VPBackdrop"},mu=z({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(d(),J(ps,{name:"fade"},{default:N(()=>[e.show?(d(),m("div",pu)):H("",!0)]),_:1}))}});const gu=F(mu,[["__scopeId","data-v-ba02b58d"]]);function vu(){const e=le(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const i=yt();return nt(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const bu=["src","alt"],yu={inheritAttrs:!1},xu=z({...yu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{const s=bt("VPImage",!0);return e.image?(d(),m(te,{key:0},[typeof e.image=="string"||"src"in e.image?(d(),m("img",Hn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:b(xn)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bu)):(d(),m(te,{key:1},[L(s,Hn({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),L(s,Hn({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):H("",!0)}}});const wo=F(xu,[["__scopeId","data-v-74766fef"]]),wu=["href"],$u=z({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=ue(),{hasSidebar:s}=Xe();return(o,i)=>(d(),m("div",{class:de(["VPNavBarTitle",{"has-sidebar":b(s)}])},[g("a",{class:"title",href:b(t).base},[S(o.$slots,"nav-bar-title-before",{},void 0,!0),L(wo,{class:"logo",image:b(n).logo},null,8,["image"]),b(n).siteTitle?(d(),m(te,{key:0},[Ce(ce(b(n).siteTitle),1)],64)):b(n).siteTitle===void 0?(d(),m(te,{key:1},[Ce(ce(b(t).title),1)],64)):H("",!0),S(o.$slots,"nav-bar-title-after",{},void 0,!0)],8,wu)],2))}});const ku=F($u,[["__scopeId","data-v-092de34b"]]),Pu="modulepreload",Cu=function(e){return"/"+e},Si={},Hr=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Cu(i),i in Si)return;Si[i]=!0;const r=i.endsWith(".css"),l=r?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const _=o[f];if(_.href===i&&(!r||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=r?"stylesheet":Pu,r||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),r)return new Promise((f,_)=>{a.addEventListener("load",f),a.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())},Su="/assets/flex-logo.2489261b.svg";function Es(e,t){return typeof e>"u"?t:e}function Ti(e){const t=Array(e);for(let n=0;n=this.minlength&&(l||!r[f])){let p=Nn(c,o,a),v="";switch(this.tokenize){case"full":if(3<_){for(let T=0;T<_;T++)for(let A=_;A>T;A--)if(A-T>=this.minlength){const W=Nn(c,o,a,_,T);v=f.substring(T,A),this.push_index(r,v,W,e,n)}break}case"reverse":if(2<_){for(let T=_-1;0=this.minlength){const A=Nn(c,o,a,_,T);this.push_index(r,v,A,e,n)}v=""}case"forward":if(1<_){for(let T=0;T<_;T++)v+=f[T],v.length>=this.minlength&&this.push_index(r,v,p,e,n);break}default:if(this.boost&&(p=Math.min(0|p/this.boost(t,f,a),c-1)),this.push_index(r,f,p,e,n),l&&1=this.minlength&&!T[f]){T[f]=1;const C=Nn(A+(o/2>A?0:1),o,a,y-1,w-1),O=this.bidirectional&&f>W;this.push_index(i,O?W:f,C,e,n,O?f:W)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function Nn(e,t,n,s,o){return n&&1=this.minlength&&!_[v]){if(!this.optimize&&!i&&!this.map[v])return r;p[A++]=v,_[v]=1}e=p,s=e.length}if(!s)return r;t||(t=100);let c,a=this.depth&&1=n)))));v++);if(a)return o?Mi(l,n,0):void(e[e.length]=l)}return!t&&l};function Mi(e,t,n){return e=e.length===1?e[0]:Vu(e),n||e.length>t?e.slice(n,n+t):e}function Li(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}Me.prototype.contain=function(e){return!!this.register[e]},Me.prototype.update=function(e,t){return this.remove(e).add(e,t)},Me.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(o.value){for(var y=f.value.search(o.value,{enrich:!0}),w=[],C=0;C!y||!y.length?[]:y.reduce((C,O)=>(C[w(O)]||(C[w(O)]=[]),C[w(O)].push(O),C),{}),A=()=>{setTimeout(()=>{r.value&&r.value.focus()},100),W(),s.value=!0};Qe(async()=>{var O,U;const y=await Hr(()=>import("./chunks/virtual_search-data.4fd145b6.js"),[]);l.value=y.default.INDEX_DATA,c.value=y.default.PREVIEW_LOOKUP,a.value=y.default.Options,i.value=window.location.origin+t.value,_.value=((O=a.value)==null?void 0:O.buttonLabel)||_.value,p.value=((U=a.value)==null?void 0:U.placeholder)||p.value;var w=new Me(a.value);w.import("reg",l.value.reg),w.import("cfg",l.value.cfg),w.import("map",l.value.map),w.import("ctx",l.value.ctx),f.value=w,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const C=G=>{G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),A())};window.addEventListener("keydown",C)});function W(){s.value=!1,o.value=""}return(y,w)=>{const C=bt("ClientOnly");return d(),m("div",Yu,[L(C,null,{default:N(()=>[(d(),J(Oc,{to:"body"},[jo(g("div",{class:"modal-back",onClick:w[2]||(w[2]=O=>s.value=!1)},[g("div",{class:"modal",onClick:w[1]||(w[1]=Mr(()=>{},["stop"]))},[g("form",Qu,[Xu,jo(g("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":w[0]||(w[0]=O=>o.value=O),placeholder:p.value,maxlength:"64",type:"search",ref_key:"input",ref:r},null,8,Ju),[[wa,o.value]])]),g("div",Zu,[(d(!0),m(te,null,we(T(b(v),O=>O.link.split("/").slice(0,-1).join("-")),(O,U)=>(d(),m("div",{key:U},[g("span",ef,ce(U?U.toString()[0].toUpperCase()+U.toString().slice(1):"Home"),1),(d(!0),m(te,null,we(O,G=>(d(),m("a",{href:i.value+G.link,key:G.id,onClick:W},[g("div",nf,[g("span",sf,ce(G.link.includes("#")?"#":"▤"),1),g("div",of,[g("h3",null,ce(G.title),1),g("p",null,[g("div",{innerHTML:G.preview},null,8,rf)])]),lf])],8,tf))),128))]))),128))]),cf])],512),[[Pa,s.value]])]))]),_:1}),g("div",{id:"docsearch",onClick:w[3]||(w[3]=O=>A())},[g("button",af,[g("span",uf,[ff,g("span",df,ce(_.value),1)]),g("span",hf,[g("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),_f])])])])}}});const mf={},gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},vf=g("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),bf=g("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),yf=[vf,bf];function xf(e,t){return d(),m("svg",gf,yf)}const wf=F(mf,[["render",xf]]),$f=z({__name:"VPLink",props:{href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=se(()=>t.href&&ms.test(t.href));return(s,o)=>(d(),J(mo(e.href?"a":"span"),{class:de(["VPLink",{link:e.href}]),href:e.href?b(Yn)(e.href):void 0,target:b(n)?"_blank":void 0,rel:b(n)?"noreferrer":void 0},{default:N(()=>[S(s.$slots,"default",{},void 0,!0),b(n)&&!e.noIcon?(d(),J(wf,{key:0,class:"icon"})):H("",!0)]),_:3},8,["class","href","target","rel"]))}});const lt=F($f,[["__scopeId","data-v-cd683231"]]),kf=z({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),J(lt,{class:de({VPNavBarMenuLink:!0,active:b(Zt)(b(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:N(()=>[Ce(ce(e.item.text),1)]),_:1},8,["class","href"]))}});const Pf=F(kf,[["__scopeId","data-v-45557806"]]),$o=le();let Dr=!1,Ls=0;function Cf(e){const t=le(!1);if(typeof window<"u"){!Dr&&Sf(),Ls++;const n=nt($o,s=>{var o,i,r;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(r=e.onBlur)==null||r.call(e))});Jt(()=>{n(),Ls--,Ls||Tf()})}return lo(t)}function Sf(){document.addEventListener("focusin",Rr),Dr=!0,$o.value=document.activeElement}function Tf(){document.removeEventListener("focusin",Rr)}function Rr(){$o.value=document.activeElement}const Vf={},Ef={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mf=g("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lf=[Mf];function Af(e,t){return d(),m("svg",Ef,Lf)}const zr=F(Vf,[["render",Af]]),If={},Nf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Of=g("circle",{cx:"12",cy:"12",r:"2"},null,-1),Bf=g("circle",{cx:"19",cy:"12",r:"2"},null,-1),Ff=g("circle",{cx:"5",cy:"12",r:"2"},null,-1),Hf=[Of,Bf,Ff];function Df(e,t){return d(),m("svg",Nf,Hf)}const Rf=F(If,[["render",Df]]),zf={class:"VPMenuLink"},Uf=z({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),m("div",zf,[L(lt,{class:de({active:b(Zt)(b(t).relativePath,e.item.activeMatch||e.item.link)}),href:e.item.link},{default:N(()=>[Ce(ce(e.item.text),1)]),_:1},8,["class","href"])]))}});const gs=F(Uf,[["__scopeId","data-v-48adf3ca"]]),jf={class:"VPMenuGroup"},qf={key:0,class:"title"},Kf=z({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(d(),m("div",jf,[e.text?(d(),m("p",qf,ce(e.text),1)):H("",!0),(d(!0),m(te,null,we(e.items,s=>(d(),m(te,null,["link"in s?(d(),J(gs,{key:0,item:s},null,8,["item"])):H("",!0)],64))),256))]))}});const Wf=F(Kf,[["__scopeId","data-v-0c1ed08e"]]),Gf={class:"VPMenu"},Yf={key:0,class:"items"},Qf=z({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(d(),m("div",Gf,[e.items?(d(),m("div",Yf,[(d(!0),m(te,null,we(e.items,s=>(d(),m(te,{key:s.text},["link"in s?(d(),J(gs,{key:0,item:s},null,8,["item"])):(d(),J(Wf,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):H("",!0),S(t.$slots,"default",{},void 0,!0)]))}});const Xf=F(Qf,[["__scopeId","data-v-1e25c4ce"]]),Jf=["aria-expanded","aria-label"],Zf={key:0,class:"text"},ed={class:"menu"},td=z({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=le(!1),n=le();Cf({el:n,onBlur:s});function s(){t.value=!1}return(o,i)=>(d(),m("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=r=>t.value=!0),onMouseleave:i[2]||(i[2]=r=>t.value=!1)},[g("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=r=>t.value=!t.value)},[e.button||e.icon?(d(),m("span",Zf,[e.icon?(d(),J(mo(e.icon),{key:0,class:"option-icon"})):H("",!0),Ce(" "+ce(e.button)+" ",1),L(zr,{class:"text-icon"})])):(d(),J(Rf,{key:1,class:"icon"}))],8,Jf),g("div",ed,[L(Xf,{items:e.items},{default:N(()=>[S(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ko=F(td,[["__scopeId","data-v-01da497a"]]),nd=z({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),J(ko,{class:de({VPNavBarMenuGroup:!0,active:b(Zt)(b(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),sd=e=>(Ue("data-v-408d05b6"),e=e(),je(),e),od={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},id=sd(()=>g("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),rd=z({__name:"VPNavBarMenu",setup(e){const{theme:t}=ue();return(n,s)=>b(t).nav?(d(),m("nav",od,[id,(d(!0),m(te,null,we(b(t).nav,o=>(d(),m(te,{key:o.text},["link"in o?(d(),J(Pf,{key:0,item:o},null,8,["item"])):(d(),J(nd,{key:1,item:o},null,8,["item"]))],64))),128))])):H("",!0)}});const ld=F(rd,[["__scopeId","data-v-408d05b6"]]),cd={},ad={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ud=g("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),fd=g("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),dd=[ud,fd];function hd(e,t){return d(),m("svg",ad,dd)}const Ur=F(cd,[["render",hd]]),_d={class:"items"},pd={class:"title"},md=z({__name:"VPNavBarTranslations",setup(e){const{theme:t}=ue();return(n,s)=>b(t).localeLinks?(d(),J(ko,{key:0,class:"VPNavBarTranslations",icon:Ur},{default:N(()=>[g("div",_d,[g("p",pd,ce(b(t).localeLinks.text),1),(d(!0),m(te,null,we(b(t).localeLinks.items,o=>(d(),J(gs,{key:o.link,item:o},null,8,["item"]))),128))])]),_:1})):H("",!0)}});const gd=F(md,[["__scopeId","data-v-c019b0a8"]]);const vd={},bd={class:"VPSwitch",type:"button",role:"switch"},yd={class:"check"},xd={key:0,class:"icon"};function wd(e,t){return d(),m("button",bd,[g("span",yd,[e.$slots.default?(d(),m("span",xd,[S(e.$slots,"default",{},void 0,!0)])):H("",!0)])])}const $d=F(vd,[["render",wd],["__scopeId","data-v-8be94668"]]),kd={},Pd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Cd=Dc('',9),Sd=[Cd];function Td(e,t){return d(),m("svg",Pd,Sd)}const Vd=F(kd,[["render",Td]]),Ed={},Md={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ld=g("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Ad=[Ld];function Id(e,t){return d(),m("svg",Md,Ad)}const Nd=F(Ed,[["render",Id]]),Od=z({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=ue(),s=le(!1),o=typeof localStorage<"u"?i():()=>{};Qe(()=>{s.value=document.documentElement.classList.contains("dark")});function i(){const r=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let c=localStorage.getItem(mi),a=t.value.appearance==="dark"&&c==null||(c==="auto"||c==null?r.matches:c==="dark");r.onchange=p=>{c==="auto"&&_(a=p.matches)};function f(){_(a=!a),c=a?r.matches?"auto":"dark":r.matches?"light":"auto",localStorage.setItem(mi,c)}function _(p){const v=document.createElement("style");v.type="text/css",v.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { +function Xs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function ts(e){if(Q(e)){const t={};for(let n=0;n{if(n){const s=n.split(Zr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function de(e){let t="";if(ye(e))t=e;else if(Q(e))for(let n=0;nye(e)?e:e==null?"":Q(e)||ve(e)&&(e.toString===Hi||!ne(e.toString))?JSON.stringify(e,Ni,2):String(e),Ni=(e,t)=>t&&t.__v_isRef?Ni(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Bi(t)?{[`Set(${t.size})`]:[...t.values()]}:ve(t)&&!Q(t)&&!Di(t)?String(t):t,ge={},Bt=[],Ye=()=>{},ol=()=>!1,il=/^on[^a-z]/,wn=e=>il.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Zs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},rl=Object.prototype.hasOwnProperty,ae=(e,t)=>rl.call(e,t),Q=Array.isArray,Ft=e=>ns(e)==="[object Map]",Bi=e=>ns(e)==="[object Set]",ne=e=>typeof e=="function",ye=e=>typeof e=="string",eo=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",Fi=e=>ve(e)&&ne(e.then)&&ne(e.catch),Hi=Object.prototype.toString,ns=e=>Hi.call(e),ll=e=>ns(e).slice(8,-1),Di=e=>ns(e)==="[object Object]",to=e=>ye(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,rn=Xs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ss=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},cl=/-(\w)/g,st=ss(e=>e.replace(cl,(t,n)=>n?n.toUpperCase():"")),al=/\B([A-Z])/g,Yt=ss(e=>e.replace(al,"-$1").toLowerCase()),os=ss(e=>e.charAt(0).toUpperCase()+e.slice(1)),ws=ss(e=>e?`on${os(e)}`:""),_n=(e,t)=>!Object.is(e,t),Bn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},pn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ao;const ul=()=>Ao||(Ao=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Ne;class fl{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Ne,!t&&Ne&&(this.index=(Ne.scopes||(Ne.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Ne;try{return Ne=this,t()}finally{Ne=n}}}on(){Ne=this}off(){Ne=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Ri=e=>(e.w&mt)>0,zi=e=>(e.n&mt)>0,pl=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(r.get(n)),t){case"add":Q(e)?to(n)&&l.push(r.get("length")):(l.push(r.get(Lt)),Ft(e)&&l.push(r.get(Ns)));break;case"delete":Q(e)||(l.push(r.get(Lt)),Ft(e)&&l.push(r.get(Ns)));break;case"set":Ft(e)&&l.push(r.get(Lt));break}if(l.length===1)l[0]&&Bs(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Bs(no(c))}}function Bs(e,t){const n=Q(e)?e:[...e];for(const s of n)s.computed&&Oo(s);for(const s of n)s.computed||Oo(s)}function Oo(e,t){(e!==We||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const gl=Xs("__proto__,__v_isRef,__isVue"),qi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(eo)),vl=oo(),bl=oo(!1,!0),yl=oo(!0),No=xl();function xl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let i=0,r=this.length;i{e[t]=function(...n){Qt();const s=fe(this)[t].apply(this,n);return Xt(),s}}),e}function oo(e=!1,t=!1){return function(s,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?Bl:Qi:t?Yi:Gi).get(s))return s;const r=Q(s);if(!e&&r&&ae(No,o))return Reflect.get(No,o,i);const l=Reflect.get(s,o,i);return(eo(o)?qi.has(o):gl(o))||(e||He(s,"get",o),t)?l:Ve(l)?r&&to(o)?l:l.value:ve(l)?e?lo(l):rs(l):l}}const wl=Ki(),$l=Ki(!0);function Ki(e=!1){return function(n,s,o,i){let r=n[s];if(qt(r)&&Ve(r)&&!Ve(o))return!1;if(!e&&(!zn(o)&&!qt(o)&&(r=fe(r),o=fe(o)),!Q(n)&&Ve(r)&&!Ve(o)))return r.value=o,!0;const l=Q(n)&&to(s)?Number(s)e,is=e=>Reflect.getPrototypeOf(e);function Cn(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),i=fe(t);n||(t!==i&&He(o,"get",t),He(o,"get",i));const{has:r}=is(o),l=s?io:n?ao:mn;if(r.call(o,t))return l(e.get(t));if(r.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function Sn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&He(s,"has",e),He(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Tn(e,t=!1){return e=e.__v_raw,!t&&He(fe(e),"iterate",Lt),Reflect.get(e,"size",e)}function Bo(e){e=fe(e);const t=fe(this);return is(t).has.call(t,e)||(t.add(e),rt(t,"add",e,e)),this}function Fo(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=is(n);let i=s.call(n,e);i||(e=fe(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?_n(t,r)&&rt(n,"set",e,t):rt(n,"add",e,t),this}function Ho(e){const t=fe(this),{has:n,get:s}=is(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&rt(t,"delete",e,void 0),i}function Do(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&rt(e,"clear",void 0,void 0),n}function Vn(e,t){return function(s,o){const i=this,r=i.__v_raw,l=fe(r),c=t?io:e?ao:mn;return!e&&He(l,"iterate",Lt),r.forEach((a,f)=>s.call(o,c(a),c(f),i))}}function En(e,t,n){return function(...s){const o=this.__v_raw,i=fe(o),r=Ft(i),l=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,a=o[e](...s),f=n?io:t?ao:mn;return!t&&He(i,"iterate",c?Ns:Lt),{next(){const{value:_,done:p}=a.next();return p?{value:_,done:p}:{value:l?[f(_[0]),f(_[1])]:f(_),done:p}},[Symbol.iterator](){return this}}}}function at(e){return function(...t){return e==="delete"?!1:this}}function Vl(){const e={get(i){return Cn(this,i)},get size(){return Tn(this)},has:Sn,add:Bo,set:Fo,delete:Ho,clear:Do,forEach:Vn(!1,!1)},t={get(i){return Cn(this,i,!1,!0)},get size(){return Tn(this)},has:Sn,add:Bo,set:Fo,delete:Ho,clear:Do,forEach:Vn(!1,!0)},n={get(i){return Cn(this,i,!0)},get size(){return Tn(this,!0)},has(i){return Sn.call(this,i,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:Vn(!0,!1)},s={get(i){return Cn(this,i,!0,!0)},get size(){return Tn(this,!0)},has(i){return Sn.call(this,i,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=En(i,!1,!1),n[i]=En(i,!0,!1),t[i]=En(i,!1,!0),s[i]=En(i,!0,!0)}),[e,n,t,s]}const[El,Ml,Ll,Al]=Vl();function ro(e,t){const n=t?e?Al:Ll:e?Ml:El;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ae(n,o)&&o in s?n:s,o,i)}const Il={get:ro(!1,!1)},Ol={get:ro(!1,!0)},Nl={get:ro(!0,!1)},Gi=new WeakMap,Yi=new WeakMap,Qi=new WeakMap,Bl=new WeakMap;function Fl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Hl(e){return e.__v_skip||!Object.isExtensible(e)?0:Fl(ll(e))}function rs(e){return qt(e)?e:co(e,!1,Wi,Il,Gi)}function Dl(e){return co(e,!1,Tl,Ol,Yi)}function lo(e){return co(e,!0,Sl,Nl,Qi)}function co(e,t,n,s,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Hl(e);if(r===0)return e;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function Ht(e){return qt(e)?Ht(e.__v_raw):!!(e&&e.__v_isReactive)}function qt(e){return!!(e&&e.__v_isReadonly)}function zn(e){return!!(e&&e.__v_isShallow)}function Xi(e){return Ht(e)||qt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function ln(e){return Rn(e,"__v_skip",!0),e}const mn=e=>ve(e)?rs(e):e,ao=e=>ve(e)?lo(e):e;function Ji(e){_t&&We&&(e=fe(e),ji(e.dep||(e.dep=no())))}function Zi(e,t){e=fe(e),e.dep&&Bs(e.dep)}function Ve(e){return!!(e&&e.__v_isRef===!0)}function le(e){return er(e,!1)}function Rl(e){return er(e,!0)}function er(e,t){return Ve(e)?e:new zl(e,t)}class zl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:mn(t)}get value(){return Ji(this),this._value}set value(t){const n=this.__v_isShallow||zn(t)||qt(t);t=n?t:fe(t),_n(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:mn(t),Zi(this))}}function b(e){return Ve(e)?e.value:e}const Ul={get:(e,t,n)=>b(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Ve(o)&&!Ve(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function tr(e){return Ht(e)?e:new Proxy(e,Ul)}var nr;class jl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[nr]=!1,this._dirty=!0,this.effect=new so(t,()=>{this._dirty||(this._dirty=!0,Zi(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Ji(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}nr="__v_isReadonly";function ql(e,t,n=!1){let s,o;const i=ne(e);return i?(s=e,o=Ye):(s=e.get,o=e.set),new jl(s,o,i||!o,n)}function pt(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){ls(i,t,n)}return o}function ze(e,t,n,s){if(ne(e)){const i=pt(e,t,n,s);return i&&Fi(i)&&i.catch(r=>{ls(r,t,n)}),i}const o=[];for(let i=0;i>>1;vn(Te[s])tt&&Te.splice(t,1)}function Yl(e){Q(e)?Dt.push(...e):(!it||!it.includes(e,e.allowRecurse?St+1:St))&&Dt.push(e),or()}function Ro(e,t=gn?tt+1:0){for(;tvn(n)-vn(s)),St=0;Ste.id==null?1/0:e.id,Ql=(e,t)=>{const n=vn(e)-vn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ir(e){Fs=!1,gn=!0,Te.sort(Ql);const t=Ye;try{for(tt=0;ttye(v)?v.trim():v)),_&&(o=n.map(pn))}let l,c=s[l=ws(t)]||s[l=ws(st(t))];!c&&i&&(c=s[l=ws(Yt(t))]),c&&ze(c,e,6,o);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,ze(a,e,6,o)}}function rr(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},l=!1;if(!ne(e)){const c=a=>{const f=rr(a,t,!0);f&&(l=!0,Pe(r,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ve(e)&&s.set(e,null),null):(Q(i)?i.forEach(c=>r[c]=null):Pe(r,i),ve(e)&&s.set(e,r),r)}function cs(e,t){return!e||!wn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ae(e,t[0].toLowerCase()+t.slice(1))||ae(e,Yt(t))||ae(e,t))}let ke=null,as=null;function jn(e){const t=ke;return ke=e,as=e&&e.type.__scopeId||null,t}function Ue(e){as=e}function je(){as=null}function O(e,t=ke,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Zo(-1);const i=jn(t);let r;try{r=e(...o)}finally{jn(i),s._d&&Zo(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function $s(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:l,attrs:c,emit:a,render:f,renderCache:_,data:p,setupState:v,ctx:T,inheritAttrs:A}=e;let W,y;const w=jn(e);try{if(n.shapeFlag&4){const N=o||s;W=Ke(f.call(N,N,_,i,v,p,T)),y=c}else{const N=t;W=Ke(N.length>1?N(i,{attrs:c,slots:l,emit:a}):N(i,null)),y=t.props?c:Jl(c)}}catch(N){fn.length=0,ls(N,e,1),W=L(Fe)}let C=W;if(y&&A!==!1){const N=Object.keys(y),{shapeFlag:U}=C;N.length&&U&7&&(r&&N.some(Js)&&(y=Zl(y,r)),C=vt(C,y))}return n.dirs&&(C=vt(C),C.dirs=C.dirs?C.dirs.concat(n.dirs):n.dirs),n.transition&&(C.transition=n.transition),W=C,jn(w),W}const Jl=e=>{let t;for(const n in e)(n==="class"||n==="style"||wn(n))&&((t||(t={}))[n]=e[n]);return t},Zl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function ec(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?zo(s,r,a):!!r;if(c&8){const f=t.dynamicProps;for(let _=0;_e.__isSuspense;function lr(e,t){t&&t.pendingBranch?Q(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}function Rt(e,t){if($e){let n=$e.provides;const s=$e.parent&&$e.parent.provides;s===n&&(n=$e.provides=Object.create(s)),n[e]=t}}function Be(e,t,n=!1){const s=$e||ke;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&ne(t)?t.call(s.proxy):t}}function gt(e,t){return us(e,null,t)}function sc(e,t){return us(e,null,{flush:"post"})}const Mn={};function nt(e,t,n){return us(e,t,n)}function us(e,t,{immediate:n,deep:s,flush:o,onTrack:i,onTrigger:r}=ge){const l=$e;let c,a=!1,f=!1;if(Ve(e)?(c=()=>e.value,a=zn(e)):Ht(e)?(c=()=>e,s=!0):Q(e)?(f=!0,a=e.some(C=>Ht(C)||zn(C)),c=()=>e.map(C=>{if(Ve(C))return C.value;if(Ht(C))return Mt(C);if(ne(C))return pt(C,l,2)})):ne(e)?t?c=()=>pt(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return _&&_(),ze(e,l,3,[p])}:c=Ye,t&&s){const C=c;c=()=>Mt(C())}let _,p=C=>{_=y.onStop=()=>{pt(C,l,4)}},v;if(yn)if(p=Ye,t?n&&ze(t,l,3,[c(),f?[]:void 0,p]):c(),o==="sync"){const C=Jc();v=C.__watcherHandles||(C.__watcherHandles=[])}else return Ye;let T=f?new Array(e.length).fill(Mn):Mn;const A=()=>{if(y.active)if(t){const C=y.run();(s||a||(f?C.some((N,U)=>_n(N,T[U])):_n(C,T)))&&(_&&_(),ze(t,l,3,[C,T===Mn?void 0:f&&T[0]===Mn?[]:T,p]),T=C)}else y.run()};A.allowRecurse=!!t;let W;o==="sync"?W=A:o==="post"?W=()=>Le(A,l&&l.suspense):(A.pre=!0,l&&(A.id=l.uid),W=()=>ho(A));const y=new so(c,W);t?n?A():T=y.run():o==="post"?Le(y.run.bind(y),l&&l.suspense):y.run();const w=()=>{y.stop(),l&&l.scope&&Zs(l.scope.effects,y)};return v&&v.push(w),w}function oc(e,t,n){const s=this.proxy,o=ye(e)?e.includes(".")?cr(s,e):()=>s[e]:e.bind(s,s);let i;ne(t)?i=t:(i=t.handler,n=t);const r=$e;Wt(this);const l=us(o,i.bind(s),n);return r?Wt(r):At(),l}function cr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Mt(n,t)});else if(Di(e))for(const n in e)Mt(e[n],t);return e}function ic(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Qe(()=>{e.isMounted=!0}),hr(()=>{e.isUnmounting=!0}),e}const De=[Function,Array],rc={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:De,onEnter:De,onAfterEnter:De,onEnterCancelled:De,onBeforeLeave:De,onLeave:De,onAfterLeave:De,onLeaveCancelled:De,onBeforeAppear:De,onAppear:De,onAfterAppear:De,onAppearCancelled:De},setup(e,{slots:t}){const n=xo(),s=ic();let o;return()=>{const i=t.default&&fr(t.default(),!0);if(!i||!i.length)return;let r=i[0];if(i.length>1){for(const A of i)if(A.type!==Fe){r=A;break}}const l=fe(e),{mode:c}=l;if(s.isLeaving)return ks(r);const a=Uo(r);if(!a)return ks(r);const f=Hs(a,l,s,n);Ds(a,f);const _=n.subTree,p=_&&Uo(_);let v=!1;const{getTransitionKey:T}=a.type;if(T){const A=T();o===void 0?o=A:A!==o&&(o=A,v=!0)}if(p&&p.type!==Fe&&(!Tt(a,p)||v)){const A=Hs(p,l,s,n);if(Ds(p,A),c==="out-in")return s.isLeaving=!0,A.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ks(r);c==="in-out"&&a.type!==Fe&&(A.delayLeave=(W,y,w)=>{const C=ur(s,p);C[String(p.key)]=p,W._leaveCb=()=>{y(),W._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=w})}return r}}},ar=rc;function ur(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hs(e,t,n,s){const{appear:o,mode:i,persisted:r=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:_,onLeave:p,onAfterLeave:v,onLeaveCancelled:T,onBeforeAppear:A,onAppear:W,onAfterAppear:y,onAppearCancelled:w}=t,C=String(e.key),N=ur(n,e),U=(M,Y)=>{M&&ze(M,s,9,Y)},G=(M,Y)=>{const X=Y[1];U(M,Y),Q(M)?M.every(oe=>oe.length<=1)&&X():M.length<=1&&X()},Z={mode:i,persisted:r,beforeEnter(M){let Y=l;if(!n.isMounted)if(o)Y=A||l;else return;M._leaveCb&&M._leaveCb(!0);const X=N[C];X&&Tt(e,X)&&X.el._leaveCb&&X.el._leaveCb(),U(Y,[M])},enter(M){let Y=c,X=a,oe=f;if(!n.isMounted)if(o)Y=W||c,X=y||a,oe=w||f;else return;let D=!1;const ie=M._enterCb=j=>{D||(D=!0,j?U(oe,[M]):U(X,[M]),Z.delayedLeave&&Z.delayedLeave(),M._enterCb=void 0)};Y?G(Y,[M,ie]):ie()},leave(M,Y){const X=String(e.key);if(M._enterCb&&M._enterCb(!0),n.isUnmounting)return Y();U(_,[M]);let oe=!1;const D=M._leaveCb=ie=>{oe||(oe=!0,Y(),ie?U(T,[M]):U(v,[M]),M._leaveCb=void 0,N[X]===e&&delete N[X])};N[X]=e,p?G(p,[M,D]):D()},clone(M){return Hs(M,t,n,s)}};return Z}function ks(e){if(fs(e))return e=vt(e),e.children=null,e}function Uo(e){return fs(e)?e.children?e.children[0]:void 0:e}function Ds(e,t){e.shapeFlag&6&&e.component?Ds(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function fr(e,t=!1,n){let s=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,fs=e=>e.type.__isKeepAlive;function lc(e,t){dr(e,"a",t)}function cc(e,t){dr(e,"da",t)}function dr(e,t,n=$e){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)fs(o.parent.vnode)&&ac(s,t,n,o),o=o.parent}}function ac(e,t,n,s){const o=ds(t,e,s,!0);Jt(()=>{Zs(s[t],o)},n)}function ds(e,t,n=$e,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Qt(),Wt(n);const l=ze(t,n,e,r);return At(),Xt(),l});return s?o.unshift(i):o.push(i),i}}const ct=e=>(t,n=$e)=>(!yn||e==="sp")&&ds(e,(...s)=>t(...s),n),uc=ct("bm"),Qe=ct("m"),fc=ct("bu"),_o=ct("u"),hr=ct("bum"),Jt=ct("um"),dc=ct("sp"),hc=ct("rtg"),_c=ct("rtc");function pc(e,t=$e){ds("ec",e,t)}function jo(e,t){const n=ke;if(n===null)return e;const s=_s(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;it(r,l,void 0,i&&i[l]));else{const r=Object.keys(e);o=new Array(r.length);for(let l=0,c=r.length;lWn(t)?!(t.type===Fe||t.type===te&&!mr(t.children)):!0)?e:null}const Rs=e=>e?Sr(e)?_s(e)||e.proxy:Rs(e.parent):null,cn=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Rs(e.parent),$root:e=>Rs(e.root),$emit:e=>e.emit,$options:e=>go(e),$forceUpdate:e=>e.f||(e.f=()=>ho(e.update)),$nextTick:e=>e.n||(e.n=fo.bind(e.proxy)),$watch:e=>oc.bind(e)}),Ps=(e,t)=>e!==ge&&!e.__isScriptSetup&&ae(e,t),mc={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const v=r[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(Ps(s,t))return r[t]=1,s[t];if(o!==ge&&ae(o,t))return r[t]=2,o[t];if((a=e.propsOptions[0])&&ae(a,t))return r[t]=3,i[t];if(n!==ge&&ae(n,t))return r[t]=4,n[t];zs&&(r[t]=0)}}const f=cn[t];let _,p;if(f)return t==="$attrs"&&He(e,"get",t),f(e);if((_=l.__cssModules)&&(_=_[t]))return _;if(n!==ge&&ae(n,t))return r[t]=4,n[t];if(p=c.config.globalProperties,ae(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return Ps(o,t)?(o[t]=n,!0):s!==ge&&ae(s,t)?(s[t]=n,!0):ae(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let l;return!!n[r]||e!==ge&&ae(e,r)||Ps(t,r)||(l=i[0])&&ae(l,r)||ae(s,r)||ae(cn,r)||ae(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ae(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let zs=!0;function gc(e){const t=go(e),n=e.proxy,s=e.ctx;zs=!1,t.beforeCreate&&Ko(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:l,provide:c,inject:a,created:f,beforeMount:_,mounted:p,beforeUpdate:v,updated:T,activated:A,deactivated:W,beforeDestroy:y,beforeUnmount:w,destroyed:C,unmounted:N,render:U,renderTracked:G,renderTriggered:Z,errorCaptured:M,serverPrefetch:Y,expose:X,inheritAttrs:oe,components:D,directives:ie,filters:j}=t;if(a&&vc(a,s,null,e.appContext.config.unwrapInjectedRef),r)for(const be in r){const pe=r[be];ne(pe)&&(s[be]=pe.bind(n))}if(o){const be=o.call(n,n);ve(be)&&(e.data=rs(be))}if(zs=!0,i)for(const be in i){const pe=i[be],xt=ne(pe)?pe.bind(n,n):ne(pe.get)?pe.get.bind(n,n):Ye,kn=!ne(pe)&&ne(pe.set)?pe.set.bind(n):Ye,wt=se({get:xt,set:kn});Object.defineProperty(s,be,{enumerable:!0,configurable:!0,get:()=>wt.value,set:Je=>wt.value=Je})}if(l)for(const be in l)gr(l[be],s,n,be);if(c){const be=ne(c)?c.call(n):c;Reflect.ownKeys(be).forEach(pe=>{Rt(pe,be[pe])})}f&&Ko(f,e,"c");function he(be,pe){Q(pe)?pe.forEach(xt=>be(xt.bind(n))):pe&&be(pe.bind(n))}if(he(uc,_),he(Qe,p),he(fc,v),he(_o,T),he(lc,A),he(cc,W),he(pc,M),he(_c,G),he(hc,Z),he(hr,w),he(Jt,N),he(dc,Y),Q(X))if(X.length){const be=e.exposed||(e.exposed={});X.forEach(pe=>{Object.defineProperty(be,pe,{get:()=>n[pe],set:xt=>n[pe]=xt})})}else e.exposed||(e.exposed={});U&&e.render===Ye&&(e.render=U),oe!=null&&(e.inheritAttrs=oe),D&&(e.components=D),ie&&(e.directives=ie)}function vc(e,t,n=Ye,s=!1){Q(e)&&(e=Us(e));for(const o in e){const i=e[o];let r;ve(i)?"default"in i?r=Be(i.from||o,i.default,!0):r=Be(i.from||o):r=Be(i),Ve(r)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[o]=r}}function Ko(e,t,n){ze(Q(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function gr(e,t,n,s){const o=s.includes(".")?cr(n,s):()=>n[s];if(ye(e)){const i=t[e];ne(i)&&nt(o,i)}else if(ne(e))nt(o,e.bind(n));else if(ve(e))if(Q(e))e.forEach(i=>gr(i,t,n,s));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&nt(o,i,e)}}function go(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,l=i.get(t);let c;return l?c=l:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(a=>qn(c,a,r,!0)),qn(c,t,r)),ve(t)&&i.set(t,c),c}function qn(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&qn(e,i,n,!0),o&&o.forEach(r=>qn(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const l=bc[r]||n&&n[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const bc={data:Wo,props:Ct,emits:Ct,methods:Ct,computed:Ct,beforeCreate:Ee,created:Ee,beforeMount:Ee,mounted:Ee,beforeUpdate:Ee,updated:Ee,beforeDestroy:Ee,beforeUnmount:Ee,destroyed:Ee,unmounted:Ee,activated:Ee,deactivated:Ee,errorCaptured:Ee,serverPrefetch:Ee,components:Ct,directives:Ct,watch:xc,provide:Wo,inject:yc};function Wo(e,t){return t?e?function(){return Pe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function yc(e,t){return Ct(Us(e),Us(t))}function Us(e){if(Q(e)){const t={};for(let n=0;n0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let _=0;_{c=!0;const[p,v]=br(_,t,!0);Pe(r,p),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return ve(e)&&s.set(e,Bt),Bt;if(Q(i))for(let f=0;f-1,v[1]=A<0||T-1||ae(v,"default"))&&l.push(_)}}}const a=[r,l];return ve(e)&&s.set(e,a),a}function Go(e){return e[0]!=="$"}function Yo(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function Qo(e,t){return Yo(e)===Yo(t)}function Xo(e,t){return Q(t)?t.findIndex(n=>Qo(n,e)):ne(t)&&Qo(t,e)?0:-1}const yr=e=>e[0]==="_"||e==="$stable",vo=e=>Q(e)?e.map(Ke):[Ke(e)],kc=(e,t,n)=>{if(t._n)return t;const s=O((...o)=>vo(t(...o)),n);return s._c=!1,s},xr=(e,t,n)=>{const s=e._ctx;for(const o in e){if(yr(o))continue;const i=e[o];if(ne(i))t[o]=kc(o,i,s);else if(i!=null){const r=vo(i);t[o]=()=>r}}},wr=(e,t)=>{const n=vo(t);e.slots.default=()=>n},Pc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Rn(t,"_",n)):xr(t,e.slots={})}else e.slots={},t&&wr(e,t);Rn(e.slots,hs,1)},Cc=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=ge;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(Pe(o,t),!n&&l===1&&delete o._):(i=!t.$stable,xr(t,o)),r=t}else t&&(wr(e,t),r={default:1});if(i)for(const l in o)!yr(l)&&!(l in r)&&delete o[l]};function $r(){return{app:null,config:{isNativeTag:ol,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Sc=0;function Tc(e,t){return function(s,o=null){ne(s)||(s=Object.assign({},s)),o!=null&&!ve(o)&&(o=null);const i=$r(),r=new Set;let l=!1;const c=i.app={_uid:Sc++,_component:s,_props:o,_container:null,_context:i,_instance:null,version:Zc,get config(){return i.config},set config(a){},use(a,...f){return r.has(a)||(a&&ne(a.install)?(r.add(a),a.install(c,...f)):ne(a)&&(r.add(a),a(c,...f))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,f){return f?(i.components[a]=f,c):i.components[a]},directive(a,f){return f?(i.directives[a]=f,c):i.directives[a]},mount(a,f,_){if(!l){const p=L(s,o);return p.appContext=i,f&&t?t(p,a):e(p,a,_),l=!0,c._container=a,a.__vue_app__=c,_s(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return i.provides[a]=f,c}};return c}}function Kn(e,t,n,s,o=!1){if(Q(e)){e.forEach((p,v)=>Kn(p,t&&(Q(t)?t[v]:t),n,s,o));return}if(zt(s)&&!o)return;const i=s.shapeFlag&4?_s(s.component)||s.component.proxy:s.el,r=o?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===ge?l.refs={}:l.refs,_=l.setupState;if(a!=null&&a!==c&&(ye(a)?(f[a]=null,ae(_,a)&&(_[a]=null)):Ve(a)&&(a.value=null)),ne(c))pt(c,l,12,[r,f]);else{const p=ye(c),v=Ve(c);if(p||v){const T=()=>{if(e.f){const A=p?ae(_,c)?_[c]:f[c]:c.value;o?Q(A)&&Zs(A,i):Q(A)?A.includes(i)||A.push(i):p?(f[c]=[i],ae(_,c)&&(_[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else p?(f[c]=r,ae(_,c)&&(_[c]=r)):v&&(c.value=r,e.k&&(f[e.k]=r))};r?(T.id=-1,Le(T,n)):T()}}}let ut=!1;const Ln=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",An=e=>e.nodeType===8;function Vc(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:i,parentNode:r,remove:l,insert:c,createComment:a}}=e,f=(y,w)=>{if(!w.hasChildNodes()){n(null,y,w),Un(),w._vnode=y;return}ut=!1,_(w.firstChild,y,null,null,null),Un(),w._vnode=y,ut&&console.error("Hydration completed but contains mismatches.")},_=(y,w,C,N,U,G=!1)=>{const Z=An(y)&&y.data==="[",M=()=>A(y,w,C,N,U,Z),{type:Y,ref:X,shapeFlag:oe,patchFlag:D}=w;let ie=y.nodeType;w.el=y,D===-2&&(G=!1,w.dynamicChildren=null);let j=null;switch(Y){case Kt:ie!==3?w.children===""?(c(w.el=o(""),r(y),y),j=y):j=M():(y.data!==w.children&&(ut=!0,y.data=w.children),j=i(y));break;case Fe:ie!==8||Z?j=M():j=i(y);break;case un:if(Z&&(y=i(y),ie=y.nodeType),ie===1||ie===3){j=y;const Ie=!w.children.length;for(let he=0;he{G=G||!!w.dynamicChildren;const{type:Z,props:M,patchFlag:Y,shapeFlag:X,dirs:oe}=w,D=Z==="input"&&oe||Z==="option";if(D||Y!==-1){if(oe&&et(w,null,C,"created"),M)if(D||!G||Y&48)for(const j in M)(D&&j.endsWith("value")||wn(j)&&!rn(j))&&s(y,j,null,M[j],!1,void 0,C);else M.onClick&&s(y,"onClick",null,M.onClick,!1,void 0,C);let ie;if((ie=M&&M.onVnodeBeforeMount)&&Re(ie,C,w),oe&&et(w,null,C,"beforeMount"),((ie=M&&M.onVnodeMounted)||oe)&&lr(()=>{ie&&Re(ie,C,w),oe&&et(w,null,C,"mounted")},N),X&16&&!(M&&(M.innerHTML||M.textContent))){let j=v(y.firstChild,w,y,C,N,U,G);for(;j;){ut=!0;const Ie=j;j=j.nextSibling,l(Ie)}}else X&8&&y.textContent!==w.children&&(ut=!0,y.textContent=w.children)}return y.nextSibling},v=(y,w,C,N,U,G,Z)=>{Z=Z||!!w.dynamicChildren;const M=w.children,Y=M.length;for(let X=0;X{const{slotScopeIds:Z}=w;Z&&(U=U?U.concat(Z):Z);const M=r(y),Y=v(i(y),w,M,C,N,U,G);return Y&&An(Y)&&Y.data==="]"?i(w.anchor=Y):(ut=!0,c(w.anchor=a("]"),M,Y),Y)},A=(y,w,C,N,U,G)=>{if(ut=!0,w.el=null,G){const Y=W(y);for(;;){const X=i(y);if(X&&X!==Y)l(X);else break}}const Z=i(y),M=r(y);return l(y),n(null,w,M,Z,C,N,Ln(M),U),Z},W=y=>{let w=0;for(;y;)if(y=i(y),y&&An(y)&&(y.data==="["&&w++,y.data==="]")){if(w===0)return i(y);w--}return y};return[f,_]}const Le=lr;function Ec(e){return Mc(e,Vc)}function Mc(e,t){const n=ul();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:l,createComment:c,setText:a,setElementText:f,parentNode:_,nextSibling:p,setScopeId:v=Ye,insertStaticContent:T}=e,A=(u,h,x,k=null,$=null,E=null,B=!1,V=null,I=!!h.dynamicChildren)=>{if(u===h)return;u&&!Tt(u,h)&&(k=Pn(u),Je(u,$,E,!0),u=null),h.patchFlag===-2&&(I=!1,h.dynamicChildren=null);const{type:P,ref:q,shapeFlag:R}=h;switch(P){case Kt:W(u,h,x,k);break;case Fe:y(u,h,x,k);break;case un:u==null&&w(h,x,k,B);break;case te:D(u,h,x,k,$,E,B,V,I);break;default:R&1?U(u,h,x,k,$,E,B,V,I):R&6?ie(u,h,x,k,$,E,B,V,I):(R&64||R&128)&&P.process(u,h,x,k,$,E,B,V,I,It)}q!=null&&$&&Kn(q,u&&u.ref,E,h||u,!h)},W=(u,h,x,k)=>{if(u==null)s(h.el=l(h.children),x,k);else{const $=h.el=u.el;h.children!==u.children&&a($,h.children)}},y=(u,h,x,k)=>{u==null?s(h.el=c(h.children||""),x,k):h.el=u.el},w=(u,h,x,k)=>{[u.el,u.anchor]=T(u.children,h,x,k,u.el,u.anchor)},C=({el:u,anchor:h},x,k)=>{let $;for(;u&&u!==h;)$=p(u),s(u,x,k),u=$;s(h,x,k)},N=({el:u,anchor:h})=>{let x;for(;u&&u!==h;)x=p(u),o(u),u=x;o(h)},U=(u,h,x,k,$,E,B,V,I)=>{B=B||h.type==="svg",u==null?G(h,x,k,$,E,B,V,I):Y(u,h,$,E,B,V,I)},G=(u,h,x,k,$,E,B,V)=>{let I,P;const{type:q,props:R,shapeFlag:K,transition:ee,dirs:re}=u;if(I=u.el=r(u.type,E,R&&R.is,R),K&8?f(I,u.children):K&16&&M(u.children,I,null,k,$,E&&q!=="foreignObject",B,V),re&&et(u,null,k,"created"),R){for(const _e in R)_e!=="value"&&!rn(_e)&&i(I,_e,null,R[_e],E,u.children,k,$,ot);"value"in R&&i(I,"value",null,R.value),(P=R.onVnodeBeforeMount)&&Re(P,k,u)}Z(I,u,u.scopeId,B,k),re&&et(u,null,k,"beforeMount");const me=(!$||$&&!$.pendingBranch)&&ee&&!ee.persisted;me&&ee.beforeEnter(I),s(I,h,x),((P=R&&R.onVnodeMounted)||me||re)&&Le(()=>{P&&Re(P,k,u),me&&ee.enter(I),re&&et(u,null,k,"mounted")},$)},Z=(u,h,x,k,$)=>{if(x&&v(u,x),k)for(let E=0;E{for(let P=I;P{const V=h.el=u.el;let{patchFlag:I,dynamicChildren:P,dirs:q}=h;I|=u.patchFlag&16;const R=u.props||ge,K=h.props||ge;let ee;x&&$t(x,!1),(ee=K.onVnodeBeforeUpdate)&&Re(ee,x,h,u),q&&et(h,u,x,"beforeUpdate"),x&&$t(x,!0);const re=$&&h.type!=="foreignObject";if(P?X(u.dynamicChildren,P,V,x,k,re,E):B||pe(u,h,V,null,x,k,re,E,!1),I>0){if(I&16)oe(V,h,R,K,x,k,$);else if(I&2&&R.class!==K.class&&i(V,"class",null,K.class,$),I&4&&i(V,"style",R.style,K.style,$),I&8){const me=h.dynamicProps;for(let _e=0;_e{ee&&Re(ee,x,h,u),q&&et(h,u,x,"updated")},k)},X=(u,h,x,k,$,E,B)=>{for(let V=0;V{if(x!==k){if(x!==ge)for(const V in x)!rn(V)&&!(V in k)&&i(u,V,x[V],null,B,h.children,$,E,ot);for(const V in k){if(rn(V))continue;const I=k[V],P=x[V];I!==P&&V!=="value"&&i(u,V,P,I,B,h.children,$,E,ot)}"value"in k&&i(u,"value",x.value,k.value)}},D=(u,h,x,k,$,E,B,V,I)=>{const P=h.el=u?u.el:l(""),q=h.anchor=u?u.anchor:l("");let{patchFlag:R,dynamicChildren:K,slotScopeIds:ee}=h;ee&&(V=V?V.concat(ee):ee),u==null?(s(P,x,k),s(q,x,k),M(h.children,x,q,$,E,B,V,I)):R>0&&R&64&&K&&u.dynamicChildren?(X(u.dynamicChildren,K,x,$,E,B,V),(h.key!=null||$&&h===$.subTree)&&bo(u,h,!0)):pe(u,h,x,q,$,E,B,V,I)},ie=(u,h,x,k,$,E,B,V,I)=>{h.slotScopeIds=V,u==null?h.shapeFlag&512?$.ctx.activate(h,x,k,B,I):j(h,x,k,$,E,B,I):Ie(u,h,I)},j=(u,h,x,k,$,E,B)=>{const V=u.component=Uc(u,k,$);if(fs(u)&&(V.ctx.renderer=It),jc(V),V.asyncDep){if($&&$.registerDep(V,he),!u.el){const I=V.subTree=L(Fe);y(null,I,h,x)}return}he(V,u,h,x,$,E,B)},Ie=(u,h,x)=>{const k=h.component=u.component;if(ec(u,h,x))if(k.asyncDep&&!k.asyncResolved){be(k,h,x);return}else k.next=h,Gl(k.update),k.update();else h.el=u.el,k.vnode=h},he=(u,h,x,k,$,E,B)=>{const V=()=>{if(u.isMounted){let{next:q,bu:R,u:K,parent:ee,vnode:re}=u,me=q,_e;$t(u,!1),q?(q.el=re.el,be(u,q,B)):q=re,R&&Bn(R),(_e=q.props&&q.props.onVnodeBeforeUpdate)&&Re(_e,ee,q,re),$t(u,!0);const xe=$s(u),qe=u.subTree;u.subTree=xe,A(qe,xe,_(qe.el),Pn(qe),u,$,E),q.el=xe.el,me===null&&tc(u,xe.el),K&&Le(K,$),(_e=q.props&&q.props.onVnodeUpdated)&&Le(()=>Re(_e,ee,q,re),$)}else{let q;const{el:R,props:K}=h,{bm:ee,m:re,parent:me}=u,_e=zt(h);if($t(u,!1),ee&&Bn(ee),!_e&&(q=K&&K.onVnodeBeforeMount)&&Re(q,me,h),$t(u,!0),R&&xs){const xe=()=>{u.subTree=$s(u),xs(R,u.subTree,u,$,null)};_e?h.type.__asyncLoader().then(()=>!u.isUnmounted&&xe()):xe()}else{const xe=u.subTree=$s(u);A(null,xe,x,k,u,$,E),h.el=xe.el}if(re&&Le(re,$),!_e&&(q=K&&K.onVnodeMounted)){const xe=h;Le(()=>Re(q,me,xe),$)}(h.shapeFlag&256||me&&zt(me.vnode)&&me.vnode.shapeFlag&256)&&u.a&&Le(u.a,$),u.isMounted=!0,h=x=k=null}},I=u.effect=new so(V,()=>ho(P),u.scope),P=u.update=()=>I.run();P.id=u.uid,$t(u,!0),P()},be=(u,h,x)=>{h.component=u;const k=u.vnode.props;u.vnode=h,u.next=null,$c(u,h.props,k,x),Cc(u,h.children,x),Qt(),Ro(),Xt()},pe=(u,h,x,k,$,E,B,V,I=!1)=>{const P=u&&u.children,q=u?u.shapeFlag:0,R=h.children,{patchFlag:K,shapeFlag:ee}=h;if(K>0){if(K&128){kn(P,R,x,k,$,E,B,V,I);return}else if(K&256){xt(P,R,x,k,$,E,B,V,I);return}}ee&8?(q&16&&ot(P,$,E),R!==P&&f(x,R)):q&16?ee&16?kn(P,R,x,k,$,E,B,V,I):ot(P,$,E,!0):(q&8&&f(x,""),ee&16&&M(R,x,k,$,E,B,V,I))},xt=(u,h,x,k,$,E,B,V,I)=>{u=u||Bt,h=h||Bt;const P=u.length,q=h.length,R=Math.min(P,q);let K;for(K=0;Kq?ot(u,$,E,!0,!1,R):M(h,x,k,$,E,B,V,I,R)},kn=(u,h,x,k,$,E,B,V,I)=>{let P=0;const q=h.length;let R=u.length-1,K=q-1;for(;P<=R&&P<=K;){const ee=u[P],re=h[P]=I?ht(h[P]):Ke(h[P]);if(Tt(ee,re))A(ee,re,x,null,$,E,B,V,I);else break;P++}for(;P<=R&&P<=K;){const ee=u[R],re=h[K]=I?ht(h[K]):Ke(h[K]);if(Tt(ee,re))A(ee,re,x,null,$,E,B,V,I);else break;R--,K--}if(P>R){if(P<=K){const ee=K+1,re=eeK)for(;P<=R;)Je(u[P],$,E,!0),P++;else{const ee=P,re=P,me=new Map;for(P=re;P<=K;P++){const Oe=h[P]=I?ht(h[P]):Ke(h[P]);Oe.key!=null&&me.set(Oe.key,P)}let _e,xe=0;const qe=K-re+1;let Ot=!1,Eo=0;const en=new Array(qe);for(P=0;P=qe){Je(Oe,$,E,!0);continue}let Ze;if(Oe.key!=null)Ze=me.get(Oe.key);else for(_e=re;_e<=K;_e++)if(en[_e-re]===0&&Tt(Oe,h[_e])){Ze=_e;break}Ze===void 0?Je(Oe,$,E,!0):(en[Ze-re]=P+1,Ze>=Eo?Eo=Ze:Ot=!0,A(Oe,h[Ze],x,null,$,E,B,V,I),xe++)}const Mo=Ot?Lc(en):Bt;for(_e=Mo.length-1,P=qe-1;P>=0;P--){const Oe=re+P,Ze=h[Oe],Lo=Oe+1{const{el:E,type:B,transition:V,children:I,shapeFlag:P}=u;if(P&6){wt(u.component.subTree,h,x,k);return}if(P&128){u.suspense.move(h,x,k);return}if(P&64){B.move(u,h,x,It);return}if(B===te){s(E,h,x);for(let R=0;RV.enter(E),$);else{const{leave:R,delayLeave:K,afterLeave:ee}=V,re=()=>s(E,h,x),me=()=>{R(E,()=>{re(),ee&&ee()})};K?K(E,re,me):me()}else s(E,h,x)},Je=(u,h,x,k=!1,$=!1)=>{const{type:E,props:B,ref:V,children:I,dynamicChildren:P,shapeFlag:q,patchFlag:R,dirs:K}=u;if(V!=null&&Kn(V,null,x,u,!0),q&256){h.ctx.deactivate(u);return}const ee=q&1&&K,re=!zt(u);let me;if(re&&(me=B&&B.onVnodeBeforeUnmount)&&Re(me,h,u),q&6)Xr(u.component,x,k);else{if(q&128){u.suspense.unmount(x,k);return}ee&&et(u,null,h,"beforeUnmount"),q&64?u.type.remove(u,h,x,$,It,k):P&&(E!==te||R>0&&R&64)?ot(P,h,x,!1,!0):(E===te&&R&384||!$&&q&16)&&ot(I,h,x),k&&To(u)}(re&&(me=B&&B.onVnodeUnmounted)||ee)&&Le(()=>{me&&Re(me,h,u),ee&&et(u,null,h,"unmounted")},x)},To=u=>{const{type:h,el:x,anchor:k,transition:$}=u;if(h===te){Qr(x,k);return}if(h===un){N(u);return}const E=()=>{o(x),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(u.shapeFlag&1&&$&&!$.persisted){const{leave:B,delayLeave:V}=$,I=()=>B(x,E);V?V(u.el,E,I):I()}else E()},Qr=(u,h)=>{let x;for(;u!==h;)x=p(u),o(u),u=x;o(h)},Xr=(u,h,x)=>{const{bum:k,scope:$,update:E,subTree:B,um:V}=u;k&&Bn(k),$.stop(),E&&(E.active=!1,Je(B,u,h,x)),V&&Le(V,h),Le(()=>{u.isUnmounted=!0},h),h&&h.pendingBranch&&!h.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===h.pendingId&&(h.deps--,h.deps===0&&h.resolve())},ot=(u,h,x,k=!1,$=!1,E=0)=>{for(let B=E;Bu.shapeFlag&6?Pn(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),Vo=(u,h,x)=>{u==null?h._vnode&&Je(h._vnode,null,null,!0):A(h._vnode||null,u,h,null,null,null,x),Ro(),Un(),h._vnode=u},It={p:A,um:Je,m:wt,r:To,mt:j,mc:M,pc:pe,pbc:X,n:Pn,o:e};let ys,xs;return t&&([ys,xs]=t(It)),{render:Vo,hydrate:ys,createApp:Tc(Vo,ys)}}function $t({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function bo(e,t,n=!1){const s=e.children,o=t.children;if(Q(s)&&Q(o))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}const Ac=e=>e.__isTeleport,an=e=>e&&(e.disabled||e.disabled===""),Jo=e=>typeof SVGElement<"u"&&e instanceof SVGElement,qs=(e,t)=>{const n=e&&e.to;return ye(n)?t?t(n):null:n},Ic={__isTeleport:!0,process(e,t,n,s,o,i,r,l,c,a){const{mc:f,pc:_,pbc:p,o:{insert:v,querySelector:T,createText:A,createComment:W}}=a,y=an(t.props);let{shapeFlag:w,children:C,dynamicChildren:N}=t;if(e==null){const U=t.el=A(""),G=t.anchor=A("");v(U,n,s),v(G,n,s);const Z=t.target=qs(t.props,T),M=t.targetAnchor=A("");Z&&(v(M,Z),r=r||Jo(Z));const Y=(X,oe)=>{w&16&&f(C,X,oe,o,i,r,l,c)};y?Y(n,G):Z&&Y(Z,M)}else{t.el=e.el;const U=t.anchor=e.anchor,G=t.target=e.target,Z=t.targetAnchor=e.targetAnchor,M=an(e.props),Y=M?n:G,X=M?U:Z;if(r=r||Jo(G),N?(p(e.dynamicChildren,N,Y,o,i,r,l),bo(e,t,!0)):c||_(e,t,Y,X,o,i,r,l,!1),y)M||In(t,n,U,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const oe=t.target=qs(t.props,T);oe&&In(t,oe,null,a,0)}else M&&In(t,G,Z,a,1)}kr(t)},remove(e,t,n,s,{um:o,o:{remove:i}},r){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:_,props:p}=e;if(_&&i(f),(r||!an(p))&&(i(a),l&16))for(let v=0;v0?Ge||Bt:null,Bc(),bn>0&&Ge&&Ge.push(e),e}function m(e,t,n,s,o,i){return Pr(g(e,t,n,s,o,i,!0))}function J(e,t,n,s,o){return Pr(L(e,t,n,s,o,!0))}function Wn(e){return e?e.__v_isVNode===!0:!1}function Tt(e,t){return e.type===t.type&&e.key===t.key}const hs="__vInternal",Cr=({key:e})=>e??null,Fn=({ref:e,ref_key:t,ref_for:n})=>e!=null?ye(e)||Ve(e)||ne(e)?{i:ke,r:e,k:t,f:!!n}:e:null;function g(e,t=null,n=null,s=0,o=null,i=e===te?0:1,r=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Cr(t),ref:t&&Fn(t),scopeId:as,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:ke};return l?(yo(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ye(n)?8:16),bn>0&&!r&&Ge&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ge.push(c),c}const L=Fc;function Fc(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===_r)&&(e=Fe),Wn(e)){const l=vt(e,t,!0);return n&&yo(l,n),bn>0&&!i&&Ge&&(l.shapeFlag&6?Ge[Ge.indexOf(e)]=l:Ge.push(l)),l.patchFlag|=-2,l}if(Gc(e)&&(e=e.__vccOpts),t){t=Hc(t);let{class:l,style:c}=t;l&&!ye(l)&&(t.class=de(l)),ve(c)&&(Xi(c)&&!Q(c)&&(c=Pe({},c)),t.style=ts(c))}const r=ye(e)?1:nc(e)?128:Ac(e)?64:ve(e)?4:ne(e)?2:0;return g(e,t,n,s,o,r,i,!0)}function Hc(e){return e?Xi(e)||hs in e?Pe({},e):e:null}function vt(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,l=t?Hn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Cr(l),ref:t&&t.ref?n&&o?Q(o)?o.concat(Fn(t)):[o,Fn(t)]:Fn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==te?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&vt(e.ssContent),ssFallback:e.ssFallback&&vt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ce(e=" ",t=0){return L(Kt,null,e,t)}function Dc(e,t){const n=L(un,null,e);return n.staticCount=t,n}function H(e="",t=!1){return t?(d(),J(Fe,null,e)):L(Fe,null,e)}function Ke(e){return e==null||typeof e=="boolean"?L(Fe):Q(e)?L(te,null,e.slice()):typeof e=="object"?ht(e):L(Kt,null,String(e))}function ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:vt(e)}function yo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Q(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),yo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(hs in t)?t._ctx=ke:o===3&&ke&&(ke.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:ke},n=32):(t=String(t),s&64?(n=16,t=[Ce(t)]):n=8);e.children=t,e.shapeFlag|=n}function Hn(...e){const t={};for(let n=0;n$e||ke,Wt=e=>{$e=e,e.scope.on()},At=()=>{$e&&$e.scope.off(),$e=null};function Sr(e){return e.vnode.shapeFlag&4}let yn=!1;function jc(e,t=!1){yn=t;const{props:n,children:s}=e.vnode,o=Sr(e);wc(e,n,o,t),Pc(e,s);const i=o?qc(e,t):void 0;return yn=!1,i}function qc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=ln(new Proxy(e.ctx,mc));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?Vr(e):null;Wt(e),Qt();const i=pt(s,e,0,[e.props,o]);if(Xt(),At(),Fi(i)){if(i.then(At,At),t)return i.then(r=>{ei(e,r,t)}).catch(r=>{ls(r,e,0)});e.asyncDep=i}else ei(e,i,t)}else Tr(e,t)}function ei(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=tr(t)),Tr(e,n)}let ti;function Tr(e,t,n){const s=e.type;if(!e.render){if(!t&&ti&&!s.render){const o=s.template||go(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=Pe(Pe({isCustomElement:i,delimiters:l},r),c);s.render=ti(o,a)}}e.render=s.render||Ye}Wt(e),Qt(),gc(e),Xt(),At()}function Kc(e){return new Proxy(e.attrs,{get(t,n){return He(e,"get","$attrs"),t[n]}})}function Vr(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Kc(e))},slots:e.slots,emit:e.emit,expose:t}}function _s(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(tr(ln(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in cn)return cn[n](e)},has(t,n){return n in t||n in cn}}))}function Wc(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Gc(e){return ne(e)&&"__vccOpts"in e}const se=(e,t)=>ql(e,t,yn);function Yc(){return Qc().slots}function Qc(){const e=xo();return e.setupContext||(e.setupContext=Vr(e))}function Gn(e,t,n){const s=arguments.length;return s===2?ve(t)&&!Q(t)?Wn(t)?L(e,null,[t]):L(e,t):L(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Wn(n)&&(n=[n]),L(e,t,n))}const Xc=Symbol(""),Jc=()=>Be(Xc),Zc="3.2.45",ea="http://www.w3.org/2000/svg",Vt=typeof document<"u"?document:null,ni=Vt&&Vt.createElement("template"),ta={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?Vt.createElementNS(ea,e):Vt.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Vt.createTextNode(e),createComment:e=>Vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{ni.innerHTML=s?`${e}`:e;const l=ni.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function na(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function sa(e,t,n){const s=e.style,o=ye(n);if(n&&!o){for(const i in n)Ks(s,i,n[i]);if(t&&!ye(t))for(const i in t)n[i]==null&&Ks(s,i,"")}else{const i=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const si=/\s*!important$/;function Ks(e,t,n){if(Q(n))n.forEach(s=>Ks(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=oa(e,t);si.test(n)?e.setProperty(Yt(s),n.replace(si,""),"important"):e[s]=n}}const oi=["Webkit","Moz","ms"],Cs={};function oa(e,t){const n=Cs[t];if(n)return n;let s=st(t);if(s!=="filter"&&s in e)return Cs[t]=s;s=os(s);for(let o=0;oSs||(ua.then(()=>Ss=0),Ss=Date.now());function da(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;ze(ha(s,n.value),t,5,[s])};return n.value=e,n.attached=fa(),n}function ha(e,t){if(Q(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const li=/^on[a-z]/,_a=(e,t,n,s,o=!1,i,r,l,c)=>{t==="class"?na(e,s,o):t==="style"?sa(e,n,s):wn(t)?Js(t)||ca(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):pa(e,t,s,o))?ra(e,t,s,i,r,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ia(e,t,s,o))};function pa(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&li.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||li.test(t)&&ye(n)?!1:t in e}const ft="transition",tn="animation",ps=(e,{slots:t})=>Gn(ar,ma(e),t);ps.displayName="Transition";const Er={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};ps.props=Pe({},ar.props,Er);const kt=(e,t=[])=>{Q(e)?e.forEach(n=>n(...t)):e&&e(...t)},ci=e=>e?Q(e)?e.some(t=>t.length>1):e.length>1:!1;function ma(e){const t={};for(const D in e)D in Er||(t[D]=e[D]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=r,appearToClass:f=l,leaveFromClass:_=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,T=ga(o),A=T&&T[0],W=T&&T[1],{onBeforeEnter:y,onEnter:w,onEnterCancelled:C,onLeave:N,onLeaveCancelled:U,onBeforeAppear:G=y,onAppear:Z=w,onAppearCancelled:M=C}=t,Y=(D,ie,j)=>{Pt(D,ie?f:l),Pt(D,ie?a:r),j&&j()},X=(D,ie)=>{D._isLeaving=!1,Pt(D,_),Pt(D,v),Pt(D,p),ie&&ie()},oe=D=>(ie,j)=>{const Ie=D?Z:w,he=()=>Y(ie,D,j);kt(Ie,[ie,he]),ai(()=>{Pt(ie,D?c:i),dt(ie,D?f:l),ci(Ie)||ui(ie,s,A,he)})};return Pe(t,{onBeforeEnter(D){kt(y,[D]),dt(D,i),dt(D,r)},onBeforeAppear(D){kt(G,[D]),dt(D,c),dt(D,a)},onEnter:oe(!1),onAppear:oe(!0),onLeave(D,ie){D._isLeaving=!0;const j=()=>X(D,ie);dt(D,_),ya(),dt(D,p),ai(()=>{D._isLeaving&&(Pt(D,_),dt(D,v),ci(N)||ui(D,s,W,j))}),kt(N,[D,j])},onEnterCancelled(D){Y(D,!1),kt(C,[D])},onAppearCancelled(D){Y(D,!0),kt(M,[D])},onLeaveCancelled(D){X(D),kt(U,[D])}})}function ga(e){if(e==null)return null;if(ve(e))return[Ts(e.enter),Ts(e.leave)];{const t=Ts(e);return[t,t]}}function Ts(e){return pn(e)}function dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ai(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let va=0;function ui(e,t,n,s){const o=e._endId=++va,i=()=>{o===e._endId&&s()};if(n)return setTimeout(i,n);const{type:r,timeout:l,propCount:c}=ba(e,t);if(!r)return s();const a=r+"end";let f=0;const _=()=>{e.removeEventListener(a,p),i()},p=v=>{v.target===e&&++f>=c&&_()};setTimeout(()=>{f(n[T]||"").split(", "),o=s(`${ft}Delay`),i=s(`${ft}Duration`),r=fi(o,i),l=s(`${tn}Delay`),c=s(`${tn}Duration`),a=fi(l,c);let f=null,_=0,p=0;t===ft?r>0&&(f=ft,_=r,p=i.length):t===tn?a>0&&(f=tn,_=a,p=c.length):(_=Math.max(r,a),f=_>0?r>a?ft:tn:null,p=f?f===ft?i.length:c.length:0);const v=f===ft&&/\b(transform|all)(,|$)/.test(s(`${ft}Property`).toString());return{type:f,timeout:_,propCount:p,hasTransform:v}}function fi(e,t){for(;e.lengthdi(n)+di(e[s])))}function di(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function ya(){return document.body.offsetHeight}const hi=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Q(t)?n=>Bn(t,n):t};function xa(e){e.target.composing=!0}function _i(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const wa={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e._assign=hi(o);const i=s||o.props&&o.props.type==="number";Nt(e,t?"change":"input",r=>{if(r.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=pn(l)),e._assign(l)}),n&&Nt(e,"change",()=>{e.value=e.value.trim()}),t||(Nt(e,"compositionstart",xa),Nt(e,"compositionend",_i),Nt(e,"change",_i))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:o}},i){if(e._assign=hi(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(o||e.type==="number")&&pn(e.value)===t))return;const r=t??"";e.value!==r&&(e.value=r)}},$a=["ctrl","shift","alt","meta"],ka={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$a.some(n=>e[`${n}Key`]&&!t.includes(n))},Mr=(e,t)=>(n,...s)=>{for(let o=0;o{nn(e,!1)}):nn(e,t))},beforeUnmount(e,{value:t}){nn(e,t)}};function nn(e,t){e.style.display=t?e._vod:"none"}const Ca=Pe({patchProp:_a},ta);let Vs,pi=!1;function Sa(){return Vs=pi?Vs:Ec(Ca),pi=!0,Vs}const Ta=(...e)=>{const t=Sa().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Va(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function Va(e){return ye(e)?document.querySelector(e):e}const Ea=z({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>(d(),m("span",{class:de(["VPBadge",e.type??"tip"])},[S(t.$slots,"default",{},()=>[Ce(ce(e.text),1)],!0)],2))}});const F=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Ma=F(Ea,[["__scopeId","data-v-e233384c"]]),La=JSON.parse(`{"lang":"en-US","title":"EyeTrackVR Docs","description":"Official documentation for EyeTrackVR. Fully opensource and affordable VR eye tracking platform.","base":"/","head":[],"appearance":true,"themeConfig":{"logo":{"light":"/logo_light.png","dark":"/logo.svg","alt":"EyeTrackVR Logo"},"siteTitle":"EyeTrackVR Docs","footer":{"message":"Released under the MIT License.","copyright":"Copyright © 2022-present ETVR"},"nav":[{"text":"About","items":[{"text":"About Us","link":"/about"},{"text":"Development Road Map","link":"/dev_roadmap"}]},{"text":"Contact","link":"/contact"}],"sidebar":[{"text":"Getting Started","collapsible":true,"items":[{"text":"Introduction","link":"/getting_started/intro"},{"text":"Things to know before you start","link":"/getting_started/things_to_know"}]},{"text":"How to Build","collapsible":true,"items":[{"text":"Full Build Guide","link":"/how_to_build/full_build"},{"text":"Part List","link":"/how_to_build/parts_list"},{"text":"How to Create your own Camera Mount","link":"/how_to_build/creating_your_own_mount"}]},{"text":"Firmware Guide","collapsible":true,"items":[{"text":"Introduction","link":"/firmware_guide/firmware"},{"text":"Setup Visual Studio Code environment","link":"/firmware_guide/setup_vscode"},{"text":"Configuring Firmware","link":"/firmware_guide/configure_firmware"},{"text":"Uploading and Updating the Firmware","link":"/firmware_guide/upload_and_update_firmware"},{"text":"Updating PlatformIO","link":"/firmware_guide/update_platformio"},{"text":"Firmware Environments","link":"/firmware_guide/environments"},{"text":"MDNS","link":"/firmware_guide/mdns"},{"text":"REST API","link":"/firmware_guide/rest_api"}]},{"text":"Software Guide","collapsible":true,"items":[{"text":"Installing and setting up the ETVR App","link":"/software_guide/eyetrackvr_app_guide"},{"text":"Building the app from source","link":"/software_guide/build_software"}]},{"text":"Miscellaneous","collapsible":true,"items":[{"text":"VR Chat Avatar Setup","link":"/misc/vrc_avatar_setup"},{"text":"FAQ","link":"/misc/faq"}]},{"text":"Development","collapsible":true,"items":[{"text":"Docs","link":"/development/docs/dev_docs"},{"text":"Edit Docs","link":"/development/docs/pages"},{"text":"Standards","link":"/development/docs/standards"}]},{"text":"Archive","collapsible":true,"items":[{"text":"Prepare to solder IR LED PCB V2's","link":"/archive/fox_ir_v2_build_instructions"}]}],"socialLinks":[{"icon":"github","link":"https://github.com/RedHawk989/EyeTrackVR"},{"icon":"discord","link":"https://discord.gg/kkXYbVykZX"}]},"locales":{},"langs":{},"scrollOffset":90,"cleanUrls":"with-subfolders"}`),ms=/^[a-z]+:/i,Aa=/^pathname:\/\//,mi="vitepress-theme-appearance",Se=typeof window<"u",Lr={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function Ia(e,t){t.sort((n,s)=>{const o=s.split("/").length-n.split("/").length;return o!==0?o:s.length-n.length});for(const n of t)if(e.startsWith(n))return n}function gi(e,t){const n=Ia(t,Object.keys(e));return n?e[n]:void 0}function Oa(e){const{locales:t}=e.themeConfig||{},n=e.locales;return t&&n?Object.keys(t).reduce((s,o)=>(s[o]={label:t[o].label,lang:n[o].lang},s),{}):{}}function Na(e,t){t=Fa(e,t);const n=gi(e.locales||{},t),s=gi(e.themeConfig.locales||{},t);return Object.assign({},e,n,{themeConfig:Object.assign({},e.themeConfig,s,{locales:{}}),lang:(n||e).lang,locales:{},langs:Oa(e)})}function Ar(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Ba(e.title,s);return`${n}${o}`}function Ba(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Fa(e,t){if(!Se)return t;const n=e.base,s=n.endsWith("/")?n.slice(0,-1):n;return t.slice(s.length)}function Ha(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([i,r])=>i===n&&r[o[0]]===o[1])}function Da(e,t){return[...e.filter(n=>!Ha(t,n)),...t]}const Ra=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,za=/^[a-z]:/i;function vi(e){const t=za.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ra,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function Ua(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function xn(e){return ms.test(e)?e:Ua(Gt.value.base,e)}function Ir(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Se){const n="/";t=vi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];!s&&t.endsWith("_index.md")&&(t=t.slice(0,-9)+".md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${vi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Or=Symbol(),Gt=Rl(La);function ja(e){const t=se(()=>Na(Gt.value,e.path));return{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),lang:se(()=>t.value.lang),localePath:se(()=>{const{langs:n,lang:s}=t.value,o=Object.keys(n).find(i=>n[i].lang===s);return xn(o||"/")}),title:se(()=>Ar(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:le(!1)}}function ue(){const e=Be(Or);if(!e)throw new Error("vitepress data not properly injected in app");return e}const Nr=Symbol(),bi="http://a.com",qa=()=>({path:"/",component:null,data:Lr});function Ka(e,t){const n=rs(qa()),s={route:n,go:o};async function o(l=Se?location.href:"/"){var a,f;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,bi);Gt.value.cleanUrls==="disabled"&&!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Se&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await r(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let i=null;async function r(l,c=0,a=!1){const f=new URL(l,bi),_=i=f.pathname;try{let p=await e(_);if(i===_){i=null;const{default:v,__pageData:T}=p;if(!v)throw new Error(`Invalid route component: ${v}`);n.path=Se?_:xn(_),n.component=ln(v),n.data=ln(T),Se&&fo(()=>{if(f.hash&&!c){let A=null;try{A=document.querySelector(decodeURIComponent(f.hash))}catch(W){console.warn(W)}if(A){yi(A,f.hash);return}}window.scrollTo(0,c)})}}catch(p){if(!/fetch/.test(p.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(p),!a)try{const v=await fetch(Gt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await v.json(),await r(l,c,!0);return}catch{}i===_&&(i=null,n.path=Se?_:xn(_),n.component=t?ln(t):null,n.data=Lr)}}return Se&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&!a.download){const{href:f,origin:_,pathname:p,hash:v,search:T,target:A}=a,W=window.location,y=p.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&A!=="_blank"&&_===W.origin&&!(y&&y[0]!==".html")&&(l.preventDefault(),p===W.pathname&&T===W.search?v&&v!==W.hash&&(history.pushState(null,"",v),window.dispatchEvent(new Event("hashchange")),yi(a,v,a.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{r(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Wa(){const e=Be(Nr);if(!e)throw new Error("useRouter() is called without provider.");return e}function yt(){return Wa().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=Gt.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const i=parseInt(window.getComputedStyle(s).paddingTop,10),r=window.scrollY+s.getBoundingClientRect().top-o+i;!n||Math.abs(r-window.scrollY)>window.innerHeight?window.scrollTo(0,r):window.scrollTo({left:0,top:r,behavior:"smooth"})}}const Ga=z({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=yt();return _o(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Gn("div",{style:{position:"relative"}},[t.component?Gn(t.component):null])}});var xi;const $n=typeof window<"u";$n&&((xi=window==null?void 0:window.navigator)!=null&&xi.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Ya(e){return e}function Qa(e){return hl()?(_l(e),!0):!1}function Xa(e){return typeof e=="function"?se(e):le(e)}function Ja(e,t=!0){xo()?Qe(e):t?e():fo(e)}const Za=$n?window:void 0;$n&&window.document;$n&&window.navigator;$n&&window.location;function eu(e,t=!1){const n=le(),s=()=>n.value=Boolean(e());return s(),Ja(s,t),n}function Ws(e,t={}){const{window:n=Za}=t,s=eu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const i=le(!1),r=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l))},l=()=>{s.value&&(r(),o=n.matchMedia(Xa(e).value),i.value=o.matches,"addEventListener"in o?o.addEventListener("change",l):o.addListener(l))};return gt(l),Qa(()=>r()),i}const Gs=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ys="__vueuse_ssr_handlers__";Gs[Ys]=Gs[Ys]||{};Gs[Ys];var wi;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(wi||(wi={}));var tu=Object.defineProperty,$i=Object.getOwnPropertySymbols,nu=Object.prototype.hasOwnProperty,su=Object.prototype.propertyIsEnumerable,ki=(e,t,n)=>t in e?tu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ou=(e,t)=>{for(var n in t||(t={}))nu.call(t,n)&&ki(e,n,t[n]);if($i)for(var n of $i(t))su.call(t,n)&&ki(e,n,t[n]);return e};const iu={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};ou({linear:Ya},iu);const Br=/#.*$/,ru=/(index)?\.(md|html)$/,lu=typeof window<"u",cu=le(lu?location.hash:"");function au(e){return ms.test(e)}function uu(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Zt(e,t,n=!1){if(t===void 0)return!1;if(e=Ci(`/${e}`),n)return new RegExp(t).test(e);if(Ci(t)!==e)return!1;const s=t.match(Br);return s?cu.value===s[0]:!0}function Pi(e){return/^\//.test(e)?e:`/${e}`}function Ci(e){return decodeURI(e).replace(Br,"").replace(ru,"")}function Yn(e){if(au(e))return e.replace(Aa,"");const{site:t}=ue(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),i=n.endsWith("/")||n.endsWith(".html")?e:`${n.replace(/(\.md)?$/,t.value.cleanUrls==="disabled"?".html":"")}${s}${o}`;return xn(i)}function Fr(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=Pi(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(Pi(s)));return n?e[n]:[]}function fu(e){const t=[];function n(s){for(const o of s)o.link&&t.push({...o,link:o.link}),"items"in o&&n(o.items)}for(const s of e)n(s.items);return t}function Xe(){const e=yt(),{theme:t,frontmatter:n}=ue(),s=Ws("(min-width: 960px)"),o=le(!1),i=se(()=>{const p=t.value.sidebar,v=e.data.relativePath;return p?Fr(p,v):[]}),r=se(()=>n.value.sidebar!==!1&&i.value.length>0&&n.value.layout!=="home"),l=se(()=>n.value.layout!=="home"&&n.value.aside!==!1),c=se(()=>r.value&&s.value);function a(){o.value=!0}function f(){o.value=!1}function _(){o.value?f():a()}return{isOpen:o,sidebar:i,hasSidebar:r,hasAside:l,isSidebarEnabled:c,open:a,close:f,toggle:_}}function du(e,t){let n;gt(()=>{n=e.value?document.activeElement:void 0}),Qe(()=>{window.addEventListener("keyup",s)}),Jt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}const hu=z({__name:"VPSkipLink",setup(e){const t=yt(),n=le();nt(()=>t.path,()=>n.value.focus());function s({target:o}){const i=document.querySelector(o.hash);if(i){const r=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",r)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",r),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(d(),m(te,null,[g("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),g("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const _u=F(hu,[["__scopeId","data-v-8ab7c6af"]]),pu={key:0,class:"VPBackdrop"},mu=z({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(d(),J(ps,{name:"fade"},{default:O(()=>[e.show?(d(),m("div",pu)):H("",!0)]),_:1}))}});const gu=F(mu,[["__scopeId","data-v-ba02b58d"]]);function vu(){const e=le(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const i=yt();return nt(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const bu=["src","alt"],yu={inheritAttrs:!1},xu=z({...yu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{const s=bt("VPImage",!0);return e.image?(d(),m(te,{key:0},[typeof e.image=="string"||"src"in e.image?(d(),m("img",Hn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:b(xn)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bu)):(d(),m(te,{key:1},[L(s,Hn({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),L(s,Hn({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):H("",!0)}}});const wo=F(xu,[["__scopeId","data-v-74766fef"]]),wu=["href"],$u=z({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=ue(),{hasSidebar:s}=Xe();return(o,i)=>(d(),m("div",{class:de(["VPNavBarTitle",{"has-sidebar":b(s)}])},[g("a",{class:"title",href:b(t).base},[S(o.$slots,"nav-bar-title-before",{},void 0,!0),L(wo,{class:"logo",image:b(n).logo},null,8,["image"]),b(n).siteTitle?(d(),m(te,{key:0},[Ce(ce(b(n).siteTitle),1)],64)):b(n).siteTitle===void 0?(d(),m(te,{key:1},[Ce(ce(b(t).title),1)],64)):H("",!0),S(o.$slots,"nav-bar-title-after",{},void 0,!0)],8,wu)],2))}});const ku=F($u,[["__scopeId","data-v-092de34b"]]),Pu="modulepreload",Cu=function(e){return"/"+e},Si={},Hr=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Cu(i),i in Si)return;Si[i]=!0;const r=i.endsWith(".css"),l=r?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const _=o[f];if(_.href===i&&(!r||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=r?"stylesheet":Pu,r||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),r)return new Promise((f,_)=>{a.addEventListener("load",f),a.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())},Su="/assets/flex-logo.2489261b.svg";function Es(e,t){return typeof e>"u"?t:e}function Ti(e){const t=Array(e);for(let n=0;n=this.minlength&&(l||!r[f])){let p=On(c,o,a),v="";switch(this.tokenize){case"full":if(3<_){for(let T=0;T<_;T++)for(let A=_;A>T;A--)if(A-T>=this.minlength){const W=On(c,o,a,_,T);v=f.substring(T,A),this.push_index(r,v,W,e,n)}break}case"reverse":if(2<_){for(let T=_-1;0=this.minlength){const A=On(c,o,a,_,T);this.push_index(r,v,A,e,n)}v=""}case"forward":if(1<_){for(let T=0;T<_;T++)v+=f[T],v.length>=this.minlength&&this.push_index(r,v,p,e,n);break}default:if(this.boost&&(p=Math.min(0|p/this.boost(t,f,a),c-1)),this.push_index(r,f,p,e,n),l&&1=this.minlength&&!T[f]){T[f]=1;const C=On(A+(o/2>A?0:1),o,a,y-1,w-1),N=this.bidirectional&&f>W;this.push_index(i,N?W:f,C,e,n,N?f:W)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function On(e,t,n,s,o){return n&&1=this.minlength&&!_[v]){if(!this.optimize&&!i&&!this.map[v])return r;p[A++]=v,_[v]=1}e=p,s=e.length}if(!s)return r;t||(t=100);let c,a=this.depth&&1=n)))));v++);if(a)return o?Mi(l,n,0):void(e[e.length]=l)}return!t&&l};function Mi(e,t,n){return e=e.length===1?e[0]:Vu(e),n||e.length>t?e.slice(n,n+t):e}function Li(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}Me.prototype.contain=function(e){return!!this.register[e]},Me.prototype.update=function(e,t){return this.remove(e).add(e,t)},Me.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(o.value){for(var y=f.value.search(o.value,{enrich:!0}),w=[],C=0;C!y||!y.length?[]:y.reduce((C,N)=>(C[w(N)]||(C[w(N)]=[]),C[w(N)].push(N),C),{}),A=()=>{setTimeout(()=>{r.value&&r.value.focus()},100),W(),s.value=!0};Qe(async()=>{var N,U;const y=await Hr(()=>import("./chunks/virtual_search-data.f5f281ff.js"),[]);l.value=y.default.INDEX_DATA,c.value=y.default.PREVIEW_LOOKUP,a.value=y.default.Options,i.value=window.location.origin+t.value,_.value=((N=a.value)==null?void 0:N.buttonLabel)||_.value,p.value=((U=a.value)==null?void 0:U.placeholder)||p.value;var w=new Me(a.value);w.import("reg",l.value.reg),w.import("cfg",l.value.cfg),w.import("map",l.value.map),w.import("ctx",l.value.ctx),f.value=w,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const C=G=>{G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),A())};window.addEventListener("keydown",C)});function W(){s.value=!1,o.value=""}return(y,w)=>{const C=bt("ClientOnly");return d(),m("div",Yu,[L(C,null,{default:O(()=>[(d(),J(Nc,{to:"body"},[jo(g("div",{class:"modal-back",onClick:w[2]||(w[2]=N=>s.value=!1)},[g("div",{class:"modal",onClick:w[1]||(w[1]=Mr(()=>{},["stop"]))},[g("form",Qu,[Xu,jo(g("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":w[0]||(w[0]=N=>o.value=N),placeholder:p.value,maxlength:"64",type:"search",ref_key:"input",ref:r},null,8,Ju),[[wa,o.value]])]),g("div",Zu,[(d(!0),m(te,null,we(T(b(v),N=>N.link.split("/").slice(0,-1).join("-")),(N,U)=>(d(),m("div",{key:U},[g("span",ef,ce(U?U.toString()[0].toUpperCase()+U.toString().slice(1):"Home"),1),(d(!0),m(te,null,we(N,G=>(d(),m("a",{href:i.value+G.link,key:G.id,onClick:W},[g("div",nf,[g("span",sf,ce(G.link.includes("#")?"#":"▤"),1),g("div",of,[g("h3",null,ce(G.title),1),g("p",null,[g("div",{innerHTML:G.preview},null,8,rf)])]),lf])],8,tf))),128))]))),128))]),cf])],512),[[Pa,s.value]])]))]),_:1}),g("div",{id:"docsearch",onClick:w[3]||(w[3]=N=>A())},[g("button",af,[g("span",uf,[ff,g("span",df,ce(_.value),1)]),g("span",hf,[g("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),_f])])])])}}});const mf={},gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},vf=g("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),bf=g("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),yf=[vf,bf];function xf(e,t){return d(),m("svg",gf,yf)}const wf=F(mf,[["render",xf]]),$f=z({__name:"VPLink",props:{href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=se(()=>t.href&&ms.test(t.href));return(s,o)=>(d(),J(mo(e.href?"a":"span"),{class:de(["VPLink",{link:e.href}]),href:e.href?b(Yn)(e.href):void 0,target:b(n)?"_blank":void 0,rel:b(n)?"noreferrer":void 0},{default:O(()=>[S(s.$slots,"default",{},void 0,!0),b(n)&&!e.noIcon?(d(),J(wf,{key:0,class:"icon"})):H("",!0)]),_:3},8,["class","href","target","rel"]))}});const lt=F($f,[["__scopeId","data-v-cd683231"]]),kf=z({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),J(lt,{class:de({VPNavBarMenuLink:!0,active:b(Zt)(b(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:O(()=>[Ce(ce(e.item.text),1)]),_:1},8,["class","href"]))}});const Pf=F(kf,[["__scopeId","data-v-45557806"]]),$o=le();let Dr=!1,Ls=0;function Cf(e){const t=le(!1);if(typeof window<"u"){!Dr&&Sf(),Ls++;const n=nt($o,s=>{var o,i,r;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(r=e.onBlur)==null||r.call(e))});Jt(()=>{n(),Ls--,Ls||Tf()})}return lo(t)}function Sf(){document.addEventListener("focusin",Rr),Dr=!0,$o.value=document.activeElement}function Tf(){document.removeEventListener("focusin",Rr)}function Rr(){$o.value=document.activeElement}const Vf={},Ef={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mf=g("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lf=[Mf];function Af(e,t){return d(),m("svg",Ef,Lf)}const zr=F(Vf,[["render",Af]]),If={},Of={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Nf=g("circle",{cx:"12",cy:"12",r:"2"},null,-1),Bf=g("circle",{cx:"19",cy:"12",r:"2"},null,-1),Ff=g("circle",{cx:"5",cy:"12",r:"2"},null,-1),Hf=[Nf,Bf,Ff];function Df(e,t){return d(),m("svg",Of,Hf)}const Rf=F(If,[["render",Df]]),zf={class:"VPMenuLink"},Uf=z({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),m("div",zf,[L(lt,{class:de({active:b(Zt)(b(t).relativePath,e.item.activeMatch||e.item.link)}),href:e.item.link},{default:O(()=>[Ce(ce(e.item.text),1)]),_:1},8,["class","href"])]))}});const gs=F(Uf,[["__scopeId","data-v-48adf3ca"]]),jf={class:"VPMenuGroup"},qf={key:0,class:"title"},Kf=z({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(d(),m("div",jf,[e.text?(d(),m("p",qf,ce(e.text),1)):H("",!0),(d(!0),m(te,null,we(e.items,s=>(d(),m(te,null,["link"in s?(d(),J(gs,{key:0,item:s},null,8,["item"])):H("",!0)],64))),256))]))}});const Wf=F(Kf,[["__scopeId","data-v-0c1ed08e"]]),Gf={class:"VPMenu"},Yf={key:0,class:"items"},Qf=z({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(d(),m("div",Gf,[e.items?(d(),m("div",Yf,[(d(!0),m(te,null,we(e.items,s=>(d(),m(te,{key:s.text},["link"in s?(d(),J(gs,{key:0,item:s},null,8,["item"])):(d(),J(Wf,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):H("",!0),S(t.$slots,"default",{},void 0,!0)]))}});const Xf=F(Qf,[["__scopeId","data-v-1e25c4ce"]]),Jf=["aria-expanded","aria-label"],Zf={key:0,class:"text"},ed={class:"menu"},td=z({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=le(!1),n=le();Cf({el:n,onBlur:s});function s(){t.value=!1}return(o,i)=>(d(),m("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=r=>t.value=!0),onMouseleave:i[2]||(i[2]=r=>t.value=!1)},[g("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=r=>t.value=!t.value)},[e.button||e.icon?(d(),m("span",Zf,[e.icon?(d(),J(mo(e.icon),{key:0,class:"option-icon"})):H("",!0),Ce(" "+ce(e.button)+" ",1),L(zr,{class:"text-icon"})])):(d(),J(Rf,{key:1,class:"icon"}))],8,Jf),g("div",ed,[L(Xf,{items:e.items},{default:O(()=>[S(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ko=F(td,[["__scopeId","data-v-01da497a"]]),nd=z({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(d(),J(ko,{class:de({VPNavBarMenuGroup:!0,active:b(Zt)(b(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),sd=e=>(Ue("data-v-408d05b6"),e=e(),je(),e),od={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},id=sd(()=>g("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),rd=z({__name:"VPNavBarMenu",setup(e){const{theme:t}=ue();return(n,s)=>b(t).nav?(d(),m("nav",od,[id,(d(!0),m(te,null,we(b(t).nav,o=>(d(),m(te,{key:o.text},["link"in o?(d(),J(Pf,{key:0,item:o},null,8,["item"])):(d(),J(nd,{key:1,item:o},null,8,["item"]))],64))),128))])):H("",!0)}});const ld=F(rd,[["__scopeId","data-v-408d05b6"]]),cd={},ad={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ud=g("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),fd=g("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),dd=[ud,fd];function hd(e,t){return d(),m("svg",ad,dd)}const Ur=F(cd,[["render",hd]]),_d={class:"items"},pd={class:"title"},md=z({__name:"VPNavBarTranslations",setup(e){const{theme:t}=ue();return(n,s)=>b(t).localeLinks?(d(),J(ko,{key:0,class:"VPNavBarTranslations",icon:Ur},{default:O(()=>[g("div",_d,[g("p",pd,ce(b(t).localeLinks.text),1),(d(!0),m(te,null,we(b(t).localeLinks.items,o=>(d(),J(gs,{key:o.link,item:o},null,8,["item"]))),128))])]),_:1})):H("",!0)}});const gd=F(md,[["__scopeId","data-v-c019b0a8"]]);const vd={},bd={class:"VPSwitch",type:"button",role:"switch"},yd={class:"check"},xd={key:0,class:"icon"};function wd(e,t){return d(),m("button",bd,[g("span",yd,[e.$slots.default?(d(),m("span",xd,[S(e.$slots,"default",{},void 0,!0)])):H("",!0)])])}const $d=F(vd,[["render",wd],["__scopeId","data-v-8be94668"]]),kd={},Pd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Cd=Dc('',9),Sd=[Cd];function Td(e,t){return d(),m("svg",Pd,Sd)}const Vd=F(kd,[["render",Td]]),Ed={},Md={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ld=g("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Ad=[Ld];function Id(e,t){return d(),m("svg",Md,Ad)}const Od=F(Ed,[["render",Id]]),Nd=z({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=ue(),s=le(!1),o=typeof localStorage<"u"?i():()=>{};Qe(()=>{s.value=document.documentElement.classList.contains("dark")});function i(){const r=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let c=localStorage.getItem(mi),a=t.value.appearance==="dark"&&c==null||(c==="auto"||c==null?r.matches:c==="dark");r.onchange=p=>{c==="auto"&&_(a=p.matches)};function f(){_(a=!a),c=a?r.matches?"auto":"dark":r.matches?"light":"auto",localStorage.setItem(mi,c)}function _(p){const v=document.createElement("style");v.type="text/css",v.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { -webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; -ms-transition: none !important; transition: none !important; -}`)),document.head.appendChild(v),s.value=p,l[p?"add":"remove"]("dark"),window.getComputedStyle(v).opacity,document.head.removeChild(v)}return f}return nt(s,r=>{n.value=r}),(r,l)=>(d(),J($d,{class:"VPSwitchAppearance","aria-label":"toggle dark mode","aria-checked":s.value,onClick:b(o)},{default:N(()=>[L(Vd,{class:"sun"}),L(Nd,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const Po=F(Od,[["__scopeId","data-v-16a7f83e"]]),Bd={key:0,class:"VPNavBarAppearance"},Fd=z({__name:"VPNavBarAppearance",setup(e){const{site:t}=ue();return(n,s)=>b(t).appearance?(d(),m("div",Bd,[L(Po)])):H("",!0)}});const Hd=F(Fd,[["__scopeId","data-v-24251c90"]]),Dd={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},Rd=["href","innerHTML"],zd=z({__name:"VPSocialLink",props:{icon:null,link:null},setup(e){const t=e,n=se(()=>typeof t.icon=="object"?t.icon.svg:Dd[t.icon]);return(s,o)=>(d(),m("a",{class:"VPSocialLink",href:e.link,target:"_blank",rel:"noopener",innerHTML:b(n)},null,8,Rd))}});const Ud=F(zd,[["__scopeId","data-v-af939139"]]),jd={class:"VPSocialLinks"},qd=z({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(d(),m("div",jd,[(d(!0),m(te,null,we(e.links,({link:s,icon:o})=>(d(),J(Ud,{key:s,icon:o,link:s},null,8,["icon","link"]))),128))]))}});const vs=F(qd,[["__scopeId","data-v-de2bf516"]]),Kd=z({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=ue();return(n,s)=>b(t).socialLinks?(d(),J(vs,{key:0,class:"VPNavBarSocialLinks",links:b(t).socialLinks},null,8,["links"])):H("",!0)}});const Wd=F(Kd,[["__scopeId","data-v-be888c46"]]),Gd=e=>(Ue("data-v-7af1585b"),e=e(),je(),e),Yd={key:0,class:"group"},Qd={class:"trans-title"},Xd={key:1,class:"group"},Jd={class:"item appearance"},Zd=Gd(()=>g("p",{class:"label"},"Appearance",-1)),eh={class:"appearance-action"},th={key:2,class:"group"},nh={class:"item social-links"},sh=z({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=ue(),s=se(()=>n.value.localeLinks||t.value.appearance||n.value.socialLinks);return(o,i)=>b(s)?(d(),J(ko,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:N(()=>[b(n).localeLinks?(d(),m("div",Yd,[g("p",Qd,ce(b(n).localeLinks.text),1),(d(!0),m(te,null,we(b(n).localeLinks.items,r=>(d(),J(gs,{key:r.link,item:r},null,8,["item"]))),128))])):H("",!0),b(t).appearance?(d(),m("div",Xd,[g("div",Jd,[Zd,g("div",eh,[L(Po)])])])):H("",!0),b(n).socialLinks?(d(),m("div",th,[g("div",nh,[L(vs,{class:"social-links-list",links:b(n).socialLinks},null,8,["links"])])])):H("",!0)]),_:1})):H("",!0)}});const oh=F(sh,[["__scopeId","data-v-7af1585b"]]),ih=e=>(Ue("data-v-670493dd"),e=e(),je(),e),rh=["aria-expanded"],lh=ih(()=>g("span",{class:"container"},[g("span",{class:"top"}),g("span",{class:"middle"}),g("span",{class:"bottom"})],-1)),ch=[lh],ah=z({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(d(),m("button",{type:"button",class:de(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},ch,10,rh))}});const uh=F(ah,[["__scopeId","data-v-670493dd"]]),fh={class:"container"},dh={class:"content"},hh=z({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{hasSidebar:t}=Xe();return(n,s)=>(d(),m("div",{class:de(["VPNavBar",{"has-sidebar":b(t)}])},[g("div",fh,[L(ku,null,{"nav-bar-title-before":N(()=>[S(n.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":N(()=>[S(n.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3}),g("div",dh,[S(n.$slots,"nav-bar-content-before",{},void 0,!0),L(pf,{class:"search"}),L(ld,{class:"menu"}),L(gd,{class:"translations"}),L(Hd,{class:"appearance"}),L(Wd,{class:"social-links"}),L(oh,{class:"extra"}),S(n.$slots,"nav-bar-content-after",{},void 0,!0),L(uh,{class:"hamburger",active:e.isScreenOpen,onClick:s[0]||(s[0]=o=>n.$emit("toggle-screen"))},null,8,["active"])])])],2))}});const _h=F(hh,[["__scopeId","data-v-26cab421"]]);function ph(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1),Ut=[],Zn=!1,So=-1,dn=void 0,Et=void 0,hn=void 0,jr=function(t){return Ut.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(t))})},es=function(t){var n=t||window.event;return jr(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},mh=function(t){if(hn===void 0){var n=!!t&&t.reserveScrollBarGap===!0,s=window.innerWidth-document.documentElement.clientWidth;if(n&&s>0){var o=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);hn=document.body.style.paddingRight,document.body.style.paddingRight=o+s+"px"}}dn===void 0&&(dn=document.body.style.overflow,document.body.style.overflow="hidden")},gh=function(){hn!==void 0&&(document.body.style.paddingRight=hn,hn=void 0),dn!==void 0&&(document.body.style.overflow=dn,dn=void 0)},vh=function(){return window.requestAnimationFrame(function(){if(Et===void 0){Et={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var t=window,n=t.scrollY,s=t.scrollX,o=t.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-s,setTimeout(function(){return window.requestAnimationFrame(function(){var i=o-window.innerHeight;i&&n>=o&&(document.body.style.top=-(n+i))})},300)}})},bh=function(){if(Et!==void 0){var t=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=Et.position,document.body.style.top=Et.top,document.body.style.left=Et.left,window.scrollTo(n,t),Et=void 0}},yh=function(t){return t?t.scrollHeight-t.scrollTop<=t.clientHeight:!1},xh=function(t,n){var s=t.targetTouches[0].clientY-So;return jr(t.target)?!1:n&&n.scrollTop===0&&s>0||yh(n)&&s<0?es(t):(t.stopPropagation(),!0)},qr=function(t,n){if(!t){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Ut.some(function(o){return o.targetElement===t})){var s={targetElement:t,options:n||{}};Ut=[].concat(ph(Ut),[s]),Jn?vh():mh(n),Jn&&(t.ontouchstart=function(o){o.targetTouches.length===1&&(So=o.targetTouches[0].clientY)},t.ontouchmove=function(o){o.targetTouches.length===1&&xh(o,t)},Zn||(document.addEventListener("touchmove",es,Co?{passive:!1}:void 0),Zn=!0))}},Kr=function(){Jn&&(Ut.forEach(function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null}),Zn&&(document.removeEventListener("touchmove",es,Co?{passive:!1}:void 0),Zn=!1),So=-1),Jn?bh():gh(),Ut=[]};const wh=z({__name:"VPNavScreenMenuLink",props:{text:null,link:null},setup(e){const t=Be("close-screen");return(n,s)=>(d(),J(lt,{class:"VPNavScreenMenuLink",href:e.link,onClick:b(t)},{default:N(()=>[Ce(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const $h=F(wh,[["__scopeId","data-v-e12f8075"]]),kh={},Ph={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ch=g("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Sh=[Ch];function Th(e,t){return d(),m("svg",Ph,Sh)}const Vh=F(kh,[["render",Th]]),Eh=z({__name:"VPNavScreenMenuGroupLink",props:{text:null,link:null},setup(e){const t=Be("close-screen");return(n,s)=>(d(),J(lt,{class:"VPNavScreenMenuGroupLink",href:e.link,onClick:b(t)},{default:N(()=>[Ce(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const Wr=F(Eh,[["__scopeId","data-v-c2f3a51b"]]),Mh={class:"VPNavScreenMenuGroupSection"},Lh={key:0,class:"title"},Ah=z({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(d(),m("div",Mh,[e.text?(d(),m("p",Lh,ce(e.text),1)):H("",!0),(d(!0),m(te,null,we(e.items,s=>(d(),J(Wr,{key:s.text,text:s.text,link:s.link},null,8,["text","link"]))),128))]))}});const Ih=F(Ah,[["__scopeId","data-v-eb049aaa"]]),Nh=["aria-controls","aria-expanded"],Oh={class:"button-text"},Bh=["id"],Fh={key:1,class:"group"},Hh=z({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=le(!1),s=se(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(i,r)=>(d(),m("div",{class:de(["VPNavScreenMenuGroup",{open:n.value}])},[g("button",{class:"button","aria-controls":b(s),"aria-expanded":n.value,onClick:o},[g("span",Oh,ce(e.text),1),L(Vh,{class:"button-icon"})],8,Nh),g("div",{id:b(s),class:"items"},[(d(!0),m(te,null,we(e.items,l=>(d(),m(te,{key:l.text},["link"in l?(d(),m("div",{key:l.text,class:"item"},[L(Wr,{text:l.text,link:l.link},null,8,["text","link"])])):(d(),m("div",Fh,[L(Ih,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,Bh)],2))}});const Dh=F(Hh,[["__scopeId","data-v-96152f1d"]]),Rh={key:0,class:"VPNavScreenMenu"},zh=z({__name:"VPNavScreenMenu",setup(e){const{theme:t}=ue();return(n,s)=>b(t).nav?(d(),m("nav",Rh,[(d(!0),m(te,null,we(b(t).nav,o=>(d(),m(te,{key:o.text},["link"in o?(d(),J($h,{key:0,text:o.text,link:o.link},null,8,["text","link"])):(d(),J(Dh,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):H("",!0)}}),Uh=e=>(Ue("data-v-8eb2f92e"),e=e(),je(),e),jh={key:0,class:"VPNavScreenAppearance"},qh=Uh(()=>g("p",{class:"text"},"Appearance",-1)),Kh=z({__name:"VPNavScreenAppearance",setup(e){const{site:t}=ue();return(n,s)=>b(t).appearance?(d(),m("div",jh,[qh,L(Po)])):H("",!0)}});const Wh=F(Kh,[["__scopeId","data-v-8eb2f92e"]]),Gh={class:"list"},Yh=["href"],Qh=z({__name:"VPNavScreenTranslations",setup(e){const{theme:t}=ue(),n=le(!1);function s(){n.value=!n.value}return(o,i)=>b(t).localeLinks?(d(),m("div",{key:0,class:de(["VPNavScreenTranslations",{open:n.value}])},[g("button",{class:"title",onClick:s},[L(Ur,{class:"icon lang"}),Ce(" "+ce(b(t).localeLinks.text)+" ",1),L(zr,{class:"icon chevron"})]),g("ul",Gh,[(d(!0),m(te,null,we(b(t).localeLinks.items,r=>(d(),m("li",{key:r.link,class:"item"},[g("a",{class:"link",href:r.link},ce(r.text),9,Yh)]))),128))])],2)):H("",!0)}});const Xh=F(Qh,[["__scopeId","data-v-75346612"]]),Jh=z({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=ue();return(n,s)=>b(t).socialLinks?(d(),J(vs,{key:0,class:"VPNavScreenSocialLinks",links:b(t).socialLinks},null,8,["links"])):H("",!0)}}),Zh={class:"container"},e1=z({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=le(null);function n(){qr(t.value,{reserveScrollBarGap:!0})}function s(){Kr()}return(o,i)=>(d(),J(ps,{name:"fade",onEnter:n,onAfterLeave:s},{default:N(()=>[e.open?(d(),m("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t},[g("div",Zh,[S(o.$slots,"nav-screen-content-before",{},void 0,!0),L(zh,{class:"menu"}),L(Xh,{class:"translations"}),L(Wh,{class:"appearance"}),L(Jh,{class:"social-links"}),S(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):H("",!0)]),_:3}))}});const t1=F(e1,[["__scopeId","data-v-27d88b68"]]),n1=z({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=vu(),{hasSidebar:o}=Xe();return Rt("close-screen",n),(i,r)=>(d(),m("header",{class:de(["VPNav",{"no-sidebar":!b(o)}])},[L(_h,{"is-screen-open":b(t),onToggleScreen:b(s)},{"nav-bar-title-before":N(()=>[S(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":N(()=>[S(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":N(()=>[S(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":N(()=>[S(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),L(t1,{open:b(t)},{"nav-screen-content-before":N(()=>[S(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":N(()=>[S(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])],2))}});const s1=F(n1,[["__scopeId","data-v-264fabfc"]]),o1={},i1={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},r1=g("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),l1=g("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),c1=g("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),a1=g("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),u1=[r1,l1,c1,a1];function f1(e,t){return d(),m("svg",i1,u1)}const d1=F(o1,[["render",f1]]),h1=e=>(Ue("data-v-232414b9"),e=e(),je(),e),_1={key:0,class:"VPLocalNav"},p1=["aria-expanded"],m1=h1(()=>g("span",{class:"menu-text"},"Menu",-1)),g1=z({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{hasSidebar:t}=Xe();function n(){window.scrollTo({top:0,left:0,behavior:"smooth"})}return(s,o)=>b(t)?(d(),m("div",_1,[g("button",{class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:o[0]||(o[0]=i=>s.$emit("open-menu"))},[L(d1,{class:"menu-icon"}),m1],8,p1),g("a",{class:"top-link",href:"#",onClick:n}," Return to top ")])):H("",!0)}});const v1=F(g1,[["__scopeId","data-v-232414b9"]]),b1={},y1={version:"1.1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},x1=g("path",{d:"M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2z M20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z"},null,-1),w1=g("path",{d:"M16,11h-3V8c0-0.6-0.4-1-1-1s-1,0.4-1,1v3H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h3v3c0,0.6,0.4,1,1,1s1-0.4,1-1v-3h3c0.6,0,1-0.4,1-1S16.6,11,16,11z"},null,-1),$1=[x1,w1];function k1(e,t){return d(),m("svg",y1,$1)}const P1=F(b1,[["render",k1]]),C1={},S1={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},T1=g("path",{d:"M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2zM20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z"},null,-1),V1=g("path",{d:"M16,11H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h8c0.6,0,1-0.4,1-1S16.6,11,16,11z"},null,-1),E1=[T1,V1];function M1(e,t){return d(),m("svg",S1,E1)}const L1=F(C1,[["render",M1]]),A1=["innerHTML"],I1=z({__name:"VPSidebarLink",props:{item:null,depth:{default:1}},setup(e){const t=e,{page:n,frontmatter:s}=ue(),o=se(()=>s.value.sidebarDepth||1/0),i=se(()=>Zt(n.value.relativePath,t.item.link)),{isSidebarEnabled:r}=Xe(),l=Be("close-sidebar"),c=Be("is-sidebar-open"),a=le(null);return gt(()=>{var f,_;c.value&&i.value&&((_=(f=a.value)==null?void 0:f.$el)==null||_.focus())}),(f,_)=>{const p=bt("VPSidebarLink",!0);return d(),m(te,null,[L(lt,{class:de(["link",{active:b(i)}]),style:ts({paddingLeft:16*(e.depth-1)+"px"}),href:e.item.link,tabindex:b(r)||b(c)?0:-1,onClick:b(l),ref_key:"link",ref:a},{default:N(()=>[g("span",{innerHTML:e.item.text,class:de(["link-text",{light:e.depth>1}])},null,10,A1)]),_:1},8,["class","style","href","tabindex","onClick"]),"items"in e.item&&e.depth(d(),J(p,{key:v.link,item:v,depth:e.depth+1},null,8,["item","depth"]))),128)):H("",!0)],64)}}});const N1=F(I1,[["__scopeId","data-v-9ac6cb77"]]),O1=["role"],B1=["innerHTML"],F1={class:"action"},H1={class:"items"},D1=z({__name:"VPSidebarGroup",props:{text:null,items:null,collapsible:{type:Boolean},collapsed:{type:Boolean}},setup(e){const t=e,n=le(!1);gt(()=>{n.value=!!(t.collapsible&&t.collapsed)});const{page:s}=ue();gt(()=>{t.items.some(i=>Zt(s.value.relativePath,i.link))&&(n.value=!1)});function o(){t.collapsible&&(n.value=!n.value)}return(i,r)=>(d(),m("section",{class:de(["VPSidebarGroup",{collapsible:e.collapsible,collapsed:n.value}])},[e.text?(d(),m("div",{key:0,class:"title",role:e.collapsible?"button":void 0,onClick:o},[g("h2",{innerHTML:e.text,class:"title-text"},null,8,B1),g("div",F1,[L(L1,{class:"icon minus"}),L(P1,{class:"icon plus"})])],8,O1)):H("",!0),g("div",H1,[(d(!0),m(te,null,we(e.items,l=>(d(),J(N1,{key:l.link,item:l},null,8,["item"]))),128))])],2))}});const R1=F(D1,[["__scopeId","data-v-6a6002da"]]),z1=e=>(Ue("data-v-21951dfa"),e=e(),je(),e),U1={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},j1=z1(()=>g("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),q1=z({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebar:n,hasSidebar:s}=Xe();let o=le(null);function i(){qr(o.value,{reserveScrollBarGap:!0})}function r(){Kr()}return sc(async()=>{var l;t.open?(i(),(l=o.value)==null||l.focus()):r()}),(l,c)=>b(s)?(d(),m("aside",{key:0,class:de(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:c[0]||(c[0]=Mr(()=>{},["stop"]))},[g("nav",U1,[j1,S(l.$slots,"sidebar-nav-before",{},void 0,!0),(d(!0),m(te,null,we(b(n),a=>(d(),m("div",{key:a.text,class:"group"},[L(R1,{text:a.text,items:a.items,collapsible:a.collapsible,collapsed:a.collapsed},null,8,["text","items","collapsible","collapsed"])]))),128)),S(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):H("",!0)}});const K1=F(q1,[["__scopeId","data-v-21951dfa"]]),W1={},G1={class:"VPPage"};function Y1(e,t){const n=bt("Content");return d(),m("div",G1,[L(n)])}const Q1=F(W1,[["render",Y1]]),X1=z({__name:"VPButton",props:{tag:null,size:null,theme:null,text:null,href:null},setup(e){const t=e,n=se(()=>[t.size??"medium",t.theme??"brand"]),s=se(()=>t.href&&ms.test(t.href)),o=se(()=>t.tag?t.tag:t.href?"a":"button");return(i,r)=>(d(),J(mo(b(o)),{class:de(["VPButton",b(n)]),href:e.href?b(Yn)(e.href):void 0,target:b(s)?"_blank":void 0,rel:b(s)?"noreferrer":void 0},{default:N(()=>[Ce(ce(e.text),1)]),_:1},8,["class","href","target","rel"]))}});const J1=F(X1,[["__scopeId","data-v-469117db"]]),Z1=e=>(Ue("data-v-f3cc6bab"),e=e(),je(),e),e0={class:"container"},t0={class:"main"},n0={key:0,class:"name"},s0={class:"clip"},o0={key:1,class:"text"},i0={key:2,class:"tagline"},r0={key:3,class:"actions"},l0={key:0,class:"image"},c0={class:"image-container"},a0=Z1(()=>g("div",{class:"image-bg"},null,-1)),u0=z({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=Be("hero-image-slot-exists");return(n,s)=>(d(),m("div",{class:de(["VPHero",{"has-image":e.image||b(t)}])},[g("div",e0,[g("div",t0,[e.name?(d(),m("h1",n0,[g("span",s0,ce(e.name),1)])):H("",!0),e.text?(d(),m("p",o0,ce(e.text),1)):H("",!0),e.tagline?(d(),m("p",i0,ce(e.tagline),1)):H("",!0),e.actions?(d(),m("div",r0,[(d(!0),m(te,null,we(e.actions,o=>(d(),m("div",{key:o.link,class:"action"},[L(J1,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):H("",!0)]),e.image||b(t)?(d(),m("div",l0,[g("div",c0,[a0,S(n.$slots,"home-hero-image",{},()=>[e.image?(d(),J(wo,{key:0,class:"image-src",image:e.image},null,8,["image"])):H("",!0)],!0)])])):H("",!0)])],2))}});const f0=F(u0,[["__scopeId","data-v-f3cc6bab"]]),d0=z({__name:"VPHomeHero",setup(e){const{frontmatter:t}=ue();return(n,s)=>b(t).hero?(d(),J(f0,{key:0,class:"VPHomeHero",name:b(t).hero.name,text:b(t).hero.text,tagline:b(t).hero.tagline,image:b(t).hero.image,actions:b(t).hero.actions},{"home-hero-image":N(()=>[S(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):H("",!0)}}),h0={},_0={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},p0=g("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),m0=[p0];function g0(e,t){return d(),m("svg",_0,m0)}const v0=F(h0,[["render",g0]]),b0={class:"box"},y0={key:1,class:"icon"},x0={class:"title"},w0={class:"details"},$0={key:2,class:"link-text"},k0={class:"link-text-value"},P0=z({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null},setup(e){return(t,n)=>(d(),J(lt,{class:"VPFeature",href:e.link,"no-icon":!0},{default:N(()=>[g("article",b0,[typeof e.icon=="object"?(d(),J(wo,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(d(),m("div",y0,ce(e.icon),1)):H("",!0),g("h2",x0,ce(e.title),1),g("p",w0,ce(e.details),1),e.linkText?(d(),m("div",$0,[g("p",k0,[Ce(ce(e.linkText)+" ",1),L(v0,{class:"link-text-icon"})])])):H("",!0)])]),_:1},8,["href"]))}});const C0=F(P0,[["__scopeId","data-v-b1d983a8"]]),S0={key:0,class:"VPFeatures"},T0={class:"container"},V0={class:"items"},E0=z({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=se(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s%2===0)return"grid-4"}else return});return(s,o)=>e.features?(d(),m("div",S0,[g("div",T0,[g("div",V0,[(d(!0),m(te,null,we(e.features,i=>(d(),m("div",{key:i.title,class:de(["item",[b(n)]])},[L(C0,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):H("",!0)}});const M0=F(E0,[["__scopeId","data-v-5e2470ab"]]),L0=z({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=ue();return(n,s)=>b(t).features?(d(),J(M0,{key:0,class:"VPHomeFeatures",features:b(t).features},null,8,["features"])):H("",!0)}}),A0={class:"VPHome"},I0=z({__name:"VPHome",setup(e){return(t,n)=>{const s=bt("Content");return d(),m("div",A0,[S(t.$slots,"home-hero-before",{},void 0,!0),L(d0,null,{"home-hero-image":N(()=>[S(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),S(t.$slots,"home-hero-after",{},void 0,!0),S(t.$slots,"home-features-before",{},void 0,!0),L(L0),S(t.$slots,"home-features-after",{},void 0,!0),L(s)])}}});const N0=F(I0,[["__scopeId","data-v-a6ccdea8"]]);function O0(){const{hasSidebar:e}=Xe(),t=Ws("(min-width: 960px)"),n=Ws("(min-width: 1280px)");return{isAsideEnabled:se(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const B0=71;function F0(e){if(e===!1)return[];let t=[];return document.querySelectorAll("h2, h3, h4, h5, h6").forEach(n=>{n.textContent&&n.id&&t.push({level:Number(n.tagName[1]),title:n.innerText.replace(/\s+#\s*$/,""),link:`#${n.id}`})}),H0(t,e)}function H0(e,t=2){return D0(e,typeof t=="number"?[t,t]:t==="deep"?[2,6]:t)}function D0(e,t){const n=[];return e=e.map(s=>({...s})),e.forEach((s,o)=>{s.level>=t[0]&&s.level<=t[1]&&R0(o,e,t)&&n.push(s)}),n}function R0(e,t,n){if(e===0)return!0;const s=t[e];for(let o=e-1;o>=0;o--){const i=t[o];if(i.level=n[0]&&i.level<=n[1])return i.children==null&&(i.children=[]),i.children.push(s),!1}return!0}function z0(e,t){const{isAsideEnabled:n}=O0(),s=uu(i,100);let o=null;Qe(()=>{requestAnimationFrame(i),window.addEventListener("scroll",s)}),_o(()=>{r(location.hash)}),Jt(()=>{window.removeEventListener("scroll",s)});function i(){if(!n.value)return;const l=[].slice.call(e.value.querySelectorAll(".outline-link")),c=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(v=>l.some(T=>T.hash===v.hash&&v.offsetParent!==null)),a=window.scrollY,f=window.innerHeight,_=document.body.offsetHeight,p=Math.abs(a+f-_)<1;if(c.length&&p){r(c[c.length-1].hash);return}for(let v=0;v{const s=bt("VPDocAsideOutlineItem",!0);return d(),m("ul",{class:de(e.root?"root":"nested")},[(d(!0),m(te,null,we(e.headers,({children:o,link:i,title:r})=>(d(),m("li",null,[g("a",{class:"outline-link",href:i,onClick:n[0]||(n[0]=(...l)=>e.onClick&&e.onClick(...l))},ce(r),9,j0),o!=null&&o.length?(d(),J(s,{key:0,headers:o,onClick:e.onClick},null,8,["headers","onClick"])):H("",!0)]))),256))],2)}}});const K0=F(q0,[["__scopeId","data-v-0eba5460"]]),W0=e=>(Ue("data-v-586090b2"),e=e(),je(),e),G0={class:"content"},Y0={class:"outline-title"},Q0={"aria-labelledby":"doc-outline-aria-label"},X0=W0(()=>g("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),J0=z({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=ue(),s=se(()=>t.value.outline??n.value.outline),o=Be("onContentUpdated");o.value=()=>{i.value=F0(s.value)};const i=le([]),r=se(()=>i.value.length>0),l=le(),c=le();z0(l,c);function a({target:f}){const _="#"+f.href.split("#")[1],p=document.querySelector(decodeURIComponent(_));p==null||p.focus()}return(f,_)=>(d(),m("div",{class:de(["VPDocAsideOutline",{"has-outline":b(r)}]),ref_key:"container",ref:l},[g("div",G0,[g("div",{class:"outline-marker",ref_key:"marker",ref:c},null,512),g("div",Y0,ce(b(n).outlineTitle||"On this page"),1),g("nav",Q0,[X0,L(K0,{headers:i.value,root:!0,onClick:a},null,8,["headers"])])])],2))}});const Z0=F(J0,[["__scopeId","data-v-586090b2"]]),e_={class:"VPDocAsideCarbonAds"},t_=z({__name:"VPDocAsideCarbonAds",setup(e){const t=()=>null;return(n,s)=>(d(),m("div",e_,[L(b(t))]))}}),n_=e=>(Ue("data-v-39cd9708"),e=e(),je(),e),s_={class:"VPDocAside"},o_=n_(()=>g("div",{class:"spacer"},null,-1)),i_=z({__name:"VPDocAside",setup(e){const{theme:t}=ue();return(n,s)=>(d(),m("div",s_,[S(n.$slots,"aside-top",{},void 0,!0),S(n.$slots,"aside-outline-before",{},void 0,!0),L(Z0),S(n.$slots,"aside-outline-after",{},void 0,!0),o_,S(n.$slots,"aside-ads-before",{},void 0,!0),b(t).carbonAds?(d(),J(t_,{key:0})):H("",!0),S(n.$slots,"aside-ads-after",{},void 0,!0),S(n.$slots,"aside-bottom",{},void 0,!0)]))}});const r_=F(i_,[["__scopeId","data-v-39cd9708"]]);function l_(){const{theme:e,page:t}=ue();return se(()=>{const{text:n="Edit this page",pattern:s}=e.value.editLink||{},{relativePath:o}=t.value;return{url:s.replace(/:path/g,o),text:n}})}function c_(){const{page:e,theme:t,frontmatter:n}=ue();return se(()=>{const s=Fr(t.value.sidebar,e.value.relativePath),o=fu(s),i=o.findIndex(r=>Zt(e.value.relativePath,r.link));return{prev:n.value.prev?{...o[i-1],text:n.value.prev}:o[i-1],next:n.value.next?{...o[i+1],text:n.value.next}:o[i+1]}})}const a_={},u_={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},f_=g("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),d_=g("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),h_=[f_,d_];function __(e,t){return d(),m("svg",u_,h_)}const p_=F(a_,[["render",__]]),m_={class:"VPLastUpdated"},g_=["datetime"],v_=z({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n}=ue(),s=se(()=>new Date(n.value.lastUpdated)),o=se(()=>s.value.toISOString()),i=le("");return Qe(()=>{gt(()=>{i.value=s.value.toLocaleString(window.navigator.language)})}),(r,l)=>(d(),m("p",m_,[Ce(ce(b(t).lastUpdatedText??"Last updated")+": ",1),g("time",{datetime:b(o)},ce(i.value),9,g_)]))}});const b_=F(v_,[["__scopeId","data-v-cc1176cb"]]),y_={key:0,class:"VPDocFooter"},x_={key:0,class:"edit-info"},w_={key:0,class:"edit-link"},$_={key:1,class:"last-updated"},k_={key:1,class:"prev-next"},P_={class:"pager"},C_=["href"],S_=["innerHTML"],T_=["innerHTML"],V_=["href"],E_=["innerHTML"],M_=["innerHTML"],L_=z({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=ue(),o=l_(),i=c_(),r=se(()=>t.value.editLink&&s.value.editLink!==!1),l=se(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),c=se(()=>r.value||l.value||i.value.prev||i.value.next);return(a,f)=>{var _,p;return b(c)?(d(),m("footer",y_,[b(r)||b(l)?(d(),m("div",x_,[b(r)?(d(),m("div",w_,[L(lt,{class:"edit-link-button",href:b(o).url,"no-icon":!0},{default:N(()=>[L(p_,{class:"edit-link-icon"}),Ce(" "+ce(b(o).text),1)]),_:1},8,["href"])])):H("",!0),b(l)?(d(),m("div",$_,[L(b_)])):H("",!0)])):H("",!0),b(i).prev||b(i).next?(d(),m("div",k_,[g("div",P_,[b(i).prev?(d(),m("a",{key:0,class:"pager-link prev",href:b(Yn)(b(i).prev.link)},[g("span",{class:"desc",innerHTML:((_=b(t).docFooter)==null?void 0:_.prev)??"Previous page"},null,8,S_),g("span",{class:"title",innerHTML:b(i).prev.text},null,8,T_)],8,C_)):H("",!0)]),g("div",{class:de(["pager",{"has-prev":b(i).prev}])},[b(i).next?(d(),m("a",{key:0,class:"pager-link next",href:b(Yn)(b(i).next.link)},[g("span",{class:"desc",innerHTML:((p=b(t).docFooter)==null?void 0:p.next)??"Next page"},null,8,E_),g("span",{class:"title",innerHTML:b(i).next.text},null,8,M_)],8,V_)):H("",!0)],2)])):H("",!0)])):H("",!0)}}});const A_=F(L_,[["__scopeId","data-v-cbbeb5ab"]]),I_=e=>(Ue("data-v-317b0207"),e=e(),je(),e),N_={class:"container"},O_={key:0,class:"aside"},B_=I_(()=>g("div",{class:"aside-curtain"},null,-1)),F_={class:"aside-container"},H_={class:"aside-content"},D_={class:"content"},R_={class:"content-container"},z_={class:"main"},U_=z({__name:"VPDoc",setup(e){const t=yt(),{hasSidebar:n,hasAside:s}=Xe(),o=se(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,"")),i=le();return Rt("onContentUpdated",i),(r,l)=>{const c=bt("Content");return d(),m("div",{class:de(["VPDoc",{"has-sidebar":b(n),"has-aside":b(s)}])},[g("div",N_,[b(s)?(d(),m("div",O_,[B_,g("div",F_,[g("div",H_,[L(r_,null,{"aside-top":N(()=>[S(r.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":N(()=>[S(r.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":N(()=>[S(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":N(()=>[S(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":N(()=>[S(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":N(()=>[S(r.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])])):H("",!0),g("div",D_,[g("div",R_,[S(r.$slots,"doc-before",{},void 0,!0),g("main",z_,[L(c,{class:de(["vp-doc",b(o)]),onContentUpdated:i.value},null,8,["class","onContentUpdated"])]),S(r.$slots,"doc-footer-before",{},void 0,!0),L(A_),S(r.$slots,"doc-after",{},void 0,!0)])])])],2)}}});const j_=F(U_,[["__scopeId","data-v-317b0207"]]),q_=z({__name:"VPContent",setup(e){const t=yt(),{frontmatter:n}=ue(),{hasSidebar:s}=Xe(),o=Be("NotFound");return(i,r)=>(d(),m("div",{class:de(["VPContent",{"has-sidebar":b(s),"is-home":b(n).layout==="home"}]),id:"VPContent"},[b(t).component===b(o)?(d(),J(b(o),{key:0})):b(n).layout==="page"?(d(),J(Q1,{key:1})):b(n).layout==="home"?(d(),J(N0,{key:2},{"home-hero-before":N(()=>[S(i.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":N(()=>[S(i.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":N(()=>[S(i.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":N(()=>[S(i.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":N(()=>[S(i.$slots,"home-features-after",{},void 0,!0)]),_:3})):(d(),J(j_,{key:3},{"doc-footer-before":N(()=>[S(i.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":N(()=>[S(i.$slots,"doc-before",{},void 0,!0)]),"doc-after":N(()=>[S(i.$slots,"doc-after",{},void 0,!0)]),"aside-top":N(()=>[S(i.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":N(()=>[S(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":N(()=>[S(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":N(()=>[S(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":N(()=>[S(i.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":N(()=>[S(i.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const K_=F(q_,[["__scopeId","data-v-ac201f45"]]),W_={class:"container"},G_=["innerHTML"],Y_=["innerHTML"],Q_=z({__name:"VPFooter",setup(e){const{theme:t}=ue(),{hasSidebar:n}=Xe();return(s,o)=>b(t).footer?(d(),m("footer",{key:0,class:de(["VPFooter",{"has-sidebar":b(n)}])},[g("div",W_,[b(t).footer.message?(d(),m("p",{key:0,class:"message",innerHTML:b(t).footer.message},null,8,G_)):H("",!0),b(t).footer.copyright?(d(),m("p",{key:1,class:"copyright",innerHTML:b(t).footer.copyright},null,8,Y_)):H("",!0)])],2)):H("",!0)}});const X_=F(Q_,[["__scopeId","data-v-1a0cce0c"]]),J_={key:0,class:"Layout"},Z_=z({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=Xe(),o=yt();nt(()=>o.path,s),du(t,s),Rt("close-sidebar",s),Rt("is-sidebar-open",t);const{frontmatter:i}=ue(),r=Yc(),l=se(()=>!!r["home-hero-image"]);return Rt("hero-image-slot-exists",l),(c,a)=>{const f=bt("Content");return b(i).layout!==!1?(d(),m("div",J_,[S(c.$slots,"layout-top",{},void 0,!0),L(_u),L(gu,{class:"backdrop",show:b(t),onClick:b(s)},null,8,["show","onClick"]),L(s1,null,{"nav-bar-title-before":N(()=>[S(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":N(()=>[S(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":N(()=>[S(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":N(()=>[S(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":N(()=>[S(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":N(()=>[S(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),L(v1,{open:b(t),onOpenMenu:b(n)},null,8,["open","onOpenMenu"]),L(K1,{open:b(t)},{"sidebar-nav-before":N(()=>[S(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":N(()=>[S(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),L(K_,null,{"home-hero-before":N(()=>[S(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":N(()=>[S(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":N(()=>[S(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":N(()=>[S(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":N(()=>[S(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":N(()=>[S(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":N(()=>[S(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":N(()=>[S(c.$slots,"doc-after",{},void 0,!0)]),"aside-top":N(()=>[S(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":N(()=>[S(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":N(()=>[S(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":N(()=>[S(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":N(()=>[S(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":N(()=>[S(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),L(X_),S(c.$slots,"layout-bottom",{},void 0,!0)])):(d(),J(f,{key:1}))}}});const ep=F(Z_,[["__scopeId","data-v-5aaf92e7"]]),bs=e=>(Ue("data-v-1bf9e22d"),e=e(),je(),e),tp={class:"NotFound"},np=bs(()=>g("p",{class:"code"},"404",-1)),sp=bs(()=>g("h1",{class:"title"},"PAGE NOT FOUND",-1)),op=bs(()=>g("div",{class:"divider"},null,-1)),ip=bs(()=>g("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),rp={class:"action"},lp=["href"],cp=z({__name:"NotFound",setup(e){const{site:t}=ue();return(n,s)=>(d(),m("div",tp,[np,sp,op,ip,g("div",rp,[g("a",{class:"link",href:b(t).base,"aria-label":"go to home"}," Take me home ",8,lp)])]))}});const ap=F(cp,[["__scopeId","data-v-1bf9e22d"]]),up={},fp={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},dp=g("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),hp=[dp];function _p(e,t){return d(),m("svg",fp,hp)}const pp=F(up,[["render",_p]]);const mp={},gp={class:"VPTeamPage"};function vp(e,t){return d(),m("div",gp,[S(e.$slots,"default")])}const dm=F(mp,[["render",vp],["__scopeId","data-v-05fecbf1"]]);const bp={},yp={class:"VPTeamPageTitle"},xp={key:0,class:"title"},wp={key:1,class:"lead"};function $p(e,t){return d(),m("div",yp,[e.$slots.title?(d(),m("h1",xp,[S(e.$slots,"title",{},void 0,!0)])):H("",!0),e.$slots.lead?(d(),m("p",wp,[S(e.$slots,"lead",{},void 0,!0)])):H("",!0)])}const hm=F(bp,[["render",$p],["__scopeId","data-v-6ce551d6"]]);const kp={},Pp=e=>(Ue("data-v-c2a5c7dd"),e=e(),je(),e),Cp={class:"VPTeamPageSection"},Sp={class:"title"},Tp=Pp(()=>g("div",{class:"title-line"},null,-1)),Vp={key:0,class:"title-text"},Ep={key:0,class:"lead"},Mp={key:1,class:"members"};function Lp(e,t){return d(),m("section",Cp,[g("div",Sp,[Tp,e.$slots.title?(d(),m("h2",Vp,[S(e.$slots,"title",{},void 0,!0)])):H("",!0)]),e.$slots.lead?(d(),m("p",Ep,[S(e.$slots,"lead",{},void 0,!0)])):H("",!0),e.$slots.members?(d(),m("div",Mp,[S(e.$slots,"members",{},void 0,!0)])):H("",!0)])}const _m=F(kp,[["render",Lp],["__scopeId","data-v-c2a5c7dd"]]),Ap={class:"profile"},Ip={class:"avatar"},Np=["src","alt"],Op={class:"data"},Bp={class:"name"},Fp={key:0,class:"affiliation"},Hp={key:0,class:"title"},Dp={key:1,class:"at"},Rp={key:1,class:"desc"},zp={key:2,class:"links"},Up={key:0,class:"sp"},jp=z({__name:"VPTeamMembersItem",props:{size:null,member:null},setup(e){return(t,n)=>(d(),m("article",{class:de(["VPTeamMembersItem",[e.size??"medium"]])},[g("div",Ap,[g("figure",Ip,[g("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Np)]),g("div",Op,[g("h1",Bp,ce(e.member.name),1),e.member.title||e.member.org?(d(),m("p",Fp,[e.member.title?(d(),m("span",Hp,ce(e.member.title),1)):H("",!0),e.member.title&&e.member.org?(d(),m("span",Dp," @ ")):H("",!0),e.member.org?(d(),J(lt,{key:2,class:de(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:N(()=>[Ce(ce(e.member.org),1)]),_:1},8,["class","href"])):H("",!0)])):H("",!0),e.member.desc?(d(),m("p",Rp,ce(e.member.desc),1)):H("",!0),e.member.links?(d(),m("div",zp,[L(vs,{links:e.member.links},null,8,["links"])])):H("",!0)])]),e.member.sponsor?(d(),m("div",Up,[L(lt,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:N(()=>[L(pp,{class:"sp-icon"}),Ce(" Sponsor ")]),_:1},8,["href"])])):H("",!0)],2))}});const qp=F(jp,[["__scopeId","data-v-3597b3b3"]]),Kp={class:"container"},Wp=z({__name:"VPTeamMembers",props:{size:null,members:null},setup(e){const t=e,n=se(()=>[t.size??"medium",`count-${t.members.length}`]);return(s,o)=>(d(),m("div",{class:de(["VPTeamMembers",b(n)])},[g("div",Kp,[(d(!0),m(te,null,we(e.members,i=>(d(),m("div",{key:i.name,class:"item"},[L(qp,{size:e.size,member:i},null,8,["size","member"])]))),128))])],2))}});const pm=F(Wp,[["__scopeId","data-v-ed08c3d1"]]),Gp={Layout:ep,NotFound:ap,enhanceApp:({app:e})=>{e.component("Badge",Ma)}},Yp={};const jt={...Gp,setup(){const{lang:e}=ue();gt(()=>{Se&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...Yp};function Qp(e,t){let n=[],s=!0;const o=i=>{if(s){s=!1;return}n.forEach(r=>document.head.removeChild(r)),n=[],i.forEach(r=>{const l=Xp(r);document.head.appendChild(l),n.push(l)})};gt(()=>{const i=e.data,r=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ar(r,i),document.querySelector("meta[name=description]").setAttribute("content",l||r.description),o(Da(r.head,Zp(c)))})}function Xp([e,t,n]){const s=document.createElement(e);for(const o in t)s.setAttribute(o,t[o]);return n&&(s.innerHTML=n),s}function Jp(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Zp(e){return e.filter(t=>!Jp(t))}const As=new Set,Gr=()=>document.createElement("link"),em=e=>{const t=Gr();t.rel="prefetch",t.href=e,document.head.appendChild(t)},tm=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let On;const nm=Se&&(On=Gr())&&On.relList&&On.relList.supports&&On.relList.supports("prefetch")?em:tm;function sm(){if(!Se||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(r=>{if(r.isIntersecting){const l=r.target;n.unobserve(l);const{pathname:c}=l;if(!As.has(c)){As.add(c);const a=Ir(c);nm(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:r,hostname:l,pathname:c}=i,a=c.match(/\.\w+$/);a&&a[0]!==".html"||r!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):As.add(c))})})};Qe(s);const o=yt();nt(()=>o.path,s),Jt(()=>{n&&n.disconnect()})}const om=z({setup(e,{slots:t}){const n=le(!1);return Qe(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function im(){if(Se){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const o=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!o||!i)return;const r=/language-(shellscript|shell|bash|sh|zsh)/.test(o.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),r&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),rm(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function rm(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),o=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),o&&(s.removeAllRanges(),s.addRange(o)),n&&n.focus()}}function lm(){Se&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const o=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((o==null?void 0:o.querySelectorAll("input"))||[]).indexOf(t),r=o==null?void 0:o.querySelector('div[class*="language-"].active'),l=(s=o==null?void 0:o.querySelectorAll('div[class*="language-"]'))==null?void 0:s[i];r&&l&&r!==l&&(r.classList.remove("active"),l.classList.add("active"))}})}const Yr=jt.NotFound||(()=>"404 Not Found"),cm=z({name:"VitePressApp",setup(){const{site:e}=ue();return Qe(()=>{nt(()=>e.value.lang,t=>{document.documentElement.lang=t},{immediate:!0})}),sm(),im(),lm(),jt.setup&&jt.setup(),()=>Gn(jt.Layout)}});function am(){const e=fm(),t=um();t.provide(Or,e);const n=ja(e.route);return t.provide(Nr,n),t.provide("NotFound",Yr),t.component("Content",Ga),t.component("ClientOnly",om),Object.defineProperty(t.config.globalProperties,"$frontmatter",{get(){return n.frontmatter.value}}),jt.enhanceApp&&jt.enhanceApp({app:t,router:e,siteData:Gt}),{app:t,router:e,data:n}}function um(){return Ta(cm)}function fm(){let e=Se,t;return Ka(n=>{let s=Ir(n);return e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),Se&&(e=!1),Hr(()=>import(s),[])},Yr)}if(Se){const{app:e,router:t,data:n}=am();t.go().then(()=>{Qp(t.route,n.site),e.mount("#app")})}export{te as F,hm as V,F as _,L as a,Ce as b,m as c,am as createApp,pm as d,_m as e,dm as f,g,Dc as h,H as i,de as j,S as k,bt as l,J as m,ts as n,d as o,jo as p,we as r,ce as t,b as u,Pa as v,N as w}; +}`)),document.head.appendChild(v),s.value=p,l[p?"add":"remove"]("dark"),window.getComputedStyle(v).opacity,document.head.removeChild(v)}return f}return nt(s,r=>{n.value=r}),(r,l)=>(d(),J($d,{class:"VPSwitchAppearance","aria-label":"toggle dark mode","aria-checked":s.value,onClick:b(o)},{default:O(()=>[L(Vd,{class:"sun"}),L(Od,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const Po=F(Nd,[["__scopeId","data-v-16a7f83e"]]),Bd={key:0,class:"VPNavBarAppearance"},Fd=z({__name:"VPNavBarAppearance",setup(e){const{site:t}=ue();return(n,s)=>b(t).appearance?(d(),m("div",Bd,[L(Po)])):H("",!0)}});const Hd=F(Fd,[["__scopeId","data-v-24251c90"]]),Dd={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},Rd=["href","innerHTML"],zd=z({__name:"VPSocialLink",props:{icon:null,link:null},setup(e){const t=e,n=se(()=>typeof t.icon=="object"?t.icon.svg:Dd[t.icon]);return(s,o)=>(d(),m("a",{class:"VPSocialLink",href:e.link,target:"_blank",rel:"noopener",innerHTML:b(n)},null,8,Rd))}});const Ud=F(zd,[["__scopeId","data-v-af939139"]]),jd={class:"VPSocialLinks"},qd=z({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(d(),m("div",jd,[(d(!0),m(te,null,we(e.links,({link:s,icon:o})=>(d(),J(Ud,{key:s,icon:o,link:s},null,8,["icon","link"]))),128))]))}});const vs=F(qd,[["__scopeId","data-v-de2bf516"]]),Kd=z({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=ue();return(n,s)=>b(t).socialLinks?(d(),J(vs,{key:0,class:"VPNavBarSocialLinks",links:b(t).socialLinks},null,8,["links"])):H("",!0)}});const Wd=F(Kd,[["__scopeId","data-v-be888c46"]]),Gd=e=>(Ue("data-v-7af1585b"),e=e(),je(),e),Yd={key:0,class:"group"},Qd={class:"trans-title"},Xd={key:1,class:"group"},Jd={class:"item appearance"},Zd=Gd(()=>g("p",{class:"label"},"Appearance",-1)),eh={class:"appearance-action"},th={key:2,class:"group"},nh={class:"item social-links"},sh=z({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=ue(),s=se(()=>n.value.localeLinks||t.value.appearance||n.value.socialLinks);return(o,i)=>b(s)?(d(),J(ko,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:O(()=>[b(n).localeLinks?(d(),m("div",Yd,[g("p",Qd,ce(b(n).localeLinks.text),1),(d(!0),m(te,null,we(b(n).localeLinks.items,r=>(d(),J(gs,{key:r.link,item:r},null,8,["item"]))),128))])):H("",!0),b(t).appearance?(d(),m("div",Xd,[g("div",Jd,[Zd,g("div",eh,[L(Po)])])])):H("",!0),b(n).socialLinks?(d(),m("div",th,[g("div",nh,[L(vs,{class:"social-links-list",links:b(n).socialLinks},null,8,["links"])])])):H("",!0)]),_:1})):H("",!0)}});const oh=F(sh,[["__scopeId","data-v-7af1585b"]]),ih=e=>(Ue("data-v-670493dd"),e=e(),je(),e),rh=["aria-expanded"],lh=ih(()=>g("span",{class:"container"},[g("span",{class:"top"}),g("span",{class:"middle"}),g("span",{class:"bottom"})],-1)),ch=[lh],ah=z({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(d(),m("button",{type:"button",class:de(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},ch,10,rh))}});const uh=F(ah,[["__scopeId","data-v-670493dd"]]),fh={class:"container"},dh={class:"content"},hh=z({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{hasSidebar:t}=Xe();return(n,s)=>(d(),m("div",{class:de(["VPNavBar",{"has-sidebar":b(t)}])},[g("div",fh,[L(ku,null,{"nav-bar-title-before":O(()=>[S(n.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":O(()=>[S(n.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3}),g("div",dh,[S(n.$slots,"nav-bar-content-before",{},void 0,!0),L(pf,{class:"search"}),L(ld,{class:"menu"}),L(gd,{class:"translations"}),L(Hd,{class:"appearance"}),L(Wd,{class:"social-links"}),L(oh,{class:"extra"}),S(n.$slots,"nav-bar-content-after",{},void 0,!0),L(uh,{class:"hamburger",active:e.isScreenOpen,onClick:s[0]||(s[0]=o=>n.$emit("toggle-screen"))},null,8,["active"])])])],2))}});const _h=F(hh,[["__scopeId","data-v-26cab421"]]);function ph(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1),Ut=[],Zn=!1,So=-1,dn=void 0,Et=void 0,hn=void 0,jr=function(t){return Ut.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(t))})},es=function(t){var n=t||window.event;return jr(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},mh=function(t){if(hn===void 0){var n=!!t&&t.reserveScrollBarGap===!0,s=window.innerWidth-document.documentElement.clientWidth;if(n&&s>0){var o=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);hn=document.body.style.paddingRight,document.body.style.paddingRight=o+s+"px"}}dn===void 0&&(dn=document.body.style.overflow,document.body.style.overflow="hidden")},gh=function(){hn!==void 0&&(document.body.style.paddingRight=hn,hn=void 0),dn!==void 0&&(document.body.style.overflow=dn,dn=void 0)},vh=function(){return window.requestAnimationFrame(function(){if(Et===void 0){Et={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var t=window,n=t.scrollY,s=t.scrollX,o=t.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-s,setTimeout(function(){return window.requestAnimationFrame(function(){var i=o-window.innerHeight;i&&n>=o&&(document.body.style.top=-(n+i))})},300)}})},bh=function(){if(Et!==void 0){var t=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=Et.position,document.body.style.top=Et.top,document.body.style.left=Et.left,window.scrollTo(n,t),Et=void 0}},yh=function(t){return t?t.scrollHeight-t.scrollTop<=t.clientHeight:!1},xh=function(t,n){var s=t.targetTouches[0].clientY-So;return jr(t.target)?!1:n&&n.scrollTop===0&&s>0||yh(n)&&s<0?es(t):(t.stopPropagation(),!0)},qr=function(t,n){if(!t){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Ut.some(function(o){return o.targetElement===t})){var s={targetElement:t,options:n||{}};Ut=[].concat(ph(Ut),[s]),Jn?vh():mh(n),Jn&&(t.ontouchstart=function(o){o.targetTouches.length===1&&(So=o.targetTouches[0].clientY)},t.ontouchmove=function(o){o.targetTouches.length===1&&xh(o,t)},Zn||(document.addEventListener("touchmove",es,Co?{passive:!1}:void 0),Zn=!0))}},Kr=function(){Jn&&(Ut.forEach(function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null}),Zn&&(document.removeEventListener("touchmove",es,Co?{passive:!1}:void 0),Zn=!1),So=-1),Jn?bh():gh(),Ut=[]};const wh=z({__name:"VPNavScreenMenuLink",props:{text:null,link:null},setup(e){const t=Be("close-screen");return(n,s)=>(d(),J(lt,{class:"VPNavScreenMenuLink",href:e.link,onClick:b(t)},{default:O(()=>[Ce(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const $h=F(wh,[["__scopeId","data-v-e12f8075"]]),kh={},Ph={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ch=g("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Sh=[Ch];function Th(e,t){return d(),m("svg",Ph,Sh)}const Vh=F(kh,[["render",Th]]),Eh=z({__name:"VPNavScreenMenuGroupLink",props:{text:null,link:null},setup(e){const t=Be("close-screen");return(n,s)=>(d(),J(lt,{class:"VPNavScreenMenuGroupLink",href:e.link,onClick:b(t)},{default:O(()=>[Ce(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const Wr=F(Eh,[["__scopeId","data-v-c2f3a51b"]]),Mh={class:"VPNavScreenMenuGroupSection"},Lh={key:0,class:"title"},Ah=z({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(d(),m("div",Mh,[e.text?(d(),m("p",Lh,ce(e.text),1)):H("",!0),(d(!0),m(te,null,we(e.items,s=>(d(),J(Wr,{key:s.text,text:s.text,link:s.link},null,8,["text","link"]))),128))]))}});const Ih=F(Ah,[["__scopeId","data-v-eb049aaa"]]),Oh=["aria-controls","aria-expanded"],Nh={class:"button-text"},Bh=["id"],Fh={key:1,class:"group"},Hh=z({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=le(!1),s=se(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(i,r)=>(d(),m("div",{class:de(["VPNavScreenMenuGroup",{open:n.value}])},[g("button",{class:"button","aria-controls":b(s),"aria-expanded":n.value,onClick:o},[g("span",Nh,ce(e.text),1),L(Vh,{class:"button-icon"})],8,Oh),g("div",{id:b(s),class:"items"},[(d(!0),m(te,null,we(e.items,l=>(d(),m(te,{key:l.text},["link"in l?(d(),m("div",{key:l.text,class:"item"},[L(Wr,{text:l.text,link:l.link},null,8,["text","link"])])):(d(),m("div",Fh,[L(Ih,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,Bh)],2))}});const Dh=F(Hh,[["__scopeId","data-v-96152f1d"]]),Rh={key:0,class:"VPNavScreenMenu"},zh=z({__name:"VPNavScreenMenu",setup(e){const{theme:t}=ue();return(n,s)=>b(t).nav?(d(),m("nav",Rh,[(d(!0),m(te,null,we(b(t).nav,o=>(d(),m(te,{key:o.text},["link"in o?(d(),J($h,{key:0,text:o.text,link:o.link},null,8,["text","link"])):(d(),J(Dh,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):H("",!0)}}),Uh=e=>(Ue("data-v-8eb2f92e"),e=e(),je(),e),jh={key:0,class:"VPNavScreenAppearance"},qh=Uh(()=>g("p",{class:"text"},"Appearance",-1)),Kh=z({__name:"VPNavScreenAppearance",setup(e){const{site:t}=ue();return(n,s)=>b(t).appearance?(d(),m("div",jh,[qh,L(Po)])):H("",!0)}});const Wh=F(Kh,[["__scopeId","data-v-8eb2f92e"]]),Gh={class:"list"},Yh=["href"],Qh=z({__name:"VPNavScreenTranslations",setup(e){const{theme:t}=ue(),n=le(!1);function s(){n.value=!n.value}return(o,i)=>b(t).localeLinks?(d(),m("div",{key:0,class:de(["VPNavScreenTranslations",{open:n.value}])},[g("button",{class:"title",onClick:s},[L(Ur,{class:"icon lang"}),Ce(" "+ce(b(t).localeLinks.text)+" ",1),L(zr,{class:"icon chevron"})]),g("ul",Gh,[(d(!0),m(te,null,we(b(t).localeLinks.items,r=>(d(),m("li",{key:r.link,class:"item"},[g("a",{class:"link",href:r.link},ce(r.text),9,Yh)]))),128))])],2)):H("",!0)}});const Xh=F(Qh,[["__scopeId","data-v-75346612"]]),Jh=z({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=ue();return(n,s)=>b(t).socialLinks?(d(),J(vs,{key:0,class:"VPNavScreenSocialLinks",links:b(t).socialLinks},null,8,["links"])):H("",!0)}}),Zh={class:"container"},e1=z({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=le(null);function n(){qr(t.value,{reserveScrollBarGap:!0})}function s(){Kr()}return(o,i)=>(d(),J(ps,{name:"fade",onEnter:n,onAfterLeave:s},{default:O(()=>[e.open?(d(),m("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t},[g("div",Zh,[S(o.$slots,"nav-screen-content-before",{},void 0,!0),L(zh,{class:"menu"}),L(Xh,{class:"translations"}),L(Wh,{class:"appearance"}),L(Jh,{class:"social-links"}),S(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):H("",!0)]),_:3}))}});const t1=F(e1,[["__scopeId","data-v-27d88b68"]]),n1=z({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=vu(),{hasSidebar:o}=Xe();return Rt("close-screen",n),(i,r)=>(d(),m("header",{class:de(["VPNav",{"no-sidebar":!b(o)}])},[L(_h,{"is-screen-open":b(t),onToggleScreen:b(s)},{"nav-bar-title-before":O(()=>[S(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":O(()=>[S(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":O(()=>[S(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":O(()=>[S(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),L(t1,{open:b(t)},{"nav-screen-content-before":O(()=>[S(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":O(()=>[S(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])],2))}});const s1=F(n1,[["__scopeId","data-v-264fabfc"]]),o1={},i1={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},r1=g("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),l1=g("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),c1=g("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),a1=g("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),u1=[r1,l1,c1,a1];function f1(e,t){return d(),m("svg",i1,u1)}const d1=F(o1,[["render",f1]]),h1=e=>(Ue("data-v-232414b9"),e=e(),je(),e),_1={key:0,class:"VPLocalNav"},p1=["aria-expanded"],m1=h1(()=>g("span",{class:"menu-text"},"Menu",-1)),g1=z({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{hasSidebar:t}=Xe();function n(){window.scrollTo({top:0,left:0,behavior:"smooth"})}return(s,o)=>b(t)?(d(),m("div",_1,[g("button",{class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:o[0]||(o[0]=i=>s.$emit("open-menu"))},[L(d1,{class:"menu-icon"}),m1],8,p1),g("a",{class:"top-link",href:"#",onClick:n}," Return to top ")])):H("",!0)}});const v1=F(g1,[["__scopeId","data-v-232414b9"]]),b1={},y1={version:"1.1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},x1=g("path",{d:"M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2z M20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z"},null,-1),w1=g("path",{d:"M16,11h-3V8c0-0.6-0.4-1-1-1s-1,0.4-1,1v3H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h3v3c0,0.6,0.4,1,1,1s1-0.4,1-1v-3h3c0.6,0,1-0.4,1-1S16.6,11,16,11z"},null,-1),$1=[x1,w1];function k1(e,t){return d(),m("svg",y1,$1)}const P1=F(b1,[["render",k1]]),C1={},S1={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},T1=g("path",{d:"M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2zM20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z"},null,-1),V1=g("path",{d:"M16,11H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h8c0.6,0,1-0.4,1-1S16.6,11,16,11z"},null,-1),E1=[T1,V1];function M1(e,t){return d(),m("svg",S1,E1)}const L1=F(C1,[["render",M1]]),A1=["innerHTML"],I1=z({__name:"VPSidebarLink",props:{item:null,depth:{default:1}},setup(e){const t=e,{page:n,frontmatter:s}=ue(),o=se(()=>s.value.sidebarDepth||1/0),i=se(()=>Zt(n.value.relativePath,t.item.link)),{isSidebarEnabled:r}=Xe(),l=Be("close-sidebar"),c=Be("is-sidebar-open"),a=le(null);return gt(()=>{var f,_;c.value&&i.value&&((_=(f=a.value)==null?void 0:f.$el)==null||_.focus())}),(f,_)=>{const p=bt("VPSidebarLink",!0);return d(),m(te,null,[L(lt,{class:de(["link",{active:b(i)}]),style:ts({paddingLeft:16*(e.depth-1)+"px"}),href:e.item.link,tabindex:b(r)||b(c)?0:-1,onClick:b(l),ref_key:"link",ref:a},{default:O(()=>[g("span",{innerHTML:e.item.text,class:de(["link-text",{light:e.depth>1}])},null,10,A1)]),_:1},8,["class","style","href","tabindex","onClick"]),"items"in e.item&&e.depth(d(),J(p,{key:v.link,item:v,depth:e.depth+1},null,8,["item","depth"]))),128)):H("",!0)],64)}}});const O1=F(I1,[["__scopeId","data-v-9ac6cb77"]]),N1=["role"],B1=["innerHTML"],F1={class:"action"},H1={class:"items"},D1=z({__name:"VPSidebarGroup",props:{text:null,items:null,collapsible:{type:Boolean},collapsed:{type:Boolean}},setup(e){const t=e,n=le(!1);gt(()=>{n.value=!!(t.collapsible&&t.collapsed)});const{page:s}=ue();gt(()=>{t.items.some(i=>Zt(s.value.relativePath,i.link))&&(n.value=!1)});function o(){t.collapsible&&(n.value=!n.value)}return(i,r)=>(d(),m("section",{class:de(["VPSidebarGroup",{collapsible:e.collapsible,collapsed:n.value}])},[e.text?(d(),m("div",{key:0,class:"title",role:e.collapsible?"button":void 0,onClick:o},[g("h2",{innerHTML:e.text,class:"title-text"},null,8,B1),g("div",F1,[L(L1,{class:"icon minus"}),L(P1,{class:"icon plus"})])],8,N1)):H("",!0),g("div",H1,[(d(!0),m(te,null,we(e.items,l=>(d(),J(O1,{key:l.link,item:l},null,8,["item"]))),128))])],2))}});const R1=F(D1,[["__scopeId","data-v-6a6002da"]]),z1=e=>(Ue("data-v-21951dfa"),e=e(),je(),e),U1={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},j1=z1(()=>g("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),q1=z({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebar:n,hasSidebar:s}=Xe();let o=le(null);function i(){qr(o.value,{reserveScrollBarGap:!0})}function r(){Kr()}return sc(async()=>{var l;t.open?(i(),(l=o.value)==null||l.focus()):r()}),(l,c)=>b(s)?(d(),m("aside",{key:0,class:de(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:c[0]||(c[0]=Mr(()=>{},["stop"]))},[g("nav",U1,[j1,S(l.$slots,"sidebar-nav-before",{},void 0,!0),(d(!0),m(te,null,we(b(n),a=>(d(),m("div",{key:a.text,class:"group"},[L(R1,{text:a.text,items:a.items,collapsible:a.collapsible,collapsed:a.collapsed},null,8,["text","items","collapsible","collapsed"])]))),128)),S(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):H("",!0)}});const K1=F(q1,[["__scopeId","data-v-21951dfa"]]),W1={},G1={class:"VPPage"};function Y1(e,t){const n=bt("Content");return d(),m("div",G1,[L(n)])}const Q1=F(W1,[["render",Y1]]),X1=z({__name:"VPButton",props:{tag:null,size:null,theme:null,text:null,href:null},setup(e){const t=e,n=se(()=>[t.size??"medium",t.theme??"brand"]),s=se(()=>t.href&&ms.test(t.href)),o=se(()=>t.tag?t.tag:t.href?"a":"button");return(i,r)=>(d(),J(mo(b(o)),{class:de(["VPButton",b(n)]),href:e.href?b(Yn)(e.href):void 0,target:b(s)?"_blank":void 0,rel:b(s)?"noreferrer":void 0},{default:O(()=>[Ce(ce(e.text),1)]),_:1},8,["class","href","target","rel"]))}});const J1=F(X1,[["__scopeId","data-v-469117db"]]),Z1=e=>(Ue("data-v-f3cc6bab"),e=e(),je(),e),e0={class:"container"},t0={class:"main"},n0={key:0,class:"name"},s0={class:"clip"},o0={key:1,class:"text"},i0={key:2,class:"tagline"},r0={key:3,class:"actions"},l0={key:0,class:"image"},c0={class:"image-container"},a0=Z1(()=>g("div",{class:"image-bg"},null,-1)),u0=z({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=Be("hero-image-slot-exists");return(n,s)=>(d(),m("div",{class:de(["VPHero",{"has-image":e.image||b(t)}])},[g("div",e0,[g("div",t0,[e.name?(d(),m("h1",n0,[g("span",s0,ce(e.name),1)])):H("",!0),e.text?(d(),m("p",o0,ce(e.text),1)):H("",!0),e.tagline?(d(),m("p",i0,ce(e.tagline),1)):H("",!0),e.actions?(d(),m("div",r0,[(d(!0),m(te,null,we(e.actions,o=>(d(),m("div",{key:o.link,class:"action"},[L(J1,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):H("",!0)]),e.image||b(t)?(d(),m("div",l0,[g("div",c0,[a0,S(n.$slots,"home-hero-image",{},()=>[e.image?(d(),J(wo,{key:0,class:"image-src",image:e.image},null,8,["image"])):H("",!0)],!0)])])):H("",!0)])],2))}});const f0=F(u0,[["__scopeId","data-v-f3cc6bab"]]),d0=z({__name:"VPHomeHero",setup(e){const{frontmatter:t}=ue();return(n,s)=>b(t).hero?(d(),J(f0,{key:0,class:"VPHomeHero",name:b(t).hero.name,text:b(t).hero.text,tagline:b(t).hero.tagline,image:b(t).hero.image,actions:b(t).hero.actions},{"home-hero-image":O(()=>[S(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):H("",!0)}}),h0={},_0={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},p0=g("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),m0=[p0];function g0(e,t){return d(),m("svg",_0,m0)}const v0=F(h0,[["render",g0]]),b0={class:"box"},y0={key:1,class:"icon"},x0={class:"title"},w0={class:"details"},$0={key:2,class:"link-text"},k0={class:"link-text-value"},P0=z({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null},setup(e){return(t,n)=>(d(),J(lt,{class:"VPFeature",href:e.link,"no-icon":!0},{default:O(()=>[g("article",b0,[typeof e.icon=="object"?(d(),J(wo,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(d(),m("div",y0,ce(e.icon),1)):H("",!0),g("h2",x0,ce(e.title),1),g("p",w0,ce(e.details),1),e.linkText?(d(),m("div",$0,[g("p",k0,[Ce(ce(e.linkText)+" ",1),L(v0,{class:"link-text-icon"})])])):H("",!0)])]),_:1},8,["href"]))}});const C0=F(P0,[["__scopeId","data-v-b1d983a8"]]),S0={key:0,class:"VPFeatures"},T0={class:"container"},V0={class:"items"},E0=z({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=se(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s%2===0)return"grid-4"}else return});return(s,o)=>e.features?(d(),m("div",S0,[g("div",T0,[g("div",V0,[(d(!0),m(te,null,we(e.features,i=>(d(),m("div",{key:i.title,class:de(["item",[b(n)]])},[L(C0,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):H("",!0)}});const M0=F(E0,[["__scopeId","data-v-5e2470ab"]]),L0=z({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=ue();return(n,s)=>b(t).features?(d(),J(M0,{key:0,class:"VPHomeFeatures",features:b(t).features},null,8,["features"])):H("",!0)}}),A0={class:"VPHome"},I0=z({__name:"VPHome",setup(e){return(t,n)=>{const s=bt("Content");return d(),m("div",A0,[S(t.$slots,"home-hero-before",{},void 0,!0),L(d0,null,{"home-hero-image":O(()=>[S(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),S(t.$slots,"home-hero-after",{},void 0,!0),S(t.$slots,"home-features-before",{},void 0,!0),L(L0),S(t.$slots,"home-features-after",{},void 0,!0),L(s)])}}});const O0=F(I0,[["__scopeId","data-v-a6ccdea8"]]);function N0(){const{hasSidebar:e}=Xe(),t=Ws("(min-width: 960px)"),n=Ws("(min-width: 1280px)");return{isAsideEnabled:se(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const B0=71;function F0(e){if(e===!1)return[];let t=[];return document.querySelectorAll("h2, h3, h4, h5, h6").forEach(n=>{n.textContent&&n.id&&t.push({level:Number(n.tagName[1]),title:n.innerText.replace(/\s+#\s*$/,""),link:`#${n.id}`})}),H0(t,e)}function H0(e,t=2){return D0(e,typeof t=="number"?[t,t]:t==="deep"?[2,6]:t)}function D0(e,t){const n=[];return e=e.map(s=>({...s})),e.forEach((s,o)=>{s.level>=t[0]&&s.level<=t[1]&&R0(o,e,t)&&n.push(s)}),n}function R0(e,t,n){if(e===0)return!0;const s=t[e];for(let o=e-1;o>=0;o--){const i=t[o];if(i.level=n[0]&&i.level<=n[1])return i.children==null&&(i.children=[]),i.children.push(s),!1}return!0}function z0(e,t){const{isAsideEnabled:n}=N0(),s=uu(i,100);let o=null;Qe(()=>{requestAnimationFrame(i),window.addEventListener("scroll",s)}),_o(()=>{r(location.hash)}),Jt(()=>{window.removeEventListener("scroll",s)});function i(){if(!n.value)return;const l=[].slice.call(e.value.querySelectorAll(".outline-link")),c=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(v=>l.some(T=>T.hash===v.hash&&v.offsetParent!==null)),a=window.scrollY,f=window.innerHeight,_=document.body.offsetHeight,p=Math.abs(a+f-_)<1;if(c.length&&p){r(c[c.length-1].hash);return}for(let v=0;v{const s=bt("VPDocAsideOutlineItem",!0);return d(),m("ul",{class:de(e.root?"root":"nested")},[(d(!0),m(te,null,we(e.headers,({children:o,link:i,title:r})=>(d(),m("li",null,[g("a",{class:"outline-link",href:i,onClick:n[0]||(n[0]=(...l)=>e.onClick&&e.onClick(...l))},ce(r),9,j0),o!=null&&o.length?(d(),J(s,{key:0,headers:o,onClick:e.onClick},null,8,["headers","onClick"])):H("",!0)]))),256))],2)}}});const K0=F(q0,[["__scopeId","data-v-0eba5460"]]),W0=e=>(Ue("data-v-586090b2"),e=e(),je(),e),G0={class:"content"},Y0={class:"outline-title"},Q0={"aria-labelledby":"doc-outline-aria-label"},X0=W0(()=>g("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),J0=z({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=ue(),s=se(()=>t.value.outline??n.value.outline),o=Be("onContentUpdated");o.value=()=>{i.value=F0(s.value)};const i=le([]),r=se(()=>i.value.length>0),l=le(),c=le();z0(l,c);function a({target:f}){const _="#"+f.href.split("#")[1],p=document.querySelector(decodeURIComponent(_));p==null||p.focus()}return(f,_)=>(d(),m("div",{class:de(["VPDocAsideOutline",{"has-outline":b(r)}]),ref_key:"container",ref:l},[g("div",G0,[g("div",{class:"outline-marker",ref_key:"marker",ref:c},null,512),g("div",Y0,ce(b(n).outlineTitle||"On this page"),1),g("nav",Q0,[X0,L(K0,{headers:i.value,root:!0,onClick:a},null,8,["headers"])])])],2))}});const Z0=F(J0,[["__scopeId","data-v-586090b2"]]),e_={class:"VPDocAsideCarbonAds"},t_=z({__name:"VPDocAsideCarbonAds",setup(e){const t=()=>null;return(n,s)=>(d(),m("div",e_,[L(b(t))]))}}),n_=e=>(Ue("data-v-39cd9708"),e=e(),je(),e),s_={class:"VPDocAside"},o_=n_(()=>g("div",{class:"spacer"},null,-1)),i_=z({__name:"VPDocAside",setup(e){const{theme:t}=ue();return(n,s)=>(d(),m("div",s_,[S(n.$slots,"aside-top",{},void 0,!0),S(n.$slots,"aside-outline-before",{},void 0,!0),L(Z0),S(n.$slots,"aside-outline-after",{},void 0,!0),o_,S(n.$slots,"aside-ads-before",{},void 0,!0),b(t).carbonAds?(d(),J(t_,{key:0})):H("",!0),S(n.$slots,"aside-ads-after",{},void 0,!0),S(n.$slots,"aside-bottom",{},void 0,!0)]))}});const r_=F(i_,[["__scopeId","data-v-39cd9708"]]);function l_(){const{theme:e,page:t}=ue();return se(()=>{const{text:n="Edit this page",pattern:s}=e.value.editLink||{},{relativePath:o}=t.value;return{url:s.replace(/:path/g,o),text:n}})}function c_(){const{page:e,theme:t,frontmatter:n}=ue();return se(()=>{const s=Fr(t.value.sidebar,e.value.relativePath),o=fu(s),i=o.findIndex(r=>Zt(e.value.relativePath,r.link));return{prev:n.value.prev?{...o[i-1],text:n.value.prev}:o[i-1],next:n.value.next?{...o[i+1],text:n.value.next}:o[i+1]}})}const a_={},u_={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},f_=g("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),d_=g("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),h_=[f_,d_];function __(e,t){return d(),m("svg",u_,h_)}const p_=F(a_,[["render",__]]),m_={class:"VPLastUpdated"},g_=["datetime"],v_=z({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n}=ue(),s=se(()=>new Date(n.value.lastUpdated)),o=se(()=>s.value.toISOString()),i=le("");return Qe(()=>{gt(()=>{i.value=s.value.toLocaleString(window.navigator.language)})}),(r,l)=>(d(),m("p",m_,[Ce(ce(b(t).lastUpdatedText??"Last updated")+": ",1),g("time",{datetime:b(o)},ce(i.value),9,g_)]))}});const b_=F(v_,[["__scopeId","data-v-cc1176cb"]]),y_={key:0,class:"VPDocFooter"},x_={key:0,class:"edit-info"},w_={key:0,class:"edit-link"},$_={key:1,class:"last-updated"},k_={key:1,class:"prev-next"},P_={class:"pager"},C_=["href"],S_=["innerHTML"],T_=["innerHTML"],V_=["href"],E_=["innerHTML"],M_=["innerHTML"],L_=z({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=ue(),o=l_(),i=c_(),r=se(()=>t.value.editLink&&s.value.editLink!==!1),l=se(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),c=se(()=>r.value||l.value||i.value.prev||i.value.next);return(a,f)=>{var _,p;return b(c)?(d(),m("footer",y_,[b(r)||b(l)?(d(),m("div",x_,[b(r)?(d(),m("div",w_,[L(lt,{class:"edit-link-button",href:b(o).url,"no-icon":!0},{default:O(()=>[L(p_,{class:"edit-link-icon"}),Ce(" "+ce(b(o).text),1)]),_:1},8,["href"])])):H("",!0),b(l)?(d(),m("div",$_,[L(b_)])):H("",!0)])):H("",!0),b(i).prev||b(i).next?(d(),m("div",k_,[g("div",P_,[b(i).prev?(d(),m("a",{key:0,class:"pager-link prev",href:b(Yn)(b(i).prev.link)},[g("span",{class:"desc",innerHTML:((_=b(t).docFooter)==null?void 0:_.prev)??"Previous page"},null,8,S_),g("span",{class:"title",innerHTML:b(i).prev.text},null,8,T_)],8,C_)):H("",!0)]),g("div",{class:de(["pager",{"has-prev":b(i).prev}])},[b(i).next?(d(),m("a",{key:0,class:"pager-link next",href:b(Yn)(b(i).next.link)},[g("span",{class:"desc",innerHTML:((p=b(t).docFooter)==null?void 0:p.next)??"Next page"},null,8,E_),g("span",{class:"title",innerHTML:b(i).next.text},null,8,M_)],8,V_)):H("",!0)],2)])):H("",!0)])):H("",!0)}}});const A_=F(L_,[["__scopeId","data-v-cbbeb5ab"]]),I_=e=>(Ue("data-v-317b0207"),e=e(),je(),e),O_={class:"container"},N_={key:0,class:"aside"},B_=I_(()=>g("div",{class:"aside-curtain"},null,-1)),F_={class:"aside-container"},H_={class:"aside-content"},D_={class:"content"},R_={class:"content-container"},z_={class:"main"},U_=z({__name:"VPDoc",setup(e){const t=yt(),{hasSidebar:n,hasAside:s}=Xe(),o=se(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,"")),i=le();return Rt("onContentUpdated",i),(r,l)=>{const c=bt("Content");return d(),m("div",{class:de(["VPDoc",{"has-sidebar":b(n),"has-aside":b(s)}])},[g("div",O_,[b(s)?(d(),m("div",N_,[B_,g("div",F_,[g("div",H_,[L(r_,null,{"aside-top":O(()=>[S(r.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":O(()=>[S(r.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":O(()=>[S(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":O(()=>[S(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":O(()=>[S(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":O(()=>[S(r.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])])):H("",!0),g("div",D_,[g("div",R_,[S(r.$slots,"doc-before",{},void 0,!0),g("main",z_,[L(c,{class:de(["vp-doc",b(o)]),onContentUpdated:i.value},null,8,["class","onContentUpdated"])]),S(r.$slots,"doc-footer-before",{},void 0,!0),L(A_),S(r.$slots,"doc-after",{},void 0,!0)])])])],2)}}});const j_=F(U_,[["__scopeId","data-v-317b0207"]]),q_=z({__name:"VPContent",setup(e){const t=yt(),{frontmatter:n}=ue(),{hasSidebar:s}=Xe(),o=Be("NotFound");return(i,r)=>(d(),m("div",{class:de(["VPContent",{"has-sidebar":b(s),"is-home":b(n).layout==="home"}]),id:"VPContent"},[b(t).component===b(o)?(d(),J(b(o),{key:0})):b(n).layout==="page"?(d(),J(Q1,{key:1})):b(n).layout==="home"?(d(),J(O0,{key:2},{"home-hero-before":O(()=>[S(i.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":O(()=>[S(i.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":O(()=>[S(i.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":O(()=>[S(i.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":O(()=>[S(i.$slots,"home-features-after",{},void 0,!0)]),_:3})):(d(),J(j_,{key:3},{"doc-footer-before":O(()=>[S(i.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":O(()=>[S(i.$slots,"doc-before",{},void 0,!0)]),"doc-after":O(()=>[S(i.$slots,"doc-after",{},void 0,!0)]),"aside-top":O(()=>[S(i.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":O(()=>[S(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":O(()=>[S(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":O(()=>[S(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":O(()=>[S(i.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":O(()=>[S(i.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const K_=F(q_,[["__scopeId","data-v-ac201f45"]]),W_={class:"container"},G_=["innerHTML"],Y_=["innerHTML"],Q_=z({__name:"VPFooter",setup(e){const{theme:t}=ue(),{hasSidebar:n}=Xe();return(s,o)=>b(t).footer?(d(),m("footer",{key:0,class:de(["VPFooter",{"has-sidebar":b(n)}])},[g("div",W_,[b(t).footer.message?(d(),m("p",{key:0,class:"message",innerHTML:b(t).footer.message},null,8,G_)):H("",!0),b(t).footer.copyright?(d(),m("p",{key:1,class:"copyright",innerHTML:b(t).footer.copyright},null,8,Y_)):H("",!0)])],2)):H("",!0)}});const X_=F(Q_,[["__scopeId","data-v-1a0cce0c"]]),J_={key:0,class:"Layout"},Z_=z({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=Xe(),o=yt();nt(()=>o.path,s),du(t,s),Rt("close-sidebar",s),Rt("is-sidebar-open",t);const{frontmatter:i}=ue(),r=Yc(),l=se(()=>!!r["home-hero-image"]);return Rt("hero-image-slot-exists",l),(c,a)=>{const f=bt("Content");return b(i).layout!==!1?(d(),m("div",J_,[S(c.$slots,"layout-top",{},void 0,!0),L(_u),L(gu,{class:"backdrop",show:b(t),onClick:b(s)},null,8,["show","onClick"]),L(s1,null,{"nav-bar-title-before":O(()=>[S(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":O(()=>[S(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":O(()=>[S(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":O(()=>[S(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":O(()=>[S(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":O(()=>[S(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),L(v1,{open:b(t),onOpenMenu:b(n)},null,8,["open","onOpenMenu"]),L(K1,{open:b(t)},{"sidebar-nav-before":O(()=>[S(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":O(()=>[S(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),L(K_,null,{"home-hero-before":O(()=>[S(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":O(()=>[S(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":O(()=>[S(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":O(()=>[S(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":O(()=>[S(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":O(()=>[S(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":O(()=>[S(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":O(()=>[S(c.$slots,"doc-after",{},void 0,!0)]),"aside-top":O(()=>[S(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":O(()=>[S(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":O(()=>[S(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":O(()=>[S(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":O(()=>[S(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":O(()=>[S(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),L(X_),S(c.$slots,"layout-bottom",{},void 0,!0)])):(d(),J(f,{key:1}))}}});const ep=F(Z_,[["__scopeId","data-v-5aaf92e7"]]),bs=e=>(Ue("data-v-1bf9e22d"),e=e(),je(),e),tp={class:"NotFound"},np=bs(()=>g("p",{class:"code"},"404",-1)),sp=bs(()=>g("h1",{class:"title"},"PAGE NOT FOUND",-1)),op=bs(()=>g("div",{class:"divider"},null,-1)),ip=bs(()=>g("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),rp={class:"action"},lp=["href"],cp=z({__name:"NotFound",setup(e){const{site:t}=ue();return(n,s)=>(d(),m("div",tp,[np,sp,op,ip,g("div",rp,[g("a",{class:"link",href:b(t).base,"aria-label":"go to home"}," Take me home ",8,lp)])]))}});const ap=F(cp,[["__scopeId","data-v-1bf9e22d"]]),up={},fp={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},dp=g("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),hp=[dp];function _p(e,t){return d(),m("svg",fp,hp)}const pp=F(up,[["render",_p]]);const mp={},gp={class:"VPTeamPage"};function vp(e,t){return d(),m("div",gp,[S(e.$slots,"default")])}const dm=F(mp,[["render",vp],["__scopeId","data-v-05fecbf1"]]);const bp={},yp={class:"VPTeamPageTitle"},xp={key:0,class:"title"},wp={key:1,class:"lead"};function $p(e,t){return d(),m("div",yp,[e.$slots.title?(d(),m("h1",xp,[S(e.$slots,"title",{},void 0,!0)])):H("",!0),e.$slots.lead?(d(),m("p",wp,[S(e.$slots,"lead",{},void 0,!0)])):H("",!0)])}const hm=F(bp,[["render",$p],["__scopeId","data-v-6ce551d6"]]);const kp={},Pp=e=>(Ue("data-v-c2a5c7dd"),e=e(),je(),e),Cp={class:"VPTeamPageSection"},Sp={class:"title"},Tp=Pp(()=>g("div",{class:"title-line"},null,-1)),Vp={key:0,class:"title-text"},Ep={key:0,class:"lead"},Mp={key:1,class:"members"};function Lp(e,t){return d(),m("section",Cp,[g("div",Sp,[Tp,e.$slots.title?(d(),m("h2",Vp,[S(e.$slots,"title",{},void 0,!0)])):H("",!0)]),e.$slots.lead?(d(),m("p",Ep,[S(e.$slots,"lead",{},void 0,!0)])):H("",!0),e.$slots.members?(d(),m("div",Mp,[S(e.$slots,"members",{},void 0,!0)])):H("",!0)])}const _m=F(kp,[["render",Lp],["__scopeId","data-v-c2a5c7dd"]]),Ap={class:"profile"},Ip={class:"avatar"},Op=["src","alt"],Np={class:"data"},Bp={class:"name"},Fp={key:0,class:"affiliation"},Hp={key:0,class:"title"},Dp={key:1,class:"at"},Rp={key:1,class:"desc"},zp={key:2,class:"links"},Up={key:0,class:"sp"},jp=z({__name:"VPTeamMembersItem",props:{size:null,member:null},setup(e){return(t,n)=>(d(),m("article",{class:de(["VPTeamMembersItem",[e.size??"medium"]])},[g("div",Ap,[g("figure",Ip,[g("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Op)]),g("div",Np,[g("h1",Bp,ce(e.member.name),1),e.member.title||e.member.org?(d(),m("p",Fp,[e.member.title?(d(),m("span",Hp,ce(e.member.title),1)):H("",!0),e.member.title&&e.member.org?(d(),m("span",Dp," @ ")):H("",!0),e.member.org?(d(),J(lt,{key:2,class:de(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:O(()=>[Ce(ce(e.member.org),1)]),_:1},8,["class","href"])):H("",!0)])):H("",!0),e.member.desc?(d(),m("p",Rp,ce(e.member.desc),1)):H("",!0),e.member.links?(d(),m("div",zp,[L(vs,{links:e.member.links},null,8,["links"])])):H("",!0)])]),e.member.sponsor?(d(),m("div",Up,[L(lt,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:O(()=>[L(pp,{class:"sp-icon"}),Ce(" Sponsor ")]),_:1},8,["href"])])):H("",!0)],2))}});const qp=F(jp,[["__scopeId","data-v-3597b3b3"]]),Kp={class:"container"},Wp=z({__name:"VPTeamMembers",props:{size:null,members:null},setup(e){const t=e,n=se(()=>[t.size??"medium",`count-${t.members.length}`]);return(s,o)=>(d(),m("div",{class:de(["VPTeamMembers",b(n)])},[g("div",Kp,[(d(!0),m(te,null,we(e.members,i=>(d(),m("div",{key:i.name,class:"item"},[L(qp,{size:e.size,member:i},null,8,["size","member"])]))),128))])],2))}});const pm=F(Wp,[["__scopeId","data-v-ed08c3d1"]]),Gp={Layout:ep,NotFound:ap,enhanceApp:({app:e})=>{e.component("Badge",Ma)}},Yp={};const jt={...Gp,setup(){const{lang:e}=ue();gt(()=>{Se&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...Yp};function Qp(e,t){let n=[],s=!0;const o=i=>{if(s){s=!1;return}n.forEach(r=>document.head.removeChild(r)),n=[],i.forEach(r=>{const l=Xp(r);document.head.appendChild(l),n.push(l)})};gt(()=>{const i=e.data,r=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ar(r,i),document.querySelector("meta[name=description]").setAttribute("content",l||r.description),o(Da(r.head,Zp(c)))})}function Xp([e,t,n]){const s=document.createElement(e);for(const o in t)s.setAttribute(o,t[o]);return n&&(s.innerHTML=n),s}function Jp(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Zp(e){return e.filter(t=>!Jp(t))}const As=new Set,Gr=()=>document.createElement("link"),em=e=>{const t=Gr();t.rel="prefetch",t.href=e,document.head.appendChild(t)},tm=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Nn;const nm=Se&&(Nn=Gr())&&Nn.relList&&Nn.relList.supports&&Nn.relList.supports("prefetch")?em:tm;function sm(){if(!Se||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(r=>{if(r.isIntersecting){const l=r.target;n.unobserve(l);const{pathname:c}=l;if(!As.has(c)){As.add(c);const a=Ir(c);nm(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:r,hostname:l,pathname:c}=i,a=c.match(/\.\w+$/);a&&a[0]!==".html"||r!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):As.add(c))})})};Qe(s);const o=yt();nt(()=>o.path,s),Jt(()=>{n&&n.disconnect()})}const om=z({setup(e,{slots:t}){const n=le(!1);return Qe(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function im(){if(Se){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const o=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!o||!i)return;const r=/language-(shellscript|shell|bash|sh|zsh)/.test(o.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),r&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),rm(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function rm(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),o=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),o&&(s.removeAllRanges(),s.addRange(o)),n&&n.focus()}}function lm(){Se&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const o=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((o==null?void 0:o.querySelectorAll("input"))||[]).indexOf(t),r=o==null?void 0:o.querySelector('div[class*="language-"].active'),l=(s=o==null?void 0:o.querySelectorAll('div[class*="language-"]'))==null?void 0:s[i];r&&l&&r!==l&&(r.classList.remove("active"),l.classList.add("active"))}})}const Yr=jt.NotFound||(()=>"404 Not Found"),cm=z({name:"VitePressApp",setup(){const{site:e}=ue();return Qe(()=>{nt(()=>e.value.lang,t=>{document.documentElement.lang=t},{immediate:!0})}),sm(),im(),lm(),jt.setup&&jt.setup(),()=>Gn(jt.Layout)}});function am(){const e=fm(),t=um();t.provide(Nr,e);const n=ja(e.route);return t.provide(Or,n),t.provide("NotFound",Yr),t.component("Content",Ga),t.component("ClientOnly",om),Object.defineProperty(t.config.globalProperties,"$frontmatter",{get(){return n.frontmatter.value}}),jt.enhanceApp&&jt.enhanceApp({app:t,router:e,siteData:Gt}),{app:t,router:e,data:n}}function um(){return Ta(cm)}function fm(){let e=Se,t;return Ka(n=>{let s=Ir(n);return e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),Se&&(e=!1),Hr(()=>import(s),[])},Yr)}if(Se){const{app:e,router:t,data:n}=am();t.go().then(()=>{Qp(t.route,n.site),e.mount("#app")})}export{te as F,hm as V,F as _,L as a,Ce as b,m as c,am as createApp,pm as d,_m as e,dm as f,g,Dc as h,H as i,de as j,S as k,bt as l,J as m,ts as n,d as o,jo as p,we as r,ce as t,b as u,Pa as v,O as w}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.583f5276.js b/assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.js similarity index 96% rename from assets/archive_fox_ir_v2_build_instructions.md.583f5276.js rename to assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.js index 1a252f7..1406ce0 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.583f5276.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.99ba4c01.js";import{o as r,c as l,a as s,u as i,g as e,b as n,h as d}from"./app.24a1fc0a.js";const p=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-hidden":"true"},"#")],-1),a=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-hidden":"true"},"#")],-1),_=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=d('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10),b=e("p",null,"Tin the resistor pads.",-1),v=e("p",null,"Hold the resistor in place.",-1),m=e("p",null,"Solder one end.",-1),g=e("p",null,"Flip to the other side of the resistor and solder it.",-1),x=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[n("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-hidden":"true"},"#")],-1),P=e("p",null,"Tin the pads",-1),B=e("p",null,"Place the resistor on the pads in the correct orientation.",-1),V=e("p",null,[n("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),n(".")],-1),C=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[n("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-hidden":"true"},"#")],-1),S=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1),w=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1),L=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[{"level":2,"title":"Step 15: Prepare to solder IR LED PCB V2s","slug":"step-15-prepare-to-solder-ir-led-pcb-v2s","link":"#step-15-prepare-to-solder-ir-led-pcb-v2s","children":[]},{"level":2,"title":"Step 17: Solder resistors on PCB V2","slug":"step-17-solder-resistors-on-pcb-v2","link":"#step-17-solder-resistors-on-pcb-v2","children":[]},{"level":2,"title":"Solder LEDs on PCB V2","slug":"solder-leds-on-pcb-v2","link":"#solder-leds-on-pcb-v2","children":[]},{"level":2,"title":"Wire up the PCBs V2","slug":"wire-up-the-pcbs-v2","link":"#wire-up-the-pcbs-v2","children":[]}],"relativePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},N=Object.assign(T,{setup(D){return(E,y)=>(r(),l("div",null,[p,a,_,c,s(o,{options:i(t).fox_ir_build_instructions_one},null,8,["options"]),h,s(o,{options:i(t).fox_ir_build_instructions_two},null,8,["options"]),u,s(o,{options:i(t).fox_ir_build_instructions_three},null,8,["options"]),f,s(o,{options:i(t).fox_ir_build_instructions_four},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),m,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),g,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_ten},null,8,["options"]),B,s(o,{options:i(t).fox_ir_build_instructions_eleven},null,8,["options"]),V,s(o,{options:i(t).fox_ir_build_instructions_twelve},null,8,["options"]),C,S,s(o,{options:i(t).fox_ir_build_instructions_thirteen},null,8,["options"]),w]))}});export{L as __pageData,N as default}; +import{_ as o,i as t}from"./chunks/index.1d77087a.js";import{o as r,c as l,a as s,u as i,g as e,b as n,h as d}from"./app.ffc675f3.js";const p=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-hidden":"true"},"#")],-1),a=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-hidden":"true"},"#")],-1),_=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=d('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10),b=e("p",null,"Tin the resistor pads.",-1),v=e("p",null,"Hold the resistor in place.",-1),m=e("p",null,"Solder one end.",-1),g=e("p",null,"Flip to the other side of the resistor and solder it.",-1),x=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[n("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-hidden":"true"},"#")],-1),P=e("p",null,"Tin the pads",-1),B=e("p",null,"Place the resistor on the pads in the correct orientation.",-1),V=e("p",null,[n("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),n(".")],-1),C=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[n("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-hidden":"true"},"#")],-1),S=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1),w=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1),L=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[{"level":2,"title":"Step 15: Prepare to solder IR LED PCB V2s","slug":"step-15-prepare-to-solder-ir-led-pcb-v2s","link":"#step-15-prepare-to-solder-ir-led-pcb-v2s","children":[]},{"level":2,"title":"Step 17: Solder resistors on PCB V2","slug":"step-17-solder-resistors-on-pcb-v2","link":"#step-17-solder-resistors-on-pcb-v2","children":[]},{"level":2,"title":"Solder LEDs on PCB V2","slug":"solder-leds-on-pcb-v2","link":"#solder-leds-on-pcb-v2","children":[]},{"level":2,"title":"Wire up the PCBs V2","slug":"wire-up-the-pcbs-v2","link":"#wire-up-the-pcbs-v2","children":[]}],"relativePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},N=Object.assign(T,{setup(D){return(E,y)=>(r(),l("div",null,[p,a,_,c,s(o,{options:i(t).fox_ir_build_instructions_one},null,8,["options"]),h,s(o,{options:i(t).fox_ir_build_instructions_two},null,8,["options"]),u,s(o,{options:i(t).fox_ir_build_instructions_three},null,8,["options"]),f,s(o,{options:i(t).fox_ir_build_instructions_four},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),m,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),g,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_ten},null,8,["options"]),B,s(o,{options:i(t).fox_ir_build_instructions_eleven},null,8,["options"]),V,s(o,{options:i(t).fox_ir_build_instructions_twelve},null,8,["options"]),C,S,s(o,{options:i(t).fox_ir_build_instructions_thirteen},null,8,["options"]),w]))}});export{L as __pageData,N as default}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.583f5276.lean.js b/assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.lean.js similarity index 95% rename from assets/archive_fox_ir_v2_build_instructions.md.583f5276.lean.js rename to assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.lean.js index 3f650d8..5d4e169 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.583f5276.lean.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.f4e1b25e.lean.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.99ba4c01.js";import{o as r,c as l,a as s,u as i,g as e,b as n,h as d}from"./app.24a1fc0a.js";const p=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-hidden":"true"},"#")],-1),a=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-hidden":"true"},"#")],-1),_=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=d("",10),b=e("p",null,"Tin the resistor pads.",-1),v=e("p",null,"Hold the resistor in place.",-1),m=e("p",null,"Solder one end.",-1),g=e("p",null,"Flip to the other side of the resistor and solder it.",-1),x=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[n("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-hidden":"true"},"#")],-1),P=e("p",null,"Tin the pads",-1),B=e("p",null,"Place the resistor on the pads in the correct orientation.",-1),V=e("p",null,[n("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),n(".")],-1),C=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[n("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-hidden":"true"},"#")],-1),S=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1),w=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1),L=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[{"level":2,"title":"Step 15: Prepare to solder IR LED PCB V2s","slug":"step-15-prepare-to-solder-ir-led-pcb-v2s","link":"#step-15-prepare-to-solder-ir-led-pcb-v2s","children":[]},{"level":2,"title":"Step 17: Solder resistors on PCB V2","slug":"step-17-solder-resistors-on-pcb-v2","link":"#step-17-solder-resistors-on-pcb-v2","children":[]},{"level":2,"title":"Solder LEDs on PCB V2","slug":"solder-leds-on-pcb-v2","link":"#solder-leds-on-pcb-v2","children":[]},{"level":2,"title":"Wire up the PCBs V2","slug":"wire-up-the-pcbs-v2","link":"#wire-up-the-pcbs-v2","children":[]}],"relativePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},N=Object.assign(T,{setup(D){return(E,y)=>(r(),l("div",null,[p,a,_,c,s(o,{options:i(t).fox_ir_build_instructions_one},null,8,["options"]),h,s(o,{options:i(t).fox_ir_build_instructions_two},null,8,["options"]),u,s(o,{options:i(t).fox_ir_build_instructions_three},null,8,["options"]),f,s(o,{options:i(t).fox_ir_build_instructions_four},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),m,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),g,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_ten},null,8,["options"]),B,s(o,{options:i(t).fox_ir_build_instructions_eleven},null,8,["options"]),V,s(o,{options:i(t).fox_ir_build_instructions_twelve},null,8,["options"]),C,S,s(o,{options:i(t).fox_ir_build_instructions_thirteen},null,8,["options"]),w]))}});export{L as __pageData,N as default}; +import{_ as o,i as t}from"./chunks/index.1d77087a.js";import{o as r,c as l,a as s,u as i,g as e,b as n,h as d}from"./app.ffc675f3.js";const p=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-hidden":"true"},"#")],-1),a=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-hidden":"true"},"#")],-1),_=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=d("",10),b=e("p",null,"Tin the resistor pads.",-1),v=e("p",null,"Hold the resistor in place.",-1),m=e("p",null,"Solder one end.",-1),g=e("p",null,"Flip to the other side of the resistor and solder it.",-1),x=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[n("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-hidden":"true"},"#")],-1),P=e("p",null,"Tin the pads",-1),B=e("p",null,"Place the resistor on the pads in the correct orientation.",-1),V=e("p",null,[n("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),n(".")],-1),C=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[n("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-hidden":"true"},"#")],-1),S=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1),w=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1),L=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[{"level":2,"title":"Step 15: Prepare to solder IR LED PCB V2s","slug":"step-15-prepare-to-solder-ir-led-pcb-v2s","link":"#step-15-prepare-to-solder-ir-led-pcb-v2s","children":[]},{"level":2,"title":"Step 17: Solder resistors on PCB V2","slug":"step-17-solder-resistors-on-pcb-v2","link":"#step-17-solder-resistors-on-pcb-v2","children":[]},{"level":2,"title":"Solder LEDs on PCB V2","slug":"solder-leds-on-pcb-v2","link":"#solder-leds-on-pcb-v2","children":[]},{"level":2,"title":"Wire up the PCBs V2","slug":"wire-up-the-pcbs-v2","link":"#wire-up-the-pcbs-v2","children":[]}],"relativePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},N=Object.assign(T,{setup(D){return(E,y)=>(r(),l("div",null,[p,a,_,c,s(o,{options:i(t).fox_ir_build_instructions_one},null,8,["options"]),h,s(o,{options:i(t).fox_ir_build_instructions_two},null,8,["options"]),u,s(o,{options:i(t).fox_ir_build_instructions_three},null,8,["options"]),f,s(o,{options:i(t).fox_ir_build_instructions_four},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),m,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),g,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_ten},null,8,["options"]),B,s(o,{options:i(t).fox_ir_build_instructions_eleven},null,8,["options"]),V,s(o,{options:i(t).fox_ir_build_instructions_twelve},null,8,["options"]),C,S,s(o,{options:i(t).fox_ir_build_instructions_thirteen},null,8,["options"]),w]))}});export{L as __pageData,N as default}; diff --git a/assets/chunks/Accordion.2b657ffe.js b/assets/chunks/Accordion.1bf3afe0.js similarity index 93% rename from assets/chunks/Accordion.2b657ffe.js rename to assets/chunks/Accordion.1bf3afe0.js index 47fc5f7..6a9bb9d 100644 --- a/assets/chunks/Accordion.2b657ffe.js +++ b/assets/chunks/Accordion.1bf3afe0.js @@ -1 +1 @@ -import{_ as l,o as n,c as i,g as o,k as r,j as c,p as d,v as p}from"../app.24a1fc0a.js";const u={data(){return{isOpen:!1}},methods:{toggleAccordion(){this.isOpen=!this.isOpen}}},_=["aria-expanded","aria-controls"],h=o("path",{d:"M15 1.2l-7 7-7-7","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1),f=[h],m=["id"];function v(e,t,w,g,s,a){return n(),i("div",null,[o("button",{onClick:t[0]||(t[0]=k=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":s.isOpen,"aria-controls":`collapse${e._uid}`},[r(e.$slots,"title"),(n(),i("svg",{class:c(["w-3 transition-all duration-200 transform",{"rotate-180":s.isOpen,"rotate-0":!s.isOpen}]),fill:"none",stroke:"currentColor",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 10","aria-hidden":"true"},f,2))],8,_),d(o("div",{id:`collapse${e._uid}`},[r(e.$slots,"content")],8,m),[[p,s.isOpen]])])}const x=l(u,[["render",v]]);export{x as A}; +import{_ as l,o as n,c as i,g as o,k as r,j as c,p as d,v as p}from"../app.ffc675f3.js";const u={data(){return{isOpen:!1}},methods:{toggleAccordion(){this.isOpen=!this.isOpen}}},_=["aria-expanded","aria-controls"],h=o("path",{d:"M15 1.2l-7 7-7-7","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1),f=[h],m=["id"];function v(e,t,w,g,s,a){return n(),i("div",null,[o("button",{onClick:t[0]||(t[0]=k=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":s.isOpen,"aria-controls":`collapse${e._uid}`},[r(e.$slots,"title"),(n(),i("svg",{class:c(["w-3 transition-all duration-200 transform",{"rotate-180":s.isOpen,"rotate-0":!s.isOpen}]),fill:"none",stroke:"currentColor",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 10","aria-hidden":"true"},f,2))],8,_),d(o("div",{id:`collapse${e._uid}`},[r(e.$slots,"content")],8,m),[[p,s.isOpen]])])}const x=l(u,[["render",v]]);export{x as A}; diff --git a/assets/chunks/CheckBoxList.b2594454.js b/assets/chunks/CheckBoxList.0e3746ef.js similarity index 84% rename from assets/chunks/CheckBoxList.b2594454.js rename to assets/chunks/CheckBoxList.0e3746ef.js index 53904e2..24f178a 100644 --- a/assets/chunks/CheckBoxList.b2594454.js +++ b/assets/chunks/CheckBoxList.0e3746ef.js @@ -1 +1 @@ -import{o as e,c as t,g as o,F as _,r as a,t as n}from"../app.24a1fc0a.js";const i={class:"checkboxes"},r={style:{"list-style":"none"}},h={key:0},k=o("input",{type:"checkbox",checked:""},null,-1),d={key:0},p=["href"],u={key:1},b={key:1},y=o("input",{type:"checkbox",unchecked:""},null,-1),f={key:0},x=["href"],g={key:1},L={__name:"CheckBoxList",props:["options"],setup(c){const l=c;return(B,v)=>(e(),t("div",i,[o("ul",r,[(e(!0),t(_,null,a(l.options.object,s=>(e(),t("li",null,[l.options.state?(e(),t("div",h,[k,s.link!==null||l.link!==""?(e(),t("label",d,[o("a",{href:s.link,target:"_blank"},n(s.label),9,p)])):(e(),t("label",u,n(s.label),1))])):(e(),t("div",b,[y,s.link!==null||l.link!==""?(e(),t("label",f,[o("a",{href:s.link,target:"_blank"},n(s.label),9,x)])):(e(),t("label",g,n(s.label),1))]))]))),256))])]))}};export{L as _}; +import{o as e,c as t,g as o,F as _,r as a,t as n}from"../app.ffc675f3.js";const i={class:"checkboxes"},r={style:{"list-style":"none"}},h={key:0},k=o("input",{type:"checkbox",checked:""},null,-1),d={key:0},p=["href"],u={key:1},b={key:1},y=o("input",{type:"checkbox",unchecked:""},null,-1),f={key:0},x=["href"],g={key:1},L={__name:"CheckBoxList",props:["options"],setup(c){const l=c;return(B,v)=>(e(),t("div",i,[o("ul",r,[(e(!0),t(_,null,a(l.options.object,s=>(e(),t("li",null,[l.options.state?(e(),t("div",h,[k,s.link!==null||l.link!==""?(e(),t("label",d,[o("a",{href:s.link,target:"_blank"},n(s.label),9,p)])):(e(),t("label",u,n(s.label),1))])):(e(),t("div",b,[y,s.link!==null||l.link!==""?(e(),t("label",f,[o("a",{href:s.link,target:"_blank"},n(s.label),9,x)])):(e(),t("label",g,n(s.label),1))]))]))),256))])]))}};export{L as _}; diff --git a/assets/chunks/index.1d77087a.js b/assets/chunks/index.1d77087a.js new file mode 100644 index 0000000..d24fe1a --- /dev/null +++ b/assets/chunks/index.1d77087a.js @@ -0,0 +1 @@ +import{o as i,c as a,g as m,n as o,b as p,t as r,i as e}from"../app.ffc675f3.js";const n={align:"center",class:"mb-4"},h=["href"],_=["src","alt"],l=["href"],d=["src","alt"],x={key:2},g=m("br",null,null,-1),s=["href"],c={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},v={__name:"ImageComponent",props:["options"],setup(t){return(u,w)=>(i(),a("div",n,[m("figure",null,[t.options.url_2?(i(),a("a",{key:0,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url_2},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:o(t.options.max_width)},null,12,_)],8,h)):(i(),a("a",{key:1,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:o(t.options.max_width)},null,12,d)],8,l)),t.options.caption?(i(),a("figcaption",x,[g,p(" "+r(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",c,r(t.options.caption_link),1)],8,s)):e("",!0)])):e("",!0)])]))}},b={image_one:{url:"https://i.imgur.com/j18rRI7.jpg",alt:"'img of components'",caption:"'ESPs, cams, a programmer and a USB connector'",max_width:"max-width: 400px;"},discord_content:{url:"https://discord.com/api/guilds/946212245187199026/widget.png?style=banner3",url_2:"https://discord.gg/kkXYbVykZX",alt:"'discord banner'",max_width:"max-width: 400px;"},external_antenna:{url:"https://i.imgur.com/OzpxFMD.png",alt:"'img of external antenna'",caption:"Image from:",caption_link:"https://randomnerdtutorials.com/esp32-cam-connect-external-antenna",max_width:"max-width: 400px;"},external_antenna_resistors:{url:"https://i.imgur.com/RIFpNqW.jpg",alt:"'img of external antenna resistors'",max_width:"max-width: 400px;"},camera_socket:{url:"https://i.imgur.com/T5asLGN.jpg",alt:"'img of camera socket'",max_width:"max-width: 400px;"},camera_socket_clip:{url:"https://i.imgur.com/Z8b8Sin.jpg",alt:"'img of camera clip'",max_width:"max-width: 400px;"},camera_cable:{url:"https://i.imgur.com/dDBIi9j.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},camera_clip_close:{url:"https://i.imgur.com/VnFi5XS.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},_7_12_one:{url:"https://i.imgur.com/LsLPAcd.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_two:{url:"https://i.imgur.com/Cdu9lSN.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_three:{url:"https://i.imgur.com/QlRrWNn.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_one:{url:"https://i.imgur.com/DhnmLBG.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_two:{url:"https://i.imgur.com/PWA0gtq.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_three:{url:"https://i.imgur.com/0zXY79j.jpg",alt:"",caption:"357ohm resistors and V3 PCBs",max_width:"max-width: 400px;"},_13_18_four:{url:"https://i.imgur.com/n1noWKq.png",alt:"",caption:"V3",max_width:"max-width: 400px;"},_13_18_five:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},_13_18_six:{url:"https://i.imgur.com/gb4etdB.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_seven:{url:"https://i.imgur.com/ev5QFch.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_eight:{url:"https://i.imgur.com/8jCQOHw.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_nine:{url:"https://i.imgur.com/CHUb7Iv.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_ten:{url:"https://i.imgur.com/jZYAm5O.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_one:{url:"https://i.imgur.com/pjvLHJL.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_two:{url:"https://i.imgur.com/RbHZQhl.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_three:{url:"https://i.imgur.com/VyClWvp.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_four:{url:"https://i.imgur.com/tFCQTqE.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_five:{url:"https://i.imgur.com/tFCQTqE.jpeg",alt:"",caption:"",max_width:"max-width: 400px;"},end_six:{url:"https://i.imgur.com/pqDgpYP.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_seven:{url:"https://i.imgur.com/bEq6Ww0.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_eight:{url:"https://i.imgur.com/r2Jo45t.png",alt:"",caption:"",max_width:"max-width: 400px;"},end_nine:{url:"https://i.imgur.com/a6ERUFx.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_ten:{url:"https://i.imgur.com/Wy89UWy.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_eleven:{url:"https://i.imgur.com/LtKOLWo.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_twelve:{url:"https://i.imgur.com/9mty1bv.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_thirteen:{url:"https://i.imgur.com/ArLO1ls.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fourteen:{url:"https://i.imgur.com/ZIecsMM.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fifteen:{url:"https://i.imgur.com/tYD1KKe.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_sixteen:{url:"https://i.imgur.com/3rCRU5A.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},upload_firmware_image_one:{url:"https://i.imgur.com/dSPSpkY.png",alt:"'platformio serial monitor button'",max_width:"max-width: 500px;"},upload_firmware_image_two:{url:"https://i.imgur.com/PoHP3NC.png",alt:"'img of platformio serial monitor'",max_width:"max-width: 600px;"},ant_logo_platformio:{url:"https://i.imgur.com/B6zK6n8.png",alt:"Platformio logo button",max_width:"max-width: 600px;"},platformio_quick_access:{url:"https://i.imgur.com/94Xgg9k.png",alt:"Platformio logo Quick Access Section",max_width:"max-width: 600px;"},platformio_quick_access_miscellaneous:{url:"https://i.imgur.com/Zoolr2M.png",alt:"Platformio miscellaneous section",max_width:"max-width: 600px;"},platformio_quick_access_upgrade_core:{url:"https://i.imgur.com/nOF817M.png",alt:"Platformio upgrade core button",max_width:"max-width: 600px;"},platformio_pio_home:{url:"https://i.imgur.com/M7ZYAtU.png",alt:"Platformio open home",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms:{url:"https://i.imgur.com/LgnU4HG.png",alt:"Platformio platforms sidebar",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms_updates:{url:"https://i.imgur.com/ZsKos2E.png",alt:"Platformio platforms sections",max_width:"max-width: 600px;"},platformio_pio_espressif32:{url:"https://i.imgur.com/mQdM6X2.png",alt:"Platformio platforms update view",max_width:"max-width: 600px;"},setup_vscode_image_one:{url:"https://i.imgur.com/jXPXIFz.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_two:{url:"https://i.imgur.com/hAm3Zu0.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_three:{url:"https://i.imgur.com/ebV0IgT.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_four:{url:"https://i.imgur.com/DWO5vkE.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_five:{url:"https://i.imgur.com/mWAVxtF.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_six:{url:"https://i.imgur.com/YbXpX7t.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_seven:{url:"https://i.imgur.com/c61Cpaz.gif",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_one:{url:"https://i.imgur.com/1Ficr7f.png",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_two:{url:"https://i.imgur.com/Sq4iQJe.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_one:{url:"https://i.imgur.com/olwRFYI.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_two:{url:"https://i.imgur.com/Ugzzgbh.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_three:{url:"https://i.imgur.com/z6V7A71.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_four:{url:"https://i.imgur.com/MJb2h74.png",alt:"'img'",caption:"See the Awating Eye Cropping Settings text?",max_width:"max-width: 500px;"},eyetrack_vr_guide_five:{url:"https://i.imgur.com/1pNYITS.png",alt:"'img'",caption:":O It's my eye!",max_width:"max-width: 500px;"},eyetrack_vr_guide_six:{url:"https://i.imgur.com/HZSvFBv.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_seven:{url:"https://i.imgur.com/xXTB3sM.png",alt:"'img'",caption:"It's crooked!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eight:{url:"https://i.imgur.com/blsrpCX.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_nine:{url:"https://i.imgur.com/30fFadH.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_ten:{url:"https://i.imgur.com/ZjpKfCV.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eleven:{url:"https://i.imgur.com/KPUn8S1.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},fox_ir_build_instructions_one:{url:"https://i.imgur.com/WyoVdcR.jpg",alt:"'img'",caption:"698ohm resistors and V2 PCBs",max_width:"max-width: 400px;"},fox_ir_build_instructions_two:{url:"https://i.imgur.com/sNB6ju2.png",alt:"'img'",caption:"V2",max_width:"max-width: 400px;"},fox_ir_build_instructions_three:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"'img'",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},fox_ir_build_instructions_four:{url:"https://i.imgur.com/ayQ5vkf.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_five:{url:"https://i.imgur.com/DpFwecO.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_six:{url:"https://i.imgur.com/50ydMrl.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_seven:{url:"https://i.imgur.com/Qq3cvxi.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eight:{url:"https://i.imgur.com/yWGaKaC.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_nine:{url:"https://i.imgur.com/Ql4zYCq.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_ten:{url:"https://i.imgur.com/Xrczoyv.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eleven:{url:"https://i.imgur.com/KKgP8qs.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_twelve:{url:"https://i.imgur.com/SvbHAuY.jpg",alt:"'img'",caption:"The LED is flipped in this Image, the green dot should face AWAY from the PCB.",max_width:"max-width: 400px;"},fox_ir_build_instructions_thirteen:{url:"https://i.imgur.com/gopjVG3.png",alt:"'drawing'",max_width:"max-width: 500px;"},pio_upgrade_command:{url:"https://i.imgur.com/taDa3vj.png",alt:"pio upgrade command in the terminal",max_width:"max-width: 500px;"}};export{v as _,b as i}; diff --git a/assets/chunks/index.47cb84cc.js b/assets/chunks/index.5b1f69a8.js similarity index 97% rename from assets/chunks/index.47cb84cc.js rename to assets/chunks/index.5b1f69a8.js index a68971c..e728e88 100644 --- a/assets/chunks/index.47cb84cc.js +++ b/assets/chunks/index.5b1f69a8.js @@ -1 +1 @@ -import{o as n,c as r,g as e,a as s,t as i,j as o,k as _,l as x}from"../app.24a1fc0a.js";const c={class:"my-2 max-w-xs rounded-lg bg-white px-4 py-4 shadow-xl ring-1 ring-slate-900/5 dark:bg-slate-800"},d={class:"drop-shadow-lg"},b={__name:"Alerts",props:["options"],setup(t){return(l,g)=>{const a=x("Badge");return n(),r("div",c,[e("div",null,[e("span",d,[s(a,{type:t.options.type,text:t.options.badge_content},null,8,["type","text"])])]),e("div",{class:o(["mt-2 pl-1 text-2xl font-bold tracking-tight text-slate-900",t.options.title_color])},i(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[_(l.$slots,"content")],2)])}}},u={user_warning:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},led_power_warning:{type:"danger",title:"Please pay attention",title_color:"text-[#b63a61] dark:text-[#ea4b7d]",text_color:"text-orange-400 dark:text-orange-500",badge_content:"WARNING"},parts_list_one:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_three:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_four:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_five:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_six:{type:"tip",title:"",title_color:"text-[green]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"TIP"},upload_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},configure_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},build_software_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},vrc_avatar_setup:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},end_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"}};export{b as _,u as a}; +import{o as n,c as r,g as e,a as s,t as i,j as o,k as _,l as x}from"../app.ffc675f3.js";const c={class:"my-2 max-w-xs rounded-lg bg-white px-4 py-4 shadow-xl ring-1 ring-slate-900/5 dark:bg-slate-800"},d={class:"drop-shadow-lg"},b={__name:"Alerts",props:["options"],setup(t){return(l,g)=>{const a=x("Badge");return n(),r("div",c,[e("div",null,[e("span",d,[s(a,{type:t.options.type,text:t.options.badge_content},null,8,["type","text"])])]),e("div",{class:o(["mt-2 pl-1 text-2xl font-bold tracking-tight text-slate-900",t.options.title_color])},i(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[_(l.$slots,"content")],2)])}}},u={user_warning:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},led_power_warning:{type:"danger",title:"Please pay attention",title_color:"text-[#b63a61] dark:text-[#ea4b7d]",text_color:"text-orange-400 dark:text-orange-500",badge_content:"WARNING"},parts_list_one:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_three:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_four:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_five:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_six:{type:"tip",title:"",title_color:"text-[green]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"TIP"},upload_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},configure_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},build_software_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},vrc_avatar_setup:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},end_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"}};export{b as _,u as a}; diff --git a/assets/chunks/index.99ba4c01.js b/assets/chunks/index.99ba4c01.js deleted file mode 100644 index 82ba938..0000000 --- a/assets/chunks/index.99ba4c01.js +++ /dev/null @@ -1 +0,0 @@ -import{o as i,c as a,g as m,n as e,b as p,t as r,i as o}from"../app.24a1fc0a.js";const n={align:"center",class:"mb-4"},h=["href"],_=["src","alt"],d=["href"],x=["src","alt"],g={key:2},l=m("br",null,null,-1),c=["href"],s={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},v={__name:"ImageComponent",props:["options"],setup(t){return(u,w)=>(i(),a("div",n,[m("figure",null,[t.options.url_2?(i(),a("a",{key:0,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url_2},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:e(t.options.max_width)},null,12,_)],8,h)):(i(),a("a",{key:1,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:e(t.options.max_width)},null,12,x)],8,d)),t.options.caption?(i(),a("figcaption",g,[l,p(" "+r(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",s,r(t.options.caption_link),1)],8,c)):o("",!0)])):o("",!0)])]))}},j={image_one:{url:"https://i.imgur.com/j18rRI7.jpg",alt:"'img of components'",caption:"'ESPs, cams, a programmer and a USB connector'",max_width:"max-width: 400px;"},discord_content:{url:"https://discord.com/api/guilds/946212245187199026/widget.png?style=banner3",url_2:"https://discord.gg/kkXYbVykZX",alt:"'discord banner'",max_width:"max-width: 400px;"},external_antenna:{url:"https://i.imgur.com/OzpxFMD.png",alt:"'img of external antenna'",caption:"Image from:",caption_link:"https://randomnerdtutorials.com/esp32-cam-connect-external-antenna",max_width:"max-width: 400px;"},external_antenna_resistors:{url:"https://i.imgur.com/RIFpNqW.jpg",alt:"'img of external antenna resistors'",max_width:"max-width: 400px;"},camera_socket:{url:"https://i.imgur.com/T5asLGN.jpg",alt:"'img of camera socket'",max_width:"max-width: 400px;"},camera_socket_clip:{url:"https://i.imgur.com/Z8b8Sin.jpg",alt:"'img of camera clip'",max_width:"max-width: 400px;"},camera_cable:{url:"https://i.imgur.com/dDBIi9j.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},camera_clip_close:{url:"https://i.imgur.com/VnFi5XS.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},_7_12_one:{url:"https://i.imgur.com/LsLPAcd.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_two:{url:"https://i.imgur.com/Cdu9lSN.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_three:{url:"https://i.imgur.com/QlRrWNn.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_one:{url:"https://i.imgur.com/DhnmLBG.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_two:{url:"https://i.imgur.com/PWA0gtq.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_three:{url:"https://i.imgur.com/0zXY79j.jpg",alt:"",caption:"357ohm resistors and V3 PCBs",max_width:"max-width: 400px;"},_13_18_four:{url:"https://i.imgur.com/n1noWKq.png",alt:"",caption:"V3",max_width:"max-width: 400px;"},_13_18_five:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},_13_18_six:{url:"https://i.imgur.com/gb4etdB.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_seven:{url:"https://i.imgur.com/ev5QFch.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_eight:{url:"https://i.imgur.com/8jCQOHw.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_nine:{url:"https://i.imgur.com/CHUb7Iv.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_ten:{url:"https://i.imgur.com/jZYAm5O.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_one:{url:"https://i.imgur.com/pjvLHJL.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_two:{url:"https://i.imgur.com/RbHZQhl.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_three:{url:"https://i.imgur.com/VyClWvp.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_four:{url:"https://i.imgur.com/tFCQTqE.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_five:{url:"https://i.imgur.com/tFCQTqE.jpeg",alt:"",caption:"",max_width:"max-width: 400px;"},end_six:{url:"https://i.imgur.com/pqDgpYP.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_seven:{url:"https://i.imgur.com/bEq6Ww0.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_eight:{url:"https://i.imgur.com/r2Jo45t.png",alt:"",caption:"",max_width:"max-width: 400px;"},end_nine:{url:"https://i.imgur.com/a6ERUFx.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_ten:{url:"https://i.imgur.com/Wy89UWy.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_eleven:{url:"https://i.imgur.com/LtKOLWo.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_twelve:{url:"https://i.imgur.com/9mty1bv.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_thirteen:{url:"https://i.imgur.com/ArLO1ls.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fourteen:{url:"https://i.imgur.com/ZIecsMM.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fifteen:{url:"https://i.imgur.com/tYD1KKe.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_sixteen:{url:"https://i.imgur.com/3rCRU5A.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},upload_firmware_image_one:{url:"https://i.imgur.com/dSPSpkY.png",alt:"'platformio serial monitor button'",max_width:"max-width: 500px;"},upload_firmware_image_two:{url:"https://i.imgur.com/PoHP3NC.png",alt:"'img of platformio serial monitor'",max_width:"max-width: 600px;"},setup_vscode_image_one:{url:"https://i.imgur.com/jXPXIFz.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_two:{url:"https://i.imgur.com/hAm3Zu0.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_three:{url:"https://i.imgur.com/ebV0IgT.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_four:{url:"https://i.imgur.com/DWO5vkE.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_five:{url:"https://i.imgur.com/mWAVxtF.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_six:{url:"https://i.imgur.com/YbXpX7t.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_seven:{url:"https://i.imgur.com/c61Cpaz.gif",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_one:{url:"https://i.imgur.com/1Ficr7f.png",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_two:{url:"https://i.imgur.com/Sq4iQJe.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_one:{url:"https://i.imgur.com/olwRFYI.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_two:{url:"https://i.imgur.com/Ugzzgbh.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_three:{url:"https://i.imgur.com/z6V7A71.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_four:{url:"https://i.imgur.com/MJb2h74.png",alt:"'img'",caption:"See the Awating Eye Cropping Settings text?",max_width:"max-width: 500px;"},eyetrack_vr_guide_five:{url:"https://i.imgur.com/1pNYITS.png",alt:"'img'",caption:":O It's my eye!",max_width:"max-width: 500px;"},eyetrack_vr_guide_six:{url:"https://i.imgur.com/HZSvFBv.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_seven:{url:"https://i.imgur.com/xXTB3sM.png",alt:"'img'",caption:"It's crooked!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eight:{url:"https://i.imgur.com/blsrpCX.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_nine:{url:"https://i.imgur.com/30fFadH.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_ten:{url:"https://i.imgur.com/ZjpKfCV.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eleven:{url:"https://i.imgur.com/KPUn8S1.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},fox_ir_build_instructions_one:{url:"https://i.imgur.com/WyoVdcR.jpg",alt:"'img'",caption:"698ohm resistors and V2 PCBs",max_width:"max-width: 400px;"},fox_ir_build_instructions_two:{url:"https://i.imgur.com/sNB6ju2.png",alt:"'img'",caption:"V2",max_width:"max-width: 400px;"},fox_ir_build_instructions_three:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"'img'",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},fox_ir_build_instructions_four:{url:"https://i.imgur.com/ayQ5vkf.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_five:{url:"https://i.imgur.com/DpFwecO.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_six:{url:"https://i.imgur.com/50ydMrl.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_seven:{url:"https://i.imgur.com/Qq3cvxi.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eight:{url:"https://i.imgur.com/yWGaKaC.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_nine:{url:"https://i.imgur.com/Ql4zYCq.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_ten:{url:"https://i.imgur.com/Xrczoyv.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eleven:{url:"https://i.imgur.com/KKgP8qs.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_twelve:{url:"https://i.imgur.com/SvbHAuY.jpg",alt:"'img'",caption:"The LED is flipped in this Image, the green dot should face AWAY from the PCB.",max_width:"max-width: 400px;"},fox_ir_build_instructions_thirteen:{url:"https://i.imgur.com/gopjVG3.png",alt:"'drawing'",max_width:"max-width: 500px;"}};export{v as _,j as i}; diff --git a/assets/chunks/virtual_search-data.4fd145b6.js b/assets/chunks/virtual_search-data.4fd145b6.js deleted file mode 100644 index 07fcdc5..0000000 --- a/assets/chunks/virtual_search-data.4fd145b6.js +++ /dev/null @@ -1,82 +0,0 @@ -const e={map:'[{"text":["1.0","3.0","5.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.0","16.0","17.0","18.0","20.0","21.0","22.0","23.0"],"step":["1.1","1.2","16.2","16.3","16.4","16.5","16.6","16.7","17.2","17.3","17.4","17.5","17.6","17.7","17.8","17.9","17.10","17.11","17.12","17.13","17.14","17.15","17.16","17.17","17.18","17.21","23.1","23.2","23.3","23.4"],"solder":["1.3","17.19"],"wire":["1.4","17.20"],"div":["2.0"],"completed":["3.1"],"in":["3.2"],"planned":["3.3"],"development":["4.0"],"getting":["4.1"],"contributing":["4.2"],"adding":["5.1"],"editing":["5.2"],"standards":["6.0"],"code":["6.1"],"once":["7.1"],"open":["7.2"],"now":["7.3"],"what":["8.1","9.1","10.1","11.1"],"build":["8.2","22.6"],"board":["8.3"],"how":["9.2","10.2","11.2"],"prerequisites":["10.3"],"troubleshooting":["10.4","13.6"],"uploading":["13.4"],"finding":["13.5"],"about":["14.1"],"hardware":["14.2"],"firmware":["14.3"],"headset":["14.4"],"this":["15.1","16.1","17.1","18.1","22.1"],"ir":["17.22","18.4"],"camera":["18.2"],"recommended":["18.3"],"misc":["18.5"],"requirements":["22.2"],"install":["22.3","22.5"],"installing":["22.4"],"see":["23.5"]},{"0":["22.4"],"1":["1.2","4.2","7.2","12.1","12.3","13.1","16.2","17.2","17.18","22.4","23.0"],"2":["12.2","13.2","16.3","17.3","17.6","23.1"],"3":["12.3","13.3","16.4","17.4","23.2"],"4":["4.1","16.5","17.5","23.3"],"5":["16.6","17.6","23.4"],"6":["16.7","17.7"],"7":["17.8","22.4"],"8":["17.9"],"9":["17.10"],"10":["17.11"],"11":["17.12"],"12":["17.13"],"13":["17.14"],"14":["17.15"],"15":["1.1","4.1","17.16"],"16":["17.17"],"17":["1.2"],"18":["17.18"],"19":["17.21"],"32":["18.2"],"81":["11.2"],"160":["18.2"],"layout":["0.0","19.0"],"page":["0.0","5.1","5.2","15.1","16.1","17.1","18.1"],"vpteampage":["0.0"],"vpteampagetitle":["0.0"],"template":["0.0"],"title":["0.0"],"div":["0.0"],"class":["0.0","2.0"],"text":["0.0","2.0","7.2","19.0"],"ab5ac7":["0.0","2.0","14.0"],"our":["0.0","14.3"],"team":["0.0"],"lead":["0.0"],"the":["0.0","1.4","4.2","5.1","6.1","7.2","8.2","10.2","10.4","11.2","12.3","13.1","13.3","13.4","13.5","16.4","17.3","17.6","17.7","17.8","17.12","17.13","17.14","17.15","17.19","17.20","17.21","18.6","22.5","22.6","23.0","23.1","23.2","23.3","23.4"],"development":["0.0"],"of":["0.0","1.4","5.1","7.2","8.2","11.2","13.5","15.1","17.21","22.4"],"eyetrackvr":["0.0","19.0","22.3","23.0","23.1"],"is":["0.0","6.1","7.2","8.1","10.1","10.2","10.3","11.1","11.2","13.3","13.4","14.1","15.1","17.6","17.21","18.6","21.0","23.3","23.4"],"guided":["0.0"],"by":["0.0","6.1","10.2","21.0","23.3","23.4"],"var":["1.0","3.0","5.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","15.0","16.0","17.0","18.0","20.0","21.0","22.0","23.0"],"prepare":["1.1","17.17"],"to":["1.1","5.1","6.1","7.2","8.1","8.2","10.1","10.2","10.3","10.4","11.2","13.1","13.3","13.4","13.5","14.1","15.1","16.2","17.6","17.7","17.8","17.11","17.12","17.15","17.17","17.18","17.20","17.21","17.22","18.4","18.6","22.1","23.0","23.3"],"solder":["1.1","1.2","17.14","17.15","17.17","17.18"],"ir":["1.1","1.3","1.4","14.1","17.12","17.17","18.2"],"led":["1.1","17.17","17.22","18.4"],"pcb":["1.1","1.2","1.3","17.18","17.19"],"v2s":["1.1"],"get":["1.1","11.2","16.7","17.17"],"your":["1.1","7.2","11.2","13.1","13.2","13.3","13.4","13.5","14.1","16.2","16.5","16.7","17.2","17.7","17.10","17.11","17.17","17.21","23.3","23.4"],"magnifying":["1.1","17.17"],"glass":["1.1","17.17"],"out":["1.1","17.17"],"it":["1.1","6.1","7.2","8.1","8.3","10.1","10.2","11.1","11.2","13.4","14.1","16.4","17.17","17.21"],"s":["1.1","11.2","17.17","23.2"],"time":["1.1","17.17","18.4"],"very":["1.1","17.17"],"smol":["1.1","17.17"],"resistors":["1.2","17.18"],"on":["1.2","1.3","8.3","10.2","13.3","16.1","17.18","17.19","18.4"],"v2":["1.2","1.3","1.4"],"you":["1.2","5.1","7.1","7.2","10.1","10.4","11.2","12.3","13.3","13.6","15.1","17.6","17.18","18.4","22.6","23.2"],"only":["1.2","6.1","17.18"],"need":["1.2","5.1","7.2","17.18","23.4"],"leds":["1.3","16.5","17.12","17.19"],"imagecard":["1.3","7.2"],"options":["1.3","7.2","8.2"],"image":["1.3","7.2","19.0"],"settings":["1.3","7.2","23.2"],"fox":["1.3"],"up":["1.4","17.5","17.20"],"pcbs":["1.4","17.17","17.20"],"basic":["1.4","11.2","16.1","18.1","23.2"],"full":["1.4"],"wiring":["1.4"],"diagram":["1.4"],"align":["2.0"],"center":["2.0"],"rounded":["2.0"],"md":["2.0","5.1"],"h1":["2.0"],"font":["3.0","5.0","9.0","12.0","13.0","14.0","18.0","21.0","23.0"],"checkboxlist":["3.1","3.3"],"progress":["3.2"],"documentation":["4.0","4.2","6.1"],"for":["4.0","5.1","6.1","11.2","13.4","17.4","17.12","17.21","18.1","18.6","23.3"],"started":["4.1"],"prerequisites":["4.1"],"node":["4.1"],"js":["4.1"],"v14":["4.1"],"or":["4.1","7.2","12.3","17.6","17.21","18.4"],"higher":["4.1"],"project":["4.2","12.3","15.1"],"structure":["4.2"],"familiarize":["4.2"],"yourself":["4.2"],"with":["4.2","7.2","11.2","12.3","14.1","14.4","17.6","18.6","23.2"],"vitepress":["4.2","5.1"],"accent":["5.0","9.0","13.0","18.0","21.0","23.0"],"this":["5.0","6.1","17.22","18.6","23.3"],"section":["5.0","17.21"],"a":["5.1","5.2","6.1","7.2","8.1","8.2","8.3","10.1","11.1","11.2","12.3","13.4","14.1","16.1","16.2","16.3","17.11","18.1","18.4","18.6","21.0","23.3"],"add":["5.1"],"will":["5.1","7.2","15.1","16.1","16.4","18.1","22.1","23.2"],"create":["5.1"],"new":["5.1","10.2","12.3"],"markdown":["5.1"],"file":["5.1","7.2"],"in":["5.1","7.2","14.4","17.10","23.2","23.3"],"docs":["5.1","19.0"],"src":["5.1","19.0"],"pages":["5.1"],"folder":["5.1"],"name":["5.1","7.2","11.2","19.0"],"be":["5.1","10.2","11.2","14.1","15.1","23.3"],"url":["5.1"],"example":["5.1","11.2"],"if":["5.1","7.2","10.4","11.2","13.3","13.6","18.4"],"called":["5.1"],"my":["5.1"],"https":["5.1"],"guide":["6.0","22.1"],"listed":["6.0"],"here":["6.0","17.21","21.0"],"standards":["6.1"],"general":["6.1"],"design":["6.1"],"that":["6.1","10.1"],"we":["6.1","8.2","8.3","11.2","14.4","23.4"],"use":["6.1","10.2","10.3","11.2","13.4","14.1","17.6"],"static":["6.1"],"site":["6.1"],"framework":["6.1"],"ensure":["6.1"],"easy":["6.1"],"maintain":["6.1"],"and":["6.1","7.2","8.3","10.2","11.2","13.3","13.4","13.5","14.0","15.1","17.7","17.10","17.21","19.0","23.0","23.2","23.3"],"extend":["6.1"],"also":["6.1"],"understand":["6.1","15.1"],"have":["6.1","7.1","7.2","8.2","12.3","14.4","17.6","17.18"],"few":["6.1","8.3"],"rules":["6.1"],"ini":["7.2"],"user":["7.2"],"config":["7.2"],"configure":["7.2","17.9"],"firmware":["7.2","8.1","9.0","10.2","12.3","13.3","13.4"],"two":["7.2"],"replace":["7.2"],"placeholder":["7.2"],"correct":["7.2"],"ssid":["7.2"],"wifi":["7.2"],"access":["7.2"],"point":["7.2"],"password":["7.2"],"respectfully":["7.2"],"info":["7.2","11.2"],"special":["7.2"],"characters":["7.2"],"such":["7.2"],"as":["7.2","11.2"],"are":["7.2","8.3","13.3","14.4","17.6","17.21","18.6"],"not":["7.2","10.2","10.4","14.1","14.4","15.1","18.4"],"supported":["7.2"],"character":["7.2"],"change":["7.2"],"spaces":["7.2"],"either":["7.2"],"space":["7.2"],"supports":["7.2"],"ap":["7.2"],"mode":["7.2"],"but":["7.2"],"recommended":["7.2","14.1","17.21","18.6"],"using":["7.2","11.2","13.3"],"set":["7.2"],"enableadhoc":["7.2"],"then":["7.2","13.5"],"can":["7.2","10.2","10.4","11.2","14.1","17.6","18.4","23.3"],"choose":["7.2"],"leave":["7.2"],"move":["7.3"],"environment":["8.1"],"way":["8.1","13.4","16.2"],"types":["8.2","8.3"],"now":["8.2","22.6"],"couple":["8.2"],"letting":["8.2"],"us":["8.2"],"decide":["8.2"],"how":["8.2","13.4","22.1"],"want":["8.2","18.4"],"firmaware":["8.2"],"debug":["8.2"],"has":["8.2"],"lot":["8.2"],"logging":["8.2"],"useful":["8.2"],"currently":["8.3"],"support":["8.3","14.4"],"different":["8.3","14.1"],"boards":["8.3","17.6"],"working":["8.3"],"adding":["8.3","23.3"],"more":["8.3"],"warning":["8.3","17.11","17.20"],"should":["9.1","22.6"],"i":["9.1","13.4"],"download":["9.1","23.0"],"do":["9.2","13.4","17.6","18.4"],"mdns":["10.1","10.2"],"protocol":["10.1"],"allows":["10.1"],"connect":["10.1","10.4","11.2","13.1","13.4","13.5","17.8","17.11"],"device":["10.1","10.4","11.2","13.4"],"enable":["10.2"],"enabled":["10.2"],"default":["10.2"],"disabled":["10.2"],"bonjour":["10.3"],"required":["10.3","22.5"],"rest":["11.1","11.2"],"api":["11.1","11.2"],"client":["11.2"],"any":["11.2","12.3"],"used":["11.2"],"communicate":["11.2"],"esp":["11.2","17.6","17.7","17.8","17.10","17.15","18.2"],"devices":["11.2"],"recommend":["11.2"],"thunder":["11.2"],"test":["11.2","16.6"],"free":["11.2"],"vscode":["11.2"],"extension":["11.2"],"requests":["11.2"],"browser":["11.2","23.3"],"choice":["11.2"],"standard":["11.2"],"follows":["11.2"],"following":["11.2"],"txt":["11.2"],"http":["11.2"],"local":["11.2"],"control":["11.2"],"builtin":["11.2"],"command":["11.2"],"endpoint":["11.2"],"param":["11.2"],"value":["11.2"],"esp32":["11.2","13.1"],"endpoints":["11.2"],"note":["11.2"],"install":["12.1","12.2","17.6","23.0"],"visual":["12.1","17.9"],"studio":["12.1","17.9"],"platformio":["12.2"],"ide":["12.2"],"once":["12.2","14.1","23.4"],"clone":["12.3"],"make":["12.3","13.3","17.2"],"sure":["12.3","13.3","17.2"],"close":["12.3"],"current":["12.3"],"projects":["12.3"],"open":["12.3","14.0"],"window":["12.3"],"before":["12.3","15.1"],"moving":["12.3"],"forward":["12.3"],"these":["12.3"],"steps":["12.3"],"uploading":["13.0"],"tracker":["13.1","13.3","13.5"],"pc":["13.1","13.5"],"via":["13.1","13.4"],"programmer":["13.1","17.8"],"first":["13.1","13.3","17.6"],"build":["13.2"],"upload":["13.3"],"ota":["13.3","13.4"],"method":["13.3"],"wish":["13.3"],"flash":["13.3"],"turned":["13.3"],"connected":["13.3"],"what":["13.4","23.3"],"stands":["13.4"],"over":["13.4","23.2"],"air":["13.4"],"update":["13.4"],"without":["13.4"],"having":["13.4"],"computer":["13.4"],"ip":["13.5","23.3"],"address":["13.5","23.3"],"encountered":["13.6"],"an":["13.6","15.1","17.6","18.1","21.0"],"issue":["13.6"],"while":["13.6"],"3xl":["14.0"],"bold":["14.0"],"underline":["14.0"],"source":["14.0","18.4"],"affordable":["14.0","19.0"],"vr":["14.0","14.4","19.0"],"emitter":["14.1"],"safety":["14.1"],"please":["14.1","14.2"],"exercise":["14.1"],"caution":["14.1"],"when":["14.1"],"messing":["14.1"],"around":["14.1"],"emitters":["14.1","18.4"],"dangerous":["14.1"],"eyes":["14.1","23.4"],"at":["14.1","17.7"],"certain":["14.1"],"power":["14.1","17.11","23.3"],"level":["14.1"],"theory":["14.4"],"compatible":["14.4"],"every":["14.4"],"however":["14.4"],"mounts":["14.4","16.7","17.21","18.6"],"may":["14.4","17.21"],"overview":["15.1"],"things":["15.1","17.6","18.4"],"know":["15.1"],"start":["15.1"],"software":["15.1","23.3","23.4"],"final":["15.1"],"include":["16.1","18.1"],"rundown":["16.1"],"find":["16.2","16.3","17.12","17.21","23.2","23.3"],"mount":["16.2","16.3","16.4","16.5","17.22"],"camera":["16.3","16.4","17.7"],"place":["16.4"],"where":["16.4"],"give":["16.4"],"everything":["16.6"],"order":["17.3"],"all":["17.3"],"wait":["17.4"],"gather":["17.5"],"external":["17.6"],"antennas":["17.6"],"shield":["17.6"],"antenna":["17.6"],"antistatic":["17.6"],"bag":["17.6"],"some":["17.6","17.21","23.2"],"cam":["17.6","18.2"],"issues":["17.6"],"signal":["17.6"],"integrity":["17.6"],"there":["17.6"],"help":["17.6"],"solve":["17.6"],"option":["17.6"],"attach":["17.7"],"cameras":["17.7","23.3"],"esps":["17.7","23.3"],"look":["17.7"],"locate":["17.7"],"ribbon":["17.7"],"cable":["17.7"],"connector":["17.7"],"plug":["17.10"],"wires":["17.11","17.12"],"usb":["17.11"],"type":["17.11"],"board":["17.11"],"cut":["17.12"],"optimal":["17.12"],"length":["17.12"],"take":["17.12"],"twist":["17.13"],"positive":["17.13"],"negative":["17.15"],"wire":["17.15"],"repeat":["17.15"],"v3":["17.18","17.19","17.20"],"per":["17.18"],"eye":["17.18","19.0","23.3","23.4"],"tin":["17.18","17.19"],"pay":["17.20"],"attention":["17.20"],"3d":["17.21","18.6"],"print":["17.21"],"head":["17.21"],"printed":["17.21","18.6"],"parts":["17.21","18.5"],"list":["17.21","18.1"],"which":["17.21"],"headset":["17.21"],"them":["17.21","18.6","23.3"],"work":["17.21"],"better":["17.21"],"worse":["17.21"],"mounting":["17.22"],"again":["17.22"],"differs":["17.22"],"from":["17.22","18.4","23.2"],"alerts":["18.0"],"part":["18.1"],"building":["18.1"],"setup":["18.2","21.0"],"2x":["18.2","18.3"],"modules":["18.2","22.5"],"aliexpress":["18.2"],"ov2640":["18.2"],"fov":["18.2"],"kit":["18.4"],"multiple":["18.4"],"places":["18.4"],"save":["18.4"],"money":["18.4"],"assembly":["18.4"],"buy":["18.4"],"me":["18.4"],"pre":["18.4"],"soldered":["18.4"],"raw":["18.4"],"1x":["18.5"],"next":["18.6"],"respected":["18.6"],"hmd":["18.6"],"based":["18.6"],"home":["19.0"],"hero":["19.0"],"opensource":["19.0"],"tracking":["19.0"],"logo":["19.0"],"light":["19.0"],"png":["19.0"],"alt":["19.0"],"avatar":["21.0"],"video":["21.0"],"created":["21.0"],"show":["22.1"],"checklist":["22.2"],"python":["22.3","22.5"],"poetry":["22.4"],"since":["22.4"],"version":["22.4"],"app":["22.6","23.0","23.1","23.2"],"step":["23.0"],"installer":["23.0"],"go":["23.0","23.2"],"latest":["23.0"],"github":["23.0"],"run":["23.1"],"getting":["23.2"],"familiar":["23.2"],"terminology":["23.2"],"let":["23.2"],"starting":["23.2"],"configuring":["23.3"],"right":["23.3"],"done":["23.3"],"opening":["23.3"],"both":["23.3"],"calibrating":["23.4"],"trackable":["23.4"],"anything":["23.5"]},{"1":["13.2"],"2":["1.1","4.2","7.2"],"4":["1.1","7.2","17.17"],"10":["4.1"],"12":["17.15"],"13":["17.17"],"18":["17.17"],"22":["4.1"],"30":["4.1"],"100":["15.1"],"300":["21.0"],"500":["21.0"],"an":["0.0","10.1","17.21"],"international":["0.0"],"some":["0.0","17.22"],"whom":["0.0"],"have":["0.0","1.2","13.4","17.2","17.8","17.21","18.2","22.4"],"chosen":["0.0"],"to":["0.0","1.2","4.2","5.0","5.2","8.3","11.1","12.3","16.1","16.3","17.4","17.9","17.14","22.4","22.6","23.4"],"be":["0.0","6.1","13.0","17.18","22.6"],"featured":["0.0"],"below":["0.0","13.3","17.7"],"br":["0.0","2.0"],"developers":["0.0"],"are":["0.0","6.0","11.2","14.1","17.17","17.22","18.4"],"a":["0.0","1.2","13.5","14.4","16.4","17.6","17.12","17.15","17.21"],"group":["0.0"],"people":["0.0","18.6"],"who":["0.0"],"passionate":["0.0"],"font":["1.0","7.0","8.0","10.0","11.0","15.0","16.0","17.0","20.0","22.0"],"things":["1.1","17.2","17.4","17.17"],"gather":["1.1","17.17"],"pcbs":["1.1"],"leds":["1.1","17.17","17.20","17.22"],"and":["1.1","8.2","9.1","10.3","12.3","14.4","17.9","17.12","17.13","17.17","23.4"],"700ohm":["1.1"],"resistors":["1.1"],"imagecard":["1.1","1.2","1.4","13.5","17.7","17.17","17.19"],"options":["1.1","1.2","1.4","3.1","3.3","13.5","17.7","17.17","17.19","18.0","18.1","22.2"],"image":["1.1","1.2","1.4","13.5","17.7","17.17","17.19"],"settings":["1.1","1.2","1.4","17.7","17.17","17.19"],"fox":["1.1","1.4"],"build":["1.1","1.3","1.4","22.1"],"instructions":["1.1","1.3","1.4"],"one":["1.1","7.2","17.21","18.0"],"here":["1.1","17.17","18.4","23.0"],"resistor":["1.2","17.18"],"per":["1.2"],"eye":["1.2","14.0","23.2"],"nine":["1.3"],"tin":["1.3"],"the":["1.3","4.0","6.0","7.1","8.1","8.3","9.0","10.3","11.1","12.1","13.2","13.6","15.1","16.2","16.7","17.2","17.10","17.11","17.18","17.22","18.4","22.1"],"pads":["1.3","17.18","17.19"],"thirteen":["1.4"],"contact":["2.0","11.2"],"us":["2.0","11.2"],"please":["2.0","11.2","12.3","14.4"],"join":["2.0"],"our":["2.0","4.2","6.1","14.4","17.3","17.10"],"discord":["2.0"],"for":["2.0","7.2","8.1","8.2","8.3","10.3","14.0","17.22","18.4","19.0"],"accent":["3.0","12.0"],"this":["3.0","5.1","7.2","10.1","10.2","11.2","12.0","13.3","17.6","17.11","17.18"],"checkboxlist":["3.2"],"eyetrackvr":["4.0","5.1","18.1","22.4"],"docs":["4.0"],"yarn":["4.1"],"v1":["4.1"],"git":["4.1","6.1","12.3"],"v2":["4.1"],"then":["4.2","11.2","13.3","23.0","23.3"],"move":["4.2"],"on":["4.2","7.3","8.2","13.4","17.3","17.20","18.6"],"specific":["4.2","8.1"],"will":["5.0","8.3","11.2","17.1","17.6","17.11","18.2","23.0"],"cover":["5.0"],"how":["5.0","16.1"],"add":["5.0","16.5"],"or":["5.0","15.1"],"dev":["5.1"],"sub":["5.1"],"directories":["5.1"],"can":["5.1","13.4","15.1","16.5"],"also":["5.1","11.2"],"edit":["5.2","17.21"],"that":["6.0","8.3","10.4","11.2","18.2","23.3"],"all":["6.1","10.2","17.5","17.21"],"should":["6.1","17.18"],"written":["6.1","11.2"],"in":["6.1","10.2","11.2","13.1","13.5","14.1","17.18","17.22"],"english":["6.1"],"way":["6.1","11.1","16.3"],"commit":["6.1"],"style":["6.1"],"opened":["7.1"],"project":["7.1","22.5"],"defaults":["7.2"],"note":["7.2","8.3","17.18","18.2"],"enabling":["7.2"],"both":["7.2","23.2"],"esps":["7.2","13.4"],"different":["7.2"],"values":["7.2"],"best":["7.2","17.6","18.6"],"only":["7.2","13.4","23.2"],"esp":["7.2","11.1","17.14"],"other":["7.2","18.6"],"sta":["7.2"],"connect":["7.2"],"computer":["7.2"],"allow":["7.2","17.7"],"alerts":["7.2","18.1"],"parts":["7.2","17.3","18.0","18.1","18.4"],"list":["7.2","14.4","18.0"],"template":["7.2","18.1"],"v":["7.2","18.1"],"slot":["7.2","18.1"],"content":["7.2"],"p":["7.2"],"make":["7.2","10.4","17.6","17.21"],"sure":["7.2","10.4","17.21"],"router":["7.2"],"has":["7.2","13.3"],"ghz":["7.2"],"band":["7.2"],"while":["7.2"],"most":["7.2","18.6"],"do":["7.2","10.1","10.2","12.3","14.1","15.1"],"store":["8.1"],"custom":["8.1"],"config":["8.1","10.2","11.2"],"device":["8.1","10.2"],"getting":["8.2","19.0"],"everything":["8.2"],"setup":["8.2","18.1"],"first":["8.2","13.4"],"time":["8.2"],"see":["8.2"],"what":["8.2","14.1","18.6"],"is":["8.2","8.3","9.0","12.2","16.4","16.6","18.4","22.3"],"going":["8.2"],"environment":["8.2","8.3","13.4"],"default":["8.2","8.3"],"so":["8.2"],"you":["8.2","10.2","13.4","14.1","16.3","16.5","16.6","17.8","17.21","18.2","18.6","23.0"],"don":["8.2","14.1"],"t":["8.2","14.1"],"important":["8.3","23.4"],"esp32aithinker":["8.3"],"work":["8.3","17.11"],"vast":["8.3"],"second":["9.0"],"part":["9.0","17.7","23.4"],"where":["9.1"],"current":["9.1"],"testing":["9.1"],"download":["9.2","12.1"],"using":["10.1","22.4"],"name":["10.1","10.2"],"instead":["10.1"],"of":["10.1","10.2","13.1","14.4","17.5","17.12","17.20"],"ip":["10.1"],"address":["10.1"],"useful":["10.1"],"if":["10.1","12.3","14.1","17.6","17.20","17.21","18.6","23.1"],"not":["10.1","11.2","12.3","17.6","17.11","18.6"],"need":["10.2","13.4","16.3"],"set":["10.2"],"file":["10.2","23.0"],"setting":["10.2"],"mdns":["10.3"],"protocol":["10.3","19.0"],"windows":["10.3"],"communicate":["11.1"],"with":["11.1","17.15","23.3"],"devices":["11.1"],"marked":["11.2"],"currently":["11.2","13.4","22.3"],"implemented":["11.2"],"future":["11.2"],"would":["11.2"],"like":["11.2"],"help":["11.2"],"implement":["11.2"],"these":["11.2","13.6"],"open":["11.2","13.5","23.3"],"suggestions":["11.2"],"new":["11.2"],"makes":["11.2"],"changes":["11.2"],"require":["11.2"],"call":["11.2"],"save":["11.2","23.3"],"write":["11.2"],"flash":["11.2","17.8","17.10"],"prevent":["11.2"],"from":["11.2","12.3","17.6","17.11","22.1"],"being":["11.2"],"too":["11.2","17.18"],"often":["11.2"],"which":["11.2","15.1"],"cause":["11.2"],"wear":["11.2"],"out":["11.2","14.2"],"restart":["11.2","23.4"],"itself":["11.2"],"after":["11.2","22.5"],"procedure":["12.0"],"code":["12.1","12.2","17.9"],"latest":["12.1","12.3"],"visual":["12.2"],"studio":["12.2"],"installed":["12.2","12.3"],"go":["12.3"],"https":["12.3","21.0"],"github":["12.3"],"com":["12.3"],"lorow":["12.3"],"openiris":["12.3"],"version":["12.3"],"main":["12.3"],"branch":["12.3"],"install":["12.3"],"it":["12.3","13.1","16.6","17.6","17.8","17.18","23.3","23.4"],"your":["13.0","16.1","17.5","17.6","17.12"],"firmware":["13.0","13.2","17.10"],"must":["13.0"],"initially":["13.0"],"cam":["13.1"],"case":["13.1"],"mb":["13.1"],"board":["13.1"],"s":["13.1","23.3"],"press":["13.2","13.3","23.3","23.4"],"network":["13.3"],"skip":["13.3"],"section":["13.3"],"once":["13.3","13.4"],"been":["13.3","14.4","22.4"],"built":["13.3"],"button":["13.3","23.4"],"sends":["13.3"],"working":["13.4"],"mnually":["13.4"],"flashed":["13.4"],"at":["13.4","14.4","15.1"],"least":["13.4"],"upate":["13.4"],"tip":["13.4"],"coming":["13.4"],"soon":["13.4"],"we":["13.4","14.1","22.4"],"support":["13.4"],"serial":["13.5"],"monitor":["13.5"],"vsc":["13.5"],"by":["13.5"],"pressing":["13.5"],"plug":["13.5"],"icon":["13.5"],"following":["13.6"],"steps":["13.6"],"check":["13.6","14.2"],"faq":["13.6"],"tracker":["14.0"],"platform":["14.0"],"social":["14.0","19.0"],"games":["14.0","19.0"],"via":["14.0","19.0"],"osc":["14.0","19.0"],"udp":["14.0","19.0"],"unless":["14.1"],"know":["14.1"],"exactly":["14.1"],"doing":["14.1"],"as":["14.1","17.7","17.15","23.0"],"could":["14.1"],"result":["14.1","17.6"],"harm":["14.1"],"doubt":["14.1"],"yourself":["14.1","17.21","18.4"],"just":["14.1"],"made":["14.4","17.21"],"yet":["14.4"],"take":["14.4"],"look":["14.4","23.4"],"3d":["14.4"],"printable":["14.4"],"bugs":["15.1"],"occur":["15.1"],"may":["15.1"],"hinder":["15.1"],"experience":["15.1"],"useability":["15.1"],"times":["15.1"],"expect":["15.1"],"reliable":["15.1"],"create":["16.1","23.1"],"own":["16.1","18.6"],"camera":["16.1","23.3"],"mount":["16.1","16.7","17.21"],"headsets":["16.2","18.6"],"lens":["16.2"],"easiest":["16.2"],"get":["16.2","19.0"],"started":["16.2","19.0"],"now":["16.3"],"good":["16.4"],"angle":["16.4"],"ideal":["16.4"],"location":["16.4"],"either":["16.5","17.17"],"unlikely":["16.6"],"listed":["16.7","17.3","18.6"],"send":["16.7"],"me":["16.7"],"read":["17.2"],"arrive":["17.4"],"long":["17.4"],"solution":["17.6"],"when":["17.6"],"comes":["17.6"],"final":["17.6"],"vive":["17.6"],"tundra":["17.6"],"trackers":["17.6"],"required":["17.6"],"interference":["17.6"],"stream":["17.6"],"unusable":["17.6"],"does":["17.6"],"circled":["17.7"],"socket":["17.7"],"flip":["17.7"],"gray":["17.7"],"up":["17.7","17.12","17.16"],"why":["17.8"],"before":["17.8"],"prepare":["17.9"],"guide":["17.10"],"building":["17.10"],"powering":["17.11"],"programmer":["17.11"],"correctly":["17.11"],"delivers":["17.11"],"piece":["17.12"],"wire":["17.12","17.13","17.14","17.16"],"marker":["17.12"],"mock":["17.12"],"usb":["17.13"],"ir":["17.13"],"positive":["17.14"],"but":["17.15"],"wires":["17.15"],"info":["17.15"],"350ohm":["17.17"],"three":["17.17"],"example":["17.18"],"i":["17.18"],"use":["17.18"],"much":["17.18"],"enough":["17.18"],"led":["17.19"],"direction":["17.20"],"green":["17.20"],"test":["17.21"],"there":["17.21","17.22"],"multiple":["17.21"],"each":["17.21"],"kind":["17.21"],"none":["17.21"],"try":["17.21"],"making":["17.21"],"skills":["17.21"],"ping":["17.21"],"cases":["17.22"],"designated":["17.22"],"spots":["17.22"],"two":["18.1"],"night":["18.2"],"vers":["18.2"],"75mm":["18.2"],"850nm":["18.2"],"amazon":["18.2"],"alternative":["18.2","18.4"],"4x":["18.3","18.4"],"component":["18.4"],"alternatively":["18.4"],"unfocused":["18.4"],"smd":["18.4"],"recomended":["18.4"],"lcsc":["18.4"],"digikey":["18.4"],"difference":["18.4"],"between":["18.4"],"them":["18.4"],"ones":["18.4"],"rated":["18.4"],"hot":["18.5"],"glue":["18.5"],"user":["18.6"],"feedback":["18.6"],"works":["18.6"],"partslist":["18.6"],"another":["18.6"],"headset":["18.6"],"above":["18.6"],"etrvr":["19.0"],"tagline":["19.0"],"actions":["19.0"],"theme":["19.0"],"brand":["19.0"],"link":["19.0"],"contributor":["21.0"],"div":["21.0"],"align":["21.0"],"center":["21.0"],"iframe":["21.0"],"width":["21.0"],"height":["21.0"],"src":["21.0"],"www":["21.0"],"app":["22.1","23.3"],"source":["22.1"],"cloning":["22.5"],"ready":["22.6"],"release":["23.0"],"zip":["23.0"],"extract":["23.0"],"run":["23.0"],"exe":["23.0"],"administrator":["23.0"],"desktop":["23.1"],"shortcut":["23.1"],"option":["23.1"],"top":["23.2"],"right":["23.2"],"shows":["23.2"],"feed":["23.2"],"left":["23.2"],"holding":["23.3"],"finger":["23.3"],"over":["23.3"],"copy":["23.3"],"close":["23.3"],"tab":["23.3"],"enter":["23.3"],"into":["23.3"],"field":["23.3"],"calibrate":["23.4"],"calibration":["23.4"],"around":["23.4"],"outdated":["23.5"]},{"1":["4.1"],"2":["4.1","12.3","17.21"],"13":["17.18"],"56":["4.1"],"about":["0.0"],"field":["0.0"],"augmented":["0.0"],"and":["0.0","2.0","12.1","12.2","17.6","17.11","17.18","17.19","22.5"],"virtual":["0.0"],"reality":["0.0"],"vpteammembers":["0.0"],"size":["0.0"],"medium":["0.0"],"members":["0.0"],"vpteampagesection":["0.0"],"contributors":["0.0"],"those":["0.0"],"accent":["1.0","7.0","8.0","10.0","11.0","15.0","16.0","17.0","20.0","22.0"],"are":["1.1","6.1","8.2","10.3","13.4","15.1","17.11"],"the":["1.1","1.2","5.0","10.1","14.0","14.4","16.3","17.9","17.16","17.17","18.1","18.2","22.4"],"pin":["1.1","17.17"],"labels":["1.1","17.17"],"two":["1.1"],"fox":["1.2"],"ir":["1.2"],"build":["1.2","22.4"],"instructions":["1.2"],"four":["1.2","12.3","17.17","18.4","23.3"],"tin":["1.2","17.13"],"pads":["1.2","17.6"],"ten":["1.3"],"place":["1.3","14.1"],"resistor":["1.3","17.6"],"pcb":["1.4","17.17"],"that":["1.4","7.2","12.3","14.1","16.1","16.4","17.6","18.6","23.0","23.4"],"receives":["1.4"],"5v":["1.4"],"power":["1.4","11.2","18.4"],"is":["1.4","4.0","5.1","10.4","14.4","16.2","17.20","18.1","23.2"],"one":["1.4","11.2","13.3","13.5","17.19","23.0"],"with":["1.4","22.6","23.0"],"updates":["2.0","7.2"],"any":["2.0","14.1","16.1"],"questions":["2.0"],"iframe":["2.0"],"will":["3.0","5.2","12.0","14.0","16.6"],"contain":["3.0","17.1"],"a":["3.0","16.6","17.1","17.18","22.5","22.6","23.0"],"options":["3.2","12.3","13.3","17.18","17.22","18.4","22.1","23.0","23.3"],"site":["4.0"],"this":["4.0","8.1","9.2","11.1","13.4","14.1","23.0","23.2","23.5"],"vscode":["4.1","12.3"],"below":["4.2","17.6"],"standards":["4.2"],"all":["4.2","8.2","11.2","15.1","23.4"],"should":["4.2","7.1","18.4","23.1","23.3"],"be":["4.2","16.7","17.6","17.7","18.4","23.0"],"written":["4.2"],"in":["4.2","8.2","17.6","17.11","17.15","17.20","18.4","18.6","22.6"],"markdown":["4.2"],"edit":["5.0"],"pages":["5.0"],"on":["5.0","7.2","9.1","13.5","14.4","19.0","23.5"],"docs":["5.0"],"website":["5.0","14.0"],"useful":["5.1","8.1","11.1"],"organizing":["5.1"],"into":["5.1","13.1","17.7"],"categories":["5.1"],"sidebar":["5.1"],"custom":["5.1"],"theme":["5.1"],"index":["5.1"],"js":["5.1"],"do":["5.1","8.3","17.7"],"you":["5.2","8.1","8.3","10.3","14.0","17.2","17.15","23.1","23.3","23.4"],"used":["6.0"],"for":["6.0","13.3","16.1","16.2","16.5"],"followed":["6.1"],"conventional":["6.1"],"commits":["6.1"],"standard":["6.1"],"see":["7.1","14.4","23.1","23.3"],"always":["7.2"],"case":["7.2","17.6"],"setting":["7.2"],"each":["7.2"],"5ghz":["7.2"],"4ghz":["7.2"],"ssids":["7.2"],"though":["7.2"],"required":["7.2"],"double":["7.2"],"check":["7.2","17.9"],"correctly":["7.2"],"entered":["7.2"],"credentials":["7.2"],"said":["7.2"],"network":["7.2","11.2"],"additonal":["7.2"],"configuration":["7.2"],"mdns":["7.2","11.2"],"wish":["7.2"],"manually":["7.2","17.10","18.2"],"keep":["7.2","10.1"],"track":["7.2"],"ip":["7.2","23.2"],"addresses":["7.2"],"ports":["7.2"],"enable":["7.2"],"feature":["7.2"],"following":["7.2"],"format":["7.2"],"http":["7.2","11.1"],"some":["7.2"],"local":["7.2","10.2"],"work":["7.2"],"connected":["7.2","17.6","17.7"],"same":["7.2"],"enabled":["7.2"],"windows":["7.2"],"by":["7.2","23.0"],"guide":["7.2","23.0","23.3"],"ota":["7.2","8.2","11.2"],"means":["7.2","14.1","18.4","18.6"],"to":["7.3","9.0","14.0","16.5","16.7","17.2","18.1","18.2","21.0"],"if":["8.1","10.3","11.1","14.4"],"want":["8.1","10.1","12.3"],"have":["8.1","8.3","15.1","16.1","16.3","18.6","23.4"],"multiple":["8.1"],"devices":["8.1"],"need":["8.2","17.6"],"specify":["8.2"],"it":["8.2","12.2","14.4","17.7","17.12","18.1","23.2"],"when":["8.2","16.4"],"building":["8.2"],"environments":["8.2"],"board":["8.2","13.3"],"only":["8.2","10.3"],"release":["8.2"],"specified":["8.2"],"name":["8.2","10.4"],"tip":["8.2"],"majority":["8.3"],"of":["8.3","9.0","10.4","14.1","16.4","17.3","17.6","18.4","23.2"],"users":["8.3"],"not":["8.3","16.1","17.7"],"switch":["8.3"],"your":["8.3","14.4","21.0","23.2"],"unless":["8.3"],"know":["8.3","10.1","17.2"],"what":["8.3"],"doing":["8.3"],"tested":["8.3","15.1"],"equation":["9.0"],"has":["9.1","11.2","15.1","17.10","17.15"],"been":["9.1","15.1"],"our":["9.1","14.2","15.1","17.15"],"or":["10.1","11.2","14.1","17.7","18.5","18.6"],"located":["10.2"],"under":["10.2"],"wifi":["10.2","11.2","13.4"],"section":["10.2"],"ini":["10.2"],"user":["10.2","15.1","17.15"],"mdnsname":["10.2"],"openiristracker":["10.2"],"add":["10.2","17.21","21.0"],"mac":["10.3"],"using":["10.3","11.1","13.4","22.3"],"correct":["10.4"],"requests":["11.1"],"method":["11.2"],"description":["11.2"],"ping":["11.2"],"returns":["11.2"],"status":["11.2"],"writes":["11.2"],"restartdevice":["11.2"],"restarts":["11.2"],"restartcamera":["11.2"],"camera":["11.2","23.2"],"resetconfig":["11.2"],"clears":["11.2"],"current":["11.2"],"memory":["11.2"],"ram":["11.2"],"getstoredconfig":["11.2"],"json":["11.2"],"object":["11.2"],"settxpower":["11.2"],"post":["11.2"],"sets":["11.2"],"transmission":["11.2"],"esps":["11.2"],"setdevice":["11.2"],"settings":["11.2","12.3","13.5","17.18","17.22","23.0","23.3"],"setcamera":["11.2"],"adds":["11.2"],"over":["11.2","13.0"],"an":["11.2","23.1","23.3"],"existing":["11.2"],"delete":["11.2"],"deletes":["11.2"],"show":["12.0"],"open":["12.2","17.7","19.0","22.5","22.6"],"here":["12.3","14.0"],"bash":["12.3"],"imagecard":["12.3","17.18","17.22","23.0","23.3"],"image":["12.3","17.6","17.18","17.22","23.0","23.3"],"setup":["12.3"],"change":["12.3","13.4"],"directory":["12.3"],"done":["13.0"],"cable":["13.0"],"once":["13.0"],"as":["13.1","18.4"],"simple":["13.1","17.8"],"sticking":["13.1"],"socket":["13.1"],"way":["13.1","23.4"],"came":["13.1"],"package":["13.1"],"button":["13.2","13.5","23.3"],"at":["13.2","17.12"],"esp":["13.3","13.5"],"img":["13.3"],"alerts":["13.3","18.4","22.1"],"template":["13.3","18.0"],"v":["13.3","18.0"],"slot":["13.3","18.0"],"content":["13.3","18.0","18.1"],"p":["13.3","18.0","18.1"],"mb":["13.3","18.2"],"does":["13.3"],"resetting":["13.3"],"re":["13.3"],"platformio":["13.4"],"visual":["13.4"],"studio":["13.4"],"code":["13.4"],"new":["13.4"],"app":["13.4","22.4"],"where":["13.4","23.2"],"upload":["13.4","13.5"],"straight":["13.4"],"from":["13.4","17.4","18.1"],"firmware":["13.5","15.1","17.9"],"now":["13.5","23.3"],"press":["13.5"],"restart":["13.5","23.3"],"itself":["13.5"],"watch":["13.5"],"don":["13.6","23.3"],"t":["13.6","23.3"],"find":["13.6","14.0"],"protocol":["14.0"],"welcome":["14.0"],"eyetrackvr":["14.0"],"documentation":["14.0"],"dont":["14.1"],"differnt":["14.1"],"etc":["14.1","23.4"],"danger":["14.1"],"important":["14.1"],"ins":["14.1"],"bypass":["14.1"],"features":["14.1","15.1","19.0"],"put":["14.1"],"parts":["14.2","16.5"],"called":["14.3"],"openiris":["14.3"],"listed":["14.4"],"perfect":["15.1","16.6"],"function":["15.1"],"fully":["15.1"],"developed":["15.1"],"yet":["15.1","18.6"],"difficulties":["15.1"],"headset":["16.1","16.2"],"may":["16.1"],"protector":["16.2"],"attach":["16.3"],"we":["16.3","23.3"],"gives":["16.4"],"view":["16.4","19.0"],"pupil":["16.4"],"looking":["16.4"],"get":["16.6"],"added":["16.7"],"before":["17.2"],"list":["17.3","18.4"],"please":["17.3"],"take":["17.3"],"note":["17.3"],"shipping":["17.4"],"times":["17.4"],"china":["17.4"],"hardware":["17.5"],"make":["17.5","17.8","17.12"],"sure":["17.5","17.8"],"unfortunately":["17.6"],"removing":["17.6"],"super":["17.6"],"easy":["17.6"],"either":["17.6"],"move":["17.6"],"remove":["17.6","18.2"],"bridge":["17.6"],"solder":["17.6"],"attached":["17.6"],"shows":["17.6"],"orientation":["17.6"],"force":["17.7"],"shove":["17.7"],"objects":["17.7"],"fingernails":["17.7"],"assembled":["17.8"],"s":["17.8"],"flash":["17.9"],"uploading":["17.10"],"lower":["17.11","18.4"],"voltage":["17.11"],"which":["17.11","18.4"],"results":["17.11"],"dim":["17.11"],"leds":["17.11"],"video":["17.11"],"artifacts":["17.11"],"these":["17.11"],"highly":["17.11"],"route":["17.12"],"mark":["17.12"],"then":["17.12"],"another":["17.12","18.5"],"led":["17.13"],"wires":["17.13"],"together":["17.13"],"lay":["17.14"],"discord":["17.15"],"learned":["17.15"],"can":["17.15","17.21","23.2"],"short":["17.15","18.4"],"2nd":["17.16"],"lightly":["17.18"],"cover":["17.18"],"pad":["17.18"],"six":["17.18"],"next":["17.18"],"grab":["17.18"],"hold":["17.18","17.19"],"end":["17.19","17.22"],"orientate":["17.19"],"dot":["17.20"],"facing":["17.20"],"inwards":["17.20"],"toward":["17.20"],"text":["17.20"],"like":["17.20","23.0"],"me":["17.21"],"prohurtz":["17.21"],"0001":["17.21"],"so":["17.21"],"i":["17.21"],"having":["17.21"],"trouble":["17.21"],"getting":["17.21"],"fit":["17.21"],"resizing":["17.21"],"up":["17.21","18.6","23.4"],"down":["17.21"],"little":["17.21"],"ensure":["17.21"],"good":["17.21"],"different":["17.21"],"types":["17.21"],"go":["17.22"],"fifteen":["17.22"],"others":["17.22"],"recommended":["18.1","18.4"],"source":["18.1","19.0"],"main":["18.1"],"filter":["18.2"],"1x":["18.2"],"programmer":["18.2"],"heatsinks":["18.3"],"event":["18.4"],"mishap":["18.4"],"they":["18.4"],"safer":["18.4"],"well":["18.4"],"being":["18.4"],"smaller":["18.4"],"footprint":["18.4"],"hence":["18.4"],"why":["18.4"],"form":["18.5"],"there":["18.6"],"no":["18.6"],"designed":["18.6"],"basic":["18.6"],"skills":["18.6"],"modeling":["18.6"],"think":["18.6"],"intro":["19.0"],"github":["19.0"],"https":["19.0"],"com":["19.0","21.0"],"redhawk989":["19.0"],"icon":["19.0"],"️":["19.0"],"title":["19.0","21.0"],"youtube":["21.0"],"embed":["21.0"],"dfm":["21.0"],"tkaruq0":["21.0"],"eye":["21.0"],"tracking":["21.0","23.3"],"support":["21.0"],"vrchat":["21.0"],"software":["22.1"],"manage":["22.4"],"dependencies":["22.4"],"installing":["22.5"],"poetry":["22.5"],"command":["22.6"],"prompt":["22.6"],"greeted":["23.0"],"window":["23.0"],"looks":["23.0"],"eyetrack":["23.0","23.3"],"vr":["23.0","23.3"],"default":["23.0"],"was":["23.1"],"checked":["23.1"],"eyes":["23.2"],"address":["23.2"],"enter":["23.2"],"alternatively":["23.2"],"feed":["23.3"],"because":["23.3"],"haven":["23.3"],"set":["23.3"],"roi":["23.3"],"cropping":["23.3"],"mode":["23.3"],"extremes":["23.4"],"left":["23.4"]},{"0":["17.6"],"1":["17.21","21.0"],"3":["17.12","18.2","22.3"],"5":["17.17"],"11":["22.3"],"actively":["0.0"],"contributed":["0.0"],"community":["0.0","14.4","16.1","19.0"],"support":["0.0"],"small":["0.0"],"philosophy":["0.0"],"three":["1.1"],"if":["1.1","13.4","15.1","17.17"],"you":["1.1","11.1","13.0","14.4","16.1","16.7","17.5","17.12","17.17","17.22","19.0","22.4"],"have":["1.1","13.0","17.5","17.17","17.22"],"different":["1.1","8.1","17.11","17.12","17.17"],"please":["1.1","5.0","17.7","17.17","18.0","18.6"],"consult":["1.1","17.17"],"their":["1.1","17.17"],"datasheet":["1.1","17.17"],"some":["1.1","8.2","13.1","17.17"],"terminology":["1.1","17.17"],"related":["1.1","14.0","17.17"],"them":["1.1","17.13","17.17"],"5v":["1.1","17.17"],"five":["1.2","12.3","17.17","17.20","18.4","23.3"],"hold":["1.2"],"in":["1.2","1.3","17.7","17.17","17.19","17.21","22.5"],"correct":["1.3"],"orientation":["1.3"],"resistor":["1.4"],"second":["1.4"],"which":["1.4","17.6"],"gets":["1.4"],"its":["1.4"],"from":["1.4","8.3","10.3","11.1","13.3"],"ground":["1.4","17.15"],"id":["2.0"],"widget":["2.0"],"src":["2.0"],"https":["2.0","4.1"],"com":["2.0"],"list":["3.0","6.1","14.2"],"of":["3.0","6.1","13.2","13.4","17.11","17.14","18.5","23.3"],"inprogress":["3.2"],"installation":["4.1"],"clone":["4.1"],"the":["4.1","13.0","14.1","16.5","16.6"],"repo":["4.1"],"sh":["4.1"],"or":["4.2","14.4","16.2","23.2"],"vue":["4.2"],"components":["4.2"],"file":["4.2","23.2"],"names":["4.2"],"are":["4.2","10.1","17.4","17.7"],"snake":["4.2"],"case":["4.2"],"use":["5.0","7.2","8.1","17.20","19.0","23.3"],"github":["5.0"],"markdown":["5.0"],"flavour":["5.0"],"object":["5.1"],"want":["5.1","10.2","11.1"],"following":["5.1","6.1"],"text":["5.1"],"getting":["5.1"],"started":["5.1"],"collapsible":["5.1"],"true":["5.1"],"items":["5.1"],"introduction":["5.1"],"link":["5.1"],"intro":["5.1"],"things":["5.1"],"know":["5.1","18.6"],"before":["5.1"],"start":["5.1","17.2"],"need":["5.2","17.12"],"eyetrackvr":["6.0"],"project":["6.0","6.1"],"these":["6.0"],"used":["6.1","23.2"],"with":["6.1","8.1","8.2","13.1"],"semantic":["6.1"],"release":["6.1"],"tool":["6.1"],"automatically":["6.1"],"generate":["6.1"],"changelog":["6.1"],"versioning":["6.1"],"as":["6.1","18.1"],"such":["6.1"],"important":["6.1"],"follow":["6.1","9.2","13.3"],"own":["6.1","9.1"],"rule":["6.1"],"customizations":["6.1"],"made":["6.1"],"something":["7.1","23.3"],"on":["7.1","14.1","16.6","17.6","17.9","17.10","17.14","23.0","23.1","23.3"],"update":["7.2"],"without":["7.2","17.15","18.2"],"having":["7.2"],"enableota":["7.2"],"otapassword":["7.2"],"nothing":["7.2"],"however":["7.2","10.2"],"anyone":["7.2"],"be":["7.2","8.2","12.3","17.21","23.2"],"able":["7.2"],"also":["7.2","8.2","10.1"],"otaserverip":["7.2"],"address":["7.2"],"uploading":["7.3"],"configs":["8.1"],"we":["8.1"],"environments":["8.1"],"recommend":["8.2"],"starting":["8.2"],"then":["8.2","13.1","18.6"],"switching":["8.2"],"once":["8.2","17.13"],"working":["8.2"],"less":["8.2"],"debugging":["8.2"],"may":["8.2"],"missing":["8.2"],"first":["8.3","16.6","22.4"],"verified":["8.3"],"does":["8.3"],"most":["8.3"],"esp32cams":["8.3"],"aliexpress":["8.3","18.1","18.3"],"get":["9.0","13.3","17.11"],"your":["9.0","13.6","23.0","23.1"],"trackers":["9.0"],"going":["9.0"],"solution":["9.1","18.6"],"called":["9.1"],"openiris":["9.1"],"track":["10.1"],"change":["10.2","23.0"],"whatever":["10.2"],"warning":["10.2"],"since":["10.2"],"can":["10.3","16.7"],"download":["10.3"],"here":["10.3","16.7"],"control":["11.1"],"device":["11.1"],"uses":["11.2","17.21"],"add":["11.2","17.13","17.18"],"params":["11.2"],"danger":["11.2"],"feature":["11.2"],"bug":["11.2"],"given":["11.2"],"url":["11.2"],"required":["11.2"],"even":["11.2"],"changing":["11.2"],"do":["11.2","16.4","17.10"],"supply":["11.2"],"set":["11.2"],"default":["11.2"],"passed":["11.2"],"query":["11.2"],"string":["11.2"],"format":["11.2"],"how":["12.0","17.10","17.21"],"to":["12.0","13.6","14.4","16.4","17.10","19.0","23.2"],"prepare":["12.0"],"it":["12.1","17.19","23.0"],"br":["12.1","20.0"],"imagecard":["12.1","17.6","17.20","17.21"],"for":["12.2","13.5","14.4","17.6","18.2","23.2","23.4"],"vscode":["12.2"],"an":["12.2","13.3","14.1"],"extension":["12.2"],"that":["12.2","13.3","14.4","16.3","17.3","18.0"],"cloned":["12.3"],"ex":["12.3"],"cd":["12.3"],"c":["12.3","23.0"],"repository":["12.3"],"by":["12.3","19.0"],"entering":["12.3"],"command":["12.3","22.5"],"tracker":["13.0"],"connected":["13.0"],"and":["13.1","14.2","18.2","18.6"],"connecting":["13.1"],"a":["13.1","17.7","23.2"],"micro":["13.1"],"usb":["13.1"],"cable":["13.1"],"cases":["13.1"],"bottom":["13.2"],"visual":["13.2"],"studio":["13.2"],"ftdi":["13.3"],"programmer":["13.3"],"guide":["13.3","17.2","17.9","23.5"],"linked":["13.3"],"above":["13.3","18.4"],"randomnerdtutorials":["13.3"],"successful":["13.3"],"should":["13.3"],"output":["13.3","13.5"],"looks":["13.3"],"version":["13.4"],"example":["13.4"],"esp32aithinker":["13.4"],"would":["13.4"],"changed":["13.4"],"like":["13.5","16.2","23.3"],"this":["13.5","17.2","17.10","17.21"],"two":["13.5","17.11"],"answer":["13.6"],"question":["13.6"],"there":["13.6"],"ask":["13.6"],"all":["14.0","14.1","16.4","17.6"],"avalable":["14.0"],"regauding":["14.0"],"building":["14.0"],"development":["14.0"],"other":["14.0","17.12"],"resources":["14.0"],"irreversible":["14.1"],"bodily":["14.1"],"measures":["14.1"],"were":["14.1"],"reduce":["14.1"],"potential":["14.1"],"failure":["14.1"],"risk":["14.1"],"further":["14.1"],"responsibilities":["14.1"],"user":["14.1"],"includes":["14.1"],"visually":["14.1"],"checking":["14.1"],"camera":["14.1","17.21"],"is":["14.3"],"recommended":["14.4"],"try":["14.4","18.6"],"make":["14.4","18.6"],"mount":["14.4","16.6","18.6"],"wait":["14.4","23.4"],"skilled":["14.4"],"member":["14.4"],"widely":["15.1"],"so":["15.1","16.1","18.6","23.4"],"issues":["15.1"],"creep":["15.1"],"up":["15.1","17.11"],"ir":["15.1"],"emitters":["15.1","18.6"],"dangerous":["15.1"],"handled":["15.1"],"wrong":["15.1"],"precautions":["15.1"],"ignored":["15.1"],"existing":["16.1"],"mounts":["16.1"],"either":["16.2"],"go":["16.2"],"website":["16.2"],"thingiverse":["16.2"],"basic":["16.3"],"design":["16.3"],"qdot":["16.3"],"created":["16.3"],"extremes":["16.4"],"lower":["16.4"],"corners":["16.4"],"job":["16.4"],"holding":["16.5","17.18"],"led":["16.5"],"boards":["16.5"],"docs":["16.7"],"step":["17.1"],"will":["17.2","17.12","17.21","17.22","18.4"],"fact":["17.3"],"hardware":["17.3","18.0"],"f":["17.4"],"u":["17.4"],"at":["17.5","17.6","18.4"],"mode":["17.6","23.2","23.4"],"connections":["17.6"],"both":["17.6"],"active":["17.6"],"same":["17.6","17.12"],"time":["17.6","17.8"],"ohm":["17.6"],"board":["17.6"],"simply":["17.6"],"options":["17.6","17.20","17.21"],"settings":["17.6","17.20","17.21"],"fine":["17.7"],"clip":["17.7"],"now":["17.7"],"slide":["17.7"],"note":["17.7","18.0"],"they":["17.8"],"actually":["17.8"],"work":["17.8"],"spend":["17.8"],"out":["17.9"],"our":["17.9"],"steps":["17.10"],"likely":["17.11"],"mess":["17.11","17.22"],"tracking":["17.11","23.2","23.4"],"pairs":["17.11"],"wire":["17.11"],"preferably":["17.11"],"size":["17.12"],"eye":["17.12"],"cuts":["17.12"],"twisted":["17.13"],"outside":["17.14"],"io12":["17.15"],"pin":["17.15"],"gnd":["17.15"],"esp":["17.16"],"repeat":["17.16"],"volt":["17.17"],"power":["17.17"],"seven":["17.18"],"while":["17.18"],"place":["17.19"],"picture":["17.20"],"below":["17.20","17.21"],"image":["17.20","17.21"],"end":["17.20","17.21"],"secure":["17.21"],"type":["17.21"],"documented":["17.21"],"nine":["17.21"],"method":["17.21"],"sliding":["17.21"],"generally":["17.21"],"mounting":["17.21"],"no":["17.22","18.0"],"specified":["17.22"],"much":["18.1"],"cheaper":["18.1"],"esp32":["18.2"],"cams":["18.2","18.6"],"programmers":["18.2"],"proper":["18.2"],"cameras":["18.2","23.2"],"template":["18.4","22.1"],"v":["18.4","22.1"],"slot":["18.4","22.1"],"content":["18.4","22.1"],"p":["18.4"],"temps":["18.4"],"245c":["18.4"],"burn":["18.4"],"low":["18.4"],"temp":["18.4"],"solder":["18.4"],"let":["18.6"],"us":["18.6"],"discord":["18.6"],"details":["19.0"],"fully":["19.0"],"free":["19.0"],"driven":["19.0"],"built":["19.0"],"frameborder":["21.0"],"allow":["21.0"],"encrypted":["21.0"],"media":["21.0"],"allowfullscreen":["21.0"],"another":["21.0"],"good":["21.0"],"resource":["21.0"],"one":["22.1"],"must":["22.4"],"install":["22.4"],"fetch":["22.4"],"prompt":["22.5"],"eyetrackapp":["22.6"],"folder":["22.6"],"run":["22.6"],"program":["23.0"],"files":["23.0"],"create":["23.0"],"shortcut":["23.0"],"desktop":["23.0","23.3"],"pressing":["23.0"],"icon":["23.1"],"double":["23.1"],"click":["23.1"],"put":["23.2","23.3"],"cam":["23.2"],"number":["23.2"],"wired":["23.2"],"pass":["23.2"],"video":["23.2"],"changes":["23.2"],"gui":["23.2"],"headset":["23.3"],"application":["23.3"],"virtual":["23.3"],"steamvr":["23.3"],"etc":["23.3"],"done":["23.4"],"say":["23.4"],"next":["23.4"],"center":["23.4"]},{"0":["22.3"],"1":["11.2","13.4"],"2":["17.12"],"3":["11.2"],"5":["1.1"],"12":["17.16"],"14":["11.2"],"300":["17.6"],"350":["2.0"],"500":["2.0","17.6"],"custom":["0.0"],"links":["0.0"],"href":["0.0"],"intro":["0.0"],"target":["0.0"],"blank":["0.0"],"guides":["0.0"],"on":["0.0","1.4","9.0","11.2","13.1","16.3","16.5","17.15","17.17","18.2"],"this":["0.0","1.1","8.2","12.3","13.2","14.0","17.17"],"website":["0.0"],"include":["0.0"],"teams":["0.0"],"own":["0.0"],"notes":["0.0"],"not":["0.0","1.4","4.2","5.1","22.1"],"all":["0.0","13.4","19.0"],"volt":["1.1"],"power":["1.1","18.2"],"in":["1.1","10.1","13.6","18.0"],"gnd":["1.1","17.17"],"ground":["1.1","17.17"],"or":["1.1","6.1","11.1","13.4","16.1","16.4","16.5","16.7","17.17"],"ar":["1.1","17.17"],"after":["1.1","13.0","14.1","17.10","17.17"],"resistor":["1.1","17.17"],"is":["1.1","13.1","13.5","17.17","22.1"],"be":["1.1","1.3","17.17","18.6"],"used":["1.1","7.2","17.17"],"as":["1.1","12.3","13.4","17.17","17.21"],"place":["1.2","17.21"],"six":["1.2","12.3","17.20","23.3"],"eleven":["1.3","17.21"],"each":["1.3","8.1","10.2"],"side":["1.3","7.1"],"of":["1.3"],"pin":["1.4","17.14"],"first":["1.4"],"does":["1.4","5.1","10.1","16.1"],"have":["1.4","10.1","10.2","13.3"],"a":["1.4","17.2","18.2","22.1"],"it":["1.4","5.1","9.0","16.7","17.10","17.15","18.6","23.1"],"946212245187199026":["2.0"],"theme":["2.0"],"dark":["2.0","14.1"],"width":["2.0","17.6"],"height":["2.0","17.6"],"allowtransparency":["2.0"],"true":["2.0"],"frameborder":["2.0"],"features":["3.0"],"that":["3.0","8.1","10.2","13.1","15.1","17.7"],"github":["4.1"],"com":["4.1","17.6"],"redhawk989":["4.1"],"eyetrackvr":["4.1","13.3"],"docs":["4.1","6.1"],"navigate":["4.1","23.0"],"to":["4.1","6.0","9.1","12.2","13.0","17.13","23.1"],"and":["4.2","14.1","17.14","21.0"],"lowercase":["4.2"],"letters":["4.2"],"do":["4.2","16.2","17.18"],"make":["4.2","10.2","13.1","15.1","17.10"],"naming":["4.2"],"changes":["4.2"],"for":["5.0","10.2","12.0","12.3"],"your":["5.0","8.2","12.0","15.1","17.8","17.18"],"files":["5.0"],"look":["5.0","18.4"],"line":["5.1"],"subdir":["5.1"],"then":["5.1","22.5","23.1"],"info":["5.1","12.3"],"note":["5.1"],"property":["5.1"],"require":["5.1","8.3"],"extension":["5.1"],"please":["5.1","15.1","17.4"],"title":["5.1","17.6"],"style":["5.1"],"var":["5.1"],"font":["5.1","18.4"],"accent":["5.1"],"the":["5.2","7.3","9.2","17.5","21.0"],"markdown":["5.2"],"file":["5.2"],"breaking":["6.1"],"change":["6.1","17.3"],"s":["6.1"],"text":["6.1","13.5","18.4"],"indicate":["6.1"],"follows":["6.1"],"bash":["6.1"],"type":["6.1","18.2"],"optional":["6.1"],"scope":["6.1"],"description":["6.1"],"body":["6.1"],"footer":["6.1"],"types":["6.1"],"feat":["6.1"],"new":["6.1","7.2"],"feature":["6.1"],"fix":["6.1"],"bug":["6.1"],"left":["7.1"],"like":["7.1","8.2","13.3","17.18","18.4"],"example":["7.2","17.6","17.15","23.3"],"updating":["7.2"],"dns":["7.2"],"esp32":["7.2","9.0","10.2"],"rest":["7.2"],"api":["7.2"],"fully":["7.2","18.0"],"featured":["7.2"],"control":["7.2"],"defauly":["7.2"],"turned":["7.2"],"off":["7.2"],"more":["7.2","11.2","12.3"],"advanced":["7.2"],"users":["7.2"],"basic":["7.2","17.2"],"operation":["7.2"],"was":["7.2"],"developed":["7.2"],"our":["7.2","23.3"],"app":["7.2"],"still":["7.2","17.3"],"development":["7.2"],"any":["7.2","14.4","18.6"],"client":["7.2"],"send":["7.2"],"post":["7.2"],"requests":["7.2"],"so":["8.1"],"things":["8.2"],"availible":["8.2"],"purposes":["8.2"],"should":["8.2","17.7"],"flashed":["8.2","17.10"],"just":["8.2","16.2","16.5"],"but":["8.2","8.3"],"will":["8.2","12.2","23.3"],"upload":["8.2","16.7"],"firmware":["8.2"],"with":["8.3","13.3","15.1","17.3","19.0"],"some":["8.3"],"may":["8.3","17.3"],"esp32cam":["8.3"],"test":["8.3"],"if":["8.3","10.2","13.1"],"lives":["9.0"],"found":["9.1"],"here":["9.1","18.6"],"check":["9.1","13.3","14.0"],"static":["10.1"],"two":["10.2","17.19"],"devices":["10.2"],"sure":["10.2","13.1","15.1","17.10"],"different":["10.2"],"macos":["10.3"],"connected":["10.4","13.4"],"network":["10.4"],"computer":["11.1"],"mobile":["11.1"],"we":["11.1","13.6","21.0"],"allow":["11.2","12.2","17.4"],"store":["11.2"],"up":["11.2","17.9","23.0"],"networks":["11.2"],"try":["11.2","16.6"],"than":["11.2"],"oldest":["11.2"],"overwritten":["11.2"],"ssid":["11.2"],"password":["11.2"],"networkname":["11.2"],"unique":["11.2"],"by":["11.2","14.3","17.1","17.18"],"refer":["11.2","12.3"],"channel":["11.2","13.6"],"broadcast":["11.2"],"br":["11.2","18.4"],"only":["11.2","12.3","15.1","17.7"],"allowed":["11.2"],"transmittion":["11.2"],"adhoc":["11.2"],"whether":["11.2"],"enable":["11.2"],"ap":["11.2"],"mode":["11.2"],"must":["11.2"],"follow":["11.2"],"system":["12.0"],"options":["12.1"],"image":["12.1"],"settings":["12.1"],"setup":["12.1"],"vscode":["12.1"],"you":["12.2","16.4","17.7"],"connect":["12.2"],"about":["12.3"],"cloning":["12.3"],"documentation":["12.3"],"download":["12.3"],"zip":["12.3"],"wifi":["13.0"],"there":["13.1","16.4"],"button":["13.1","13.4","23.0"],"labeled":["13.1"],"ioo":["13.1"],"exists":["13.1"],"code":["13.2"],"builds":["13.2"],"congratulations":["13.3"],"now":["13.3","23.4"],"successfully":["13.3","13.4"],"uploaded":["13.3"],"trouble":["13.3"],"uploading":["13.3"],"over":["13.3"],"cable":["13.3"],"normally":["13.4"],"trackers":["13.4"],"handle":["13.4"],"future":["13.4"],"updates":["13.4","14.4"],"retrieve":["13.4"],"ip":["13.4"],"mdns":["13.4"],"name":["13.4"],"highlighted":["13.5"],"green":["13.5"],"demonstration":["13.5"],"stream":["13.5"],"camera":["13.5","18.6"],"take":["13.5"],"questions":["13.6","14.4"],"discord":["13.6","14.4","21.0"],"project":["14.0"],"want":["14.0","16.4"],"get":["14.0"],"started":["14.0"],"out":["14.0","23.2"],"getting":["14.0","16.4"],"page":["14.0"],"brightness":["14.1"],"correct":["14.1"],"feel":["14.1"],"warmth":["14.1"],"experience":["14.1"],"short":["14.1","17.12"],"term":["14.1"],"effects":["14.1"],"being":["14.1"],"exposed":["14.1"],"light":["14.1"],"symptoms":["14.1"],"such":["14.1"],"spots":["14.1"],"dry":["14.1"],"warm":["14.1"],"repo":["14.2"],"made":["14.3"],"create":["14.4"],"one":["14.4"],"contact":["14.4"],"join":["14.4"],"hope":["14.4"],"cause":["15.1"],"damage":["15.1"],"eyes":["15.1"],"buy":["15.1"],"linked":["15.1"],"ones":["15.1","17.12"],"specs":["15.1"],"match":["15.1"],"exactly":["15.1"],"search":["16.2"],"3d":["16.2"],"printed":["16.2"],"taken":["16.3"],"from":["16.3"],"his":["16.3"],"at":["16.4"],"nearly":["16.4","19.0"],"put":["16.4","17.15"],"glue":["16.5","17.21"],"them":["16.5","17.8","17.11"],"print":["16.6"],"adjust":["16.6","23.3"],"thingiverse":["16.7"],"give":["17.2","18.6"],"although":["17.3"],"n":["17.4"],"anywhere":["17.4"],"least":["17.5"],"following":["17.5","17.20"],"checkboxlist":["17.5"],"bridging":["17.6"],"attaching":["17.6"],"resistors":["17.6"],"div":["17.6","17.21"],"align":["17.6"],"center":["17.6"],"iframe":["17.6"],"src":["17.6"],"https":["17.6"],"www":["17.6"],"youtube":["17.6"],"embed":["17.6"],"r4psuwtfrbg":["17.6"],"how":["17.6"],"add":["17.6"],"pins":["17.7"],"facing":["17.7"],"down":["17.7"],"see":["17.7"],"black":["17.7"],"soldering":["17.8","17.18"],"slide":["17.8"],"into":["17.8","17.21"],"setting":["17.9"],"vs":["17.9"],"once":["17.9"],"colors":["17.11"],"cut":["17.11"],"length":["17.11"],"56mm":["17.11"],"my":["17.11"],"case":["17.11"],"twist":["17.11"],"together":["17.11","17.12"],"connecting":["17.12"],"pcbs":["17.12"],"per":["17.12"],"solder":["17.13"],"keep":["17.13"],"5v":["17.14"],"issues":["17.15"],"below":["17.15"],"i":["17.15"],"steps":["17.16"],"2nd":["17.17"],"iron":["17.18"],"apply":["17.18","17.21"],"having":["17.18"],"piece":["17.18"],"diagram":["17.20"],"requires":["17.21"],"no":["17.21"],"ten":["17.21"],"slowly":["17.21"],"pressure":["17.21"],"inwards":["17.21"],"until":["17.21"],"snaps":["17.21"],"around":["17.22"],"find":["17.22","18.4"],"what":["17.22"],"works":["17.22","19.0"],"best":["17.22"],"shows":["17.22"],"has":["18.0"],"been":["18.0"],"set":["18.0"],"three":["18.1"],"usb":["18.2"],"male":["18.2"],"port":["18.2"],"both":["18.2"],"esps":["18.2"],"bare":["18.2"],"breakout":["18.2"],"class":["18.4"],"bold":["18.4"],"focused":["18.4"],"something":["18.4"],"would":["18.4"],"tv":["18.4"],"remote":["18.4"],"use":["18.4","21.0"],"aliexpress":["18.5"],"amazon":["18.5"],"can":["18.6","23.0"],"added":["18.6"],"fit":["18.6"],"potentially":["18.6"],"compatible":["18.6"],"willing":["18.6"],"easy":["19.0"],"headsets":["19.0"],"faq":["20.0"],"vrc":["21.0"],"face":["21.0"],"wiki":["21.0"],"their":["21.0"],"currently":["21.0"],"p":["22.1"],"required":["22.1","22.4"],"before":["22.3"],"open":["22.4","23.0"],"eyetrackapp":["22.5"],"folder":["22.5"],"run":["22.5"],"poetry":["22.6"],"pyinstaller":["22.6"],"spec":["22.6"],"path":["23.0"],"where":["23.0"],"an":["23.0"],"alternate":["23.0"],"press":["23.0"],"outputs":["23.2"],"values":["23.2"],"cropping":["23.2"],"crop":["23.2"],"threshold":["23.2"],"draw":["23.3"],"rectangle":["23.3"],"selects":["23.3"],"good":["23.3"],"head":["23.3"],"back":["23.3"],"rotation":["23.3"],"moving":["23.3"],"straight":["23.4"],"forward":["23.4"],"recenter":["23.4"],"let":["23.5"],"me":["23.5"]},{"0":["2.0"],"1":["13.3","17.6"],"2":["13.3","13.4","17.4"],"3":["4.1"],"4":["11.2"],"8":["11.2"],"14":["17.16"],"18":["11.2"],"19":["11.2"],"20":["11.2"],"28":["11.2"],"34":["11.2"],"44":["11.2"],"52":["11.2"],"60":["11.2"],"68":["11.2"],"74":["11.2"],"76":["11.2"],"78":["11.2"],"1206":["18.4"],"them":["0.0","8.1"],"polished":["0.0"],"that":["0.0","5.1","17.18","23.1","23.2"],"we":["0.0","5.1","7.2","12.3","15.1"],"disclose":["0.0"],"for":["0.0","11.1","14.1","14.2","15.1","17.11"],"other":["0.0","5.0","23.4"],"use":["0.0","5.1"],"here":["0.0","7.2","16.1","16.2","16.3","17.11"],"hope":["0.0"],"you":["0.0","13.1","17.10","22.1","22.3"],"may":["0.0"],"find":["0.0"],"something":["0.0"],"useful":["0.0"],"on":["1.1"],"2nd":["1.1"],"series":["1.1","17.17"],"not":["1.1","1.3","6.1","13.2","17.17"],"needed":["1.1","17.17","18.1"],"since":["1.1","17.17"],"they":["1.1","17.17"],"1st":["1.1","17.17"],"one":["1.2","12.1","17.17","18.2"],"end":["1.2"],"seven":["1.2","23.3"],"careful":["1.3"],"to":["1.3","2.0"],"at":["1.3","5.0","5.1","10.2","18.0"],"too":["1.3"],"high":["1.3"],"a":["1.3","13.3","17.10","23.1"],"temp":["1.3"],"and":["1.4","5.1","9.0","16.6","17.8","18.4","22.4"],"input":["1.4","13.5"],"ar":["1.4"],"after":["1.4"],"sandbox":["2.0"],"allow":["2.0","17.6"],"popups":["2.0"],"escape":["2.0"],"are":["3.0","5.1","8.1","18.0"],"in":["3.0","5.2","12.3","13.4","18.1"],"progress":["3.0"],"it":["4.0","16.5","17.3","22.6"],"vitepress":["4.1","5.2"],"folder":["4.1","4.2"],"cd":["4.1"],"install":["4.1"],"packages":["4.1"],"major":["4.2"],"see":["5.0"],"appears":["5.1"],"top":["5.1","17.15"],"like":["5.1","7.2","17.3","23.2"],"keep":["5.1","13.5"],"cohesive":["5.1"],"so":["5.1","7.2"],"give":["5.1","22.6"],"nice":["5.1"],"orange":["5.1"],"colour":["5.1"],"required":["5.1"],"e67e22":["5.1"],"using":["5.1","14.1"],"ensure":["6.0"],"changes":["6.1"],"do":["6.1","22.1"],"affect":["6.1"],"meaning":["6.1"],"white":["6.1"],"space":["6.1"],"formatting":["6.1"],"missing":["6.1"],"semi":["6.1"],"colons":["6.1"],"etc":["6.1"],"refactor":["6.1"],"neither":["6.1"],"fixes":["6.1"],"nor":["6.1"],"adds":["6.1"],"perf":["6.1"],"improves":["6.1"],"performance":["6.1"],"test":["6.1"],"adding":["6.1"],"correcting":["6.1"],"existing":["6.1"],"tests":["6.1"],"build":["6.1","12.2","14.0","19.0"],"this":["7.1","17.13","22.5"],"imagecard":["7.1","14.4","17.5","17.14"],"options":["7.1","14.0","14.1","14.4","17.5","21.0","23.4"],"browser":["7.2"],"functionality":["7.2"],"tools":["7.2"],"thunder":["7.2"],"postman":["7.2"],"full":["7.2","14.0"],"documented":["7.2"],"environments":["7.2"],"multiple":["7.2"],"support":["7.2"],"types":["7.2"],"configured":["7.2"],"environment":["7.2"],"follows":["7.2"],"esp32aithinker":["7.2"],"default":["7.2"],"ai":["7.2","8.3"],"thinker":["7.2","8.3"],"generic":["7.2"],"alibaba":["7.2"],"aliexpress":["7.2"],"amazon":["7.2"],"cam":["7.2"],"boards":["7.2"],"esp32cam":["7.2"],"unlikely":["7.2"],"esp32m5stack":["7.2"],"esp32wrover":["7.2"],"eye":["7.2"],"firmware":["7.3"],"can":["8.1","10.1"],"easily":["8.1"],"switch":["8.1"],"between":["8.1"],"envrionments":["8.1"],"broken":["8.1"],"up":["8.1","16.5","17.18"],"into":["8.1","13.3","13.5"],"esp":["8.2"],"wirelessly":["8.2"],"warning":["8.2","14.0","14.1"],"change":["8.2","10.1"],"ip":["8.2"],"which":["8.2"],"setting":["8.2"],"called":["8.2"],"otaserverip":["8.2"],"try":["8.3","10.4"],"supported":["8.3"],"esp32":["8.3","17.6"],"chip":["9.0"],"responsible":["9.0","15.1"],"the":["9.1","12.0","12.2"],"status":["9.1"],"of":["9.1","12.3","17.2","17.7","17.15","17.18","18.6"],"steps":["9.2","15.1"],"but":["10.1","13.2"],"will":["10.1","10.2","12.3","13.6","17.15"],"able":["10.2","17.21"],"connect":["10.2"],"both":["10.2"],"same":["10.2"],"already":["10.3"],"installed":["10.3"],"also":["10.3","23.0"],"get":["10.3","17.10"],"developed":["11.1"],"project":["11.1","17.2"],"enum":["11.2"],"pass":["11.2"],"number":["11.2"],"right":["11.2"],"sign":["11.2"],"corresponds":["11.2"],"dbm":["11.2"],"wish":["11.2","13.4"],"cpp":["11.2"],"typedef":["11.2"],"5dbm":["11.2"],"19dbm":["11.2"],"17dbm":["11.2"],"15dbm":["11.2"],"13dbm":["11.2"],"11dbm":["11.2"],"7dbm":["11.2"],"2dbm":["11.2"],"minus":["11.2"],"1dbm":["11.2"],"uploading":["12.0"],"tracker":["12.2","13.4"],"upload":["12.2"],"properly":["12.3"],"take":["12.3"],"note":["12.3","13.5","17.8"],"path":["12.3"],"run":["12.3","22.4"],"is":["12.3","17.9","17.22"],"where":["12.3","17.11"],"files":["12.3","18.4"],"downloaded":["12.3"],"when":["12.3","17.21"],"first":["13.0"],"update":["13.0"],"hold":["13.1","14.1"],"while":["13.1","13.5","14.1"],"plug":["13.1"],"once":["13.1","17.7"],"plugged":["13.1","13.3"],"does":["13.2"],"following":["13.3","21.0","22.4"],"usb":["13.3","17.8"],"firmly":["13.3"],"pc":["13.3"],"data":["13.3"],"flash":["13.4"],"be":["13.4","13.6","17.15","23.1"],"found":["13.4"],"through":["13.4"],"network":["13.4"],"monitoring":["13.4"],"applications":["13.4"],"by":["13.4"],"viewing":["13.4"],"output":["13.4"],"serial":["13.4"],"monitor":["13.4"],"ini":["13.4"],"user":["13.4","14.0"],"config":["13.4"],"file":["13.4"],"put":["13.4","17.18"],"hostname":["13.4"],"software":["13.5"],"mind":["13.5"],"testing":["13.5"],"happy":["13.6"],"help":["13.6"],"adapted":["13.6"],"then":["14.0","17.18"],"guide":["14.0","18.6","23.4"],"alerts":["14.0","14.1","17.21","21.0","23.0","23.4"],"feeling":["14.1"],"actively":["14.1"],"strive":["14.1"],"make":["14.1"],"eyetrackvr":["14.1"],"safe":["14.1"],"possible":["14.1"],"responsibility":["14.1"],"damage":["14.1"],"done":["14.1"],"led":["14.1"],"template":["14.1","17.21","23.0","23.4"],"v":["14.1","17.21","23.0"],"information":["14.2"],"lorow":["14.3"],"there":["14.4"],"image":["14.4"],"settings":["14.4"],"content":["14.4","17.21","23.0"],"licenses":["14.4"],"github":["14.4","16.3"],"license":["14.4"],"https":["14.4"],"damaged":["15.1"],"caused":["15.1"],"go":["15.1"],"own":["15.1"],"route":["15.1"],"documentation":["15.1"],"incomplete":["15.1"],"important":["15.1"],"none":["16.1"],"work":["16.1","23.2"],"well":["16.1"],"example":["16.2"],"hardware":["16.3"],"alternatively":["16.3"],"as":["16.4"],"close":["16.4"],"headset":["16.4"],"s":["16.4","16.5","17.6"],"lens":["16.4"],"repeat":["16.6","23.4"],"until":["16.6"],"similar":["16.7"],"services":["16.7"],"just":["16.7"],"assembly":["17.1"],"overview":["17.2"],"more":["17.3","18.1"],"developments":["17.3"],"seems":["17.3"],"weeks":["17.4"],"requiredhardware":["17.5"],"frameborder":["17.6"],"accelerometer":["17.6"],"clipboard":["17.6"],"write":["17.6"],"encrypted":["17.6"],"media":["17.6"],"gyroscope":["17.6"],"picture":["17.6"],"allowfullscreen":["17.6"],"second":["17.6"],"cover":["17.6","18.2"],"aid":["17.6"],"problems":["17.6"],"completely":["17.6","19.0"],"has":["17.7"],"been":["17.7"],"slid":["17.7"],"press":["17.7"],"port":["17.8"],"goes":["17.8"],"set":["17.9"],"video":["17.10"],"stream":["17.10"],"ground":["17.11","17.12"],"5v":["17.11"],"i":["17.11"],"used":["17.11"],"speaker":["17.11"],"longer":["17.12"],"power":["17.12"],"or":["17.12","18.2"],"slightly":["17.12"],"makes":["17.13"],"connection":["17.13"],"much":["17.13"],"apply":["17.14"],"week":["17.15"],"with":["17.16","18.2","23.1"],"resistors":["17.17"],"sng":["17.17"],"my":["17.18"],"stick":["17.18"],"air":["17.18"],"way":["17.18"],"three":["17.19"],"flip":["17.19"],"away":["17.20"],"from":["17.20","23.3"],"align":["17.21"],"center":["17.21"],"slot":["17.21","23.0"],"p":["17.21","23.0"],"chance":["17.21"],"breaking":["17.21"],"putting":["17.21"],"happens":["17.21"],"save":["17.21"],"optimal":["17.22"],"near":["17.22"],"position":["17.22"],"hot":["17.22"],"glue":["17.22"],"stone":["18.0"],"all":["18.0","23.3"],"purchases":["18.0"],"good":["18.1"],"practice":["18.1"],"buy":["18.1"],"than":["18.1"],"some":["18.1"],"cases":["18.1"],"lower":["18.2"],"gauge":["18.2"],"aren":["18.4","23.2"],"t":["18.4","23.2"],"exactly":["18.4"],"sure":["18.4"],"what":["18.4"],"doing":["18.4"],"link":["18.4"],"emitter":["18.4"],"pcbs":["18.4"],"highly":["18.4"],"gerber":["18.4"],"schematics":["18.4"],"located":["18.4"],"350ohm":["18.4"],"soldering":["18.5"],"iron":["18.5"],"shot":["18.6"],"design":["18.6"],"rest":["18.6"],"community":["18.6"],"check":["18.6"],"out":["18.6"],"our":["18.6","23.2"],"making":["18.6"],"your":["18.6"],"diy":["19.0"],"platform":["19.0"],"paramaters":["21.0"],"lefteyex":["21.0"],"righteyex":["21.0"],"eyesy":["21.0"],"lefteyelidexpandedsqueeze":["21.0"],"righteyelidexpandedsqueeze":["21.0"],"step":["22.1"],"need":["22.1"],"continue":["22.3"],"windows":["22.4"],"powershell":["22.4"],"command":["22.4"],"time":["22.6"],"greeted":["23.1"],"gui":["23.1"],"cut":["23.2"],"things":["23.2"],"dark":["23.2"],"pupil":["23.2"],"rotation":["23.2"],"method":["23.2"],"best":["23.2"],"want":["23.2"],"slider":["23.3"],"eight":["23.3"],"threshold":["23.3"],"continuing":["23.3"],"move":["23.3"],"fully":["23.4"],"calibrated":["23.4"],"eyetrack":["23.4"],"vr":["23.4"],"two":["23.4"],"know":["23.5"]},{"1":["1.1","17.17"],"2":["16.2"],"3":["13.4"],"4":["13.3","13.4"],"28":["18.2"],"348":["18.4"],"357":["18.4"],"400":["14.1"],"500":["14.1"],"3232":["13.4"],"12345678":["13.4"],"advocate":["0.0"],"https":["0.0","22.4"],"en":["0.0"],"wikipedia":["0.0"],"org":["0.0"],"wiki":["0.0"],"open":["0.0"],"source":["0.0"],"model":["0.0"],"sng":["1.1"],"single":["1.1","17.17"],"use":["1.1","13.0","13.5","15.1","17.17","23.2"],"using":["1.1","4.0","17.17","18.4"],"only":["1.1","13.5","17.17","21.0","23.3"],"v3":["1.1","17.17"],"boards":["1.1","17.17"],"flip":["1.2","17.18"],"other":["1.2","6.1","13.3","17.18","17.19"],"side":["1.2"],"of":["1.2","4.2","18.1","22.5"],"and":["1.2","3.0","5.0","6.0","16.2","16.5","17.2","18.1","18.5"],"it":["1.2","13.2","13.3"],"recommended":["1.3","17.17"],"soldering":["1.3"],"is":["1.3","6.0","14.0"],"230c":["1.3"],"with":["1.3","5.1","17.22"],"max":["1.3"],"245c":["1.3"],"2nd":["1.4"],"goes":["1.4"],"to":["1.4","13.2","17.3"],"same":["2.0","10.1"],"origin":["2.0"],"scripts":["2.0","6.1"],"target":["2.0"],"blank":["2.0"],"completed":["3.0"],"built":["4.0","5.1"],"start":["4.1","23.2","23.3"],"dev":["4.1"],"server":["4.1"],"without":["4.2"],"proir":["4.2"],"consultation":["4.2"],"team":["4.2"],"they":["5.0","13.4"],"are":["5.0","17.3"],"formatted":["5.0"],"examples":["5.0"],"tailwindcss":["5.1"],"classes":["5.1"],"our":["5.1"],"css":["5.1"],"variables":["5.1"],"find":["5.1"],"these":["5.1"],"styles":["5.1"],"change":["5.1"],"any":["5.1","19.0"],"but":["5.1","17.7"],"consistent":["5.1","6.0"],"rest":["5.1"],"site":["5.1"],"tip":["5.1"],"docs":["5.2","13.6"],"src":["5.2","6.1"],"pages":["5.2"],"easy":["6.0"],"system":["6.1"],"external":["6.1"],"dependencies":["6.1"],"example":["6.1"],"scopes":["6.1"],"gulp":["6.1"],"broccoli":["6.1"],"npm":["6.1"],"yarn":["6.1"],"actions":["6.1"],"ci":["6.1"],"configuration":["6.1"],"files":["6.1"],"gh":["6.1"],"yml":["6.1"],"yaml":["6.1"],"chore":["6.1"],"don":["6.1"],"t":["6.1","11.2"],"modify":["6.1"],"revert":["6.1"],"reverts":["6.1"],"previous":["6.1"],"no":["6.1"],"image":["7.1","12.2","17.5","17.13","17.14","23.1"],"settings":["7.1","12.2","17.5","17.13","17.14"],"configure":["7.1"],"s3":["7.2"],"variant":["7.2"],"debug":["7.2","8.1"],"release":["7.2","13.1"],"debugging":["7.2"],"production":["7.2"],"memory":["7.2"],"slower":["7.2"],"recommend":["7.2"],"initial":["7.2"],"testing":["7.2"],"easier":["7.2","17.13"],"us":["7.2"],"once":["7.2","22.6"],"confident":["7.2"],"working":["7.2"],"switch":["7.2"],"print":["7.2"],"out":["7.2"],"messages":["7.2"],"serial":["7.2"],"port":["7.2","11.2"],"errors":["7.2"],"save":["7.2"],"faster":["7.2"],"two":["8.1"],"distinct":["8.1"],"parts":["8.1","18.6"],"build":["8.1"],"type":["8.1"],"e":["8.1"],"g":["8.1"],"can":["8.2","11.1","13.0","13.1","13.5","16.3"],"found":["8.2","14.3"],"user":["8.2"],"config":["8.2"],"ini":["8.2"],"file":["8.2","11.2"],"supports":["8.2"],"both":["8.2","23.4"],"ipv4":["8.2"],"mdns":["8.2"],"names":["8.2"],"as":["8.2"],"long":["8.2"],"resolvable":["8.2"],"camera":["8.3","17.8","17.12"],"esp":["8.3","12.3"],"eye":["8.3","16.4"],"non":["8.3","14.1"],"esp32s3":["8.3"],"version":["8.3"],"esp32m5stack":["8.3"],"m5stack":["8.3"],"for":["9.0"],"streaming":["9.0"],"video":["9.0"],"data":["9.0","19.0"],"project":["9.1"],"please":["9.1","22.3"],"visit":["9.1"],"described":["9.2"],"always":["10.1"],"be":["10.1"],"means":["10.1"],"time":["10.2"],"followed":["10.2"],"fully":["10.3"],"tested":["10.3"],"package":["10.3"],"restart":["10.4","13.4","23.2"],"still":["10.4","17.7"],"so":["11.1"],"that":["11.1","17.15","17.21"],"hostname":["11.2"],"service":["11.2"],"look":["11.2"],"when":["11.2"],"scanning":["11.2"],"should":["11.2","17.6","22.5"],"openiristracker":["11.2"],"order":["11.2"],"eyetrackvr":["11.2","14.4"],"firmware":["11.2","12.0","12.2"],"binary":["11.2"],"depricated":["11.2"],"removed":["11.2"],"txpower":["11.2"],"imagecard":["12.2","17.8","17.13","23.1"],"options":["12.2","17.13","17.14","18.6","23.1"],"platformio":["12.3"],"later":["12.3"],"needed":["12.3","17.21"],"going":["12.3","17.3"],"selecting":["12.3"],"then":["12.3","17.10","17.11","18.4"],"navigating":["12.3"],"folder":["12.3"],"opt":["13.0"],"ota":["13.0"],"an":["13.1"],"ftdi":["13.1"],"steps":["13.1","16.1"],"aren":["13.1"],"send":["13.2"],"charging":["13.3"],"suggested":["13.3"],"try":["13.3"],"cables":["13.3"],"or":["13.3"],"devices":["13.3"],"drivers":["13.3"],"up":["13.3","13.5","23.3"],"date":["13.3"],"some":["13.3","13.6","15.1","16.1"],"ports":["13.3"],"into":["13.4"],"enableota":["13.4"],"otaserverip":["13.4"],"openiristrackerl":["13.4"],"local":["13.4"],"here":["13.4","14.3"],"custom":["13.4"],"otapassword":["13.4"],"otaserverport":["13.4"],"env":["13.4"],"must":["13.4"],"power":["13.4","17.10"],"cycled":["13.4"],"getting":["13.5"],"set":["13.5","15.1"],"have":["13.5","16.6"],"client":["13.5"],"from":["13.6","17.8","18.2"],"slimevr":["13.6"],"credit":["13.6"],"template":["14.0","18.6","21.0"],"v":["14.0","18.6","21.0","23.4"],"slot":["14.0","14.1","18.6","21.0","23.4"],"content":["14.0","14.1","18.6","21.0","23.4"],"p":["14.0","14.1","18.6","21.0","23.4"],"in":["14.0"],"active":["14.0"],"sure":["14.1"],"class":["14.1"],"text":["14.1"],"red":["14.1"],"focused":["14.1","19.0"],"font":["14.1"],"bold":["14.1"],"5ma":["14.1"],"total":["14.1"],"regauring":["14.2"],"com":["14.4"],"redhawk989":["14.4"],"blob":["14.4"],"main":["14.4"],"all":["14.4","22.5"],"software":["14.4"],"under":["14.4"],"mit":["14.4"],"documentation":["14.4"],"missing":["15.1"],"need":["15.1"],"avatar":["15.1"],"require":["15.1"],"basic":["15.1"],"unity":["15.1"],"i":["16.1","16.4"],"show":["16.1"],"simple":["16.1"],"get":["16.1","18.4"],"quest":["16.2"],"rift":["16.2"],"create":["16.3"],"your":["16.3","17.22","18.0"],"own":["16.3"],"if":["16.3","18.0","23.0"],"possible":["16.4"],"achieve":["16.4"],"biggest":["16.4"],"what":["16.5","17.2"],"works":["16.5"],"best":["16.5","23.4"],"satisfactory":["16.6"],"stls":["16.7"],"via":["16.7"],"guide":["17.1"],"s":["17.2","17.15"],"status":["17.2"],"we":["17.3"],"stick":["17.3"],"months":["17.4"],"everything":["17.4"],"them":["17.6"],"cases":["17.6"],"free":["17.6"],"however":["17.6"],"noted":["17.6"],"performs":["17.6"],"worse":["17.6"],"than":["17.6"],"certain":["17.6"],"issue":["17.6"],"like":["17.6","23.1"],"back":["17.7"],"there":["17.7"],"will":["17.7"],"small":["17.7","17.21"],"amount":["17.7"],"gentle":["17.7"],"away":["17.8"],"move":["17.9"],"browser":["17.10"],"down":["17.10"],"copper":["17.11"],"denotes":["17.11"],"positive":["17.11"],"silver":["17.11"],"negative":["17.11"],"strip":["17.11"],"about":["17.11"],"led":["17.12"],"near":["17.12"],"ish":["17.15"],"joint":["17.15"],"where":["17.15","17.21"],"glue":["17.15"],"comes":["17.15"],"700ohm":["17.17"],"eight":["17.18"],"end":["17.18"],"around":["17.19","17.21"],"seven":["17.20"],"depending":["17.21"],"on":["17.21"],"break":["17.21"],"was":["17.21"],"dab":["17.21"],"hot":["17.21"],"likely":["17.21"],"twelve":["17.21"],"friend":["17.22"],"sixteen":["17.22"],"loss":["18.0"],"changes":["18.0"],"namely":["18.1"],"programmers":["18.1"],"esps":["18.1"],"reduces":["18.1"],"risk":["18.1"],"doa":["18.1"],"wire":["18.2"],"awg":["18.2"],"resistors":["18.4"],"buying":["18.4"],"regular":["18.4"],"through":["18.4","23.0"],"hole":["18.4"],"acceptable":["18.4"],"ohm":["18.4"],"this":["18.4","23.1"],"ensures":["18.4"],"solder":["18.5"],"alerts":["18.6"],"list":["18.6"],"six":["18.6"],"game":["19.0"],"privacy":["19.0"],"does":["19.0"],"not":["19.0"],"collect":["19.0"],"invoke":["22.4"],"webrequest":["22.4"],"uri":["22.4"],"python":["22.4"],"done":["22.6"],"used":["23.0"],"update":["23.0"],"just":["23.0"],"process":["23.0"],"again":["23.0"],"has":["23.0"],"looks":["23.1"],"level":["23.2"],"slider":["23.2"],"adjust":["23.2"],"case":["23.2"],"calibrationn":["23.2"],"calibration":["23.2"],"way":["23.3"],"slowly":["23.3"],"backing":["23.3"],"off":["23.3"],"until":["23.3"],"mainly":["23.3"],"pupil":["23.3"],"being":["23.3"],"visualized":["23.3"],"viewer":["23.3"],"too":["23.3"],"low":["23.3"],"nine":["23.3"],"at":["23.4"],"one":["23.4"],"spot":["23.4"],"hit":["23.4"],"prohurtz":["23.5"],"0001":["23.5"]},{"0":["14.4"],"4":["14.4"],"5":["4.1","13.4"],"6":["13.4"],"7":["13.4","17.11","17.13"],"8":["13.4"],"12":["17.8","17.11"],"13":["17.15"],"18":["17.14","17.15"],"34":["18.4"],"3653631":["16.2"],"why":["0.0"],"strive":["0.0"],"make":["0.0","13.5"],"work":["0.0","13.3"],"consultation":["0.0"],"replication":["0.0"],"reuse":["0.0"],"recommended":["1.1","8.2"],"negative":["1.1","17.17"],"marks":["1.1","17.17"],"side":["1.1","17.17"],"of":["1.1","5.0","13.3","16.1","17.17"],"positive":["1.1","17.17"],"eight":["1.2","17.20"],"twelve":["1.3"],"system":["1.4"],"in":["1.4","4.1","13.0"],"esps":["1.4"],"gg":["2.0"],"kkxybvykzx":["2.0"],"alt":["2.0"],"planned":["3.0"],"vitepress":["4.0"],"open":["4.1"],"site":["4.1"],"your":["4.1","19.0"],"browser":["4.1","13.5"],"members":["4.2"],"for":["4.2","13.1","16.4","17.18"],"componentes":["4.2"],"follow":["4.2","7.2"],"vue3":["4.2"],"docs":["4.2"],"entire":["5.1"],"supports":["5.1"],"documentation":["5.1","11.2","22.4"],"here":["5.1","9.2","13.6"],"all":["5.1","23.2"],"wish":["5.1"],"must":["5.1"],"prefaced":["5.1"],"when":["5.1"],"inside":["5.1"],"on":["5.1","15.1","18.1"],"html":["5.1"],"elements":["5.1"],"class":["5.1"],"attribute":["5.1"],"h1":["5.1"],"folder":["5.2"],"understand":["6.0"],"will":["6.1"],"trigger":["6.1"],"an":["6.1","12.3"],"add":["6.1","7.2"],"title":["6.1"],"added":["6.1","7.2"],"thing":["6.1","16.2"],"some":["6.1","12.3"],"detail":["6.1"],"about":["6.1"],"line":["6.1"],"optionaland":["6.1"],"if":["6.1"],"needed":["6.1"],"firmware":["7.1"],"one":["7.1","17.5","17.8","17.14","17.18"],"configutration":["7.2"],"espaithinker":["7.2","8.1"],"please":["7.2","18.4","21.0"],"gif":["7.2"],"s":["7.2","8.2","16.2"],"below":["7.2"],"place":["7.2"],"tip":["7.2","8.3","11.2","17.22"],"coming":["7.2","8.3","11.2","17.7"],"soon":["7.2","8.3","11.2"],"changing":["7.2"],"want":["7.2","14.1"],"help":["7.2"],"submit":["7.2"],"pr":["7.2"],"flash":["7.2"],"social":["7.2"],"vr":["7.2","23.1"],"games":["7.2"],"gui":["7.2"],"download":["7.2"],"vscode":["7.2","13.3"],"platformio":["7.2"],"project":["7.2"],"hard":["7.2"],"at":["7.2","23.2"],"currently":["7.2","17.2"],"date":["7.2"],"back":["7.2"],"frequently":["7.2"],"release":["8.1"],"board":["8.1"],"esp32cam":["8.1"],"network":["8.2"],"i":["8.2"],"e":["8.2"],"bonjour":["8.2"],"installed":["8.2","23.0"],"computer":["8.2"],"port":["8.2"],"password":["8.2"],"not":["8.2","13.3","13.4"],"wrover":["8.3"],"s3":["8.3"],"variant":["8.3"],"esp32s3cam":["8.3"],"from":["9.0"],"tracker":["9.0","12.0"],"development":["9.1"],"road":["9.1"],"map":["9.1"],"even":["10.1"],"changes":["10.1"],"example":["10.2"],"using":["10.2"],"http":["10.2"],"us":["10.3"],"router":["10.4"],"more":["11.1"],"easily":["11.1","17.22"],"our":["11.1"],"new":["11.1"],"app":["11.1","13.5"],"level":["11.2"],"working":["11.2","14.0","16.1"],"section":["11.2"],"two":["12.1","17.15","23.0"],"setup":["12.2"],"three":["12.2","17.13","23.1"],"opening":["12.3"],"seven":["12.3"],"adaptation":["12.3"],"slimevr":["12.3"],"credit":["12.3"],"goes":["12.3","13.6"],"team":["12.3","13.6"],"adapted":["12.3"],"future":["13.0"],"t":["13.1"],"easy":["13.1"],"so":["13.1"],"grab":["13.1"],"this":["13.1"],"guide":["13.1","15.1","23.1"],"how":["13.1"],"set":["13.1"],"up":["13.1"],"esp":["13.2"],"yet":["13.2"],"img":["13.2","13.4"],"might":["13.3"],"ones":["13.3"],"additionally":["13.3"],"can":["13.3"],"be":["13.3"],"caused":["13.3"],"by":["13.3","14.4"],"software":["13.3"],"hogging":["13.3"],"com":["13.3","16.2"],"cura":["13.3"],"cause":["13.3"],"press":["13.4"],"br":["13.4"],"touch":["13.4"],"move":["13.4","15.1"],"them":["13.4","17.12"],"during":["13.4"],"wait":["13.4"],"around":["13.4","17.12"],"minute":["13.4"],"repeat":["13.4","17.18","23.3"],"many":["13.4"],"sure":["13.5"],"you":["13.5"],"close":["13.5","17.7"],"tab":["13.5"],"tested":["13.5"],"it":["13.5","14.0","22.3"],"however":["14.0"],"most":["14.0"],"users":["14.0"],"details":["14.1"],"see":["14.1"],"data":["14.1"],"sheets":["14.1"],"effect":["14.1"],"infrared":["14.1"],"radiation":["14.1"],"lens":["14.1"],"an002":["14.1"],"photobiological":["14.1"],"sources":["14.1"],"training":["14.1"],"library":["14.1"],"nir":["14.1"],"stds":["14.1"],"including":["14.4"],"wiki":["14.4"],"creative":["14.4"],"commons":["14.4"],"cc":["14.4"],"sa":["14.4"],"knowledge":["15.1"],"owning":["15.1"],"once":["15.1","17.12"],"acknowledged":["15.1"],"items":["15.1"],"above":["15.1"],"full":["15.1"],"build":["15.1"],"form":["16.1"],"https":["16.2"],"www":["16.2"],"skills":["16.3"],"recommend":["16.4"],"other":["16.4"],"mounts":["16.4"],"inspiration":["16.4"],"experiment":["16.5"],"good":["16.6"],"luck":["16.6"],"discord":["16.7"],"prohurtz":["16.7"],"0001":["16.7"],"expect":["17.2"],"current":["17.3"],"ws4ps3mw250":["17.6"],"covering":["17.6"],"anti":["17.6"],"static":["17.6"],"ammount":["17.7"],"out":["17.7","18.4"],"options":["17.8","17.11","17.15"],"image":["17.8","17.11","17.15"],"settings":["17.8","17.11","17.15","23.1"],"next":["17.9","17.10"],"3mm":["17.11"],"exposed":["17.11","17.12"],"imagecard":["17.11","17.15"],"bottom":["17.12","17.21"],"strip":["17.12"],"4mm":["17.12"],"handy":["17.15"],"nine":["17.18"],"now":["17.18"],"ten":["17.18","23.3"],"four":["17.19"],"gluing":["17.21"],"bit":["17.21"],"thirteen":["17.21"],"fourteen":["17.21"],"use":["17.22"],"rubbing":["17.22"],"alcohol":["17.22"],"remove":["17.22"],"dead":["18.1"],"arrival":["18.1"],"causing":["18.1"],"delay":["18.1"],"external":["18.2"],"antennas":["18.2"],"small":["18.2"],"large":["18.2"],"correct":["18.4"],"patreon":["18.4"],"check":["18.4"],"discount":["18.4"],"codes":["18.4"],"available":["18.4"],"also":["18.4"],"unit":["18.4"],"pricing":["18.4"],"1x":["18.4"],"wire":["18.4"],"awg":["18.4"],"aliexpress":["18.4"],"hosted":["19.0"],"own":["19.0"],"pc":["19.0"],"uses":["19.0"],"the":["19.0"],"sound":["19.0"],"control":["19.0"],"float":["21.0"],"parameters":["21.0"],"adjust":["21.0"],"accordingly":["21.0"],"org":["22.4"],"usebasicparsing":["22.4"],"content":["22.4"],"py":["22.4"],"under":["22.6"],"dist":["22.6"],"been":["23.0"],"successfully":["23.0"],"should":["23.0"],"look":["23.0","23.2"],"eyetrack":["23.1"],"extremes":["23.2"],"recenter":["23.2"],"whatever":["23.2"],"point":["23.2"],"are":["23.2"],"looking":["23.2"],"high":["23.3"],"eleven":["23.3"],"everything":["23.3"],"left":["23.3"],"each":["23.4"],"without":["23.4"],"moving":["23.4"]}]'},t={"0.0":{t:"",p:`layout: page -<VPTeamPage> -<VPTeamPageTitle> -<te ...`,l:"about.html",a:""},"1.0":{t:"# Fox IR V2 Buil dInstructions ",p:"",l:"archive/fox_ir_v2_build_instructions.html",a:"text-var-font-accent"},"1.1":{t:"step-15-prepare-to-solder-ir-led-pcb-v2s",p:"Get your magnifying glass out, it's time to solder very smol t ...",l:"archive/fox_ir_v2_build_instructions.html#step-15-prepare-to-solder-ir-led-pcb-v2s",a:"step-15-prepare-to-solder-ir-led-pcb-v2s"},"1.2":{t:"step-17-solder-resistors-on-pcb-v2",p:`You only need 1 PCB to have a resistor per eye. -<ImageCard ...`,l:"archive/fox_ir_v2_build_instructions.html#step-17-solder-resistors-on-pcb-v2",a:"step-17-solder-resistors-on-pcb-v2"},"1.3":{t:"solder-leds-on-pcb-v2",p:"<ImageCard :options="image_settings.fox_ir_build_instr ...",l:"archive/fox_ir_v2_build_instructions.html#solder-leds-on-pcb-v2",a:"solder-leds-on-pcb-v2"},"1.4":{t:"wire-up-the-pcbs-v2",p:`Basic full wiring diagram of IR PCBs V2. -<ImageCard :option ...`,l:"archive/fox_ir_v2_build_instructions.html#wire-up-the-pcbs-v2",a:"wire-up-the-pcbs-v2"},"2.0":{t:"div-align-center-class-rounded-md",p:"<h1 class="text-[#ab5ac7]">Contact Us</h1&g ...",l:"contact.html",a:"div-align-center-class-rounded-md"},"3.0":{t:"# EyeTrackVR Development Roadmap ",p:"This will contain a list of features that are in progress, com ...",l:"dev_roadmap.html",a:"text-var-font-accent"},"3.1":{t:"completed",p:`<CheckBoxList -:options="{...Completed}" -/> -`,l:"dev_roadmap.html#completed",a:"completed"},"3.2":{t:"in-progress",p:`<CheckBoxList -:options="{...InProgress}" -/> -`,l:"dev_roadmap.html#in-progress",a:"in-progress"},"3.3":{t:"planned",p:`<CheckBoxList -:options="{...Planned}" -/> -`,l:"dev_roadmap.html#planned",a:"planned"},"4.0":{t:"development-documentation-for-the-eyetrackvr-docs-site",p:"This is the documentation for the EyeTrackVR Docs site. It is ...",l:"development/docs/dev_docs.html",a:"development-documentation-for-the-eyetrackvr-docs-site"},"4.1":{t:"getting-started",p:`Prerequisites - -Node.js (v14.15.4 or higher) -Yarn (v1.22.10 or ...`,l:"development/docs/dev_docs.html#getting-started",a:"getting-started"},"4.2":{t:"contributing",p:`Project Structure - -Familiarize yourself with the VitePress doc ...`,l:"development/docs/dev_docs.html#contributing",a:"contributing"},"5.0":{t:"# Pages ",p:"This section will cover how to add or edit pages on the docs w ...",l:"development/docs/pages.html",a:"text-var-font-accent"},"5.1":{t:"adding-a-page",p:"To add a page, you will need to create a new Markdown file in ...",l:"development/docs/pages.html#adding-a-page",a:"adding-a-page"},"5.2":{t:"editing-a-page",p:"To edit a page, you will need to edit the Markdown file in the ...",l:"development/docs/pages.html#editing-a-page",a:"editing-a-page"},"6.0":{t:"standards-guide",p:"Listed here are the standards that are used for the EyeTrackVR ...",l:"development/docs/standards.html",a:"standards-guide"},"6.1":{t:"code-standards",p:`General -It is by design that we use a static-site framework fo ...`,l:"development/docs/standards.html#code-standards",a:"code-standards"},"7.0":{t:"# Configuring the firmware ",p:"",l:"firmware_guide/configure_firmware.html",a:"text-var-font-accent"},"7.1":{t:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",p:"<ImageCard :options="image_settings.configure_firmware ...",l:"firmware_guide/configure_firmware.html#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",a:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this"},"7.2":{t:"open-the-ini-user-config-ini-file",p:"<ImageCard :options="image_settings.configure_firmware ...",l:"firmware_guide/configure_firmware.html#open-the-ini-user-config-ini-file",a:"open-the-ini-user-config-ini-file"},"7.3":{t:"now-move-on-to-uploading-the-firmware",p:"",l:"firmware_guide/configure_firmware.html#now-move-on-to-uploading-the-firmware",a:"now-move-on-to-uploading-the-firmware"},"8.0":{t:"# Firmware Environments ",p:"",l:"firmware_guide/environments.html",a:"text-var-font-accent"},"8.1":{t:"what-is-it",p:"A firmware environment is a way to store the custom firmware c ...",l:"firmware_guide/environments.html#what-is-it",a:"what-is-it"},"8.2":{t:"build-types",p:"We now have a couple of options letting us decide how we want ...",l:"firmware_guide/environments.html#build-types",a:"build-types"},"8.3":{t:"board-types",p:"We currently support a few different boards, and we are workin ...",l:"firmware_guide/environments.html#board-types",a:"board-types"},"9.0":{t:"# What is this? ",p:"Firmware is the second part of the equation to get your tracke ...",l:"firmware_guide/firmware.html",a:"text-var-font-accent"},"9.1":{t:"what-should-i-download-and-where",p:"Current testing has been on our own solution called OpenIris, ...",l:"firmware_guide/firmware.html#what-should-i-download-and-where",a:"what-should-i-download-and-where"},"9.2":{t:"how-do-download-this",p:`Follow the steps described here -`,l:"firmware_guide/firmware.html#how-do-download-this",a:"how-do-download-this"},"10.0":{t:"# MDNS ",p:"",l:"firmware_guide/htmlns.md",a:"text-var-font-accent"},"10.1":{t:"what-is-it",p:"mDNS is a protocol that allows you to connect to a device usin ...",l:"firmware_guide/htmlns.md#what-is-it",a:"what-is-it"},"10.2":{t:"how-to-use-it",p:`Enable mDNS -The mDNS is enabled by default on the new firmware ...`,l:"firmware_guide/htmlns.md#how-to-use-it",a:"how-to-use-it"},"10.3":{t:"prerequisites-bonjour",p:"Bonjour is required to use the mDNS protocol for windows and m ...",l:"firmware_guide/htmlns.md#prerequisites-bonjour",a:"prerequisites-bonjour"},"10.4":{t:"troubleshooting",p:`Can not connect to the device -If you can not connect to the de ...`,l:"firmware_guide/htmlns.md#troubleshooting",a:"troubleshooting"},"11.0":{t:"# REST API ",p:"",l:"firmware_guide/rest_api.html",a:"text-var-font-accent"},"11.1":{t:"what-is-it",p:"A REST API is a way to communicate with the ESP devices using ...",l:"firmware_guide/rest_api.html#what-is-it",a:"what-is-it"},"11.2":{t:"how-to-use-it",p:`REST API Client -Any REST API client can be used to communicate ...`,l:"firmware_guide/rest_api.html#how-to-use-it",a:"how-to-use-it"},"12.0":{t:"# Setting up the environment ",p:"This procedure will show how to prepare your system for upload ...",l:"firmware_guide/setup_vscode.html",a:"text-var-font-accent"},"12.1":{t:"_1-install-visual-studio-code",p:`Download the latest Visual Studio Code and install it. -Downloa ...`,l:"firmware_guide/setup_vscode.html#_1-install-visual-studio-code",a:"_1-install-visual-studio-code"},"12.2":{t:"_2-install-platformio-ide",p:"Once Visual Studio Code is installed, open it and install Plat ...",l:"firmware_guide/setup_vscode.html#_2-install-platformio-ide",a:"_2-install-platformio-ide"},"12.3":{t:"_3-clone-the-firmware-project",p:"Make sure you close any current projects you have open or open ...",l:"firmware_guide/setup_vscode.html#_3-clone-the-firmware-project",a:"_3-clone-the-firmware-project"},"13.0":{t:"# Building and uploading the firmware manually ",p:"Uploading your firmware must initially be done over cable. Onc ...",l:"firmware_guide/upload_firmware.html",a:"text-var-font-accent"},"13.1":{t:"_1-connect-your-tracker-to-your-pc-via-the-programmer",p:"First, connect your ESP32-Cam to your programmer. In the case ...",l:"firmware_guide/upload_firmware.html#_1-connect-your-tracker-to-your-pc-via-the-programmer",a:"_1-connect-your-tracker-to-your-pc-via-the-programmer"},"13.2":{t:"_2-build-your-firmware",p:` -Press the build button at the bottom of Visual Studio Code. - - ...`,l:"firmware_guide/upload_firmware.html#_2-build-your-firmware",a:"_2-build-your-firmware"},"13.3":{t:"_3-upload-your-firmware",p:` - -If you are using the OTA method, first make sure the tracker ...`,l:"firmware_guide/upload_firmware.html#_3-upload-your-firmware",a:"_3-upload-your-firmware"},"13.4":{t:"uploading-via-ota",p:`What is it? -OTA stands for Over The Air, and it is a way to up ...`,l:"firmware_guide/upload_firmware.html#uploading-via-ota",a:"uploading-via-ota"},"13.5":{t:"finding-the-ip-address-of-your-tracker",p:"Connect your tracker to your PC and then open a serial monitor ...",l:"firmware_guide/upload_firmware.html#finding-the-ip-address-of-your-tracker",a:"finding-the-ip-address-of-your-tracker"},"13.6":{t:"troubleshooting",p:"If you encountered an issue while following these steps check ...",l:"firmware_guide/upload_firmware.html#troubleshooting",a:"troubleshooting"},"14.0":{t:"# EyeTrackVR ",p:"Open source and affordable VR eye tracker platform for Social ...",l:"getting_started/intro.html",a:"text-3xl-font-bold-underline-text-ab5ac7"},"14.1":{t:"about-ir-emitter-safety",p:`Please exercise caution when messing around with IR emitters. - ...`,l:"getting_started/intro.html#about-ir-emitter-safety",a:"about-ir-emitter-safety"},"14.2":{t:"hardware",p:"Please check out our parts list and hardware repo. for informa ...",l:"getting_started/intro.html#hardware",a:"hardware"},"14.3":{t:"firmware",p:`Our firmware called OpenIris is made by lorow found here. -`,l:"getting_started/intro.html#firmware",a:"firmware"},"14.4":{t:"headset-support",p:"In theory, we are compatible with every VR headset. However, m ...",l:"getting_started/intro.html#headset-support",a:"headset-support"},"15.0":{t:"# Things To Know Before You Start ",p:"",l:"getting_started/things_to_know.html",a:"text-var-font-accent"},"15.1":{t:"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project",p:`Software is not final -Bugs can and will occur which may hinder ...`,l:"getting_started/things_to_know.html#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project",a:"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project"},"16.0":{t:"# Creating Your Own Mount ",p:"",l:"how_to_build/creating_your_own_mount.html",a:"text-var-font-accent"},"16.1":{t:"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts",p:"So, you have a headset that does not have any mounts or none t ...",l:"how_to_build/creating_your_own_mount.html#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts",a:"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts"},"16.2":{t:"step-1-find-a-way-to-mount-to-your-headsets-lens",p:"The easiest way to get started is to find a lens protector for ...",l:"how_to_build/creating_your_own_mount.html#step-1-find-a-way-to-mount-to-your-headsets-lens",a:"step-1-find-a-way-to-mount-to-your-headsets-lens"},"16.3":{t:"step-2-find-a-camera-mount",p:"Now, you need a way to attach the camera. We have a basic desi ...",l:"how_to_build/creating_your_own_mount.html#step-2-find-a-camera-mount",a:"step-2-find-a-camera-mount"},"16.4":{t:"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle",p:"The "Ideal" location is a place that gives a good vi ...",l:"how_to_build/creating_your_own_mount.html#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle",a:"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle"},"16.5":{t:"step-4-mount-your-leds",p:"You can either add parts to your mount for holding the LED boa ...",l:"how_to_build/creating_your_own_mount.html#step-4-mount-your-leds",a:"step-4-mount-your-leds"},"16.6":{t:"step-5-test-everything",p:"It is unlikely you will get a perfect mount on the first try. ...",l:"how_to_build/creating_your_own_mount.html#step-5-test-everything",a:"step-5-test-everything"},"16.7":{t:"step-6-get-your-mounts-listed",p:"Send me the mount to be added to the docs here! You can upload ...",l:"how_to_build/creating_your_own_mount.html#step-6-get-your-mounts-listed",a:"step-6-get-your-mounts-listed"},"17.0":{t:"# Build Guide ",p:"",l:"how_to_build/full_build.html",a:"text-var-font-accent"},"17.1":{t:"this-page-will-contain-a-step-by-step-assembly-guide",p:"",l:"how_to_build/full_build.html#this-page-will-contain-a-step-by-step-assembly-guide",a:"this-page-will-contain-a-step-by-step-assembly-guide"},"17.2":{t:"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide",p:"This will give you a basic overview of the project's status an ...",l:"how_to_build/full_build.html#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide",a:"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide"},"17.3":{t:"step-2-order-all-the-parts-listed-on-our-parts-list",p:"Please take note of the fact that hardware still may change, a ...",l:"how_to_build/full_build.html#step-2-order-all-the-parts-listed-on-our-parts-list",a:"step-2-order-all-the-parts-listed-on-our-parts-list"},"17.4":{t:"step-3-wait-for-things-to-arrive",p:`Long shipping times from China are f u n. -Please allow anywhe ...`,l:"how_to_build/full_build.html#step-3-wait-for-things-to-arrive",a:"step-3-wait-for-things-to-arrive"},"17.5":{t:"step-4-gather-up-all-of-your-hardware",p:`Make sure you have at least the following: -<CheckBoxList :o ...`,l:"how_to_build/full_build.html#step-4-gather-up-all-of-your-hardware",a:"step-4-gather-up-all-of-your-hardware"},"17.6":{t:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",p:"Some ESP-CAM boards have issues with signal integrity, there a ...",l:"how_to_build/full_build.html#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",a:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag"},"17.7":{t:"step-6-attach-cameras-to-esps",p:"Look at your ESP and locate the camera ribbon cable connector ...",l:"how_to_build/full_build.html#step-6-attach-cameras-to-esps",a:"step-6-attach-cameras-to-esps"},"17.8":{t:"step-7-connect-esp-to-the-programmer-to-flash",p:"Why flash before you have it assembled? It's simple, to make s ...",l:"how_to_build/full_build.html#step-7-connect-esp-to-the-programmer-to-flash",a:"step-7-connect-esp-to-the-programmer-to-flash"},"17.9":{t:"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware",p:`Check out our guide on Setting up VS Code -Once VS Code is set ...`,l:"how_to_build/full_build.html#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware",a:"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware"},"17.10":{t:"step-9-plug-in-your-esp-and-flash-the-firmware",p:"Our guide, Building and uploading the firmware manually has st ...",l:"how_to_build/full_build.html#step-9-plug-in-your-esp-and-flash-the-firmware",a:"step-9-plug-in-your-esp-and-flash-the-firmware"},"17.11":{t:"step-10-connect-your-power-wires-to-a-usb-type-a-board",p:`::: warning -Powering from the programmer board will not work c ...`,l:"how_to_build/full_build.html#step-10-connect-your-power-wires-to-a-usb-type-a-board",a:"step-10-connect-your-power-wires-to-a-usb-type-a-board"},"17.12":{t:"step-11-cut-wires-for-ir-leds",p:"To find the optimal length, take a piece of wire and a marker ...",l:"how_to_build/full_build.html#step-11-cut-wires-for-ir-leds",a:"step-11-cut-wires-for-ir-leds"},"17.13":{t:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",p:"Once twisted together add solder to keep them together. This m ...",l:"how_to_build/full_build.html#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",a:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them"},"17.14":{t:"step-13-solder-the-positive-wire-to-esp",p:`Lay the wire on the outside of the 5V pin and apply solder. -&l ...`,l:"how_to_build/full_build.html#step-13-solder-the-positive-wire-to-esp",a:"step-13-solder-the-positive-wire-to-esp"},"17.15":{t:"step-14-solder-the-negative-wire-to-esp",p:`Repeat Step 12 but with the negative wires. -::: info -As a user ...`,l:"how_to_build/full_build.html#step-14-solder-the-negative-wire-to-esp",a:"step-14-solder-the-negative-wire-to-esp"},"17.16":{t:"step-15-wire-up-the-2nd-esp",p:`Repeat steps 12-14 with the 2nd ESP. -`,l:"how_to_build/full_build.html#step-15-wire-up-the-2nd-esp",a:"step-15-wire-up-the-2nd-esp"},"17.17":{t:"step-16-prepare-to-solder-ir-led-pcbs",p:"Get your magnifying glass out, it's time to solder very smol t ...",l:"how_to_build/full_build.html#step-16-prepare-to-solder-ir-led-pcbs",a:"step-16-prepare-to-solder-ir-led-pcbs"},"17.18":{t:"step-18-solder-resistors-on-pcb-v3",p:`You only need 1 PCB to have resistors per eye. -Tin the resisto ...`,l:"how_to_build/full_build.html#step-18-solder-resistors-on-pcb-v3",a:"step-18-solder-resistors-on-pcb-v3"},"17.19":{t:"solder-leds-on-pcb-v3",p:`Tin the LED pads. -<ImageCard :options="image_settings. ...`,l:"how_to_build/full_build.html#solder-leds-on-pcb-v3",a:"solder-leds-on-pcb-v3"},"17.20":{t:"wire-up-the-pcbs-v3",p:`::: warning -Pay attention to the direction of the LEDs on the ...`,l:"how_to_build/full_build.html#wire-up-the-pcbs-v3",a:"wire-up-the-pcbs-v3"},"17.21":{t:"step-19-3d-print-mounts",p:`Head to the 3D printed parts section of the parts list here. -F ...`,l:"how_to_build/full_build.html#step-19-3d-print-mounts",a:"step-19-3d-print-mounts"},"17.22":{t:"ir-led-mounting",p:`This again differs from mount to mount. -In some cases, there a ...`,l:"how_to_build/full_build.html#ir-led-mounting",a:"ir-led-mounting"},"18.0":{t:"# Parts List ",p:`<Alerts :options="alerts.parts_list_one"> -< ...`,l:"how_to_build/parts_list.html",a:"text-var-font-accent"},"18.1":{t:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",p:`<Alerts :options="alerts.parts_list_two"> -< ...`,l:"how_to_build/parts_list.html#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",a:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup"},"18.2":{t:"camera-setup",p:` - -2x ESP-CAM-32 modules - - -AliExpress - - -2x ov2640 160° FOV IR / ...`,l:"how_to_build/parts_list.html#camera-setup",a:"camera-setup"},"18.3":{t:"recommended",p:` - -2x-4x Heatsinks - - -AliExpress -`,l:"how_to_build/parts_list.html#recommended",a:"recommended"},"18.4":{t:"ir-emitters",p:`IR LED kit -If you do not want to source things from multiple p ...`,l:"how_to_build/parts_list.html#ir-emitters",a:"ir-emitters"},"18.5":{t:"misc-parts",p:` - -1x Hot glue or another form of glue. -AliExpress -Amazon - - -1x ...`,l:"how_to_build/parts_list.html#misc-parts",a:"misc-parts"},"18.6":{t:"_3d-printed-mounts",p:"Mounts with a ★ next to them are the recommended mounts for th ...",l:"how_to_build/parts_list.html#_3d-printed-mounts",a:"_3d-printed-mounts"},"19.0":{t:"",p:`layout: home -hero: -name: EyeTrackVR Docs -text: Opensource and ...`,l:"index.html",a:""},"20.0":{t:"# Frequently Asked Questions ",p:`<br> - -<FAQ /> -`,l:"misc/faq.html",a:"text-var-font-accent"},"21.0":{t:"# How to set up your avatar for eye tracking: ",p:`Here is an avatar setup video created by a contributor: -<di ...`,l:"misc/vrc_avatar_setup.html",a:"text-var-font-accent"},"22.0":{t:"# Build the app from source ",p:"",l:"software_guide/build_software.html",a:"text-var-font-accent"},"22.1":{t:"this-guide-will-show-how-to-build-the-app-from-source",p:`<Alerts :options="alerts.build_software_one"> - ...`,l:"software_guide/build_software.html#this-guide-will-show-how-to-build-the-app-from-source",a:"this-guide-will-show-how-to-build-the-app-from-source"},"22.2":{t:"requirements",p:`<CheckList :options="{...Requirements}"/> -`,l:"software_guide/build_software.html#requirements",a:"requirements"},"22.3":{t:"install-python",p:"EyetrackVR is currently using Python 3.11.0 Before you continu ...",l:"software_guide/build_software.html#install-python",a:"install-python"},"22.4":{t:"installing-poetry",p:"Since version 0.1.7 of EyeTrackVR, we have been using Poetry t ...",l:"software_guide/build_software.html#installing-poetry",a:"installing-poetry"},"22.5":{t:"install-the-required-python-modules",p:"After cloning the project and installing Poetry, open a comman ...",l:"software_guide/build_software.html#install-the-required-python-modules",a:"install-the-required-python-modules"},"22.6":{t:"build-the-app",p:`Now, you should be ready to build the app. -With a command prom ...`,l:"software_guide/build_software.html#build-the-app",a:"build-the-app"},"23.0":{t:"# How to install, run and adjust the EyeTrackVR app. ",p:"Step 1: Download the EyeTrackVR Installer and install the EyeT ...",l:"software_guide/eyetrackvr_app_guide.html",a:"text-var-font-accent"},"23.1":{t:"step-2-run-the-eyetrackvr-app",p:"If the Create Desktop Shortcut option was checked you should s ...",l:"software_guide/eyetrackvr_app_guide.html#step-2-run-the-eyetrackvr-app",a:"step-2-run-the-eyetrackvr-app"},"23.2":{t:"step-3-getting-familiar-with-settings-and-terminology",p:"Let's go over some basic terminology you will find in the app. ...",l:"software_guide/eyetrackvr_app_guide.html#step-3-getting-familiar-with-settings-and-terminology",a:"step-3-getting-familiar-with-settings-and-terminology"},"23.3":{t:"step-4-adding-your-cameras-to-the-software-and-configuring-them",p:"Power your ESPs and find what the IP address is for your right ...",l:"software_guide/eyetrackvr_app_guide.html#step-4-adding-your-cameras-to-the-software-and-configuring-them",a:"step-4-adding-your-cameras-to-the-software-and-configuring-them"},"23.4":{t:"step-5-calibrating-your-eyes",p:"Once your eye is trackable by the software we need to calibrat ...",l:"software_guide/eyetrackvr_app_guide.html#step-5-calibrating-your-eyes",a:"step-5-calibrating-your-eyes"},"23.5":{t:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",p:"",l:"software_guide/eyetrackvr_app_guide.html#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",a:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001"}},o={previewLength:62,buttonLabel:"Search",placeholder:"Search docs",preset:"score",cache:1e3,context:!0},a={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:o};export{a as default}; diff --git a/assets/chunks/virtual_search-data.f5f281ff.js b/assets/chunks/virtual_search-data.f5f281ff.js new file mode 100644 index 0000000..9a7c9a5 --- /dev/null +++ b/assets/chunks/virtual_search-data.f5f281ff.js @@ -0,0 +1,83 @@ +const e={map:'[{"text":["1.0","3.0","5.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","15.0","16.0","17.0","18.0","19.0","21.0","22.0","23.0","24.0"],"step":["1.1","1.2","17.2","17.3","17.4","17.5","17.6","17.7","18.2","18.3","18.4","18.5","18.6","18.7","18.8","18.9","18.10","18.11","18.12","18.13","18.14","18.15","18.16","18.17","18.18","18.21","24.1","24.2","24.3","24.4"],"solder":["1.3","18.19"],"wire":["1.4","18.20"],"div":["2.0"],"completed":["3.1"],"in":["3.2"],"planned":["3.3"],"development":["4.0"],"getting":["4.1"],"contributing":["4.2"],"adding":["5.1"],"editing":["5.2"],"standards":["6.0"],"code":["6.1"],"once":["7.1"],"open":["7.2"],"now":["7.3"],"what":["8.1","9.1","10.1","11.1"],"build":["8.2","23.6"],"board":["8.3"],"how":["9.2","10.2","11.2"],"prerequisites":["10.3"],"troubleshooting":["10.4","14.6"],"updating":["13.1"],"upgrading":["13.2"],"uploading":["14.4"],"finding":["14.5"],"about":["15.1"],"hardware":["15.2"],"firmware":["15.3"],"headset":["15.4"],"this":["16.1","17.1","18.1","19.1","23.1"],"ir":["18.22","19.4"],"camera":["19.2"],"recommended":["19.3"],"misc":["19.5"],"requirements":["23.2"],"install":["23.3","23.5"],"installing":["23.4"],"see":["24.5"]},{"0":["23.4"],"1":["1.2","4.2","7.2","12.1","12.3","14.1","17.2","18.2","18.18","23.4","24.0"],"2":["12.2","14.2","17.3","18.3","18.6","24.1"],"3":["12.3","14.3","17.4","18.4","24.2"],"4":["4.1","17.5","18.5","24.3"],"5":["17.6","18.6","24.4"],"6":["17.7","18.7"],"7":["18.8","23.4"],"8":["18.9"],"9":["18.10"],"10":["18.11"],"11":["18.12"],"12":["18.13"],"13":["18.14"],"14":["18.15"],"15":["1.1","4.1","18.16"],"16":["18.17"],"17":["1.2"],"18":["18.18"],"19":["18.21"],"32":["19.2"],"81":["11.2"],"160":["19.2"],"layout":["0.0","20.0"],"page":["0.0","5.1","5.2","16.1","17.1","18.1","19.1"],"vpteampage":["0.0"],"vpteampagetitle":["0.0"],"template":["0.0"],"title":["0.0"],"div":["0.0"],"class":["0.0","2.0"],"text":["0.0","2.0","7.2","20.0"],"ab5ac7":["0.0","2.0","15.0"],"our":["0.0","15.3"],"team":["0.0"],"lead":["0.0"],"the":["0.0","1.4","4.2","5.1","6.1","7.2","8.2","10.2","10.4","11.2","12.3","13.2","14.1","14.3","14.4","14.5","17.4","18.3","18.6","18.7","18.8","18.12","18.13","18.14","18.15","18.19","18.20","18.21","19.6","23.5","23.6","24.0","24.1","24.2","24.3","24.4"],"development":["0.0"],"of":["0.0","1.4","5.1","7.2","8.2","11.2","14.5","16.1","18.21","23.4"],"eyetrackvr":["0.0","20.0","23.3","24.0","24.1"],"is":["0.0","6.1","7.2","8.1","10.1","10.2","10.3","11.1","11.2","14.3","14.4","15.1","16.1","18.6","18.21","19.6","22.0","24.3","24.4"],"guided":["0.0"],"by":["0.0","6.1","10.2","13.1","14.5","22.0","24.3","24.4"],"var":["1.0","3.0","5.0","7.0","8.0","9.0","10.0","11.0","12.0","13.0","14.0","16.0","17.0","18.0","19.0","21.0","22.0","23.0","24.0"],"prepare":["1.1","18.17"],"to":["1.1","5.1","6.1","7.2","8.1","8.2","10.1","10.2","10.3","10.4","11.2","13.1","13.2","14.1","14.3","14.4","14.5","15.1","16.1","17.2","18.6","18.7","18.8","18.11","18.12","18.15","18.17","18.18","18.20","18.21","18.22","19.4","19.6","23.1","24.0","24.3"],"solder":["1.1","1.2","18.14","18.15","18.17","18.18"],"ir":["1.1","1.3","1.4","15.1","18.12","18.17","19.2"],"led":["1.1","18.17","18.22","19.4"],"pcb":["1.1","1.2","1.3","18.18","18.19"],"v2s":["1.1"],"get":["1.1","11.2","17.7","18.17"],"your":["1.1","7.2","11.2","13.1","14.1","14.2","14.3","14.4","14.5","15.1","17.2","17.5","17.7","18.2","18.7","18.10","18.11","18.17","18.21","24.3","24.4"],"magnifying":["1.1","18.17"],"glass":["1.1","18.17"],"out":["1.1","18.17"],"it":["1.1","6.1","7.2","8.1","8.3","10.1","10.2","11.1","11.2","13.1","14.4","15.1","17.4","18.17","18.21"],"s":["1.1","11.2","18.17","24.2"],"time":["1.1","18.17","19.4"],"very":["1.1","18.17"],"smol":["1.1","18.17"],"resistors":["1.2","18.18"],"on":["1.2","1.3","8.3","10.2","14.3","17.1","18.18","18.19","19.4"],"v2":["1.2","1.3","1.4"],"you":["1.2","5.1","7.1","7.2","10.1","10.4","11.2","12.3","13.1","13.2","14.3","14.6","16.1","18.6","18.18","19.4","23.6","24.2"],"only":["1.2","6.1","18.18"],"need":["1.2","5.1","7.2","13.2","18.18","24.4"],"leds":["1.3","17.5","18.12","18.19"],"imagecard":["1.3","7.2","14.5"],"options":["1.3","7.2","8.2","14.5"],"image":["1.3","7.2","14.5","20.0"],"settings":["1.3","7.2","14.5","24.2"],"fox":["1.3"],"up":["1.4","18.5","18.20"],"pcbs":["1.4","18.17","18.20"],"basic":["1.4","11.2","17.1","19.1","24.2"],"full":["1.4"],"wiring":["1.4"],"diagram":["1.4"],"align":["2.0"],"center":["2.0"],"rounded":["2.0"],"md":["2.0","5.1"],"h1":["2.0"],"font":["3.0","5.0","9.0","12.0","13.0","14.0","15.0","19.0","22.0","24.0"],"checkboxlist":["3.1","3.3"],"progress":["3.2"],"documentation":["4.0","4.2","6.1"],"for":["4.0","5.1","6.1","11.2","14.4","18.4","18.12","18.21","19.1","19.6","24.3"],"started":["4.1"],"prerequisites":["4.1"],"node":["4.1"],"js":["4.1"],"v14":["4.1"],"or":["4.1","7.2","12.3","18.6","18.21","19.4"],"higher":["4.1"],"project":["4.2","12.3","16.1"],"structure":["4.2"],"familiarize":["4.2"],"yourself":["4.2"],"with":["4.2","7.2","11.2","12.3","15.1","15.4","18.6","19.6","24.2"],"vitepress":["4.2","5.1"],"accent":["5.0","9.0","13.0","14.0","19.0","22.0","24.0"],"this":["5.0","6.1","13.2","18.22","19.6","24.3"],"section":["5.0","18.21"],"a":["5.1","5.2","6.1","7.2","8.1","8.2","8.3","10.1","11.1","11.2","12.3","14.4","14.5","15.1","17.1","17.2","17.3","18.11","19.1","19.4","19.6","22.0","24.3"],"add":["5.1"],"will":["5.1","7.2","16.1","17.1","17.4","19.1","23.1","24.2"],"create":["5.1"],"new":["5.1","10.2","12.3"],"markdown":["5.1"],"file":["5.1","7.2"],"in":["5.1","7.2","14.5","15.4","18.10","24.2","24.3"],"docs":["5.1","20.0"],"src":["5.1","20.0"],"pages":["5.1"],"folder":["5.1"],"name":["5.1","7.2","11.2","20.0"],"be":["5.1","10.2","11.2","15.1","16.1","24.3"],"url":["5.1"],"example":["5.1","11.2"],"if":["5.1","7.2","10.4","11.2","14.3","14.6","19.3","19.4"],"called":["5.1"],"my":["5.1"],"https":["5.1"],"guide":["6.0","23.1"],"listed":["6.0"],"here":["6.0","18.21","22.0"],"standards":["6.1"],"general":["6.1"],"design":["6.1"],"that":["6.1","10.1"],"we":["6.1","8.2","8.3","11.2","15.4","24.4"],"use":["6.1","10.2","10.3","11.2","14.4","15.1","18.6"],"static":["6.1"],"site":["6.1"],"framework":["6.1"],"ensure":["6.1"],"easy":["6.1"],"maintain":["6.1"],"and":["6.1","7.2","8.3","10.2","11.2","13.0","14.3","14.4","14.5","15.0","16.1","18.7","18.10","18.21","20.0","24.0","24.2","24.3"],"extend":["6.1"],"also":["6.1","13.2"],"understand":["6.1","16.1"],"have":["6.1","7.1","7.2","8.2","12.3","15.4","18.6","18.18"],"few":["6.1","8.3"],"rules":["6.1"],"ini":["7.2"],"user":["7.2"],"config":["7.2"],"configure":["7.2","18.9"],"firmware":["7.2","8.1","9.0","10.2","12.3","14.3","14.4","14.5"],"two":["7.2","13.1"],"replace":["7.2"],"placeholder":["7.2"],"correct":["7.2"],"ssid":["7.2"],"wifi":["7.2"],"access":["7.2"],"point":["7.2"],"password":["7.2"],"respectfully":["7.2"],"info":["7.2","11.2"],"special":["7.2"],"characters":["7.2"],"such":["7.2"],"as":["7.2","11.2"],"are":["7.2","8.3","13.1","14.3","15.4","18.6","18.21","19.6"],"not":["7.2","10.2","10.4","15.1","15.4","16.1","19.4"],"supported":["7.2"],"character":["7.2"],"change":["7.2"],"spaces":["7.2"],"either":["7.2"],"space":["7.2"],"supports":["7.2"],"ap":["7.2"],"mode":["7.2"],"but":["7.2","19.3"],"recommended":["7.2","15.1","18.21","19.6"],"using":["7.2","11.2","14.3"],"set":["7.2"],"enableadhoc":["7.2"],"then":["7.2","14.5"],"can":["7.2","10.2","10.4","11.2","13.1","15.1","18.6","19.4","24.3"],"choose":["7.2"],"leave":["7.2"],"move":["7.3"],"environment":["8.1"],"way":["8.1","14.4","17.2"],"types":["8.2","8.3"],"now":["8.2","23.6"],"couple":["8.2"],"letting":["8.2"],"us":["8.2"],"decide":["8.2"],"how":["8.2","14.4","23.1"],"want":["8.2","19.4"],"firmaware":["8.2"],"debug":["8.2"],"has":["8.2"],"lot":["8.2"],"logging":["8.2"],"useful":["8.2"],"currently":["8.3"],"support":["8.3","15.4"],"different":["8.3","15.1"],"boards":["8.3","18.6"],"working":["8.3"],"adding":["8.3","24.3"],"more":["8.3"],"warning":["8.3","18.11","18.20"],"should":["9.1","23.6"],"i":["9.1","14.4"],"download":["9.1","24.0"],"do":["9.2","13.2","14.4","18.6","19.4"],"mdns":["10.1","10.2"],"protocol":["10.1"],"allows":["10.1"],"connect":["10.1","10.4","11.2","14.1","14.4","14.5","18.8","18.11"],"device":["10.1","10.4","11.2","14.4"],"enable":["10.2"],"enabled":["10.2"],"default":["10.2"],"disabled":["10.2"],"bonjour":["10.3"],"required":["10.3","23.5"],"rest":["11.1","11.2"],"api":["11.1","11.2"],"client":["11.2"],"any":["11.2","12.3"],"used":["11.2"],"communicate":["11.2"],"esp":["11.2","18.6","18.7","18.8","18.10","18.15","19.2"],"devices":["11.2"],"recommend":["11.2"],"thunder":["11.2"],"test":["11.2","17.6"],"free":["11.2"],"vscode":["11.2"],"extension":["11.2"],"requests":["11.2"],"browser":["11.2","24.3"],"choice":["11.2"],"standard":["11.2"],"follows":["11.2"],"following":["11.2"],"txt":["11.2"],"http":["11.2"],"local":["11.2"],"control":["11.2"],"builtin":["11.2"],"command":["11.2"],"endpoint":["11.2"],"param":["11.2"],"value":["11.2"],"esp32":["11.2","14.1"],"endpoints":["11.2"],"note":["11.2"],"install":["12.1","12.2","18.6","24.0"],"visual":["12.1","18.9"],"studio":["12.1","18.9"],"platformio":["12.2","13.1"],"ide":["12.2"],"once":["12.2","15.1","24.4"],"clone":["12.3"],"make":["12.3","14.3","18.2"],"sure":["12.3","14.3","18.2"],"close":["12.3"],"current":["12.3"],"projects":["12.3"],"open":["12.3","14.5","15.0"],"window":["12.3"],"before":["12.3","16.1"],"moving":["12.3"],"forward":["12.3"],"these":["12.3"],"steps":["12.3"],"sometimes":["13.0"],"when":["13.0","15.1"],"building":["13.0","19.1"],"itself":["13.1"],"there":["13.1","18.6"],"ways":["13.1"],"update":["13.1","14.4"],"installation":["13.1"],"via":["13.1","14.1","14.4"],"cli":["13.1"],"easily":["13.1"],"simply":["13.1"],"sdk":["13.2"],"ll":["13.2"],"upgrade":["13.2"],"from":["13.2","18.22","19.4","24.2"],"timem":["13.2"],"uploading":["14.0"],"tracker":["14.1","14.3","14.5"],"pc":["14.1","14.5"],"programmer":["14.1","18.8"],"first":["14.1","14.3","18.6"],"build":["14.2"],"upload":["14.3","14.5"],"ota":["14.3","14.4"],"method":["14.3"],"wish":["14.3"],"flash":["14.3"],"turned":["14.3"],"connected":["14.3"],"what":["14.4","24.3"],"stands":["14.4"],"over":["14.4","24.2"],"air":["14.4"],"without":["14.4"],"having":["14.4"],"computer":["14.4"],"ip":["14.5","24.3"],"address":["14.5","24.3"],"serial":["14.5"],"monitor":["14.5"],"vsc":["14.5"],"pressing":["14.5"],"plug":["14.5","18.10"],"icon":["14.5"],"one":["14.5"],"encountered":["14.6"],"an":["14.6","16.1","18.6","19.1","22.0"],"issue":["14.6"],"while":["14.6"],"3xl":["15.0"],"bold":["15.0"],"underline":["15.0"],"source":["15.0","19.4"],"affordable":["15.0","20.0"],"vr":["15.0","15.4","20.0"],"emitter":["15.1"],"safety":["15.1"],"please":["15.1","15.2"],"exercise":["15.1"],"caution":["15.1"],"messing":["15.1"],"around":["15.1"],"emitters":["15.1","19.4"],"dangerous":["15.1"],"eyes":["15.1","24.4"],"at":["15.1","18.7"],"certain":["15.1"],"power":["15.1","18.11","24.3"],"level":["15.1"],"theory":["15.4"],"compatible":["15.4"],"every":["15.4"],"however":["15.4"],"mounts":["15.4","17.7","18.21","19.6"],"may":["15.4","18.21"],"overview":["16.1"],"things":["16.1","18.6","19.4"],"know":["16.1"],"start":["16.1"],"software":["16.1","24.3","24.4"],"final":["16.1"],"include":["17.1","19.1"],"rundown":["17.1"],"find":["17.2","17.3","18.12","18.21","24.2","24.3"],"mount":["17.2","17.3","17.4","17.5","18.22"],"camera":["17.3","17.4","18.7"],"place":["17.4"],"where":["17.4"],"give":["17.4"],"everything":["17.6"],"order":["18.3"],"all":["18.3"],"wait":["18.4"],"gather":["18.5"],"external":["18.6"],"antennas":["18.6","19.3"],"shield":["18.6"],"antenna":["18.6"],"antistatic":["18.6"],"bag":["18.6"],"some":["18.6","18.21","24.2"],"cam":["18.6","19.2"],"issues":["18.6"],"signal":["18.6"],"integrity":["18.6"],"help":["18.6"],"solve":["18.6"],"option":["18.6"],"attach":["18.7"],"cameras":["18.7","24.3"],"esps":["18.7","24.3"],"look":["18.7"],"locate":["18.7"],"ribbon":["18.7"],"cable":["18.7"],"connector":["18.7"],"wires":["18.11","18.12"],"usb":["18.11"],"type":["18.11"],"board":["18.11"],"cut":["18.12"],"optimal":["18.12"],"length":["18.12"],"take":["18.12"],"twist":["18.13"],"positive":["18.13"],"negative":["18.15"],"wire":["18.15"],"repeat":["18.15"],"v3":["18.18","18.19","18.20"],"per":["18.18"],"eye":["18.18","20.0","24.3","24.4"],"tin":["18.18","18.19"],"pay":["18.20"],"attention":["18.20"],"3d":["18.21","19.6"],"print":["18.21"],"head":["18.21"],"printed":["18.21","19.6"],"parts":["18.21","19.5"],"list":["18.21","19.1"],"which":["18.21"],"headset":["18.21"],"them":["18.21","19.6","24.3"],"work":["18.21"],"better":["18.21"],"worse":["18.21"],"mounting":["18.22"],"again":["18.22"],"differs":["18.22"],"alerts":["19.0"],"part":["19.1"],"setup":["19.2","22.0"],"2x":["19.2"],"modules":["19.2","23.5"],"aliexpress":["19.2"],"ov2640":["19.2"],"fov":["19.2"],"optional":["19.3"],"kit":["19.4"],"multiple":["19.4"],"places":["19.4"],"save":["19.4"],"money":["19.4"],"assembly":["19.4"],"buy":["19.4"],"me":["19.4"],"pre":["19.4"],"soldered":["19.4"],"raw":["19.4"],"1x":["19.5"],"next":["19.6"],"respected":["19.6"],"hmd":["19.6"],"based":["19.6"],"home":["20.0"],"hero":["20.0"],"opensource":["20.0"],"tracking":["20.0"],"logo":["20.0"],"light":["20.0"],"png":["20.0"],"alt":["20.0"],"avatar":["22.0"],"video":["22.0"],"created":["22.0"],"show":["23.1"],"checklist":["23.2"],"python":["23.3","23.5"],"poetry":["23.4"],"since":["23.4"],"version":["23.4"],"app":["23.6","24.0","24.1","24.2"],"step":["24.0"],"installer":["24.0"],"go":["24.0","24.2"],"latest":["24.0"],"github":["24.0"],"run":["24.1"],"getting":["24.2"],"familiar":["24.2"],"terminology":["24.2"],"let":["24.2"],"starting":["24.2"],"configuring":["24.3"],"right":["24.3"],"done":["24.3"],"opening":["24.3"],"both":["24.3"],"calibrating":["24.4"],"trackable":["24.4"],"anything":["24.5"]},{"1":["13.1","13.2","14.2"],"2":["1.1","4.2","7.2","13.1","13.2"],"4":["1.1","7.2","18.17"],"10":["4.1"],"12":["18.15"],"13":["18.17"],"18":["18.17"],"22":["4.1"],"30":["4.1"],"100":["16.1"],"300":["22.0"],"500":["22.0"],"an":["0.0","10.1","18.21"],"international":["0.0"],"some":["0.0","18.22"],"whom":["0.0"],"have":["0.0","1.2","14.4","18.2","18.8","18.21","19.2","23.4"],"chosen":["0.0"],"to":["0.0","1.2","4.2","5.0","5.2","8.3","11.1","12.3","17.1","17.3","18.4","18.9","18.14","23.4","23.6","24.4"],"be":["0.0","6.1","14.0","18.18","23.6"],"featured":["0.0"],"below":["0.0","14.3","18.7"],"br":["0.0","2.0"],"developers":["0.0"],"are":["0.0","6.0","11.2","15.1","18.17","18.22","19.4"],"a":["0.0","1.2","13.1","15.4","17.4","18.6","18.12","18.15","18.21"],"group":["0.0"],"people":["0.0","19.6"],"who":["0.0"],"passionate":["0.0"],"font":["1.0","7.0","8.0","10.0","11.0","16.0","17.0","18.0","21.0","23.0"],"things":["1.1","18.2","18.4","18.17"],"gather":["1.1","18.17"],"pcbs":["1.1"],"leds":["1.1","18.17","18.20","18.22"],"and":["1.1","8.2","9.1","10.3","12.3","15.4","18.9","18.12","18.13","18.17","24.4"],"700ohm":["1.1"],"resistors":["1.1"],"imagecard":["1.1","1.2","1.4","13.1","18.7","18.17","18.19"],"options":["1.1","1.2","1.4","3.1","3.3","13.1","18.7","18.17","18.19","19.0","19.1","23.2"],"image":["1.1","1.2","1.4","13.1","18.7","18.17","18.19"],"settings":["1.1","1.2","1.4","13.1","18.7","18.17","18.19"],"fox":["1.1","1.4"],"build":["1.1","1.3","1.4","23.1"],"instructions":["1.1","1.3","1.4"],"one":["1.1","7.2","13.1","18.21","19.0"],"here":["1.1","18.17","19.4","24.0"],"resistor":["1.2","18.18"],"per":["1.2"],"eye":["1.2","15.0","24.2"],"nine":["1.3"],"tin":["1.3"],"the":["1.3","4.0","6.0","7.1","8.1","8.3","9.0","10.3","11.1","12.1","13.0","14.2","14.6","16.1","17.2","17.7","18.2","18.10","18.11","18.18","18.22","19.4","23.1"],"pads":["1.3","18.18","18.19"],"thirteen":["1.4"],"contact":["2.0","11.2"],"us":["2.0","11.2"],"please":["2.0","11.2","12.3","15.4"],"join":["2.0"],"our":["2.0","4.2","6.1","15.4","18.3","18.10"],"discord":["2.0"],"for":["2.0","7.2","8.1","8.2","8.3","10.3","14.5","15.0","18.22","19.4","20.0"],"accent":["3.0","12.0"],"this":["3.0","5.1","7.2","10.1","10.2","11.2","12.0","14.3","14.5","18.6","18.11","18.18"],"checkboxlist":["3.2"],"eyetrackvr":["4.0","5.1","19.1","23.4"],"docs":["4.0"],"yarn":["4.1"],"v1":["4.1"],"git":["4.1","6.1","12.3"],"v2":["4.1"],"then":["4.2","11.2","14.3","24.0","24.3"],"move":["4.2"],"on":["4.2","7.3","8.2","13.2","14.4","14.5","18.3","18.20","19.6"],"specific":["4.2","8.1"],"will":["5.0","8.3","11.2","18.1","18.6","18.11","19.2","24.0"],"cover":["5.0"],"how":["5.0","17.1"],"add":["5.0","17.5"],"or":["5.0","16.1"],"dev":["5.1"],"sub":["5.1"],"directories":["5.1"],"can":["5.1","14.4","16.1","17.5"],"also":["5.1","11.2"],"edit":["5.2","18.21"],"that":["6.0","8.3","10.4","11.2","19.2","24.3"],"all":["6.1","10.2","18.5","18.21"],"should":["6.1","18.18"],"written":["6.1","11.2"],"in":["6.1","10.2","11.2","13.1","14.1","15.1","18.18","18.22"],"english":["6.1"],"way":["6.1","11.1","17.3"],"commit":["6.1"],"style":["6.1"],"opened":["7.1"],"project":["7.1","23.5"],"defaults":["7.2"],"note":["7.2","8.3","18.18","19.2"],"enabling":["7.2"],"both":["7.2","24.2"],"esps":["7.2","14.4"],"different":["7.2"],"values":["7.2"],"best":["7.2","18.6","19.6"],"only":["7.2","14.4","24.2"],"esp":["7.2","11.1","14.5","18.14"],"other":["7.2","19.6"],"sta":["7.2"],"connect":["7.2"],"computer":["7.2"],"allow":["7.2","18.7"],"alerts":["7.2","19.1"],"parts":["7.2","18.3","19.0","19.1","19.4"],"list":["7.2","15.4","19.0"],"template":["7.2","19.1"],"v":["7.2","19.1"],"slot":["7.2","19.1"],"content":["7.2"],"p":["7.2"],"make":["7.2","10.4","18.6","18.21"],"sure":["7.2","10.4","18.21"],"router":["7.2"],"has":["7.2","14.3"],"ghz":["7.2"],"band":["7.2"],"while":["7.2"],"most":["7.2","19.6"],"do":["7.2","10.1","10.2","12.3","15.1","16.1"],"store":["8.1"],"custom":["8.1"],"config":["8.1","10.2","11.2"],"device":["8.1","10.2"],"getting":["8.2","20.0"],"everything":["8.2"],"setup":["8.2","19.1"],"first":["8.2","14.4"],"time":["8.2"],"see":["8.2"],"what":["8.2","15.1","19.6"],"is":["8.2","8.3","9.0","12.2","14.5","17.4","17.6","19.4","23.3"],"going":["8.2"],"environment":["8.2","8.3","14.4"],"default":["8.2","8.3"],"so":["8.2"],"you":["8.2","10.2","13.0","14.4","15.1","17.3","17.5","17.6","18.8","18.21","19.2","19.3","19.6","24.0"],"don":["8.2","15.1"],"t":["8.2","15.1"],"important":["8.3","24.4"],"esp32aithinker":["8.3"],"work":["8.3","18.11"],"vast":["8.3"],"second":["9.0"],"part":["9.0","18.7","24.4"],"where":["9.1"],"current":["9.1"],"testing":["9.1"],"download":["9.2","12.1"],"using":["10.1","23.4"],"name":["10.1","10.2"],"instead":["10.1"],"of":["10.1","10.2","14.1","15.4","18.5","18.12","18.20"],"ip":["10.1"],"address":["10.1"],"useful":["10.1"],"if":["10.1","12.3","15.1","18.6","18.20","18.21","19.6","24.1"],"not":["10.1","11.2","12.3","18.6","18.11","19.6"],"need":["10.2","14.4","17.3"],"set":["10.2"],"file":["10.2","24.0"],"setting":["10.2"],"mdns":["10.3"],"protocol":["10.3","20.0"],"windows":["10.3"],"communicate":["11.1"],"with":["11.1","18.15","24.3"],"devices":["11.1"],"marked":["11.2"],"currently":["11.2","14.4","23.3"],"implemented":["11.2"],"future":["11.2"],"would":["11.2"],"like":["11.2","14.5"],"help":["11.2"],"implement":["11.2"],"these":["11.2","14.6"],"open":["11.2","13.1","24.3"],"suggestions":["11.2"],"new":["11.2"],"makes":["11.2"],"changes":["11.2"],"require":["11.2"],"call":["11.2"],"save":["11.2","24.3"],"write":["11.2"],"flash":["11.2","18.8","18.10"],"prevent":["11.2"],"from":["11.2","12.3","18.6","18.11","23.1"],"being":["11.2"],"too":["11.2","18.18"],"often":["11.2"],"which":["11.2","16.1"],"cause":["11.2"],"wear":["11.2"],"out":["11.2","15.2"],"restart":["11.2","14.5","24.4"],"itself":["11.2","14.5"],"after":["11.2","23.5"],"procedure":["12.0"],"code":["12.1","12.2","18.9"],"latest":["12.1","12.3"],"visual":["12.2"],"studio":["12.2"],"installed":["12.2","12.3"],"go":["12.3"],"https":["12.3","22.0"],"github":["12.3"],"com":["12.3"],"lorow":["12.3"],"openiris":["12.3"],"version":["12.3"],"main":["12.3"],"branch":["12.3"],"install":["12.3"],"it":["12.3","14.1","17.6","18.6","18.8","18.18","24.3","24.4"],"uploading":["13.0"],"firmware":["13.0","14.0","14.2","18.10"],"may":["13.0","16.1"],"run":["13.0","24.0"],"into":["13.0","13.1","24.3"],"typing":["13.1"],"command":["13.1"],"terminal":["13.1"],"pio":["13.1"],"upgrade":["13.1"],"prompt":["13.1"],"via":["13.2","15.0","20.0"],"vsc":["13.2"],"follow":["13.2"],"guide":["13.2","18.10"],"above":["13.2","19.6"],"up":["13.2","18.7","18.12","18.16"],"until":["13.2"],"clicking":["13.2"],"quick":["13.2"],"access":["13.2"],"section":["13.2","14.3"],"your":["14.0","17.1","18.5","18.6","18.12"],"must":["14.0"],"initially":["14.0"],"cam":["14.1"],"case":["14.1"],"mb":["14.1"],"board":["14.1"],"s":["14.1","24.3"],"press":["14.2","14.3","14.5","24.3","24.4"],"network":["14.3"],"skip":["14.3"],"once":["14.3","14.4"],"been":["14.3","15.4","23.4"],"built":["14.3"],"button":["14.3","14.5","24.4"],"sends":["14.3"],"working":["14.4"],"mnually":["14.4"],"flashed":["14.4"],"at":["14.4","15.4","16.1"],"least":["14.4"],"upate":["14.4"],"tip":["14.4"],"coming":["14.4"],"soon":["14.4"],"we":["14.4","15.1","23.4"],"support":["14.4"],"now":["14.5","17.3"],"watch":["14.5"],"output":["14.5"],"two":["14.5","19.1"],"text":["14.5"],"highlighted":["14.5"],"green":["14.5","18.20"],"demonstration":["14.5"],"following":["14.6"],"steps":["14.6"],"check":["14.6","15.2"],"faq":["14.6"],"tracker":["15.0"],"platform":["15.0"],"social":["15.0","20.0"],"games":["15.0","20.0"],"osc":["15.0","20.0"],"udp":["15.0","20.0"],"unless":["15.1"],"know":["15.1"],"exactly":["15.1"],"doing":["15.1"],"as":["15.1","18.7","18.15","24.0"],"could":["15.1"],"result":["15.1","18.6"],"harm":["15.1"],"doubt":["15.1"],"yourself":["15.1","18.21","19.4"],"just":["15.1"],"made":["15.4","18.21"],"yet":["15.4"],"take":["15.4"],"look":["15.4","24.4"],"3d":["15.4"],"printable":["15.4"],"bugs":["16.1"],"occur":["16.1"],"hinder":["16.1"],"experience":["16.1"],"useability":["16.1"],"times":["16.1"],"expect":["16.1"],"reliable":["16.1"],"create":["17.1","24.1"],"own":["17.1","19.6"],"camera":["17.1","24.3"],"mount":["17.1","17.7","18.21"],"headsets":["17.2","19.6"],"lens":["17.2"],"easiest":["17.2"],"get":["17.2","20.0"],"started":["17.2","20.0"],"good":["17.4"],"angle":["17.4"],"ideal":["17.4"],"location":["17.4"],"either":["17.5","18.17"],"unlikely":["17.6"],"listed":["17.7","18.3","19.6"],"send":["17.7"],"me":["17.7"],"read":["18.2"],"arrive":["18.4"],"long":["18.4"],"solution":["18.6"],"when":["18.6"],"comes":["18.6"],"final":["18.6"],"vive":["18.6","19.3"],"tundra":["18.6"],"trackers":["18.6"],"required":["18.6"],"interference":["18.6"],"stream":["18.6"],"unusable":["18.6"],"does":["18.6"],"circled":["18.7"],"socket":["18.7"],"flip":["18.7"],"gray":["18.7"],"why":["18.8"],"before":["18.8"],"prepare":["18.9"],"building":["18.10"],"powering":["18.11"],"programmer":["18.11"],"correctly":["18.11"],"delivers":["18.11"],"piece":["18.12"],"wire":["18.12","18.13","18.14","18.16"],"marker":["18.12"],"mock":["18.12"],"usb":["18.13"],"ir":["18.13"],"positive":["18.14"],"but":["18.15"],"wires":["18.15"],"info":["18.15"],"350ohm":["18.17"],"three":["18.17"],"example":["18.18"],"i":["18.18"],"use":["18.18"],"much":["18.18"],"enough":["18.18"],"led":["18.19"],"direction":["18.20"],"test":["18.21"],"there":["18.21","18.22"],"multiple":["18.21"],"each":["18.21"],"kind":["18.21"],"none":["18.21"],"try":["18.21"],"making":["18.21"],"skills":["18.21"],"ping":["18.21"],"cases":["18.22"],"designated":["18.22"],"spots":["18.22"],"night":["19.2"],"vers":["19.2"],"75mm":["19.2"],"850nm":["19.2"],"amazon":["19.2"],"alternative":["19.2","19.4"],"re":["19.3"],"running":["19.3"],"full":["19.3"],"body":["19.3"],"component":["19.4"],"alternatively":["19.4"],"4x":["19.4"],"unfocused":["19.4"],"smd":["19.4"],"recomended":["19.4"],"lcsc":["19.4"],"digikey":["19.4"],"difference":["19.4"],"between":["19.4"],"them":["19.4"],"ones":["19.4"],"rated":["19.4"],"hot":["19.5"],"glue":["19.5"],"user":["19.6"],"feedback":["19.6"],"works":["19.6"],"partslist":["19.6"],"another":["19.6"],"headset":["19.6"],"etrvr":["20.0"],"tagline":["20.0"],"actions":["20.0"],"theme":["20.0"],"brand":["20.0"],"link":["20.0"],"contributor":["22.0"],"div":["22.0"],"align":["22.0"],"center":["22.0"],"iframe":["22.0"],"width":["22.0"],"height":["22.0"],"src":["22.0"],"www":["22.0"],"app":["23.1","24.3"],"source":["23.1"],"cloning":["23.5"],"ready":["23.6"],"release":["24.0"],"zip":["24.0"],"extract":["24.0"],"exe":["24.0"],"administrator":["24.0"],"desktop":["24.1"],"shortcut":["24.1"],"option":["24.1"],"top":["24.2"],"right":["24.2"],"shows":["24.2"],"feed":["24.2"],"left":["24.2"],"holding":["24.3"],"finger":["24.3"],"over":["24.3"],"copy":["24.3"],"close":["24.3"],"tab":["24.3"],"enter":["24.3"],"field":["24.3"],"calibrate":["24.4"],"calibration":["24.4"],"around":["24.4"],"outdated":["24.5"]},{"1":["4.1"],"2":["4.1","12.3","18.21"],"3":["13.1","13.2"],"4":["13.1"],"13":["18.18"],"56":["4.1"],"about":["0.0"],"field":["0.0"],"augmented":["0.0"],"and":["0.0","2.0","12.1","12.2","13.1","13.2","18.6","18.11","18.18","18.19","23.5"],"virtual":["0.0"],"reality":["0.0"],"vpteammembers":["0.0"],"size":["0.0"],"medium":["0.0"],"members":["0.0"],"vpteampagesection":["0.0"],"contributors":["0.0"],"those":["0.0"],"accent":["1.0","7.0","8.0","10.0","11.0","16.0","17.0","18.0","21.0","23.0"],"are":["1.1","6.1","8.2","10.3","14.4","16.1","18.11"],"the":["1.1","1.2","5.0","10.1","15.0","15.4","17.3","18.9","18.16","18.17","19.1","19.2","23.4"],"pin":["1.1","18.17"],"labels":["1.1","18.17"],"two":["1.1"],"fox":["1.2"],"ir":["1.2"],"build":["1.2","23.4"],"instructions":["1.2"],"four":["1.2","12.3","18.17","19.4","24.3"],"tin":["1.2","18.13"],"pads":["1.2","18.6"],"ten":["1.3"],"place":["1.3","15.1"],"resistor":["1.3","18.6"],"pcb":["1.4","18.17"],"that":["1.4","7.2","12.3","15.1","17.1","17.4","18.6","19.6","24.0","24.4"],"receives":["1.4"],"5v":["1.4"],"power":["1.4","11.2","19.4"],"is":["1.4","4.0","5.1","10.4","13.0","15.4","17.2","18.20","19.1","24.2"],"one":["1.4","11.2","14.3","18.19","24.0"],"with":["1.4","19.3","23.6","24.0"],"updates":["2.0","7.2"],"any":["2.0","15.1","17.1"],"questions":["2.0"],"iframe":["2.0"],"will":["3.0","5.2","12.0","13.2","15.0","17.6"],"contain":["3.0","18.1"],"a":["3.0","17.6","18.1","18.18","23.5","23.6","24.0"],"options":["3.2","12.3","13.2","14.3","18.18","18.22","19.4","23.1","24.0","24.3"],"site":["4.0"],"this":["4.0","8.1","9.2","11.1","14.4","15.1","24.0","24.2","24.5"],"vscode":["4.1","12.3"],"below":["4.2","18.6"],"standards":["4.2"],"all":["4.2","8.2","11.2","16.1","24.4"],"should":["4.2","7.1","19.4","24.1","24.3"],"be":["4.2","17.7","18.6","18.7","19.4","24.0"],"written":["4.2"],"in":["4.2","8.2","18.6","18.11","18.15","18.20","19.4","19.6","23.6"],"markdown":["4.2"],"edit":["5.0"],"pages":["5.0"],"on":["5.0","7.2","9.1","15.4","20.0","24.5"],"docs":["5.0"],"website":["5.0","15.0"],"useful":["5.1","8.1","11.1"],"organizing":["5.1"],"into":["5.1","14.1","14.5","18.7"],"categories":["5.1"],"sidebar":["5.1"],"custom":["5.1"],"theme":["5.1"],"index":["5.1"],"js":["5.1"],"do":["5.1","8.3","18.7"],"you":["5.2","8.1","8.3","10.3","15.0","18.2","18.15","24.1","24.3","24.4"],"used":["6.0"],"for":["6.0","13.1","14.3","17.1","17.2","17.5"],"followed":["6.1"],"conventional":["6.1"],"commits":["6.1"],"standard":["6.1"],"see":["7.1","15.4","24.1","24.3"],"always":["7.2"],"case":["7.2","18.6"],"setting":["7.2"],"each":["7.2"],"5ghz":["7.2"],"4ghz":["7.2"],"ssids":["7.2"],"though":["7.2","13.0"],"required":["7.2"],"double":["7.2"],"check":["7.2","18.9"],"correctly":["7.2"],"entered":["7.2"],"credentials":["7.2"],"said":["7.2"],"network":["7.2","11.2"],"additonal":["7.2"],"configuration":["7.2"],"mdns":["7.2","11.2"],"wish":["7.2"],"manually":["7.2","18.10","19.2"],"keep":["7.2","10.1","14.5"],"track":["7.2"],"ip":["7.2","24.2"],"addresses":["7.2"],"ports":["7.2"],"enable":["7.2"],"feature":["7.2"],"following":["7.2"],"format":["7.2"],"http":["7.2","11.1"],"some":["7.2"],"local":["7.2","10.2"],"work":["7.2"],"connected":["7.2","18.6","18.7"],"same":["7.2"],"enabled":["7.2"],"windows":["7.2"],"by":["7.2","24.0"],"guide":["7.2","24.0","24.3"],"ota":["7.2","8.2","11.2"],"means":["7.2","15.1","19.4","19.6"],"to":["7.3","9.0","15.0","17.5","17.7","18.2","19.1","19.2","22.0"],"if":["8.1","10.3","11.1","15.4"],"want":["8.1","10.1","12.3"],"have":["8.1","8.3","14.5","16.1","17.1","17.3","19.6","24.4"],"multiple":["8.1"],"devices":["8.1"],"need":["8.2","18.6"],"specify":["8.2"],"it":["8.2","12.2","15.4","18.7","18.12","19.1","24.2"],"when":["8.2","17.4"],"building":["8.2"],"environments":["8.2"],"board":["8.2","14.3"],"only":["8.2","10.3","14.5"],"release":["8.2"],"specified":["8.2"],"name":["8.2","10.4"],"tip":["8.2"],"majority":["8.3"],"of":["8.3","9.0","10.4","15.1","17.4","18.3","18.6","19.4","24.2"],"users":["8.3"],"not":["8.3","17.1","18.7"],"switch":["8.3"],"your":["8.3","15.4","22.0","24.2"],"unless":["8.3"],"know":["8.3","10.1","18.2"],"what":["8.3"],"doing":["8.3"],"tested":["8.3","16.1"],"equation":["9.0"],"has":["9.1","11.2","16.1","18.10","18.15"],"been":["9.1","16.1"],"our":["9.1","15.2","16.1","18.15"],"or":["10.1","11.2","15.1","18.7","19.3","19.5","19.6"],"located":["10.2"],"under":["10.2"],"wifi":["10.2","11.2","14.4"],"section":["10.2"],"ini":["10.2"],"user":["10.2","16.1","18.15"],"mdnsname":["10.2"],"openiristracker":["10.2"],"add":["10.2","18.21","22.0"],"mac":["10.3"],"using":["10.3","11.1","14.4","23.3"],"correct":["10.4","13.0"],"requests":["11.1"],"method":["11.2"],"description":["11.2"],"ping":["11.2"],"returns":["11.2"],"status":["11.2"],"writes":["11.2"],"restartdevice":["11.2"],"restarts":["11.2"],"restartcamera":["11.2"],"camera":["11.2","14.5","24.2"],"resetconfig":["11.2"],"clears":["11.2"],"current":["11.2"],"memory":["11.2"],"ram":["11.2"],"getstoredconfig":["11.2"],"json":["11.2"],"object":["11.2"],"settxpower":["11.2"],"post":["11.2"],"sets":["11.2"],"transmission":["11.2"],"esps":["11.2"],"setdevice":["11.2"],"settings":["11.2","12.3","13.2","18.18","18.22","24.0","24.3"],"setcamera":["11.2"],"adds":["11.2"],"over":["11.2","14.0"],"an":["11.2","24.1","24.3"],"existing":["11.2"],"delete":["11.2"],"deletes":["11.2"],"show":["12.0"],"open":["12.2","13.2","18.7","20.0","23.5","23.6"],"here":["12.3","15.0"],"bash":["12.3"],"imagecard":["12.3","13.2","18.18","18.22","24.0","24.3"],"image":["12.3","13.2","18.6","18.18","18.22","24.0","24.3"],"setup":["12.3"],"change":["12.3","14.4"],"directory":["12.3"],"bizarre":["13.0"],"even":["13.0"],"code":["13.0","13.1","14.4"],"platformio":["13.0","13.2","14.4"],"type":["13.1"],"press":["13.1"],"enter":["13.1","24.2"],"wait":["13.1"],"finish":["13.1"],"done":["13.1","14.0"],"visual":["13.1","14.4"],"studio":["13.1","14.4"],"instead":["13.2"],"pio":["13.2"],"home":["13.2"],"select":["13.2"],"cable":["14.0"],"once":["14.0"],"as":["14.1","19.4"],"simple":["14.1","18.8"],"sticking":["14.1"],"socket":["14.1"],"way":["14.1","24.4"],"came":["14.1"],"package":["14.1"],"button":["14.2","24.3"],"at":["14.2","18.12"],"esp":["14.3"],"img":["14.3"],"alerts":["14.3","19.4","23.1"],"template":["14.3","19.0"],"v":["14.3","19.0"],"slot":["14.3","19.0"],"content":["14.3","19.0","19.1"],"p":["14.3","19.0","19.1"],"mb":["14.3","19.2"],"does":["14.3"],"resetting":["14.3"],"re":["14.3"],"new":["14.4"],"app":["14.4","23.4"],"where":["14.4","24.2"],"upload":["14.4"],"straight":["14.4"],"from":["14.4","18.4","19.1"],"stream":["14.5"],"take":["14.5","18.3"],"note":["14.5","18.3"],"input":["14.5"],"software":["14.5","23.1"],"mind":["14.5"],"while":["14.5"],"testing":["14.5"],"getting":["14.5","18.21"],"set":["14.5","24.3"],"up":["14.5","18.21","19.6","24.4"],"can":["14.5","18.15","18.21","24.2"],"client":["14.5"],"use":["14.5"],"don":["14.6","24.3"],"t":["14.6","24.3"],"find":["14.6","15.0"],"protocol":["15.0"],"welcome":["15.0"],"eyetrackvr":["15.0"],"documentation":["15.0"],"dont":["15.1"],"differnt":["15.1"],"etc":["15.1","24.4"],"danger":["15.1"],"important":["15.1"],"ins":["15.1"],"bypass":["15.1"],"features":["15.1","16.1","20.0"],"put":["15.1"],"parts":["15.2","17.5"],"called":["15.3"],"openiris":["15.3"],"listed":["15.4"],"perfect":["16.1","17.6"],"function":["16.1"],"fully":["16.1"],"developed":["16.1"],"yet":["16.1","19.6"],"firmware":["16.1","18.9"],"difficulties":["16.1"],"headset":["17.1","17.2"],"may":["17.1"],"protector":["17.2"],"attach":["17.3"],"we":["17.3","24.3"],"gives":["17.4"],"view":["17.4","20.0"],"pupil":["17.4"],"looking":["17.4"],"get":["17.6"],"added":["17.7"],"before":["18.2"],"list":["18.3","19.4"],"please":["18.3"],"shipping":["18.4"],"times":["18.4"],"china":["18.4"],"hardware":["18.5"],"make":["18.5","18.8","18.12"],"sure":["18.5","18.8"],"unfortunately":["18.6"],"removing":["18.6"],"super":["18.6"],"easy":["18.6"],"either":["18.6"],"move":["18.6"],"remove":["18.6","19.2"],"bridge":["18.6"],"solder":["18.6"],"attached":["18.6"],"shows":["18.6"],"orientation":["18.6"],"force":["18.7"],"shove":["18.7"],"objects":["18.7"],"fingernails":["18.7"],"assembled":["18.8"],"s":["18.8"],"flash":["18.9"],"uploading":["18.10"],"lower":["18.11","19.4"],"voltage":["18.11"],"which":["18.11","19.4"],"results":["18.11"],"dim":["18.11"],"leds":["18.11"],"video":["18.11"],"artifacts":["18.11"],"these":["18.11"],"highly":["18.11"],"route":["18.12"],"mark":["18.12"],"then":["18.12"],"another":["18.12","19.5"],"led":["18.13"],"wires":["18.13"],"together":["18.13"],"lay":["18.14"],"discord":["18.15"],"learned":["18.15"],"short":["18.15","19.4"],"2nd":["18.16"],"lightly":["18.18"],"cover":["18.18"],"pad":["18.18"],"six":["18.18"],"next":["18.18"],"grab":["18.18"],"hold":["18.18","18.19"],"end":["18.19","18.22"],"orientate":["18.19"],"dot":["18.20"],"facing":["18.20"],"inwards":["18.20"],"toward":["18.20"],"text":["18.20"],"like":["18.20","24.0"],"me":["18.21"],"prohurtz":["18.21"],"0001":["18.21"],"so":["18.21"],"i":["18.21"],"having":["18.21","19.3"],"trouble":["18.21"],"fit":["18.21"],"resizing":["18.21"],"down":["18.21"],"little":["18.21"],"ensure":["18.21"],"good":["18.21"],"different":["18.21"],"types":["18.21"],"go":["18.22"],"fifteen":["18.22"],"others":["18.22"],"recommended":["19.1","19.4"],"source":["19.1","20.0"],"main":["19.1"],"filter":["19.2"],"1x":["19.2"],"programmer":["19.2"],"tracking":["19.3","22.0","24.3"],"issues":["19.3"],"streaming":["19.3"],"event":["19.4"],"mishap":["19.4"],"they":["19.4"],"safer":["19.4"],"well":["19.4"],"being":["19.4"],"smaller":["19.4"],"footprint":["19.4"],"hence":["19.4"],"why":["19.4"],"form":["19.5"],"there":["19.6"],"no":["19.6"],"designed":["19.6"],"basic":["19.6"],"skills":["19.6"],"modeling":["19.6"],"think":["19.6"],"intro":["20.0"],"github":["20.0"],"https":["20.0"],"com":["20.0","22.0"],"redhawk989":["20.0"],"icon":["20.0"],"️":["20.0"],"title":["20.0","22.0"],"youtube":["22.0"],"embed":["22.0"],"dfm":["22.0"],"tkaruq0":["22.0"],"eye":["22.0"],"support":["22.0"],"vrchat":["22.0"],"manage":["23.4"],"dependencies":["23.4"],"installing":["23.5"],"poetry":["23.5"],"command":["23.6"],"prompt":["23.6"],"greeted":["24.0"],"window":["24.0"],"looks":["24.0"],"eyetrack":["24.0","24.3"],"vr":["24.0","24.3"],"default":["24.0"],"was":["24.1"],"checked":["24.1"],"eyes":["24.2"],"address":["24.2"],"alternatively":["24.2"],"restart":["24.3"],"feed":["24.3"],"because":["24.3"],"haven":["24.3"],"roi":["24.3"],"now":["24.3"],"cropping":["24.3"],"mode":["24.3"],"extremes":["24.4"],"left":["24.4"]},{"0":["18.6"],"1":["18.21","22.0"],"3":["18.12","19.2","23.3"],"5":["18.17"],"11":["23.3"],"actively":["0.0"],"contributed":["0.0"],"community":["0.0","15.4","17.1","20.0"],"support":["0.0"],"small":["0.0"],"philosophy":["0.0"],"three":["1.1"],"if":["1.1","14.4","16.1","18.17"],"you":["1.1","11.1","14.0","14.5","15.4","17.1","17.7","18.5","18.12","18.17","18.22","20.0","23.4"],"have":["1.1","14.0","18.5","18.17","18.22"],"different":["1.1","8.1","18.11","18.12","18.17"],"please":["1.1","5.0","18.7","18.17","19.0","19.6"],"consult":["1.1","18.17"],"their":["1.1","18.17"],"datasheet":["1.1","18.17"],"some":["1.1","8.2","14.1","18.17"],"terminology":["1.1","18.17"],"related":["1.1","15.0","18.17"],"them":["1.1","18.13","18.17"],"5v":["1.1","18.17"],"five":["1.2","12.3","18.17","18.20","19.4","24.3"],"hold":["1.2"],"in":["1.2","1.3","13.2","18.7","18.17","18.19","18.21","23.5"],"correct":["1.3"],"orientation":["1.3"],"resistor":["1.4"],"second":["1.4"],"which":["1.4","18.6"],"gets":["1.4"],"its":["1.4"],"from":["1.4","8.3","10.3","11.1","14.3"],"ground":["1.4","18.15"],"id":["2.0"],"widget":["2.0"],"src":["2.0"],"https":["2.0","4.1"],"com":["2.0"],"list":["3.0","6.1","15.2"],"of":["3.0","6.1","14.2","14.4","18.11","18.14","19.5","24.3"],"inprogress":["3.2"],"installation":["4.1"],"clone":["4.1"],"the":["4.1","13.1","14.0","15.1","17.5","17.6"],"repo":["4.1"],"sh":["4.1"],"or":["4.2","15.4","17.2","24.2"],"vue":["4.2"],"components":["4.2"],"file":["4.2","24.2"],"names":["4.2"],"are":["4.2","10.1","18.4","18.7"],"snake":["4.2"],"case":["4.2"],"use":["5.0","7.2","8.1","18.20","20.0","24.3"],"github":["5.0"],"markdown":["5.0"],"flavour":["5.0"],"object":["5.1"],"want":["5.1","10.2","11.1"],"following":["5.1","6.1"],"text":["5.1"],"getting":["5.1"],"started":["5.1"],"collapsible":["5.1"],"true":["5.1"],"items":["5.1"],"introduction":["5.1"],"link":["5.1"],"intro":["5.1"],"things":["5.1"],"know":["5.1","19.6"],"before":["5.1"],"start":["5.1","18.2"],"need":["5.2","14.5","18.12"],"eyetrackvr":["6.0"],"project":["6.0","6.1"],"these":["6.0"],"used":["6.1","24.2"],"with":["6.1","8.1","8.2","14.1"],"semantic":["6.1"],"release":["6.1"],"tool":["6.1"],"automatically":["6.1"],"generate":["6.1"],"changelog":["6.1"],"versioning":["6.1"],"as":["6.1","19.1"],"such":["6.1"],"important":["6.1"],"follow":["6.1","9.2","14.3","14.5"],"own":["6.1","9.1"],"rule":["6.1"],"customizations":["6.1"],"made":["6.1"],"something":["7.1","24.3"],"on":["7.1","13.1","15.1","17.6","18.6","18.9","18.10","18.14","24.0","24.1","24.3"],"update":["7.2","14.5"],"without":["7.2","18.15","19.2"],"having":["7.2"],"enableota":["7.2"],"otapassword":["7.2"],"nothing":["7.2"],"however":["7.2","10.2"],"anyone":["7.2"],"be":["7.2","8.2","12.3","18.21","24.2"],"able":["7.2"],"also":["7.2","8.2","10.1","13.1"],"otaserverip":["7.2"],"address":["7.2"],"uploading":["7.3"],"configs":["8.1"],"we":["8.1"],"environments":["8.1"],"recommend":["8.2"],"starting":["8.2"],"then":["8.2","14.1","19.6"],"switching":["8.2"],"once":["8.2","18.13"],"working":["8.2"],"less":["8.2"],"debugging":["8.2"],"may":["8.2"],"missing":["8.2"],"first":["8.3","17.6","23.4"],"verified":["8.3"],"does":["8.3"],"most":["8.3"],"esp32cams":["8.3"],"aliexpress":["8.3","19.1","19.3"],"get":["9.0","14.3","18.11"],"your":["9.0","14.6","24.0","24.1"],"trackers":["9.0"],"going":["9.0"],"solution":["9.1","19.6"],"called":["9.1"],"openiris":["9.1"],"track":["10.1"],"change":["10.2","24.0"],"whatever":["10.2"],"warning":["10.2"],"since":["10.2"],"can":["10.3","17.7"],"download":["10.3"],"here":["10.3","17.7"],"control":["11.1"],"device":["11.1"],"uses":["11.2","18.21"],"add":["11.2","18.13","18.18"],"params":["11.2"],"danger":["11.2"],"feature":["11.2"],"bug":["11.2"],"given":["11.2"],"url":["11.2"],"required":["11.2"],"even":["11.2"],"changing":["11.2"],"do":["11.2","17.4","18.10"],"supply":["11.2"],"set":["11.2"],"default":["11.2"],"passed":["11.2"],"query":["11.2"],"string":["11.2"],"format":["11.2"],"how":["12.0","18.10","18.21"],"to":["12.0","13.0","14.6","15.4","17.4","18.10","20.0","24.2"],"prepare":["12.0"],"it":["12.1","14.5","18.19","24.0"],"br":["12.1","21.0"],"imagecard":["12.1","18.6","18.20","18.21"],"for":["12.2","13.2","15.4","18.6","19.2","19.3","24.2","24.4"],"vscode":["12.2"],"an":["12.2","14.3","15.1"],"extension":["12.2"],"that":["12.2","13.1","14.3","15.4","17.3","18.3","19.0"],"cloned":["12.3"],"ex":["12.3"],"cd":["12.3"],"c":["12.3","24.0"],"repository":["12.3"],"by":["12.3","20.0"],"entering":["12.3"],"command":["12.3","23.5"],"will":["13.0","18.2","18.12","18.21","18.22","19.4"],"refuse":["13.0"],"build":["13.0"],"instead":["13.0"],"using":["13.1"],"tab":["13.1","14.5"],"vsc":["13.1"],"click":["13.1","13.2","24.1"],"little":["13.1"],"a":["13.2","14.1","18.7","24.2"],"window":["13.2"],"dashboard":["13.2"],"there":["13.2","14.6"],"platforms":["13.2"],"button":["13.2"],"sidebar":["13.2"],"tracker":["14.0"],"connected":["14.0"],"and":["14.1","15.2","19.2","19.6"],"connecting":["14.1"],"micro":["14.1"],"usb":["14.1"],"cable":["14.1"],"cases":["14.1"],"bottom":["14.2"],"visual":["14.2"],"studio":["14.2"],"ftdi":["14.3"],"programmer":["14.3"],"guide":["14.3","18.2","18.9","24.5"],"linked":["14.3"],"above":["14.3","19.4"],"randomnerdtutorials":["14.3"],"successful":["14.3"],"should":["14.3"],"output":["14.3"],"looks":["14.3"],"version":["14.4","14.5"],"example":["14.4"],"esp32aithinker":["14.4"],"would":["14.4"],"changed":["14.4"],"app":["14.5"],"make":["14.5","15.4","19.6"],"sure":["14.5"],"close":["14.5"],"browser":["14.5"],"tested":["14.5"],"updating":["14.5"],"newest":["14.5"],"ll":["14.5"],"couple":["14.5"],"answer":["14.6"],"question":["14.6"],"ask":["14.6"],"all":["15.0","15.1","17.4","18.6"],"avalable":["15.0"],"regauding":["15.0"],"building":["15.0"],"development":["15.0"],"other":["15.0","18.12"],"resources":["15.0"],"irreversible":["15.1"],"bodily":["15.1"],"measures":["15.1"],"were":["15.1"],"reduce":["15.1"],"potential":["15.1"],"failure":["15.1"],"risk":["15.1"],"further":["15.1"],"responsibilities":["15.1"],"user":["15.1"],"includes":["15.1"],"visually":["15.1"],"checking":["15.1"],"camera":["15.1","18.21"],"is":["15.3"],"recommended":["15.4"],"try":["15.4","19.6"],"mount":["15.4","17.6","19.6"],"wait":["15.4","24.4"],"skilled":["15.4"],"member":["15.4"],"widely":["16.1"],"so":["16.1","17.1","19.6","24.4"],"issues":["16.1"],"creep":["16.1"],"up":["16.1","18.11"],"ir":["16.1"],"emitters":["16.1","19.6"],"dangerous":["16.1"],"handled":["16.1"],"wrong":["16.1"],"precautions":["16.1"],"ignored":["16.1"],"existing":["17.1"],"mounts":["17.1"],"either":["17.2"],"go":["17.2"],"website":["17.2"],"like":["17.2","24.3"],"thingiverse":["17.2"],"basic":["17.3"],"design":["17.3"],"qdot":["17.3"],"created":["17.3"],"extremes":["17.4"],"lower":["17.4"],"corners":["17.4"],"job":["17.4"],"holding":["17.5","18.18"],"led":["17.5"],"boards":["17.5"],"docs":["17.7"],"step":["18.1"],"this":["18.2","18.10","18.21"],"fact":["18.3"],"hardware":["18.3","19.0"],"f":["18.4"],"u":["18.4"],"at":["18.5","18.6","19.4"],"mode":["18.6","24.2","24.4"],"connections":["18.6"],"both":["18.6"],"active":["18.6"],"same":["18.6","18.12"],"time":["18.6","18.8"],"ohm":["18.6"],"board":["18.6"],"simply":["18.6"],"options":["18.6","18.20","18.21"],"settings":["18.6","18.20","18.21"],"fine":["18.7"],"clip":["18.7"],"now":["18.7"],"slide":["18.7"],"note":["18.7","19.0"],"they":["18.8"],"actually":["18.8"],"work":["18.8"],"spend":["18.8"],"out":["18.9"],"our":["18.9"],"steps":["18.10"],"likely":["18.11"],"mess":["18.11","18.22"],"tracking":["18.11","24.2","24.4"],"two":["18.11"],"pairs":["18.11"],"wire":["18.11"],"preferably":["18.11"],"size":["18.12"],"eye":["18.12"],"cuts":["18.12"],"twisted":["18.13"],"outside":["18.14"],"io12":["18.15"],"pin":["18.15"],"gnd":["18.15"],"esp":["18.16"],"repeat":["18.16"],"volt":["18.17"],"power":["18.17"],"seven":["18.18"],"while":["18.18"],"place":["18.19"],"picture":["18.20"],"below":["18.20","18.21"],"image":["18.20","18.21"],"end":["18.20","18.21"],"secure":["18.21"],"type":["18.21"],"documented":["18.21"],"nine":["18.21"],"method":["18.21"],"sliding":["18.21"],"generally":["18.21"],"mounting":["18.21"],"no":["18.22","19.0"],"specified":["18.22"],"much":["19.1"],"cheaper":["19.1"],"esp32":["19.2"],"cams":["19.2","19.6"],"programmers":["19.2"],"proper":["19.2"],"cameras":["19.2","24.2"],"2x":["19.3"],"external":["19.3"],"esps":["19.3"],"template":["19.4","23.1"],"v":["19.4","23.1"],"slot":["19.4","23.1"],"content":["19.4","23.1"],"p":["19.4"],"temps":["19.4"],"245c":["19.4"],"burn":["19.4"],"low":["19.4"],"temp":["19.4"],"solder":["19.4"],"let":["19.6"],"us":["19.6"],"discord":["19.6"],"details":["20.0"],"fully":["20.0"],"free":["20.0"],"driven":["20.0"],"built":["20.0"],"frameborder":["22.0"],"allow":["22.0"],"encrypted":["22.0"],"media":["22.0"],"allowfullscreen":["22.0"],"another":["22.0"],"good":["22.0"],"resource":["22.0"],"one":["23.1"],"must":["23.4"],"install":["23.4"],"fetch":["23.4"],"prompt":["23.5"],"eyetrackapp":["23.6"],"folder":["23.6"],"run":["23.6"],"program":["24.0"],"files":["24.0"],"create":["24.0"],"shortcut":["24.0"],"desktop":["24.0","24.3"],"pressing":["24.0"],"icon":["24.1"],"double":["24.1"],"put":["24.2","24.3"],"cam":["24.2"],"number":["24.2"],"wired":["24.2"],"pass":["24.2"],"video":["24.2"],"changes":["24.2"],"gui":["24.2"],"headset":["24.3"],"application":["24.3"],"virtual":["24.3"],"steamvr":["24.3"],"etc":["24.3"],"done":["24.4"],"say":["24.4"],"next":["24.4"],"center":["24.4"]},{"0":["23.3"],"1":["11.2","14.4","14.5"],"2":["14.5","18.12"],"3":["11.2","14.5"],"4":["13.2"],"5":["1.1"],"12":["18.16"],"14":["11.2"],"300":["18.6"],"350":["2.0"],"500":["2.0","18.6"],"custom":["0.0"],"links":["0.0"],"href":["0.0"],"intro":["0.0"],"target":["0.0"],"blank":["0.0"],"guides":["0.0"],"on":["0.0","1.4","9.0","11.2","14.1","17.3","17.5","18.15","18.17","19.2"],"this":["0.0","1.1","8.2","12.3","14.2","15.0","18.17"],"website":["0.0"],"include":["0.0"],"teams":["0.0"],"own":["0.0"],"notes":["0.0"],"not":["0.0","1.4","4.2","5.1","23.1"],"all":["0.0","14.4","20.0"],"volt":["1.1"],"power":["1.1","19.2"],"in":["1.1","10.1","14.6","19.0"],"gnd":["1.1","18.17"],"ground":["1.1","18.17"],"or":["1.1","6.1","11.1","14.4","17.1","17.4","17.5","17.7","18.17"],"ar":["1.1","18.17"],"after":["1.1","14.0","15.1","18.10","18.17"],"resistor":["1.1","18.17"],"is":["1.1","14.1","18.17","23.1"],"be":["1.1","1.3","13.1","18.17","19.6"],"used":["1.1","7.2","18.17"],"as":["1.1","12.3","14.4","18.17","18.21"],"place":["1.2","18.21"],"six":["1.2","12.3","18.20","24.3"],"eleven":["1.3","18.21"],"each":["1.3","8.1","10.2"],"side":["1.3","7.1","13.1"],"of":["1.3","13.2"],"pin":["1.4","18.14"],"first":["1.4"],"does":["1.4","5.1","10.1","17.1"],"have":["1.4","10.1","10.2","14.3"],"a":["1.4","18.2","19.2","23.1"],"it":["1.4","5.1","9.0","13.0","17.7","18.10","18.15","19.6","24.1"],"946212245187199026":["2.0"],"theme":["2.0"],"dark":["2.0","15.1"],"width":["2.0","18.6"],"height":["2.0","18.6"],"allowtransparency":["2.0"],"true":["2.0"],"frameborder":["2.0"],"features":["3.0"],"that":["3.0","8.1","10.2","14.1","16.1","18.7"],"github":["4.1"],"com":["4.1","18.6"],"redhawk989":["4.1"],"eyetrackvr":["4.1","14.3"],"docs":["4.1","6.1"],"navigate":["4.1","24.0"],"to":["4.1","6.0","9.1","12.2","14.0","18.13","24.1"],"and":["4.2","15.1","18.14","22.0"],"lowercase":["4.2"],"letters":["4.2"],"do":["4.2","17.2","18.18"],"make":["4.2","10.2","14.1","16.1","18.10"],"naming":["4.2"],"changes":["4.2","14.5"],"for":["5.0","10.2","12.0","12.3"],"your":["5.0","8.2","12.0","16.1","18.8","18.18"],"files":["5.0"],"look":["5.0","19.4"],"line":["5.1"],"subdir":["5.1"],"then":["5.1","23.5","24.1"],"info":["5.1","12.3"],"note":["5.1"],"property":["5.1"],"require":["5.1","8.3"],"extension":["5.1"],"please":["5.1","16.1","18.4"],"title":["5.1","18.6"],"style":["5.1"],"var":["5.1"],"font":["5.1","19.4"],"accent":["5.1"],"the":["5.2","7.3","9.2","18.5","22.0"],"markdown":["5.2"],"file":["5.2"],"breaking":["6.1"],"change":["6.1","18.3"],"s":["6.1"],"text":["6.1","19.4"],"indicate":["6.1"],"follows":["6.1"],"bash":["6.1"],"type":["6.1","19.2"],"optional":["6.1"],"scope":["6.1"],"description":["6.1"],"body":["6.1"],"footer":["6.1"],"types":["6.1"],"feat":["6.1"],"new":["6.1","7.2"],"feature":["6.1"],"fix":["6.1"],"bug":["6.1"],"left":["7.1"],"like":["7.1","8.2","14.3","18.18","19.4"],"example":["7.2","14.5","18.6","18.15","24.3"],"updating":["7.2"],"dns":["7.2"],"esp32":["7.2","9.0","10.2"],"rest":["7.2"],"api":["7.2"],"fully":["7.2","19.0"],"featured":["7.2"],"control":["7.2"],"defauly":["7.2"],"turned":["7.2"],"off":["7.2"],"more":["7.2","11.2","12.3"],"advanced":["7.2"],"users":["7.2"],"basic":["7.2","18.2"],"operation":["7.2"],"was":["7.2"],"developed":["7.2"],"our":["7.2","24.3"],"app":["7.2"],"still":["7.2","18.3"],"development":["7.2"],"any":["7.2","15.4","19.6"],"client":["7.2"],"send":["7.2"],"post":["7.2"],"requests":["7.2"],"so":["8.1"],"things":["8.2"],"availible":["8.2"],"purposes":["8.2"],"should":["8.2","13.2","18.7"],"flashed":["8.2","18.10"],"just":["8.2","17.2","17.5"],"but":["8.2","8.3"],"will":["8.2","12.2","13.1","24.3"],"upload":["8.2","17.7"],"firmware":["8.2"],"with":["8.3","13.0","14.3","16.1","18.3","20.0"],"some":["8.3","13.0"],"may":["8.3","18.3"],"esp32cam":["8.3"],"test":["8.3"],"if":["8.3","10.2","14.1"],"lives":["9.0"],"found":["9.1"],"here":["9.1","19.3","19.6"],"check":["9.1","14.3","15.0"],"static":["10.1"],"two":["10.2","18.19"],"devices":["10.2"],"sure":["10.2","14.1","16.1","18.10"],"different":["10.2"],"macos":["10.3"],"connected":["10.4","14.4"],"network":["10.4"],"computer":["11.1"],"mobile":["11.1"],"we":["11.1","14.6","22.0"],"allow":["11.2","12.2","18.4"],"store":["11.2"],"up":["11.2","18.9","24.0"],"networks":["11.2"],"try":["11.2","17.6"],"than":["11.2"],"oldest":["11.2"],"overwritten":["11.2"],"ssid":["11.2"],"password":["11.2"],"networkname":["11.2"],"unique":["11.2"],"by":["11.2","15.3","18.1","18.18"],"refer":["11.2","12.3"],"channel":["11.2","14.6"],"broadcast":["11.2"],"br":["11.2","19.4"],"only":["11.2","12.3","16.1","18.7"],"allowed":["11.2"],"transmittion":["11.2"],"adhoc":["11.2"],"whether":["11.2"],"enable":["11.2"],"ap":["11.2"],"mode":["11.2"],"must":["11.2"],"follow":["11.2"],"system":["12.0"],"options":["12.1"],"image":["12.1"],"settings":["12.1"],"setup":["12.1"],"vscode":["12.1"],"you":["12.2","17.4","18.7"],"connect":["12.2"],"about":["12.3"],"cloning":["12.3"],"documentation":["12.3"],"download":["12.3","14.5"],"zip":["12.3"],"complain":["13.0"],"weird":["13.0"],"error":["13.0"],"usually":["13.0"],"icon":["13.1"],"sidebar":["13.1"],"ant":["13.1"],"logo":["13.1"],"panel":["13.1"],"once":["13.2","18.9"],"see":["13.2","18.7"],"couple":["13.2"],"tabs":["13.2"],"next":["13.2"],"wifi":["14.0"],"there":["14.1","17.4"],"button":["14.1","14.4","24.0"],"labeled":["14.1"],"ioo":["14.1"],"exists":["14.1"],"code":["14.2"],"builds":["14.2"],"congratulations":["14.3"],"now":["14.3","24.4"],"successfully":["14.3","14.4"],"uploaded":["14.3"],"trouble":["14.3"],"uploading":["14.3"],"over":["14.3"],"cable":["14.3"],"normally":["14.4"],"trackers":["14.4"],"handle":["14.4"],"future":["14.4"],"updates":["14.4","15.4"],"retrieve":["14.4"],"ip":["14.4"],"mdns":["14.4"],"name":["14.4"],"steps":["14.5","18.16"],"terminal":["14.5"],"enter":["14.5"],"directory":["14.5"],"ve":["14.5"],"cloned":["14.5"],"openiris":["14.5"],"cd":["14.5"],"d":["14.5"],"save":["14.5"],"current":["14.5"],"config":["14.5"],"using":["14.5"],"git":["14.5"],"stash":["14.5"],"questions":["14.6","15.4"],"discord":["14.6","15.4","22.0"],"project":["15.0"],"want":["15.0","17.4"],"get":["15.0"],"started":["15.0"],"out":["15.0","24.2"],"getting":["15.0","17.4"],"page":["15.0"],"brightness":["15.1"],"correct":["15.1"],"feel":["15.1"],"warmth":["15.1"],"experience":["15.1"],"short":["15.1","18.12"],"term":["15.1"],"effects":["15.1"],"being":["15.1"],"exposed":["15.1"],"light":["15.1"],"symptoms":["15.1"],"such":["15.1"],"spots":["15.1"],"dry":["15.1"],"warm":["15.1"],"repo":["15.2"],"made":["15.3"],"create":["15.4"],"one":["15.4"],"contact":["15.4"],"join":["15.4"],"hope":["15.4"],"cause":["16.1"],"damage":["16.1"],"eyes":["16.1"],"buy":["16.1"],"linked":["16.1"],"ones":["16.1","18.12"],"specs":["16.1"],"match":["16.1"],"exactly":["16.1"],"search":["17.2"],"3d":["17.2"],"printed":["17.2"],"taken":["17.3"],"from":["17.3"],"his":["17.3"],"at":["17.4"],"nearly":["17.4","20.0"],"put":["17.4","18.15"],"glue":["17.5","18.21"],"them":["17.5","18.8","18.11"],"print":["17.6"],"adjust":["17.6","24.3"],"thingiverse":["17.7"],"give":["18.2","19.6"],"although":["18.3"],"n":["18.4"],"anywhere":["18.4"],"least":["18.5"],"following":["18.5","18.20"],"checkboxlist":["18.5"],"bridging":["18.6"],"attaching":["18.6"],"resistors":["18.6"],"div":["18.6","18.21"],"align":["18.6"],"center":["18.6"],"iframe":["18.6"],"src":["18.6"],"https":["18.6"],"www":["18.6"],"youtube":["18.6"],"embed":["18.6"],"r4psuwtfrbg":["18.6"],"how":["18.6"],"add":["18.6"],"pins":["18.7"],"facing":["18.7"],"down":["18.7"],"black":["18.7"],"soldering":["18.8","18.18"],"slide":["18.8"],"into":["18.8","18.21"],"setting":["18.9"],"vs":["18.9"],"colors":["18.11"],"cut":["18.11"],"length":["18.11"],"56mm":["18.11"],"my":["18.11"],"case":["18.11"],"twist":["18.11"],"together":["18.11","18.12"],"connecting":["18.12"],"pcbs":["18.12"],"per":["18.12"],"solder":["18.13"],"keep":["18.13"],"5v":["18.14"],"issues":["18.15"],"below":["18.15"],"i":["18.15"],"2nd":["18.17"],"iron":["18.18"],"apply":["18.18","18.21"],"having":["18.18"],"piece":["18.18"],"diagram":["18.20"],"requires":["18.21"],"no":["18.21"],"ten":["18.21"],"slowly":["18.21"],"pressure":["18.21"],"inwards":["18.21"],"until":["18.21"],"snaps":["18.21"],"around":["18.22"],"find":["18.22","19.4"],"what":["18.22"],"works":["18.22","20.0"],"best":["18.22"],"shows":["18.22"],"has":["19.0"],"been":["19.0"],"set":["19.0"],"three":["19.1"],"usb":["19.2"],"male":["19.2"],"port":["19.2"],"both":["19.2"],"esps":["19.2"],"bare":["19.2"],"breakout":["19.2"],"amazon":["19.3","19.5"],"class":["19.4"],"bold":["19.4"],"focused":["19.4"],"something":["19.4"],"would":["19.4"],"tv":["19.4"],"remote":["19.4"],"use":["19.4","22.0"],"aliexpress":["19.5"],"can":["19.6","24.0"],"added":["19.6"],"fit":["19.6"],"camera":["19.6"],"potentially":["19.6"],"compatible":["19.6"],"willing":["19.6"],"easy":["20.0"],"headsets":["20.0"],"faq":["21.0"],"vrc":["22.0"],"face":["22.0"],"wiki":["22.0"],"their":["22.0"],"currently":["22.0"],"p":["23.1"],"required":["23.1","23.4"],"before":["23.3"],"open":["23.4","24.0"],"eyetrackapp":["23.5"],"folder":["23.5"],"run":["23.5"],"poetry":["23.6"],"pyinstaller":["23.6"],"spec":["23.6"],"path":["24.0"],"where":["24.0"],"an":["24.0"],"alternate":["24.0"],"press":["24.0"],"outputs":["24.2"],"values":["24.2"],"cropping":["24.2"],"crop":["24.2"],"threshold":["24.2"],"draw":["24.3"],"rectangle":["24.3"],"selects":["24.3"],"good":["24.3"],"head":["24.3"],"back":["24.3"],"rotation":["24.3"],"moving":["24.3"],"straight":["24.4"],"forward":["24.4"],"recenter":["24.4"],"let":["24.5"],"me":["24.5"]},{"0":["2.0"],"1":["14.3","18.6"],"2":["14.3","14.4","18.4"],"3":["4.1"],"4":["11.2","14.5"],"8":["11.2"],"14":["18.16"],"18":["11.2"],"19":["11.2"],"20":["11.2"],"28":["11.2"],"34":["11.2"],"44":["11.2"],"52":["11.2"],"60":["11.2"],"68":["11.2"],"74":["11.2"],"76":["11.2"],"78":["11.2"],"1206":["19.4"],"them":["0.0","8.1","13.1"],"polished":["0.0"],"that":["0.0","5.1","13.0","14.5","18.18","24.1","24.2"],"we":["0.0","5.1","7.2","12.3","16.1"],"disclose":["0.0"],"for":["0.0","11.1","15.1","15.2","16.1","18.11"],"other":["0.0","5.0","24.4"],"use":["0.0","5.1"],"here":["0.0","7.2","17.1","17.2","17.3","18.11"],"hope":["0.0"],"you":["0.0","14.1","18.10","23.1","23.3"],"may":["0.0"],"find":["0.0"],"something":["0.0"],"useful":["0.0"],"on":["1.1"],"2nd":["1.1"],"series":["1.1","18.17"],"not":["1.1","1.3","6.1","14.2","18.17"],"needed":["1.1","18.17","19.1"],"since":["1.1","18.17"],"they":["1.1","18.17"],"1st":["1.1","18.17"],"one":["1.2","12.1","18.17","19.2"],"end":["1.2"],"seven":["1.2","24.3"],"careful":["1.3"],"to":["1.3","2.0"],"at":["1.3","5.0","5.1","10.2","19.0"],"too":["1.3"],"high":["1.3"],"a":["1.3","14.3","18.10","24.1"],"temp":["1.3"],"and":["1.4","5.1","9.0","17.6","18.8","19.4","23.4"],"input":["1.4"],"ar":["1.4"],"after":["1.4"],"sandbox":["2.0"],"allow":["2.0","18.6"],"popups":["2.0"],"escape":["2.0"],"are":["3.0","5.1","8.1","19.0"],"in":["3.0","5.2","12.3","14.4","19.1"],"progress":["3.0"],"it":["4.0","17.5","18.3","23.6"],"vitepress":["4.1","5.2"],"folder":["4.1","4.2"],"cd":["4.1"],"install":["4.1"],"packages":["4.1"],"major":["4.2"],"see":["5.0"],"appears":["5.1"],"top":["5.1","18.15"],"like":["5.1","7.2","13.2","18.3","24.2"],"keep":["5.1"],"cohesive":["5.1"],"so":["5.1","7.2","14.5"],"give":["5.1","23.6"],"nice":["5.1"],"orange":["5.1"],"colour":["5.1"],"required":["5.1"],"e67e22":["5.1"],"using":["5.1","15.1"],"ensure":["6.0"],"changes":["6.1"],"do":["6.1","23.1"],"affect":["6.1"],"meaning":["6.1"],"white":["6.1"],"space":["6.1"],"formatting":["6.1"],"missing":["6.1"],"semi":["6.1"],"colons":["6.1"],"etc":["6.1"],"refactor":["6.1"],"neither":["6.1"],"fixes":["6.1"],"nor":["6.1"],"adds":["6.1"],"perf":["6.1"],"improves":["6.1"],"performance":["6.1"],"test":["6.1"],"adding":["6.1"],"correcting":["6.1"],"existing":["6.1"],"tests":["6.1"],"build":["6.1","12.2","15.0","20.0"],"this":["7.1","18.13","23.5"],"imagecard":["7.1","15.4","18.5","18.14"],"options":["7.1","15.0","15.1","15.4","18.5","22.0","24.4"],"browser":["7.2"],"functionality":["7.2"],"tools":["7.2"],"thunder":["7.2"],"postman":["7.2"],"full":["7.2","15.0"],"documented":["7.2"],"environments":["7.2"],"multiple":["7.2"],"support":["7.2"],"types":["7.2"],"configured":["7.2"],"environment":["7.2"],"follows":["7.2"],"esp32aithinker":["7.2"],"default":["7.2"],"ai":["7.2","8.3"],"thinker":["7.2","8.3"],"generic":["7.2"],"alibaba":["7.2"],"aliexpress":["7.2"],"amazon":["7.2"],"cam":["7.2"],"boards":["7.2"],"esp32cam":["7.2"],"unlikely":["7.2"],"esp32m5stack":["7.2"],"esp32wrover":["7.2"],"eye":["7.2"],"firmware":["7.3"],"can":["8.1","10.1"],"easily":["8.1"],"switch":["8.1"],"between":["8.1"],"broken":["8.1"],"up":["8.1","17.5","18.18"],"into":["8.1","14.3"],"esp":["8.2"],"wirelessly":["8.2"],"warning":["8.2","14.5","15.0","15.1"],"change":["8.2","10.1"],"ip":["8.2"],"which":["8.2"],"setting":["8.2"],"called":["8.2","13.1"],"otaserverip":["8.2"],"try":["8.3","10.4"],"supported":["8.3"],"esp32":["8.3","18.6"],"chip":["9.0"],"responsible":["9.0","16.1"],"the":["9.1","12.0","12.2"],"status":["9.1"],"of":["9.1","12.3","13.1","18.2","18.7","18.15","18.18","19.6"],"steps":["9.2","16.1"],"but":["10.1","14.2"],"will":["10.1","10.2","12.3","14.6","18.15"],"able":["10.2","18.21"],"connect":["10.2"],"both":["10.2"],"same":["10.2"],"already":["10.3"],"installed":["10.3","13.2"],"also":["10.3","24.0"],"get":["10.3","18.10"],"developed":["11.1"],"project":["11.1","18.2"],"enum":["11.2"],"pass":["11.2"],"number":["11.2"],"right":["11.2"],"sign":["11.2"],"corresponds":["11.2"],"dbm":["11.2"],"wish":["11.2","14.4"],"cpp":["11.2"],"typedef":["11.2"],"5dbm":["11.2"],"19dbm":["11.2"],"17dbm":["11.2"],"15dbm":["11.2"],"13dbm":["11.2"],"11dbm":["11.2"],"7dbm":["11.2"],"2dbm":["11.2"],"minus":["11.2"],"1dbm":["11.2"],"uploading":["12.0"],"tracker":["12.2","14.4"],"upload":["12.2"],"properly":["12.3"],"take":["12.3"],"note":["12.3","18.8"],"path":["12.3"],"run":["12.3","23.4"],"is":["12.3","18.9","18.22"],"where":["12.3","18.11"],"files":["12.3","19.4"],"downloaded":["12.3"],"when":["12.3","18.21"],"means":["13.0"],"either":["13.0"],"or":["13.0","13.2","18.12","19.2"],"arduinosdk":["13.0"],"got":["13.0"],"couple":["13.1"],"sections":["13.1"],"quick":["13.1"],"access":["13.1"],"side":["13.2"],"bard":["13.2"],"things":["13.2","24.2"],"embedded":["13.2"],"updates":["13.2"],"first":["14.0"],"update":["14.0"],"hold":["14.1","15.1"],"while":["14.1","15.1"],"plug":["14.1"],"once":["14.1","18.7"],"plugged":["14.1","14.3"],"does":["14.2"],"following":["14.3","22.0","23.4"],"usb":["14.3","18.8"],"firmly":["14.3"],"pc":["14.3"],"data":["14.3"],"flash":["14.4"],"be":["14.4","14.6","18.15","24.1"],"found":["14.4"],"through":["14.4"],"network":["14.4"],"monitoring":["14.4"],"applications":["14.4"],"by":["14.4"],"viewing":["14.4"],"output":["14.4"],"serial":["14.4"],"monitor":["14.4"],"ini":["14.4"],"user":["14.4","14.5","15.0"],"config":["14.4"],"file":["14.4"],"put":["14.4","18.18"],"hostname":["14.4"],"from":["14.5","18.20","24.3"],"repo":["14.5"],"pull":["14.5"],"apply":["14.5","18.14"],"saved":["14.5"],"don":["14.5"],"t":["14.5","19.4","24.2"],"retype":["14.5"],"wi":["14.5"],"fi":["14.5"],"credentials":["14.5"],"alerts":["14.5","15.0","15.1","18.21","22.0","24.0","24.4"],"happy":["14.6"],"help":["14.6"],"adapted":["14.6"],"then":["15.0","18.18"],"guide":["15.0","19.6","24.4"],"feeling":["15.1"],"actively":["15.1"],"strive":["15.1"],"make":["15.1"],"eyetrackvr":["15.1"],"safe":["15.1"],"possible":["15.1"],"responsibility":["15.1"],"damage":["15.1"],"done":["15.1"],"led":["15.1"],"template":["15.1","18.21","24.0","24.4"],"v":["15.1","18.21","24.0"],"information":["15.2"],"lorow":["15.3"],"there":["15.4"],"image":["15.4"],"settings":["15.4"],"content":["15.4","18.21","24.0"],"licenses":["15.4"],"github":["15.4","17.3"],"license":["15.4"],"https":["15.4"],"damaged":["16.1"],"caused":["16.1"],"go":["16.1"],"own":["16.1"],"route":["16.1"],"documentation":["16.1"],"incomplete":["16.1"],"important":["16.1"],"none":["17.1"],"work":["17.1","24.2"],"well":["17.1"],"example":["17.2"],"hardware":["17.3"],"alternatively":["17.3"],"as":["17.4"],"close":["17.4"],"headset":["17.4"],"s":["17.4","17.5","18.6"],"lens":["17.4"],"repeat":["17.6","24.4"],"until":["17.6"],"similar":["17.7"],"services":["17.7"],"just":["17.7"],"assembly":["18.1"],"overview":["18.2"],"more":["18.3","19.1"],"developments":["18.3"],"seems":["18.3"],"weeks":["18.4"],"requiredhardware":["18.5"],"frameborder":["18.6"],"accelerometer":["18.6"],"clipboard":["18.6"],"write":["18.6"],"encrypted":["18.6"],"media":["18.6"],"gyroscope":["18.6"],"picture":["18.6"],"allowfullscreen":["18.6"],"second":["18.6"],"cover":["18.6","19.2"],"aid":["18.6"],"problems":["18.6"],"completely":["18.6","20.0"],"has":["18.7"],"been":["18.7"],"slid":["18.7"],"press":["18.7"],"port":["18.8"],"goes":["18.8"],"set":["18.9"],"video":["18.10"],"stream":["18.10"],"ground":["18.11","18.12"],"5v":["18.11"],"i":["18.11"],"used":["18.11"],"speaker":["18.11"],"longer":["18.12"],"power":["18.12"],"slightly":["18.12"],"makes":["18.13"],"connection":["18.13"],"much":["18.13"],"week":["18.15"],"with":["18.16","19.2","24.1"],"resistors":["18.17"],"sng":["18.17"],"my":["18.18"],"stick":["18.18"],"air":["18.18"],"way":["18.18"],"three":["18.19"],"flip":["18.19"],"away":["18.20"],"align":["18.21"],"center":["18.21"],"slot":["18.21","24.0"],"p":["18.21","24.0"],"chance":["18.21"],"breaking":["18.21"],"putting":["18.21"],"happens":["18.21"],"save":["18.21"],"optimal":["18.22"],"near":["18.22"],"position":["18.22"],"hot":["18.22"],"glue":["18.22"],"stone":["19.0"],"all":["19.0","24.3"],"purchases":["19.0"],"good":["19.1"],"practice":["19.1"],"buy":["19.1"],"than":["19.1"],"some":["19.1"],"cases":["19.1"],"lower":["19.2"],"gauge":["19.2"],"diymore":["19.3"],"link":["19.3","19.4"],"aren":["19.4","24.2"],"exactly":["19.4"],"sure":["19.4"],"what":["19.4"],"doing":["19.4"],"emitter":["19.4"],"pcbs":["19.4"],"highly":["19.4"],"gerber":["19.4"],"schematics":["19.4"],"located":["19.4"],"350ohm":["19.4"],"soldering":["19.5"],"iron":["19.5"],"shot":["19.6"],"design":["19.6"],"rest":["19.6"],"community":["19.6"],"check":["19.6"],"out":["19.6"],"our":["19.6","24.2"],"making":["19.6"],"your":["19.6"],"diy":["20.0"],"platform":["20.0"],"paramaters":["22.0"],"lefteyex":["22.0"],"righteyex":["22.0"],"eyesy":["22.0"],"lefteyelidexpandedsqueeze":["22.0"],"righteyelidexpandedsqueeze":["22.0"],"step":["23.1"],"need":["23.1"],"continue":["23.3"],"windows":["23.4"],"powershell":["23.4"],"command":["23.4"],"time":["23.6"],"greeted":["24.1"],"gui":["24.1"],"cut":["24.2"],"dark":["24.2"],"pupil":["24.2"],"rotation":["24.2"],"method":["24.2"],"best":["24.2"],"want":["24.2"],"slider":["24.3"],"eight":["24.3"],"threshold":["24.3"],"continuing":["24.3"],"move":["24.3"],"fully":["24.4"],"calibrated":["24.4"],"eyetrack":["24.4"],"vr":["24.4"],"two":["24.4"],"know":["24.5"]},{"1":["1.1","18.17"],"2":["17.2"],"3":["14.4"],"4":["14.3","14.4"],"5":["13.1","13.2"],"28":["19.2"],"32":["13.2"],"348":["19.4"],"357":["19.4"],"400":["15.1"],"500":["15.1"],"3232":["14.4"],"12345678":["14.4"],"advocate":["0.0"],"https":["0.0","23.4"],"en":["0.0"],"wikipedia":["0.0"],"org":["0.0"],"wiki":["0.0"],"open":["0.0"],"source":["0.0"],"model":["0.0"],"sng":["1.1"],"single":["1.1","18.17"],"use":["1.1","14.0","16.1","18.17","19.3","24.2"],"using":["1.1","4.0","18.17","19.4"],"only":["1.1","18.17","22.0","24.3"],"v3":["1.1","18.17"],"boards":["1.1","18.17"],"flip":["1.2","18.18"],"other":["1.2","6.1","14.3","18.18","18.19"],"side":["1.2"],"of":["1.2","4.2","19.1","23.5"],"and":["1.2","3.0","5.0","6.0","17.2","17.5","18.2","19.1","19.5"],"it":["1.2","14.2","14.3"],"recommended":["1.3","18.17"],"soldering":["1.3"],"is":["1.3","6.0","15.0"],"230c":["1.3"],"with":["1.3","5.1","18.22"],"max":["1.3"],"245c":["1.3"],"2nd":["1.4"],"goes":["1.4"],"to":["1.4","14.2","18.3"],"same":["2.0","10.1"],"origin":["2.0"],"scripts":["2.0","6.1"],"target":["2.0"],"blank":["2.0"],"completed":["3.0"],"built":["4.0","5.1"],"start":["4.1","24.2","24.3"],"dev":["4.1"],"server":["4.1"],"without":["4.2"],"proir":["4.2"],"consultation":["4.2"],"team":["4.2"],"they":["5.0","14.4"],"are":["5.0","18.3"],"formatted":["5.0"],"examples":["5.0"],"tailwindcss":["5.1"],"classes":["5.1"],"our":["5.1"],"css":["5.1"],"variables":["5.1"],"find":["5.1"],"these":["5.1"],"styles":["5.1"],"change":["5.1"],"any":["5.1","20.0"],"but":["5.1","18.7"],"consistent":["5.1","6.0"],"rest":["5.1"],"site":["5.1"],"tip":["5.1"],"docs":["5.2","14.6"],"src":["5.2","6.1"],"pages":["5.2"],"easy":["6.0"],"system":["6.1"],"external":["6.1"],"dependencies":["6.1"],"example":["6.1"],"scopes":["6.1"],"gulp":["6.1"],"broccoli":["6.1"],"npm":["6.1"],"yarn":["6.1"],"actions":["6.1"],"ci":["6.1"],"configuration":["6.1"],"files":["6.1","14.5"],"gh":["6.1"],"yml":["6.1"],"yaml":["6.1"],"chore":["6.1"],"don":["6.1"],"t":["6.1","11.2"],"modify":["6.1"],"revert":["6.1"],"reverts":["6.1"],"previous":["6.1"],"no":["6.1"],"image":["7.1","12.2","18.5","18.13","18.14","24.1"],"settings":["7.1","12.2","18.5","18.13","18.14"],"configure":["7.1"],"s3":["7.2"],"variant":["7.2"],"debug":["7.2","8.1"],"release":["7.2","14.1"],"debugging":["7.2"],"production":["7.2"],"memory":["7.2"],"slower":["7.2"],"recommend":["7.2"],"initial":["7.2"],"testing":["7.2"],"easier":["7.2","18.13"],"us":["7.2"],"once":["7.2","23.6"],"confident":["7.2"],"working":["7.2"],"switch":["7.2"],"print":["7.2"],"out":["7.2"],"messages":["7.2"],"serial":["7.2"],"port":["7.2","11.2"],"errors":["7.2"],"save":["7.2"],"faster":["7.2"],"two":["8.1"],"distinct":["8.1"],"parts":["8.1","19.6"],"build":["8.1"],"type":["8.1"],"e":["8.1"],"g":["8.1"],"can":["8.2","11.1","14.0","14.1","17.3"],"found":["8.2","15.3"],"user":["8.2"],"config":["8.2"],"ini":["8.2"],"file":["8.2","11.2"],"supports":["8.2"],"both":["8.2","24.4"],"ipv4":["8.2"],"mdns":["8.2"],"names":["8.2"],"as":["8.2"],"long":["8.2"],"resolvable":["8.2"],"camera":["8.3","18.8","18.12"],"esp":["8.3","12.3"],"eye":["8.3","17.4"],"non":["8.3","15.1"],"esp32s3":["8.3"],"version":["8.3","13.2"],"esp32m5stack":["8.3"],"m5stack":["8.3"],"for":["9.0"],"streaming":["9.0"],"video":["9.0"],"data":["9.0","20.0"],"project":["9.1"],"please":["9.1","23.3"],"visit":["9.1"],"described":["9.2"],"always":["10.1"],"be":["10.1"],"means":["10.1"],"time":["10.2"],"followed":["10.2"],"fully":["10.3"],"tested":["10.3"],"package":["10.3"],"restart":["10.4","14.4","24.2"],"still":["10.4","18.7"],"so":["11.1"],"that":["11.1","18.15","18.21"],"hostname":["11.2"],"service":["11.2"],"look":["11.2"],"when":["11.2"],"scanning":["11.2"],"should":["11.2","18.6","23.5"],"openiristracker":["11.2"],"order":["11.2"],"eyetrackvr":["11.2","15.4"],"firmware":["11.2","12.0","12.2"],"binary":["11.2"],"depricated":["11.2"],"removed":["11.2"],"txpower":["11.2"],"imagecard":["12.2","18.8","18.13","24.1"],"options":["12.2","18.13","18.14","19.6","24.1"],"platformio":["12.3"],"later":["12.3"],"needed":["12.3","18.21"],"going":["12.3","18.3"],"selecting":["12.3"],"then":["12.3","13.1","18.10","18.11","19.4"],"navigating":["12.3"],"folder":["12.3"],"update":["13.0","13.2","24.0"],"s":["13.0","18.2","18.15"],"moment":["13.0"],"section":["13.1"],"miscelleneous":["13.1"],"miscellaneous":["13.1"],"locate":["13.2"],"platform":["13.2"],"called":["13.2"],"espressif":["13.2"],"opt":["14.0"],"ota":["14.0"],"an":["14.1"],"ftdi":["14.1"],"steps":["14.1","17.1"],"aren":["14.1"],"send":["14.2"],"charging":["14.3"],"suggested":["14.3"],"try":["14.3"],"cables":["14.3"],"or":["14.3"],"devices":["14.3"],"drivers":["14.3"],"up":["14.3","24.3"],"date":["14.3"],"some":["14.3","14.6","16.1","17.1"],"ports":["14.3"],"into":["14.4"],"enableota":["14.4"],"otaserverip":["14.4"],"openiristrackerl":["14.4"],"local":["14.4"],"here":["14.4","15.3"],"custom":["14.4"],"otapassword":["14.4"],"otaserverport":["14.4"],"env":["14.4"],"must":["14.4"],"power":["14.4","18.10"],"cycled":["14.4"],"template":["14.5","15.0","19.6","22.0"],"v":["14.5","15.0","19.6","22.0","24.4"],"slot":["14.5","15.0","15.1","19.6","22.0","24.4"],"content":["14.5","15.0","15.1","19.6","22.0","24.4"],"p":["14.5","15.0","15.1","19.6","22.0","24.4"],"skip":["14.5"],"step":["14.5"],"if":["14.5","17.3","19.0","24.0"],"message":["14.5"],"denotes":["14.5","18.11"],"had":["14.5"],"changed":["14.5"],"does":["14.5","20.0"],"updated":["14.5"],"from":["14.6","18.8","19.2"],"slimevr":["14.6"],"credit":["14.6"],"in":["15.0","19.3"],"active":["15.0"],"sure":["15.1"],"class":["15.1"],"text":["15.1"],"red":["15.1"],"focused":["15.1","20.0"],"font":["15.1"],"bold":["15.1"],"5ma":["15.1"],"total":["15.1"],"regauring":["15.2"],"com":["15.4"],"redhawk989":["15.4"],"blob":["15.4"],"main":["15.4"],"all":["15.4","23.5"],"software":["15.4"],"under":["15.4"],"mit":["15.4"],"documentation":["15.4"],"missing":["16.1"],"need":["16.1"],"set":["16.1"],"avatar":["16.1"],"require":["16.1"],"basic":["16.1"],"unity":["16.1"],"i":["17.1","17.4"],"show":["17.1"],"simple":["17.1"],"get":["17.1","19.4"],"quest":["17.2"],"rift":["17.2"],"create":["17.3"],"your":["17.3","18.22","19.0"],"own":["17.3"],"possible":["17.4"],"achieve":["17.4"],"biggest":["17.4"],"what":["17.5","18.2"],"works":["17.5"],"best":["17.5","24.4"],"have":["17.6"],"satisfactory":["17.6"],"stls":["17.7"],"via":["17.7"],"guide":["18.1"],"status":["18.2"],"we":["18.3"],"stick":["18.3"],"months":["18.4"],"everything":["18.4"],"them":["18.6"],"cases":["18.6"],"free":["18.6"],"however":["18.6"],"noted":["18.6"],"performs":["18.6"],"worse":["18.6"],"than":["18.6"],"certain":["18.6"],"issue":["18.6"],"like":["18.6","24.1"],"back":["18.7"],"there":["18.7"],"will":["18.7"],"small":["18.7","18.21"],"amount":["18.7"],"gentle":["18.7"],"away":["18.8"],"move":["18.9"],"browser":["18.10"],"down":["18.10"],"copper":["18.11"],"positive":["18.11"],"silver":["18.11"],"negative":["18.11"],"strip":["18.11"],"about":["18.11"],"led":["18.12"],"near":["18.12"],"ish":["18.15"],"joint":["18.15"],"where":["18.15","18.21"],"glue":["18.15"],"comes":["18.15"],"700ohm":["18.17"],"eight":["18.18"],"end":["18.18"],"around":["18.19","18.21"],"seven":["18.20"],"depending":["18.21"],"on":["18.21"],"break":["18.21"],"was":["18.21"],"dab":["18.21"],"hot":["18.21"],"likely":["18.21"],"twelve":["18.21"],"friend":["18.22"],"sixteen":["18.22"],"loss":["19.0"],"changes":["19.0"],"namely":["19.1"],"programmers":["19.1"],"esps":["19.1"],"reduces":["19.1"],"risk":["19.1"],"doa":["19.1"],"wire":["19.2"],"awg":["19.2"],"currently":["19.3"],"by":["19.3"],"prohurtz":["19.3","24.5"],"0001":["19.3","24.5"],"resistors":["19.4"],"buying":["19.4"],"regular":["19.4"],"through":["19.4","24.0"],"hole":["19.4"],"acceptable":["19.4"],"ohm":["19.4"],"this":["19.4","24.1"],"ensures":["19.4"],"solder":["19.5"],"alerts":["19.6"],"list":["19.6"],"six":["19.6"],"game":["20.0"],"privacy":["20.0"],"not":["20.0"],"collect":["20.0"],"invoke":["23.4"],"webrequest":["23.4"],"uri":["23.4"],"python":["23.4"],"done":["23.6"],"used":["24.0"],"just":["24.0"],"process":["24.0"],"again":["24.0"],"has":["24.0"],"looks":["24.1"],"level":["24.2"],"slider":["24.2"],"adjust":["24.2"],"case":["24.2"],"calibrationn":["24.2"],"calibration":["24.2"],"way":["24.3"],"slowly":["24.3"],"backing":["24.3"],"off":["24.3"],"until":["24.3"],"mainly":["24.3"],"pupil":["24.3"],"being":["24.3"],"visualized":["24.3"],"viewer":["24.3"],"too":["24.3"],"low":["24.3"],"nine":["24.3"],"at":["24.4"],"one":["24.4"],"spot":["24.4"],"hit":["24.4"]},{"0":["15.4"],"4":["15.4"],"5":["4.1","14.4","14.5"],"6":["13.1","13.2","14.4"],"7":["14.4","18.11","18.13"],"8":["14.4"],"12":["18.8","18.11"],"13":["18.15"],"18":["18.14","18.15"],"34":["19.4"],"3653631":["17.2"],"why":["0.0"],"strive":["0.0"],"make":["0.0"],"work":["0.0","14.3"],"consultation":["0.0"],"replication":["0.0"],"reuse":["0.0"],"recommended":["1.1","8.2"],"negative":["1.1","18.17"],"marks":["1.1","18.17"],"side":["1.1","18.17"],"of":["1.1","5.0","14.3","17.1","18.17"],"positive":["1.1","18.17"],"eight":["1.2","18.20"],"twelve":["1.3"],"system":["1.4"],"in":["1.4","4.1","13.0","14.0"],"esps":["1.4"],"gg":["2.0"],"kkxybvykzx":["2.0"],"alt":["2.0"],"planned":["3.0"],"vitepress":["4.0"],"open":["4.1"],"site":["4.1"],"your":["4.1","20.0"],"browser":["4.1"],"members":["4.2"],"for":["4.2","14.1","17.4","18.18"],"componentes":["4.2"],"follow":["4.2","7.2"],"vue3":["4.2"],"docs":["4.2"],"entire":["5.1"],"supports":["5.1"],"documentation":["5.1","11.2","23.4"],"here":["5.1","9.2","14.6"],"all":["5.1","24.2"],"wish":["5.1"],"must":["5.1"],"prefaced":["5.1"],"when":["5.1"],"inside":["5.1"],"on":["5.1","16.1","19.1"],"html":["5.1"],"elements":["5.1"],"class":["5.1"],"attribute":["5.1"],"h1":["5.1"],"folder":["5.2"],"understand":["6.0"],"will":["6.1"],"trigger":["6.1"],"an":["6.1","12.3"],"add":["6.1","7.2"],"title":["6.1"],"added":["6.1","7.2"],"thing":["6.1","17.2"],"some":["6.1","12.3"],"detail":["6.1"],"about":["6.1"],"line":["6.1"],"optionaland":["6.1"],"if":["6.1"],"needed":["6.1"],"firmware":["7.1"],"one":["7.1","18.5","18.8","18.14","18.18"],"configutration":["7.2"],"espaithinker":["7.2","8.1"],"please":["7.2","19.4","22.0"],"gif":["7.2"],"s":["7.2","8.2","13.2","17.2"],"below":["7.2"],"place":["7.2"],"tip":["7.2","8.3","11.2","18.22"],"coming":["7.2","8.3","11.2","18.7"],"soon":["7.2","8.3","11.2"],"changing":["7.2"],"want":["7.2","15.1"],"help":["7.2"],"submit":["7.2"],"pr":["7.2"],"flash":["7.2"],"social":["7.2"],"vr":["7.2","24.1"],"games":["7.2"],"gui":["7.2"],"download":["7.2"],"vscode":["7.2","14.3"],"platformio":["7.2"],"project":["7.2"],"hard":["7.2","14.5"],"at":["7.2","24.2"],"currently":["7.2","18.2"],"date":["7.2"],"back":["7.2"],"frequently":["7.2"],"release":["8.1"],"board":["8.1"],"esp32cam":["8.1"],"network":["8.2"],"i":["8.2"],"e":["8.2"],"bonjour":["8.2"],"installed":["8.2","24.0"],"computer":["8.2"],"port":["8.2"],"password":["8.2"],"not":["8.2","14.3","14.4"],"wrover":["8.3"],"s3":["8.3"],"variant":["8.3"],"esp32s3cam":["8.3"],"from":["9.0"],"tracker":["9.0","12.0"],"development":["9.1"],"road":["9.1"],"map":["9.1"],"even":["10.1"],"changes":["10.1"],"example":["10.2"],"using":["10.2"],"http":["10.2"],"us":["10.3"],"router":["10.4"],"more":["11.1"],"easily":["11.1","18.22"],"our":["11.1"],"new":["11.1"],"app":["11.1"],"level":["11.2"],"working":["11.2","15.0","17.1"],"section":["11.2","14.5"],"two":["12.1","18.15","24.0"],"setup":["12.2"],"three":["12.2","18.13","24.1"],"opening":["12.3"],"seven":["12.3"],"adaptation":["12.3"],"slimevr":["12.3"],"credit":["12.3"],"goes":["12.3","14.6"],"team":["12.3","14.6"],"adapted":["12.3"],"this":["13.0","14.1"],"guide":["13.0","14.1","16.1","24.1"],"come":["13.0"],"handy":["13.0","18.15"],"core":["13.1"],"finnish":["13.1"],"espressif32":["13.2"],"wait":["13.2","14.4"],"it":["13.2","15.0","23.3"],"is":["13.2"],"done":["13.2"],"that":["13.2"],"future":["14.0"],"t":["14.1"],"easy":["14.1"],"so":["14.1"],"grab":["14.1"],"how":["14.1"],"set":["14.1"],"up":["14.1"],"esp":["14.2"],"yet":["14.2"],"img":["14.2","14.4"],"might":["14.3"],"ones":["14.3"],"additionally":["14.3"],"can":["14.3"],"be":["14.3"],"caused":["14.3"],"by":["14.3","15.4"],"software":["14.3"],"hogging":["14.3"],"com":["14.3","17.2"],"cura":["14.3"],"cause":["14.3"],"press":["14.4"],"br":["14.4"],"touch":["14.4"],"move":["14.4","16.1"],"them":["14.4","18.12"],"during":["14.4"],"around":["14.4","18.12"],"minute":["14.4"],"repeat":["14.4","18.18","24.3"],"many":["14.4"],"anything":["14.5"],"went":["14.5"],"wrong":["14.5"],"reset":["14.5"],"everything":["14.5","24.3"],"default":["14.5"],"state":["14.5"],"retyping":["14.5"],"following":["14.5"],"uploading":["14.5"],"however":["15.0"],"most":["15.0"],"users":["15.0"],"details":["15.1"],"see":["15.1"],"data":["15.1"],"sheets":["15.1"],"effect":["15.1"],"infrared":["15.1"],"radiation":["15.1"],"lens":["15.1"],"an002":["15.1"],"photobiological":["15.1"],"sources":["15.1"],"training":["15.1"],"library":["15.1"],"nir":["15.1"],"stds":["15.1"],"including":["15.4"],"wiki":["15.4"],"creative":["15.4"],"commons":["15.4"],"cc":["15.4"],"sa":["15.4"],"knowledge":["16.1"],"owning":["16.1"],"once":["16.1","18.12"],"acknowledged":["16.1"],"items":["16.1"],"above":["16.1"],"full":["16.1"],"build":["16.1"],"form":["17.1"],"https":["17.2"],"www":["17.2"],"skills":["17.3"],"recommend":["17.4"],"other":["17.4"],"mounts":["17.4"],"inspiration":["17.4"],"experiment":["17.5"],"good":["17.6"],"luck":["17.6"],"discord":["17.7"],"prohurtz":["17.7"],"0001":["17.7"],"expect":["18.2"],"current":["18.3"],"ws4ps3mw250":["18.6"],"covering":["18.6"],"anti":["18.6"],"static":["18.6"],"ammount":["18.7"],"out":["18.7","19.4"],"close":["18.7"],"options":["18.8","18.11","18.15"],"image":["18.8","18.11","18.15"],"settings":["18.8","18.11","18.15","24.1"],"next":["18.9","18.10"],"3mm":["18.11"],"exposed":["18.11","18.12"],"imagecard":["18.11","18.15"],"bottom":["18.12","18.21"],"strip":["18.12"],"4mm":["18.12"],"nine":["18.18"],"now":["18.18"],"ten":["18.18","24.3"],"four":["18.19"],"gluing":["18.21"],"bit":["18.21"],"thirteen":["18.21"],"fourteen":["18.21"],"use":["18.22"],"rubbing":["18.22"],"alcohol":["18.22"],"remove":["18.22"],"dead":["19.1"],"arrival":["19.1"],"causing":["19.1"],"delay":["19.1"],"external":["19.2"],"antennas":["19.2"],"small":["19.2"],"large":["19.2"],"4x":["19.3"],"heatsinks":["19.3"],"correct":["19.4"],"patreon":["19.4"],"check":["19.4"],"discount":["19.4"],"codes":["19.4"],"available":["19.4"],"also":["19.4"],"unit":["19.4"],"pricing":["19.4"],"1x":["19.4"],"wire":["19.4"],"awg":["19.4"],"aliexpress":["19.4"],"hosted":["20.0"],"own":["20.0"],"pc":["20.0"],"uses":["20.0"],"the":["20.0"],"sound":["20.0"],"control":["20.0"],"float":["22.0"],"parameters":["22.0"],"adjust":["22.0"],"accordingly":["22.0"],"org":["23.4"],"usebasicparsing":["23.4"],"content":["23.4"],"py":["23.4"],"under":["23.6"],"dist":["23.6"],"been":["24.0"],"successfully":["24.0"],"should":["24.0"],"look":["24.0","24.2"],"eyetrack":["24.1"],"extremes":["24.2"],"recenter":["24.2"],"whatever":["24.2"],"point":["24.2"],"are":["24.2"],"looking":["24.2"],"high":["24.3"],"eleven":["24.3"],"left":["24.3"],"each":["24.4"],"without":["24.4"],"moving":["24.4"]}]'},t={"0.0":{t:"",p:`layout: page +<VPTeamPage> +<VPTeamPageTitle> +<te ...`,l:"about.html",a:""},"1.0":{t:"# Fox IR V2 Buil dInstructions ",p:"",l:"archive/fox_ir_v2_build_instructions.html",a:"text-var-font-accent"},"1.1":{t:"step-15-prepare-to-solder-ir-led-pcb-v2s",p:"Get your magnifying glass out, it's time to solder very smol t ...",l:"archive/fox_ir_v2_build_instructions.html#step-15-prepare-to-solder-ir-led-pcb-v2s",a:"step-15-prepare-to-solder-ir-led-pcb-v2s"},"1.2":{t:"step-17-solder-resistors-on-pcb-v2",p:`You only need 1 PCB to have a resistor per eye. +<ImageCard ...`,l:"archive/fox_ir_v2_build_instructions.html#step-17-solder-resistors-on-pcb-v2",a:"step-17-solder-resistors-on-pcb-v2"},"1.3":{t:"solder-leds-on-pcb-v2",p:"<ImageCard :options="image_settings.fox_ir_build_instr ...",l:"archive/fox_ir_v2_build_instructions.html#solder-leds-on-pcb-v2",a:"solder-leds-on-pcb-v2"},"1.4":{t:"wire-up-the-pcbs-v2",p:`Basic full wiring diagram of IR PCBs V2. +<ImageCard :option ...`,l:"archive/fox_ir_v2_build_instructions.html#wire-up-the-pcbs-v2",a:"wire-up-the-pcbs-v2"},"2.0":{t:"div-align-center-class-rounded-md",p:"<h1 class="text-[#ab5ac7]">Contact Us</h1&g ...",l:"contact.html",a:"div-align-center-class-rounded-md"},"3.0":{t:"# EyeTrackVR Development Roadmap ",p:"This will contain a list of features that are in progress, com ...",l:"dev_roadmap.html",a:"text-var-font-accent"},"3.1":{t:"completed",p:`<CheckBoxList +:options="{...Completed}" +/> +`,l:"dev_roadmap.html#completed",a:"completed"},"3.2":{t:"in-progress",p:`<CheckBoxList +:options="{...InProgress}" +/> +`,l:"dev_roadmap.html#in-progress",a:"in-progress"},"3.3":{t:"planned",p:`<CheckBoxList +:options="{...Planned}" +/> +`,l:"dev_roadmap.html#planned",a:"planned"},"4.0":{t:"development-documentation-for-the-eyetrackvr-docs-site",p:"This is the documentation for the EyeTrackVR Docs site. It is ...",l:"development/docs/dev_docs.html",a:"development-documentation-for-the-eyetrackvr-docs-site"},"4.1":{t:"getting-started",p:`Prerequisites + +Node.js (v14.15.4 or higher) +Yarn (v1.22.10 or ...`,l:"development/docs/dev_docs.html#getting-started",a:"getting-started"},"4.2":{t:"contributing",p:`Project Structure + +Familiarize yourself with the VitePress doc ...`,l:"development/docs/dev_docs.html#contributing",a:"contributing"},"5.0":{t:"# Pages ",p:"This section will cover how to add or edit pages on the docs w ...",l:"development/docs/pages.html",a:"text-var-font-accent"},"5.1":{t:"adding-a-page",p:"To add a page, you will need to create a new Markdown file in ...",l:"development/docs/pages.html#adding-a-page",a:"adding-a-page"},"5.2":{t:"editing-a-page",p:"To edit a page, you will need to edit the Markdown file in the ...",l:"development/docs/pages.html#editing-a-page",a:"editing-a-page"},"6.0":{t:"standards-guide",p:"Listed here are the standards that are used for the EyeTrackVR ...",l:"development/docs/standards.html",a:"standards-guide"},"6.1":{t:"code-standards",p:`General +It is by design that we use a static-site framework fo ...`,l:"development/docs/standards.html#code-standards",a:"code-standards"},"7.0":{t:"# Configuring the firmware ",p:"",l:"firmware_guide/configure_firmware.html",a:"text-var-font-accent"},"7.1":{t:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",p:"<ImageCard :options="image_settings.configure_firmware ...",l:"firmware_guide/configure_firmware.html#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",a:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this"},"7.2":{t:"open-the-ini-user-config-ini-file",p:"<ImageCard :options="image_settings.configure_firmware ...",l:"firmware_guide/configure_firmware.html#open-the-ini-user-config-ini-file",a:"open-the-ini-user-config-ini-file"},"7.3":{t:"now-move-on-to-uploading-the-firmware",p:"",l:"firmware_guide/configure_firmware.html#now-move-on-to-uploading-the-firmware",a:"now-move-on-to-uploading-the-firmware"},"8.0":{t:"# Firmware Environments ",p:"",l:"firmware_guide/environments.html",a:"text-var-font-accent"},"8.1":{t:"what-is-it",p:"A firmware environment is a way to store the custom firmware c ...",l:"firmware_guide/environments.html#what-is-it",a:"what-is-it"},"8.2":{t:"build-types",p:"We now have a couple of options letting us decide how we want ...",l:"firmware_guide/environments.html#build-types",a:"build-types"},"8.3":{t:"board-types",p:"We currently support a few different boards, and we are workin ...",l:"firmware_guide/environments.html#board-types",a:"board-types"},"9.0":{t:"# What is this? ",p:"Firmware is the second part of the equation to get your tracke ...",l:"firmware_guide/firmware.html",a:"text-var-font-accent"},"9.1":{t:"what-should-i-download-and-where",p:"Current testing has been on our own solution called OpenIris, ...",l:"firmware_guide/firmware.html#what-should-i-download-and-where",a:"what-should-i-download-and-where"},"9.2":{t:"how-do-download-this",p:`Follow the steps described here +`,l:"firmware_guide/firmware.html#how-do-download-this",a:"how-do-download-this"},"10.0":{t:"# MDNS ",p:"",l:"firmware_guide/htmlns.md",a:"text-var-font-accent"},"10.1":{t:"what-is-it",p:"mDNS is a protocol that allows you to connect to a device usin ...",l:"firmware_guide/htmlns.md#what-is-it",a:"what-is-it"},"10.2":{t:"how-to-use-it",p:`Enable mDNS +The mDNS is enabled by default on the new firmware ...`,l:"firmware_guide/htmlns.md#how-to-use-it",a:"how-to-use-it"},"10.3":{t:"prerequisites-bonjour",p:"Bonjour is required to use the mDNS protocol for windows and m ...",l:"firmware_guide/htmlns.md#prerequisites-bonjour",a:"prerequisites-bonjour"},"10.4":{t:"troubleshooting",p:`Can not connect to the device +If you can not connect to the de ...`,l:"firmware_guide/htmlns.md#troubleshooting",a:"troubleshooting"},"11.0":{t:"# REST API ",p:"",l:"firmware_guide/rest_api.html",a:"text-var-font-accent"},"11.1":{t:"what-is-it",p:"A REST API is a way to communicate with the ESP devices using ...",l:"firmware_guide/rest_api.html#what-is-it",a:"what-is-it"},"11.2":{t:"how-to-use-it",p:`REST API Client +Any REST API client can be used to communicate ...`,l:"firmware_guide/rest_api.html#how-to-use-it",a:"how-to-use-it"},"12.0":{t:"# Setting up the environment ",p:"This procedure will show how to prepare your system for upload ...",l:"firmware_guide/setup_vscode.html",a:"text-var-font-accent"},"12.1":{t:"_1-install-visual-studio-code",p:`Download the latest Visual Studio Code and install it. +Downloa ...`,l:"firmware_guide/setup_vscode.html#_1-install-visual-studio-code",a:"_1-install-visual-studio-code"},"12.2":{t:"_2-install-platformio-ide",p:"Once Visual Studio Code is installed, open it and install Plat ...",l:"firmware_guide/setup_vscode.html#_2-install-platformio-ide",a:"_2-install-platformio-ide"},"12.3":{t:"_3-clone-the-firmware-project",p:"Make sure you close any current projects you have open or open ...",l:"firmware_guide/setup_vscode.html#_3-clone-the-firmware-project",a:"_3-clone-the-firmware-project"},"13.0":{t:"# Updating Platformio ",p:"Sometimes, when building and uploading the firmware, you may r ...",l:"firmware_guide/update_platformio.html",a:"text-var-font-accent"},"13.1":{t:"updating-platformio-itself",p:`There are two ways to update your platformio installation +Via ...`,l:"firmware_guide/update_platformio.html#updating-platformio-itself",a:"updating-platformio-itself"},"13.2":{t:"upgrading-the-sdk",p:`You'll also need to upgrade the SDK from timem to do this +Upgr ...`,l:"firmware_guide/update_platformio.html#upgrading-the-sdk",a:"upgrading-the-sdk"},"14.0":{t:"# Building and uploading the firmware manually ",p:"Uploading your firmware must initially be done over cable. Onc ...",l:"firmware_guide/upload_and_update_firmware.html",a:"text-var-font-accent"},"14.1":{t:"_1-connect-your-tracker-to-your-pc-via-the-programmer",p:"First, connect your ESP32-Cam to your programmer. In the case ...",l:"firmware_guide/upload_and_update_firmware.html#_1-connect-your-tracker-to-your-pc-via-the-programmer",a:"_1-connect-your-tracker-to-your-pc-via-the-programmer"},"14.2":{t:"_2-build-your-firmware",p:` +Press the build button at the bottom of Visual Studio Code. + + ...`,l:"firmware_guide/upload_and_update_firmware.html#_2-build-your-firmware",a:"_2-build-your-firmware"},"14.3":{t:"_3-upload-your-firmware",p:` + +If you are using the OTA method, first make sure the tracker ...`,l:"firmware_guide/upload_and_update_firmware.html#_3-upload-your-firmware",a:"_3-upload-your-firmware"},"14.4":{t:"uploading-via-ota",p:`What is it? +OTA stands for Over The Air, and it is a way to up ...`,l:"firmware_guide/upload_and_update_firmware.html#uploading-via-ota",a:"uploading-via-ota"},"14.5":{t:"finding-the-ip-address-of-your-tracker",p:"Connect your tracker to your PC and then open a serial monitor ...",l:"firmware_guide/upload_and_update_firmware.html#finding-the-ip-address-of-your-tracker",a:"finding-the-ip-address-of-your-tracker"},"14.6":{t:"troubleshooting",p:"If you encountered an issue while following these steps check ...",l:"firmware_guide/upload_and_update_firmware.html#troubleshooting",a:"troubleshooting"},"15.0":{t:"# EyeTrackVR ",p:"Open source and affordable VR eye tracker platform for Social ...",l:"getting_started/intro.html",a:"text-3xl-font-bold-underline-text-ab5ac7"},"15.1":{t:"about-ir-emitter-safety",p:`Please exercise caution when messing around with IR emitters. + ...`,l:"getting_started/intro.html#about-ir-emitter-safety",a:"about-ir-emitter-safety"},"15.2":{t:"hardware",p:"Please check out our parts list and hardware repo. for informa ...",l:"getting_started/intro.html#hardware",a:"hardware"},"15.3":{t:"firmware",p:`Our firmware called OpenIris is made by lorow found here. +`,l:"getting_started/intro.html#firmware",a:"firmware"},"15.4":{t:"headset-support",p:"In theory, we are compatible with every VR headset. However, m ...",l:"getting_started/intro.html#headset-support",a:"headset-support"},"16.0":{t:"# Things To Know Before You Start ",p:"",l:"getting_started/things_to_know.html",a:"text-var-font-accent"},"16.1":{t:"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project",p:`Software is not final +Bugs can and will occur which may hinder ...`,l:"getting_started/things_to_know.html#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project",a:"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project"},"17.0":{t:"# Creating Your Own Mount ",p:"",l:"how_to_build/creating_your_own_mount.html",a:"text-var-font-accent"},"17.1":{t:"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts",p:"So, you have a headset that does not have any mounts or none t ...",l:"how_to_build/creating_your_own_mount.html#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts",a:"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts"},"17.2":{t:"step-1-find-a-way-to-mount-to-your-headsets-lens",p:"The easiest way to get started is to find a lens protector for ...",l:"how_to_build/creating_your_own_mount.html#step-1-find-a-way-to-mount-to-your-headsets-lens",a:"step-1-find-a-way-to-mount-to-your-headsets-lens"},"17.3":{t:"step-2-find-a-camera-mount",p:"Now, you need a way to attach the camera. We have a basic desi ...",l:"how_to_build/creating_your_own_mount.html#step-2-find-a-camera-mount",a:"step-2-find-a-camera-mount"},"17.4":{t:"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle",p:"The "Ideal" location is a place that gives a good vi ...",l:"how_to_build/creating_your_own_mount.html#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle",a:"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle"},"17.5":{t:"step-4-mount-your-leds",p:"You can either add parts to your mount for holding the LED boa ...",l:"how_to_build/creating_your_own_mount.html#step-4-mount-your-leds",a:"step-4-mount-your-leds"},"17.6":{t:"step-5-test-everything",p:"It is unlikely you will get a perfect mount on the first try. ...",l:"how_to_build/creating_your_own_mount.html#step-5-test-everything",a:"step-5-test-everything"},"17.7":{t:"step-6-get-your-mounts-listed",p:"Send me the mount to be added to the docs here! You can upload ...",l:"how_to_build/creating_your_own_mount.html#step-6-get-your-mounts-listed",a:"step-6-get-your-mounts-listed"},"18.0":{t:"# Build Guide ",p:"",l:"how_to_build/full_build.html",a:"text-var-font-accent"},"18.1":{t:"this-page-will-contain-a-step-by-step-assembly-guide",p:"",l:"how_to_build/full_build.html#this-page-will-contain-a-step-by-step-assembly-guide",a:"this-page-will-contain-a-step-by-step-assembly-guide"},"18.2":{t:"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide",p:"This will give you a basic overview of the project's status an ...",l:"how_to_build/full_build.html#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide",a:"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide"},"18.3":{t:"step-2-order-all-the-parts-listed-on-our-parts-list",p:"Please take note of the fact that hardware still may change, a ...",l:"how_to_build/full_build.html#step-2-order-all-the-parts-listed-on-our-parts-list",a:"step-2-order-all-the-parts-listed-on-our-parts-list"},"18.4":{t:"step-3-wait-for-things-to-arrive",p:`Long shipping times from China are f u n. +Please allow anywhe ...`,l:"how_to_build/full_build.html#step-3-wait-for-things-to-arrive",a:"step-3-wait-for-things-to-arrive"},"18.5":{t:"step-4-gather-up-all-of-your-hardware",p:`Make sure you have at least the following: +<CheckBoxList :o ...`,l:"how_to_build/full_build.html#step-4-gather-up-all-of-your-hardware",a:"step-4-gather-up-all-of-your-hardware"},"18.6":{t:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",p:"Some ESP-CAM boards have issues with signal integrity, there a ...",l:"how_to_build/full_build.html#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",a:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag"},"18.7":{t:"step-6-attach-cameras-to-esps",p:"Look at your ESP and locate the camera ribbon cable connector ...",l:"how_to_build/full_build.html#step-6-attach-cameras-to-esps",a:"step-6-attach-cameras-to-esps"},"18.8":{t:"step-7-connect-esp-to-the-programmer-to-flash",p:"Why flash before you have it assembled? It's simple, to make s ...",l:"how_to_build/full_build.html#step-7-connect-esp-to-the-programmer-to-flash",a:"step-7-connect-esp-to-the-programmer-to-flash"},"18.9":{t:"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware",p:`Check out our guide on Setting up VS Code +Once VS Code is set ...`,l:"how_to_build/full_build.html#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware",a:"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware"},"18.10":{t:"step-9-plug-in-your-esp-and-flash-the-firmware",p:"Our guide, Building and uploading the firmware manually has st ...",l:"how_to_build/full_build.html#step-9-plug-in-your-esp-and-flash-the-firmware",a:"step-9-plug-in-your-esp-and-flash-the-firmware"},"18.11":{t:"step-10-connect-your-power-wires-to-a-usb-type-a-board",p:`::: warning +Powering from the programmer board will not work c ...`,l:"how_to_build/full_build.html#step-10-connect-your-power-wires-to-a-usb-type-a-board",a:"step-10-connect-your-power-wires-to-a-usb-type-a-board"},"18.12":{t:"step-11-cut-wires-for-ir-leds",p:"To find the optimal length, take a piece of wire and a marker ...",l:"how_to_build/full_build.html#step-11-cut-wires-for-ir-leds",a:"step-11-cut-wires-for-ir-leds"},"18.13":{t:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",p:"Once twisted together add solder to keep them together. This m ...",l:"how_to_build/full_build.html#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",a:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them"},"18.14":{t:"step-13-solder-the-positive-wire-to-esp",p:`Lay the wire on the outside of the 5V pin and apply solder. +&l ...`,l:"how_to_build/full_build.html#step-13-solder-the-positive-wire-to-esp",a:"step-13-solder-the-positive-wire-to-esp"},"18.15":{t:"step-14-solder-the-negative-wire-to-esp",p:`Repeat Step 12 but with the negative wires. +::: info +As a user ...`,l:"how_to_build/full_build.html#step-14-solder-the-negative-wire-to-esp",a:"step-14-solder-the-negative-wire-to-esp"},"18.16":{t:"step-15-wire-up-the-2nd-esp",p:`Repeat steps 12-14 with the 2nd ESP. +`,l:"how_to_build/full_build.html#step-15-wire-up-the-2nd-esp",a:"step-15-wire-up-the-2nd-esp"},"18.17":{t:"step-16-prepare-to-solder-ir-led-pcbs",p:"Get your magnifying glass out, it's time to solder very smol t ...",l:"how_to_build/full_build.html#step-16-prepare-to-solder-ir-led-pcbs",a:"step-16-prepare-to-solder-ir-led-pcbs"},"18.18":{t:"step-18-solder-resistors-on-pcb-v3",p:`You only need 1 PCB to have resistors per eye. +Tin the resisto ...`,l:"how_to_build/full_build.html#step-18-solder-resistors-on-pcb-v3",a:"step-18-solder-resistors-on-pcb-v3"},"18.19":{t:"solder-leds-on-pcb-v3",p:`Tin the LED pads. +<ImageCard :options="image_settings. ...`,l:"how_to_build/full_build.html#solder-leds-on-pcb-v3",a:"solder-leds-on-pcb-v3"},"18.20":{t:"wire-up-the-pcbs-v3",p:`::: warning +Pay attention to the direction of the LEDs on the ...`,l:"how_to_build/full_build.html#wire-up-the-pcbs-v3",a:"wire-up-the-pcbs-v3"},"18.21":{t:"step-19-3d-print-mounts",p:`Head to the 3D printed parts section of the parts list here. +F ...`,l:"how_to_build/full_build.html#step-19-3d-print-mounts",a:"step-19-3d-print-mounts"},"18.22":{t:"ir-led-mounting",p:`This again differs from mount to mount. +In some cases, there a ...`,l:"how_to_build/full_build.html#ir-led-mounting",a:"ir-led-mounting"},"19.0":{t:"# Parts List ",p:`<Alerts :options="alerts.parts_list_one"> +< ...`,l:"how_to_build/parts_list.html",a:"text-var-font-accent"},"19.1":{t:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",p:`<Alerts :options="alerts.parts_list_two"> +< ...`,l:"how_to_build/parts_list.html#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",a:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup"},"19.2":{t:"camera-setup",p:` + +2x ESP-CAM-32 modules + + +AliExpress + + +2x ov2640 160° FOV IR / ...`,l:"how_to_build/parts_list.html#camera-setup",a:"camera-setup"},"19.3":{t:"recommended",p:` + +Antennas + + +Optional but recommended if you're running vive f ...`,l:"how_to_build/parts_list.html#recommended",a:"recommended"},"19.4":{t:"ir-emitters",p:`IR LED kit +If you do not want to source things from multiple p ...`,l:"how_to_build/parts_list.html#ir-emitters",a:"ir-emitters"},"19.5":{t:"misc-parts",p:` + +1x Hot glue or another form of glue. +AliExpress +Amazon + + +1x ...`,l:"how_to_build/parts_list.html#misc-parts",a:"misc-parts"},"19.6":{t:"_3d-printed-mounts",p:"Mounts with a ★ next to them are the recommended mounts for th ...",l:"how_to_build/parts_list.html#_3d-printed-mounts",a:"_3d-printed-mounts"},"20.0":{t:"",p:`layout: home +hero: +name: EyeTrackVR Docs +text: Opensource and ...`,l:"index.html",a:""},"21.0":{t:"# Frequently Asked Questions ",p:`<br> + +<FAQ /> +`,l:"misc/faq.html",a:"text-var-font-accent"},"22.0":{t:"# How to set up your avatar for eye tracking: ",p:`Here is an avatar setup video created by a contributor: +<di ...`,l:"misc/vrc_avatar_setup.html",a:"text-var-font-accent"},"23.0":{t:"# Build the app from source ",p:"",l:"software_guide/build_software.html",a:"text-var-font-accent"},"23.1":{t:"this-guide-will-show-how-to-build-the-app-from-source",p:`<Alerts :options="alerts.build_software_one"> + ...`,l:"software_guide/build_software.html#this-guide-will-show-how-to-build-the-app-from-source",a:"this-guide-will-show-how-to-build-the-app-from-source"},"23.2":{t:"requirements",p:`<CheckList :options="{...Requirements}"/> +`,l:"software_guide/build_software.html#requirements",a:"requirements"},"23.3":{t:"install-python",p:"EyetrackVR is currently using Python 3.11.0 Before you continu ...",l:"software_guide/build_software.html#install-python",a:"install-python"},"23.4":{t:"installing-poetry",p:"Since version 0.1.7 of EyeTrackVR, we have been using Poetry t ...",l:"software_guide/build_software.html#installing-poetry",a:"installing-poetry"},"23.5":{t:"install-the-required-python-modules",p:"After cloning the project and installing Poetry, open a comman ...",l:"software_guide/build_software.html#install-the-required-python-modules",a:"install-the-required-python-modules"},"23.6":{t:"build-the-app",p:`Now, you should be ready to build the app. +With a command prom ...`,l:"software_guide/build_software.html#build-the-app",a:"build-the-app"},"24.0":{t:"# How to install, run and adjust the EyeTrackVR app. ",p:"Step 1: Download the EyeTrackVR Installer and install the EyeT ...",l:"software_guide/eyetrackvr_app_guide.html",a:"text-var-font-accent"},"24.1":{t:"step-2-run-the-eyetrackvr-app",p:"If the Create Desktop Shortcut option was checked you should s ...",l:"software_guide/eyetrackvr_app_guide.html#step-2-run-the-eyetrackvr-app",a:"step-2-run-the-eyetrackvr-app"},"24.2":{t:"step-3-getting-familiar-with-settings-and-terminology",p:"Let's go over some basic terminology you will find in the app. ...",l:"software_guide/eyetrackvr_app_guide.html#step-3-getting-familiar-with-settings-and-terminology",a:"step-3-getting-familiar-with-settings-and-terminology"},"24.3":{t:"step-4-adding-your-cameras-to-the-software-and-configuring-them",p:"Power your ESPs and find what the IP address is for your right ...",l:"software_guide/eyetrackvr_app_guide.html#step-4-adding-your-cameras-to-the-software-and-configuring-them",a:"step-4-adding-your-cameras-to-the-software-and-configuring-them"},"24.4":{t:"step-5-calibrating-your-eyes",p:"Once your eye is trackable by the software we need to calibrat ...",l:"software_guide/eyetrackvr_app_guide.html#step-5-calibrating-your-eyes",a:"step-5-calibrating-your-eyes"},"24.5":{t:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",p:"",l:"software_guide/eyetrackvr_app_guide.html#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",a:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001"}},o={previewLength:62,buttonLabel:"Search",placeholder:"Search docs",preset:"score",cache:1e3,context:!0},a={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:o};export{a as default}; diff --git a/assets/contact.md.0d2a9076.js b/assets/contact.md.c7df13d0.js similarity index 92% rename from assets/contact.md.0d2a9076.js rename to assets/contact.md.c7df13d0.js index 072b135..9cf24bc 100644 --- a/assets/contact.md.0d2a9076.js +++ b/assets/contact.md.c7df13d0.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,g as e,b as s}from"./app.24a1fc0a.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=e("div",{align:"center",class:"rounded-md"},[e("h1",{class:"text-[#ab5ac7]"},"Contact Us"),e("br"),s(" Please join our Discord for updates and any questions. "),e("br"),e("br"),e("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1),d=[c];function n(i,l,p,_,m,u){return a(),o("div",null,d)}const b=t(r,[["render",n]]);export{f as __pageData,b as default}; +import{_ as t,o as a,c as o,g as e,b as s}from"./app.ffc675f3.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=e("div",{align:"center",class:"rounded-md"},[e("h1",{class:"text-[#ab5ac7]"},"Contact Us"),e("br"),s(" Please join our Discord for updates and any questions. "),e("br"),e("br"),e("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1),d=[c];function n(i,l,p,_,m,u){return a(),o("div",null,d)}const b=t(r,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/contact.md.0d2a9076.lean.js b/assets/contact.md.c7df13d0.lean.js similarity index 92% rename from assets/contact.md.0d2a9076.lean.js rename to assets/contact.md.c7df13d0.lean.js index 072b135..9cf24bc 100644 --- a/assets/contact.md.0d2a9076.lean.js +++ b/assets/contact.md.c7df13d0.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,g as e,b as s}from"./app.24a1fc0a.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=e("div",{align:"center",class:"rounded-md"},[e("h1",{class:"text-[#ab5ac7]"},"Contact Us"),e("br"),s(" Please join our Discord for updates and any questions. "),e("br"),e("br"),e("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1),d=[c];function n(i,l,p,_,m,u){return a(),o("div",null,d)}const b=t(r,[["render",n]]);export{f as __pageData,b as default}; +import{_ as t,o as a,c as o,g as e,b as s}from"./app.ffc675f3.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=e("div",{align:"center",class:"rounded-md"},[e("h1",{class:"text-[#ab5ac7]"},"Contact Us"),e("br"),s(" Please join our Discord for updates and any questions. "),e("br"),e("br"),e("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1),d=[c];function n(i,l,p,_,m,u){return a(),o("div",null,d)}const b=t(r,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/dev_roadmap.md.787025a7.js b/assets/dev_roadmap.md.ff471091.js similarity index 94% rename from assets/dev_roadmap.md.787025a7.js rename to assets/dev_roadmap.md.ff471091.js index b52fd84..d840294 100644 --- a/assets/dev_roadmap.md.787025a7.js +++ b/assets/dev_roadmap.md.ff471091.js @@ -1 +1 @@ -import{_ as t}from"./chunks/CheckBoxList.b2594454.js";import{o,c as r,a as l,u as n,g as e,b as a}from"./app.24a1fc0a.js";const s={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"}]},i={state:!1,object:[{label:"Variable eye openness tracking"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Auto threshold's"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"Power regulator board"},{label:"New IR LED PCB (only for the power reg board)"}]},d={state:!1,object:[{label:"Support for binary parameters"},{label:"Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"Custom ESP-CAM boards"}]},c=e("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[a("EyeTrackVR Development Roadmap "),e("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-hidden":"true"},"#")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),h=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-hidden":"true"},"#")],-1),m=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-hidden":"true"},"#")],-1),u=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-hidden":"true"},"#")],-1),k=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[{"level":2,"title":"Completed","slug":"completed","link":"#completed","children":[]},{"level":2,"title":"In Progress","slug":"in-progress","link":"#in-progress","children":[]},{"level":2,"title":"Planned","slug":"planned","link":"#planned","children":[]}],"relativePath":"dev_roadmap.md","lastUpdated":1676223729000}'),b={name:"dev_roadmap.md"},y=Object.assign(b,{setup(g){return(_,f)=>(o(),r("div",null,[c,p,h,l(t,{options:{...n(s)}},null,8,["options"]),m,l(t,{options:{...n(i)}},null,8,["options"]),u,l(t,{options:{...n(d)}},null,8,["options"])]))}});export{k as __pageData,y as default}; +import{_ as t}from"./chunks/CheckBoxList.0e3746ef.js";import{o,c as r,a as l,u as n,g as e,b as a}from"./app.ffc675f3.js";const s={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"}]},i={state:!1,object:[{label:"Variable eye openness tracking"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Auto threshold's"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"Power regulator board"},{label:"New IR LED PCB (only for the power reg board)"}]},d={state:!1,object:[{label:"Support for binary parameters"},{label:"Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"Custom ESP-CAM boards"}]},c=e("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[a("EyeTrackVR Development Roadmap "),e("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-hidden":"true"},"#")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),h=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-hidden":"true"},"#")],-1),m=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-hidden":"true"},"#")],-1),u=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-hidden":"true"},"#")],-1),k=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[{"level":2,"title":"Completed","slug":"completed","link":"#completed","children":[]},{"level":2,"title":"In Progress","slug":"in-progress","link":"#in-progress","children":[]},{"level":2,"title":"Planned","slug":"planned","link":"#planned","children":[]}],"relativePath":"dev_roadmap.md","lastUpdated":1676223729000}'),b={name:"dev_roadmap.md"},y=Object.assign(b,{setup(g){return(_,f)=>(o(),r("div",null,[c,p,h,l(t,{options:{...n(s)}},null,8,["options"]),m,l(t,{options:{...n(i)}},null,8,["options"]),u,l(t,{options:{...n(d)}},null,8,["options"])]))}});export{k as __pageData,y as default}; diff --git a/assets/dev_roadmap.md.787025a7.lean.js b/assets/dev_roadmap.md.ff471091.lean.js similarity index 94% rename from assets/dev_roadmap.md.787025a7.lean.js rename to assets/dev_roadmap.md.ff471091.lean.js index b52fd84..d840294 100644 --- a/assets/dev_roadmap.md.787025a7.lean.js +++ b/assets/dev_roadmap.md.ff471091.lean.js @@ -1 +1 @@ -import{_ as t}from"./chunks/CheckBoxList.b2594454.js";import{o,c as r,a as l,u as n,g as e,b as a}from"./app.24a1fc0a.js";const s={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"}]},i={state:!1,object:[{label:"Variable eye openness tracking"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Auto threshold's"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"Power regulator board"},{label:"New IR LED PCB (only for the power reg board)"}]},d={state:!1,object:[{label:"Support for binary parameters"},{label:"Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"Custom ESP-CAM boards"}]},c=e("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[a("EyeTrackVR Development Roadmap "),e("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-hidden":"true"},"#")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),h=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-hidden":"true"},"#")],-1),m=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-hidden":"true"},"#")],-1),u=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-hidden":"true"},"#")],-1),k=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[{"level":2,"title":"Completed","slug":"completed","link":"#completed","children":[]},{"level":2,"title":"In Progress","slug":"in-progress","link":"#in-progress","children":[]},{"level":2,"title":"Planned","slug":"planned","link":"#planned","children":[]}],"relativePath":"dev_roadmap.md","lastUpdated":1676223729000}'),b={name:"dev_roadmap.md"},y=Object.assign(b,{setup(g){return(_,f)=>(o(),r("div",null,[c,p,h,l(t,{options:{...n(s)}},null,8,["options"]),m,l(t,{options:{...n(i)}},null,8,["options"]),u,l(t,{options:{...n(d)}},null,8,["options"])]))}});export{k as __pageData,y as default}; +import{_ as t}from"./chunks/CheckBoxList.0e3746ef.js";import{o,c as r,a as l,u as n,g as e,b as a}from"./app.ffc675f3.js";const s={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"}]},i={state:!1,object:[{label:"Variable eye openness tracking"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Auto threshold's"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"Power regulator board"},{label:"New IR LED PCB (only for the power reg board)"}]},d={state:!1,object:[{label:"Support for binary parameters"},{label:"Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"Custom ESP-CAM boards"}]},c=e("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[a("EyeTrackVR Development Roadmap "),e("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-hidden":"true"},"#")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),h=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-hidden":"true"},"#")],-1),m=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-hidden":"true"},"#")],-1),u=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-hidden":"true"},"#")],-1),k=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[{"level":2,"title":"Completed","slug":"completed","link":"#completed","children":[]},{"level":2,"title":"In Progress","slug":"in-progress","link":"#in-progress","children":[]},{"level":2,"title":"Planned","slug":"planned","link":"#planned","children":[]}],"relativePath":"dev_roadmap.md","lastUpdated":1676223729000}'),b={name:"dev_roadmap.md"},y=Object.assign(b,{setup(g){return(_,f)=>(o(),r("div",null,[c,p,h,l(t,{options:{...n(s)}},null,8,["options"]),m,l(t,{options:{...n(i)}},null,8,["options"]),u,l(t,{options:{...n(d)}},null,8,["options"])]))}});export{k as __pageData,y as default}; diff --git a/assets/development_docs_dev_docs.md.f24037a5.js b/assets/development_docs_dev_docs.md.c984c92b.js similarity index 98% rename from assets/development_docs_dev_docs.md.f24037a5.js rename to assets/development_docs_dev_docs.md.c984c92b.js index dad343d..fd359a3 100644 --- a/assets/development_docs_dev_docs.md.f24037a5.js +++ b/assets/development_docs_dev_docs.md.c984c92b.js @@ -1,4 +1,4 @@ -import{_ as e,o as a,c as t,h as s}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Prerequisites","slug":"prerequisites","link":"#prerequisites","children":[]},{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Contributing","slug":"contributing","link":"#contributing","children":[{"level":3,"title":"Project Structure","slug":"project-structure","link":"#project-structure","children":[]}]}],"relativePath":"development/docs/dev_docs.md","lastUpdated":1677868200000}'),r={name:"development/docs/dev_docs.md"},n=s(`

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/RedHawk989/EyeTrackVR-Docs.git
    +import{_ as e,o as a,c as t,h as s}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Prerequisites","slug":"prerequisites","link":"#prerequisites","children":[]},{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Contributing","slug":"contributing","link":"#contributing","children":[{"level":3,"title":"Project Structure","slug":"project-structure","link":"#project-structure","children":[]}]}],"relativePath":"development/docs/dev_docs.md","lastUpdated":1677868200000}'),r={name:"development/docs/dev_docs.md"},n=s(`

    Development Documentation for the EyeTrackVR Docs Site

    This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

    Getting Started

    Prerequisites

    • Node.js (v14.15.4 or higher)
    • Yarn (v1.22.10 or higher)
    • Git (v2.30.1 or higher)
    • VSCode (v1.56.2 or higher)

    Installation

    1. Clone the repo

      sh
      git clone https://github.com/RedHawk989/EyeTrackVR-Docs.git
       
    2. Navigate to the vitepress folder

      sh
      cd vitepress
       
    3. Install Yarn packages

      sh
       yarn
       
    4. Start the dev server

      sh
      yarn dev
      diff --git a/assets/development_docs_dev_docs.md.f24037a5.lean.js b/assets/development_docs_dev_docs.md.c984c92b.lean.js
      similarity index 93%
      rename from assets/development_docs_dev_docs.md.f24037a5.lean.js
      rename to assets/development_docs_dev_docs.md.c984c92b.lean.js
      index c306fda..5c4f020 100644
      --- a/assets/development_docs_dev_docs.md.f24037a5.lean.js
      +++ b/assets/development_docs_dev_docs.md.c984c92b.lean.js
      @@ -1 +1 @@
      -import{_ as e,o as a,c as t,h as s}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Prerequisites","slug":"prerequisites","link":"#prerequisites","children":[]},{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Contributing","slug":"contributing","link":"#contributing","children":[{"level":3,"title":"Project Structure","slug":"project-structure","link":"#project-structure","children":[]}]}],"relativePath":"development/docs/dev_docs.md","lastUpdated":1677868200000}'),r={name:"development/docs/dev_docs.md"},n=s("",12),i=[n];function l(o,c,d,p,h,u){return a(),t("div",null,i)}const v=e(r,[["render",l]]);export{m as __pageData,v as default};
      +import{_ as e,o as a,c as t,h as s}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Prerequisites","slug":"prerequisites","link":"#prerequisites","children":[]},{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Contributing","slug":"contributing","link":"#contributing","children":[{"level":3,"title":"Project Structure","slug":"project-structure","link":"#project-structure","children":[]}]}],"relativePath":"development/docs/dev_docs.md","lastUpdated":1677868200000}'),r={name:"development/docs/dev_docs.md"},n=s("",12),i=[n];function l(o,c,d,p,h,u){return a(),t("div",null,i)}const v=e(r,[["render",l]]);export{m as __pageData,v as default};
      diff --git a/assets/development_docs_pages.md.59411662.js b/assets/development_docs_pages.md.08f3671d.js
      similarity index 99%
      rename from assets/development_docs_pages.md.59411662.js
      rename to assets/development_docs_pages.md.08f3671d.js
      index 03fff41..bbd7525 100644
      --- a/assets/development_docs_pages.md.59411662.js
      +++ b/assets/development_docs_pages.md.08f3671d.js
      @@ -1,4 +1,4 @@
      -import{_ as e,o as s,c as a,h as n}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[{"level":2,"title":"Adding a Page","slug":"adding-a-page","link":"#adding-a-page","children":[{"level":3,"title":"Sub-directories","slug":"sub-directories","link":"#sub-directories","children":[]},{"level":3,"title":"Adding a Page to the Sidebar","slug":"adding-a-page-to-the-sidebar","link":"#adding-a-page-to-the-sidebar","children":[]},{"level":3,"title":"Title Style","slug":"title-style","link":"#title-style","children":[]}]},{"level":2,"title":"Editing a Page","slug":"editing-a-page","link":"#editing-a-page","children":[]}],"relativePath":"development/docs/pages.md","lastUpdated":1677868200000}'),o={name:"development/docs/pages.md"},l=n(`

      Pages

      This section will cover how to add or edit pages on the docs website.

      Please use the Github Markdown flavour for your Markdown files.

      Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

      Adding a Page

      To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.

      Sub-directories

      You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.

      This is useful for organizing pages into categories.

      Adding a Page to the Sidebar

      To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

      To do this, you will need to add the page to the sidebar object.

      For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

      js
      {
      +import{_ as e,o as s,c as a,h as n}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[{"level":2,"title":"Adding a Page","slug":"adding-a-page","link":"#adding-a-page","children":[{"level":3,"title":"Sub-directories","slug":"sub-directories","link":"#sub-directories","children":[]},{"level":3,"title":"Adding a Page to the Sidebar","slug":"adding-a-page-to-the-sidebar","link":"#adding-a-page-to-the-sidebar","children":[]},{"level":3,"title":"Title Style","slug":"title-style","link":"#title-style","children":[]}]},{"level":2,"title":"Editing a Page","slug":"editing-a-page","link":"#editing-a-page","children":[]}],"relativePath":"development/docs/pages.md","lastUpdated":1677868200000}'),o={name:"development/docs/pages.md"},l=n(`

      Pages

      This section will cover how to add or edit pages on the docs website.

      Please use the Github Markdown flavour for your Markdown files.

      Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

      Adding a Page

      To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.

      Sub-directories

      You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.

      This is useful for organizing pages into categories.

      Adding a Page to the Sidebar

      To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

      To do this, you will need to add the page to the sidebar object.

      For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

      js
      {
           text: "Getting Started",
           collapsible: true,
           items: [
      diff --git a/assets/development_docs_pages.md.59411662.lean.js b/assets/development_docs_pages.md.08f3671d.lean.js
      similarity index 93%
      rename from assets/development_docs_pages.md.59411662.lean.js
      rename to assets/development_docs_pages.md.08f3671d.lean.js
      index 065664f..59d1c82 100644
      --- a/assets/development_docs_pages.md.59411662.lean.js
      +++ b/assets/development_docs_pages.md.08f3671d.lean.js
      @@ -1 +1 @@
      -import{_ as e,o as s,c as a,h as n}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[{"level":2,"title":"Adding a Page","slug":"adding-a-page","link":"#adding-a-page","children":[{"level":3,"title":"Sub-directories","slug":"sub-directories","link":"#sub-directories","children":[]},{"level":3,"title":"Adding a Page to the Sidebar","slug":"adding-a-page-to-the-sidebar","link":"#adding-a-page-to-the-sidebar","children":[]},{"level":3,"title":"Title Style","slug":"title-style","link":"#title-style","children":[]}]},{"level":2,"title":"Editing a Page","slug":"editing-a-page","link":"#editing-a-page","children":[]}],"relativePath":"development/docs/pages.md","lastUpdated":1677868200000}'),o={name:"development/docs/pages.md"},l=n("",24),t=[l];function p(c,r,i,d,y,F){return s(),a("div",null,t)}const D=e(o,[["render",p]]);export{u as __pageData,D as default};
      +import{_ as e,o as s,c as a,h as n}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[{"level":2,"title":"Adding a Page","slug":"adding-a-page","link":"#adding-a-page","children":[{"level":3,"title":"Sub-directories","slug":"sub-directories","link":"#sub-directories","children":[]},{"level":3,"title":"Adding a Page to the Sidebar","slug":"adding-a-page-to-the-sidebar","link":"#adding-a-page-to-the-sidebar","children":[]},{"level":3,"title":"Title Style","slug":"title-style","link":"#title-style","children":[]}]},{"level":2,"title":"Editing a Page","slug":"editing-a-page","link":"#editing-a-page","children":[]}],"relativePath":"development/docs/pages.md","lastUpdated":1677868200000}'),o={name:"development/docs/pages.md"},l=n("",24),t=[l];function p(c,r,i,d,y,F){return s(),a("div",null,t)}const D=e(o,[["render",p]]);export{u as __pageData,D as default};
      diff --git a/assets/development_docs_standards.md.bb372161.js b/assets/development_docs_standards.md.4c4a8f40.js
      similarity index 99%
      rename from assets/development_docs_standards.md.bb372161.js
      rename to assets/development_docs_standards.md.4c4a8f40.js
      index 34b1eb7..58fc0e2 100644
      --- a/assets/development_docs_standards.md.bb372161.js
      +++ b/assets/development_docs_standards.md.4c4a8f40.js
      @@ -1,4 +1,4 @@
      -import{_ as e,o as s,c as a,h as n}from"./app.24a1fc0a.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"Code Standards","slug":"code-standards","link":"#code-standards","children":[{"level":3,"title":"General","slug":"general","link":"#general","children":[]},{"level":3,"title":"Git Commit Style","slug":"git-commit-style","link":"#git-commit-style","children":[]}]}],"relativePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n(`

      Standards Guide

      Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

      Code Standards

      General

      It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

      We have only a few rules for the documentation site:

      • All code should be written in English.
      • All code should be written in a way that is easy to understand.
      • All code should be written in a way that is easy to maintain.
      • All code should be written in a way that is easy to extend.
      • Our git commit style is to be followed, in english only.

      Git Commit Style

      We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

      Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

      The following is a list of the customizations that we have made to the Conventional Commits standard:

      • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

      Our git commit style is as follows:

      bash
      <type>[optional scope]: <description>
      +import{_ as e,o as s,c as a,h as n}from"./app.ffc675f3.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"Code Standards","slug":"code-standards","link":"#code-standards","children":[{"level":3,"title":"General","slug":"general","link":"#general","children":[]},{"level":3,"title":"Git Commit Style","slug":"git-commit-style","link":"#git-commit-style","children":[]}]}],"relativePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n(`

      Standards Guide

      Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

      Code Standards

      General

      It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

      We have only a few rules for the documentation site:

      • All code should be written in English.
      • All code should be written in a way that is easy to understand.
      • All code should be written in a way that is easy to maintain.
      • All code should be written in a way that is easy to extend.
      • Our git commit style is to be followed, in english only.

      Git Commit Style

      We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

      Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

      The following is a list of the customizations that we have made to the Conventional Commits standard:

      • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

      Our git commit style is as follows:

      bash
      <type>[optional scope]: <description>
       
       [optional body]
       
      diff --git a/assets/development_docs_standards.md.bb372161.lean.js b/assets/development_docs_standards.md.4c4a8f40.lean.js
      similarity index 90%
      rename from assets/development_docs_standards.md.bb372161.lean.js
      rename to assets/development_docs_standards.md.4c4a8f40.lean.js
      index 060b86c..4127319 100644
      --- a/assets/development_docs_standards.md.bb372161.lean.js
      +++ b/assets/development_docs_standards.md.4c4a8f40.lean.js
      @@ -1 +1 @@
      -import{_ as e,o as s,c as a,h as n}from"./app.24a1fc0a.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"Code Standards","slug":"code-standards","link":"#code-standards","children":[{"level":3,"title":"General","slug":"general","link":"#general","children":[]},{"level":3,"title":"Git Commit Style","slug":"git-commit-style","link":"#git-commit-style","children":[]}]}],"relativePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n("",18),l=[o];function i(r,c,p,d,h,m){return s(),a("div",null,l)}const C=e(t,[["render",i]]);export{y as __pageData,C as default};
      +import{_ as e,o as s,c as a,h as n}from"./app.ffc675f3.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"Code Standards","slug":"code-standards","link":"#code-standards","children":[{"level":3,"title":"General","slug":"general","link":"#general","children":[]},{"level":3,"title":"Git Commit Style","slug":"git-commit-style","link":"#git-commit-style","children":[]}]}],"relativePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n("",18),l=[o];function i(r,c,p,d,h,m){return s(),a("div",null,l)}const C=e(t,[["render",i]]);export{y as __pageData,C as default};
      diff --git a/assets/firmware_guide_configure_firmware.md.064ffccc.js b/assets/firmware_guide_configure_firmware.md.3641ea6f.js
      similarity index 83%
      rename from assets/firmware_guide_configure_firmware.md.064ffccc.js
      rename to assets/firmware_guide_configure_firmware.md.3641ea6f.js
      index 4e721e4..9d1efe9 100644
      --- a/assets/firmware_guide_configure_firmware.md.064ffccc.js
      +++ b/assets/firmware_guide_configure_firmware.md.3641ea6f.js
      @@ -1 +1 @@
      -import{_ as s,a as d}from"./chunks/index.47cb84cc.js";import{_ as i,i as n}from"./chunks/index.99ba4c01.js";import{o as h,c,a as t,u as a,w as l,g as e,b as o,h as r}from"./app.24a1fc0a.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-hidden":"true"},"#")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-hidden":"true"},"#")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-hidden":"true"},"#")],-1),m=r('

      Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.

      INFO

      Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

      Spaces are not supported either. If you have a space in either, you will need to change it.

      The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.

      Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

      You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

      Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

      ',2),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),g=r('

      Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

      Additonal configuration

      mDNS

      If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.

      OTA

      The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

      You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

      REST API

      The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

      This feature is used more for advanced users, and is not required for basic operation.

      The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

      The full REST API is documented here.

      Environments

      The firmware supports multiple environments. This means that we have full support for multiple types of esps. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one. The environments are as follows:

      • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
      • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
      • esp32M5Stack - This is for ESP32M5Stack.
      • esp32WRover - This is for the ESP32WRover.
      • esp-eye - This is for the ESP-EYE (not the S3 variant).

      Each environment has a debug and release configuration. The debug configuration is for debugging, and the release configuration is for production. The debug configuration is not recommended for production, as it will use more memory, and will be slower. However we recommend using the debug configuration for initial configuration and testing, as it will be easier to debug, for you and for us. Once you are confident that the firmware is working correctly, you can switch to the release configuration.

      The debug configuration will print out debug messages to the serial port. The release configuration will not print out debug messages to the serial port, and will only print errors. This will save memory, and will make the firmware faster.

      The default configutration is debug for the espAIThinker environment. If you are using a different ESP, please follow the GIF(s) below to change the environment.

      Coming Soon

      GIF(s) for changing the environment will be added soon.

      Want to help? Submit a PR to add the GIF(s).

      Coming Soon

      We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.

      Now, move on to uploading the firmware

      ',21),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[{"level":2,"title":"Once you have opened the project, you should see something on the left side like this","slug":"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","link":"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","children":[]},{"level":2,"title":"Open the ini/user_config.ini file","slug":"open-the-ini-user-config-ini-file","link":"#open-the-ini-user-config-ini-file","children":[{"level":3,"title":"Additonal configuration","slug":"additonal-configuration","link":"#additonal-configuration","children":[]}]},{"level":2,"title":"Now, move on to uploading the firmware","slug":"now-move-on-to-uploading-the-firmware","link":"#now-move-on-to-uploading-the-firmware","children":[]}],"relativePath":"firmware_guide/configure_firmware.md","lastUpdated":1676590091000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(_){return(b,S)=>(h(),c("div",null,[u,p,t(i,{options:a(n).configure_firmware_one},null,8,["options"]),f,t(i,{options:a(n).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),g]))}});export{k as __pageData,E as default}; +import{_ as s,a as d}from"./chunks/index.5b1f69a8.js";import{_ as i,i as n}from"./chunks/index.1d77087a.js";import{o as h,c,a as t,u as a,w as l,g as e,b as o,h as r}from"./app.ffc675f3.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-hidden":"true"},"#")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-hidden":"true"},"#")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-hidden":"true"},"#")],-1),m=r('

      Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.

      INFO

      Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

      Spaces are not supported either. If you have a space in either, you will need to change it.

      The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.

      Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

      You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

      Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

      ',2),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),g=r('

      Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

      Additonal configuration

      mDNS

      If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.

      OTA

      The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

      You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

      REST API

      The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

      This feature is used more for advanced users, and is not required for basic operation.

      The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

      The full REST API is documented here.

      Environments

      The firmware supports multiple environments. This means that we have full support for multiple types of esps. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one. The environments are as follows:

      • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
      • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
      • esp32M5Stack - This is for ESP32M5Stack.
      • esp32WRover - This is for the ESP32WRover.
      • esp-eye - This is for the ESP-EYE (not the S3 variant).

      Each environment has a debug and release configuration. The debug configuration is for debugging, and the release configuration is for production. The debug configuration is not recommended for production, as it will use more memory, and will be slower. However we recommend using the debug configuration for initial configuration and testing, as it will be easier to debug, for you and for us. Once you are confident that the firmware is working correctly, you can switch to the release configuration.

      The debug configuration will print out debug messages to the serial port. The release configuration will not print out debug messages to the serial port, and will only print errors. This will save memory, and will make the firmware faster.

      The default configutration is debug for the espAIThinker environment. If you are using a different ESP, please follow the GIF(s) below to change the environment.

      Coming Soon

      GIF(s) for changing the environment will be added soon.

      Want to help? Submit a PR to add the GIF(s).

      Coming Soon

      We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.

      Now, move on to uploading the firmware

      ',21),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[{"level":2,"title":"Once you have opened the project, you should see something on the left side like this","slug":"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","link":"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","children":[]},{"level":2,"title":"Open the ini/user_config.ini file","slug":"open-the-ini-user-config-ini-file","link":"#open-the-ini-user-config-ini-file","children":[{"level":3,"title":"Additonal configuration","slug":"additonal-configuration","link":"#additonal-configuration","children":[]}]},{"level":2,"title":"Now, move on to uploading the firmware","slug":"now-move-on-to-uploading-the-firmware","link":"#now-move-on-to-uploading-the-firmware","children":[]}],"relativePath":"firmware_guide/configure_firmware.md","lastUpdated":1678402493000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(_){return(b,S)=>(h(),c("div",null,[u,p,t(i,{options:a(n).configure_firmware_one},null,8,["options"]),f,t(i,{options:a(n).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),g]))}});export{k as __pageData,E as default}; diff --git a/assets/firmware_guide_configure_firmware.md.064ffccc.lean.js b/assets/firmware_guide_configure_firmware.md.3641ea6f.lean.js similarity index 89% rename from assets/firmware_guide_configure_firmware.md.064ffccc.lean.js rename to assets/firmware_guide_configure_firmware.md.3641ea6f.lean.js index b2e53c1..c42109e 100644 --- a/assets/firmware_guide_configure_firmware.md.064ffccc.lean.js +++ b/assets/firmware_guide_configure_firmware.md.3641ea6f.lean.js @@ -1 +1 @@ -import{_ as s,a as d}from"./chunks/index.47cb84cc.js";import{_ as i,i as n}from"./chunks/index.99ba4c01.js";import{o as h,c,a as t,u as a,w as l,g as e,b as o,h as r}from"./app.24a1fc0a.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-hidden":"true"},"#")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-hidden":"true"},"#")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-hidden":"true"},"#")],-1),m=r("",2),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),g=r("",21),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[{"level":2,"title":"Once you have opened the project, you should see something on the left side like this","slug":"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","link":"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","children":[]},{"level":2,"title":"Open the ini/user_config.ini file","slug":"open-the-ini-user-config-ini-file","link":"#open-the-ini-user-config-ini-file","children":[{"level":3,"title":"Additonal configuration","slug":"additonal-configuration","link":"#additonal-configuration","children":[]}]},{"level":2,"title":"Now, move on to uploading the firmware","slug":"now-move-on-to-uploading-the-firmware","link":"#now-move-on-to-uploading-the-firmware","children":[]}],"relativePath":"firmware_guide/configure_firmware.md","lastUpdated":1676590091000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(_){return(b,S)=>(h(),c("div",null,[u,p,t(i,{options:a(n).configure_firmware_one},null,8,["options"]),f,t(i,{options:a(n).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),g]))}});export{k as __pageData,E as default}; +import{_ as s,a as d}from"./chunks/index.5b1f69a8.js";import{_ as i,i as n}from"./chunks/index.1d77087a.js";import{o as h,c,a as t,u as a,w as l,g as e,b as o,h as r}from"./app.ffc675f3.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-hidden":"true"},"#")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-hidden":"true"},"#")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-hidden":"true"},"#")],-1),m=r("",2),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),g=r("",21),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[{"level":2,"title":"Once you have opened the project, you should see something on the left side like this","slug":"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","link":"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","children":[]},{"level":2,"title":"Open the ini/user_config.ini file","slug":"open-the-ini-user-config-ini-file","link":"#open-the-ini-user-config-ini-file","children":[{"level":3,"title":"Additonal configuration","slug":"additonal-configuration","link":"#additonal-configuration","children":[]}]},{"level":2,"title":"Now, move on to uploading the firmware","slug":"now-move-on-to-uploading-the-firmware","link":"#now-move-on-to-uploading-the-firmware","children":[]}],"relativePath":"firmware_guide/configure_firmware.md","lastUpdated":1678402493000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(_){return(b,S)=>(h(),c("div",null,[u,p,t(i,{options:a(n).configure_firmware_one},null,8,["options"]),f,t(i,{options:a(n).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),g]))}});export{k as __pageData,E as default}; diff --git a/assets/firmware_guide_environments.md.216a4654.js b/assets/firmware_guide_environments.md.36d19564.js similarity index 95% rename from assets/firmware_guide_environments.md.216a4654.js rename to assets/firmware_guide_environments.md.36d19564.js index d1190ad..de26cdc 100644 --- a/assets/firmware_guide_environments.md.216a4654.js +++ b/assets/firmware_guide_environments.md.36d19564.js @@ -1 +1 @@ -import{_ as e,o,c as t,h as i}from"./app.24a1fc0a.js";const f=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"Build Types","slug":"build-types","link":"#build-types","children":[]},{"level":2,"title":"Board Types","slug":"board-types","link":"#board-types","children":[]}],"relativePath":"firmware_guide/environments.md","lastUpdated":1678049194000}'),n={name:"firmware_guide/environments.md"},a=i('

      Firmware Environments

      What is it?

      A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

      We use environments to store the firmware config for each device, so that you can easily switch between them.

      Envrionments are broken up into two distinct parts:

      • The build type (e.g. debug, release)
      • The board type (e.g. espaithinker, esp32cam)

      Build Types

      We now have a couple of options letting us decide how we want to build the firmaware.

      • Debug - Has a lot of logging, useful for getting everything setup for the first time and to see what is going on.

      The debug environment is the default environment, so you don't need to specify it when building.

      All debug environments are the default board environments, only OTA and release are specified in the name.

      Tip

      We recommend starting with a debug environment, and then switching to release once everything is working.

      • Release - Has a lot less debugging, may also be missing some things availible only in debug for debug purposes, this should be flashed when everything is working.

      • OTA - Just like release, but it will upload your firmware to your esp wirelessly.

      Warning

      You need to change the IP to which board we should upload to, the setting is called the otaserverip and can be found in the user_config.ini file.

      The otaserverip setting supports both IPv4 and mDNS names, as long as the mDNS name is resolvable on your network (i.e: you have bonjour installed on your computer).

      You can also change the port and password, but it's not recommended.

      Board Types

      We currently support a few different boards, and we are working on adding more.

      Warning

      It is important to note that the esp32AIThinker environment is the default environment, and will work for the vast majority of users. Do not switch your environment unless you know what you are doing, and have tested the default environment first, and verified that it does not work for you.

      Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

      Currently supported boards:

      • esp32AIThinker - The ESP32 Ai Thinker.
      • esp32cam - The ESP32 Camera.
      • esp_eye - The Non-Esp32S3 version of the ESP-EYE camera.
      • esp32M5Stack - The ESP32 M5Stack camera.
      • wrover - The ESP32 WRover (Non-ESP32-S3 variant).

      Coming Soon

      • esp32s3cam - The ESP32-S3 Camera boards.
      ',20),s=[a];function r(d,c,l,h,p,u){return o(),t("div",null,s)}const v=e(n,[["render",r]]);export{f as __pageData,v as default}; +import{_ as e,o,c as t,h as i}from"./app.ffc675f3.js";const f=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"Build Types","slug":"build-types","link":"#build-types","children":[]},{"level":2,"title":"Board Types","slug":"board-types","link":"#board-types","children":[]}],"relativePath":"firmware_guide/environments.md","lastUpdated":1678402493000}'),n={name:"firmware_guide/environments.md"},a=i('

      Firmware Environments

      What is it?

      A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

      We use environments to store the firmware config for each device, so that you can easily switch between them.

      Environments are broken up into two distinct parts:

      • The build type (e.g. debug, release)
      • The board type (e.g. espaithinker, esp32cam)

      Build Types

      We now have a couple of options letting us decide how we want to build the firmaware.

      • Debug - Has a lot of logging, useful for getting everything setup for the first time and to see what is going on.

      The debug environment is the default environment, so you don't need to specify it when building.

      All debug environments are the default board environments, only OTA and release are specified in the name.

      Tip

      We recommend starting with a debug environment, and then switching to release once everything is working.

      • Release - Has a lot less debugging, may also be missing some things availible only in debug for debug purposes, this should be flashed when everything is working.

      • OTA - Just like release, but it will upload your firmware to your esp wirelessly.

      Warning

      You need to change the IP to which board we should upload to, the setting is called the otaserverip and can be found in the user_config.ini file.

      The otaserverip setting supports both IPv4 and mDNS names, as long as the mDNS name is resolvable on your network (i.e: you have bonjour installed on your computer).

      You can also change the port and password, but it's not recommended.

      Board Types

      We currently support a few different boards, and we are working on adding more.

      Warning

      It is important to note that the esp32AIThinker environment is the default environment, and will work for the vast majority of users. Do not switch your environment unless you know what you are doing, and have tested the default environment first, and verified that it does not work for you.

      Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

      Currently supported boards:

      • esp32AIThinker - The ESP32 Ai Thinker.
      • esp32cam - The ESP32 Camera.
      • esp_eye - The Non-Esp32S3 version of the ESP-EYE camera.
      • esp32M5Stack - The ESP32 M5Stack camera.
      • wrover - The ESP32 WRover (Non-ESP32-S3 variant).

      Coming Soon

      • esp32s3cam - The ESP32-S3 Camera boards.
      ',20),s=[a];function r(d,c,l,h,p,u){return o(),t("div",null,s)}const v=e(n,[["render",r]]);export{f as __pageData,v as default}; diff --git a/assets/firmware_guide_environments.md.216a4654.lean.js b/assets/firmware_guide_environments.md.36d19564.lean.js similarity index 81% rename from assets/firmware_guide_environments.md.216a4654.lean.js rename to assets/firmware_guide_environments.md.36d19564.lean.js index cf65fb1..e29b853 100644 --- a/assets/firmware_guide_environments.md.216a4654.lean.js +++ b/assets/firmware_guide_environments.md.36d19564.lean.js @@ -1 +1 @@ -import{_ as e,o,c as t,h as i}from"./app.24a1fc0a.js";const f=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"Build Types","slug":"build-types","link":"#build-types","children":[]},{"level":2,"title":"Board Types","slug":"board-types","link":"#board-types","children":[]}],"relativePath":"firmware_guide/environments.md","lastUpdated":1678049194000}'),n={name:"firmware_guide/environments.md"},a=i("",20),s=[a];function r(d,c,l,h,p,u){return o(),t("div",null,s)}const v=e(n,[["render",r]]);export{f as __pageData,v as default}; +import{_ as e,o,c as t,h as i}from"./app.ffc675f3.js";const f=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"Build Types","slug":"build-types","link":"#build-types","children":[]},{"level":2,"title":"Board Types","slug":"board-types","link":"#board-types","children":[]}],"relativePath":"firmware_guide/environments.md","lastUpdated":1678402493000}'),n={name:"firmware_guide/environments.md"},a=i("",20),s=[a];function r(d,c,l,h,p,u){return o(),t("div",null,s)}const v=e(n,[["render",r]]);export{f as __pageData,v as default}; diff --git a/assets/firmware_guide_firmware.md.58eb9ad7.js b/assets/firmware_guide_firmware.md.5b8407e9.js similarity index 96% rename from assets/firmware_guide_firmware.md.58eb9ad7.js rename to assets/firmware_guide_firmware.md.5b8407e9.js index 3d753eb..4722f9e 100644 --- a/assets/firmware_guide_firmware.md.58eb9ad7.js +++ b/assets/firmware_guide_firmware.md.5b8407e9.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,h as o}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[{"level":2,"title":"What should I download and where?","slug":"what-should-i-download-and-where","link":"#what-should-i-download-and-where","children":[]},{"level":2,"title":"How do download this?","slug":"how-do-download-this","link":"#how-do-download-this","children":[]}],"relativePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),d={name:"firmware_guide/firmware.md"},r=o('

      What is this?

      Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.

      What should I download and where?

      Current testing has been on our own solution called OpenIris, found here. To check the status of the project, please visit the Development Road Map

      How do download this?

      Follow the steps described here

      ',6),h=[r];function s(i,n,l,c,w,_){return a(),t("div",null,h)}const f=e(d,[["render",s]]);export{u as __pageData,f as default}; +import{_ as e,o as a,c as t,h as o}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[{"level":2,"title":"What should I download and where?","slug":"what-should-i-download-and-where","link":"#what-should-i-download-and-where","children":[]},{"level":2,"title":"How do download this?","slug":"how-do-download-this","link":"#how-do-download-this","children":[]}],"relativePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),d={name:"firmware_guide/firmware.md"},r=o('

      What is this?

      Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.

      What should I download and where?

      Current testing has been on our own solution called OpenIris, found here. To check the status of the project, please visit the Development Road Map

      How do download this?

      Follow the steps described here

      ',6),h=[r];function s(i,n,l,c,w,_){return a(),t("div",null,h)}const f=e(d,[["render",s]]);export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_firmware.md.58eb9ad7.lean.js b/assets/firmware_guide_firmware.md.5b8407e9.lean.js similarity index 90% rename from assets/firmware_guide_firmware.md.58eb9ad7.lean.js rename to assets/firmware_guide_firmware.md.5b8407e9.lean.js index 14eb663..767286c 100644 --- a/assets/firmware_guide_firmware.md.58eb9ad7.lean.js +++ b/assets/firmware_guide_firmware.md.5b8407e9.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,h as o}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[{"level":2,"title":"What should I download and where?","slug":"what-should-i-download-and-where","link":"#what-should-i-download-and-where","children":[]},{"level":2,"title":"How do download this?","slug":"how-do-download-this","link":"#how-do-download-this","children":[]}],"relativePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),d={name:"firmware_guide/firmware.md"},r=o("",6),h=[r];function s(i,n,l,c,w,_){return a(),t("div",null,h)}const f=e(d,[["render",s]]);export{u as __pageData,f as default}; +import{_ as e,o as a,c as t,h as o}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[{"level":2,"title":"What should I download and where?","slug":"what-should-i-download-and-where","link":"#what-should-i-download-and-where","children":[]},{"level":2,"title":"How do download this?","slug":"how-do-download-this","link":"#how-do-download-this","children":[]}],"relativePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),d={name:"firmware_guide/firmware.md"},r=o("",6),h=[r];function s(i,n,l,c,w,_){return a(),t("div",null,h)}const f=e(d,[["render",s]]);export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_mdns.md.803194e9.js b/assets/firmware_guide_mdns.md.089ec198.js similarity index 98% rename from assets/firmware_guide_mdns.md.803194e9.js rename to assets/firmware_guide_mdns.md.089ec198.js index 344b16f..1a48c51 100644 --- a/assets/firmware_guide_mdns.md.803194e9.js +++ b/assets/firmware_guide_mdns.md.089ec198.js @@ -1,2 +1,2 @@ -import{_ as e,o as t,c as o,h as n}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"Enable mDNS","slug":"enable-mdns","link":"#enable-mdns","children":[]},{"level":3,"title":"Connect to the device","slug":"connect-to-the-device","link":"#connect-to-the-device","children":[]}]},{"level":2,"title":"Prerequisites Bonjour","slug":"prerequisites-bonjour","link":"#prerequisites-bonjour","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[{"level":3,"title":"Can not connect to the device","slug":"can-not-connect-to-the-device","link":"#can-not-connect-to-the-device","children":[]}]}],"relativePath":"firmware_guide/mdns.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/mdns.md"},i=n(`

      MDNS

      What is it?

      mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

      In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

      How to use it

      Enable mDNS

      The mDNS is enabled by default on the new firmware, and can not be disabled.

      To use it, all you need to do is set the name of the device in the firmware config file.

      This setting can be located under the [wifi] section of the ini/user_config.ini file.

      ini
      mdnsname = "openiristracker" # do not add .local
      +import{_ as e,o as t,c as o,h as n}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"Enable mDNS","slug":"enable-mdns","link":"#enable-mdns","children":[]},{"level":3,"title":"Connect to the device","slug":"connect-to-the-device","link":"#connect-to-the-device","children":[]}]},{"level":2,"title":"Prerequisites Bonjour","slug":"prerequisites-bonjour","link":"#prerequisites-bonjour","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[{"level":3,"title":"Can not connect to the device","slug":"can-not-connect-to-the-device","link":"#can-not-connect-to-the-device","children":[]}]}],"relativePath":"firmware_guide/mdns.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/mdns.md"},i=n(`

      MDNS

      What is it?

      mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

      In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

      How to use it

      Enable mDNS

      The mDNS is enabled by default on the new firmware, and can not be disabled.

      To use it, all you need to do is set the name of the device in the firmware config file.

      This setting can be located under the [wifi] section of the ini/user_config.ini file.

      ini
      mdnsname = "openiristracker" # do not add .local
       

      By default, the name of the device is openiristracker, however you can change it to whatever you want.

      Change the name

      Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

      Connect to the device

      To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

      Prerequisites Bonjour

      Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

      You can also get the fully tested Bonjour package from us here (for Windows only).

      Troubleshooting

      Can not connect to the device

      If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

      If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

      `,21),s=[i];function c(d,r,h,l,u,p){return t(),o("div",null,s)}const v=e(a,[["render",c]]);export{m as __pageData,v as default}; diff --git a/assets/firmware_guide_mdns.md.803194e9.lean.js b/assets/firmware_guide_mdns.md.089ec198.lean.js similarity index 94% rename from assets/firmware_guide_mdns.md.803194e9.lean.js rename to assets/firmware_guide_mdns.md.089ec198.lean.js index 0df52aa..a47b3d4 100644 --- a/assets/firmware_guide_mdns.md.803194e9.lean.js +++ b/assets/firmware_guide_mdns.md.089ec198.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,h as n}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"Enable mDNS","slug":"enable-mdns","link":"#enable-mdns","children":[]},{"level":3,"title":"Connect to the device","slug":"connect-to-the-device","link":"#connect-to-the-device","children":[]}]},{"level":2,"title":"Prerequisites Bonjour","slug":"prerequisites-bonjour","link":"#prerequisites-bonjour","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[{"level":3,"title":"Can not connect to the device","slug":"can-not-connect-to-the-device","link":"#can-not-connect-to-the-device","children":[]}]}],"relativePath":"firmware_guide/mdns.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/mdns.md"},i=n("",21),s=[i];function c(d,r,h,l,u,p){return t(),o("div",null,s)}const v=e(a,[["render",c]]);export{m as __pageData,v as default}; +import{_ as e,o as t,c as o,h as n}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"Enable mDNS","slug":"enable-mdns","link":"#enable-mdns","children":[]},{"level":3,"title":"Connect to the device","slug":"connect-to-the-device","link":"#connect-to-the-device","children":[]}]},{"level":2,"title":"Prerequisites Bonjour","slug":"prerequisites-bonjour","link":"#prerequisites-bonjour","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[{"level":3,"title":"Can not connect to the device","slug":"can-not-connect-to-the-device","link":"#can-not-connect-to-the-device","children":[]}]}],"relativePath":"firmware_guide/mdns.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/mdns.md"},i=n("",21),s=[i];function c(d,r,h,l,u,p){return t(),o("div",null,s)}const v=e(a,[["render",c]]);export{m as __pageData,v as default}; diff --git a/assets/firmware_guide_rest_api.md.38976bc1.js b/assets/firmware_guide_rest_api.md.cdbe96a3.js similarity index 99% rename from assets/firmware_guide_rest_api.md.38976bc1.js rename to assets/firmware_guide_rest_api.md.cdbe96a3.js index be75e98..b4410a3 100644 --- a/assets/firmware_guide_rest_api.md.38976bc1.js +++ b/assets/firmware_guide_rest_api.md.cdbe96a3.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as t,h as n}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"REST API Client","slug":"rest-api-client","link":"#rest-api-client","children":[]},{"level":3,"title":"Standard","slug":"standard","link":"#standard","children":[]},{"level":3,"title":"Endpoints","slug":"endpoints","link":"#endpoints","children":[]},{"level":3,"title":"Params","slug":"params","link":"#params","children":[]},{"level":3,"title":"Camera Params","slug":"camera-params","link":"#camera-params","children":[]}]}],"relativePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/rest_api.md"},l=n(`

      REST API

      What is it?

      A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

      We developed a REST API for this project so that we can control the devices more easily from our new app.

      How to use it

      REST API Client

      Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

      For basic GET requests, you can use your browser of choice.

      Standard

      The REST API follows the following standard:

      txt
      http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}
      +import{_ as s,o as e,c as t,h as n}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"REST API Client","slug":"rest-api-client","link":"#rest-api-client","children":[]},{"level":3,"title":"Standard","slug":"standard","link":"#standard","children":[]},{"level":3,"title":"Endpoints","slug":"endpoints","link":"#endpoints","children":[]},{"level":3,"title":"Params","slug":"params","link":"#params","children":[]},{"level":3,"title":"Camera Params","slug":"camera-params","link":"#camera-params","children":[]}]}],"relativePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/rest_api.md"},l=n(`

      REST API

      What is it?

      A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

      We developed a REST API for this project so that we can control the devices more easily from our new app.

      How to use it

      REST API Client

      Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

      For basic GET requests, you can use your browser of choice.

      Standard

      The REST API follows the following standard:

      txt
      http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}
       

      For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

      Endpoints

      Note

      Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

      If you would like to help us implement these endpoints, please contact us.

      We are also open to suggestions for new endpoints.

      Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

      The REST API has the following endpoints:

      EndpointMethodDescription
      /pingGETReturns the status of the device.
      /saveGETWrites any changes to the flash.
      /restartDeviceGETRestarts the ESP itself.
      /restartCameraGETRestarts the camera.
      /resetConfigGETClears the current config in memory and RAM
      /getStoredConfigGETReturns a JSON object of the devices current config.
      /setTxPowerPOSTSets the Transmission Power of the ESPs
      /setDevicePOSTSets the OTA and mDNS settings
      /setCameraPOSTSets all of the camera settings
      /wifiPOSTAdds a new wifi network, or writes over an existing one
      /wifiDELETEDeletes a wifi network **

      Note

      /wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

      Params

      The REST API has the following params:

      Feature not a bug

      All params for a given URL are required, even if you are not changing that params value.

      If you do not supply a param, that param will be set to default settings.

      URL params are passed in the URL as a query string, using the following format:

      http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

      /wifi

      Note

      We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

      ParamDescription
      ssidThe ssid of the network.
      passwordThe password of the network.
      networkNameThe unique name (given by you) to refer to that network in memory.
      channelThe channel for the wifi network to broadcast on
      only 1 - 14 are allowed.
      powerThe Transmittion power of the ESP for that network config.
      adhocWhether to enable AP mode or not.

      Note - Transmission Power

      You must follow the following format for the power param:

      Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

      cpp
      typedef enum {
           WIFI_POWER_19_5dBm = 78,// 19.5dBm
           WIFI_POWER_19dBm = 76,// 19dBm
      diff --git a/assets/firmware_guide_rest_api.md.38976bc1.lean.js b/assets/firmware_guide_rest_api.md.cdbe96a3.lean.js
      similarity index 93%
      rename from assets/firmware_guide_rest_api.md.38976bc1.lean.js
      rename to assets/firmware_guide_rest_api.md.cdbe96a3.lean.js
      index 01f96a2..17e4850 100644
      --- a/assets/firmware_guide_rest_api.md.38976bc1.lean.js
      +++ b/assets/firmware_guide_rest_api.md.cdbe96a3.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as e,c as t,h as n}from"./app.24a1fc0a.js";const m=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"REST API Client","slug":"rest-api-client","link":"#rest-api-client","children":[]},{"level":3,"title":"Standard","slug":"standard","link":"#standard","children":[]},{"level":3,"title":"Endpoints","slug":"endpoints","link":"#endpoints","children":[]},{"level":3,"title":"Params","slug":"params","link":"#params","children":[]},{"level":3,"title":"Camera Params","slug":"camera-params","link":"#camera-params","children":[]}]}],"relativePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/rest_api.md"},l=n("",33),o=[l];function p(r,c,i,d,y,h){return e(),t("div",null,o)}const u=s(a,[["render",p]]);export{m as __pageData,u as default};
      +import{_ as s,o as e,c as t,h as n}from"./app.ffc675f3.js";const m=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[{"level":2,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":2,"title":"How to use it","slug":"how-to-use-it","link":"#how-to-use-it","children":[{"level":3,"title":"REST API Client","slug":"rest-api-client","link":"#rest-api-client","children":[]},{"level":3,"title":"Standard","slug":"standard","link":"#standard","children":[]},{"level":3,"title":"Endpoints","slug":"endpoints","link":"#endpoints","children":[]},{"level":3,"title":"Params","slug":"params","link":"#params","children":[]},{"level":3,"title":"Camera Params","slug":"camera-params","link":"#camera-params","children":[]}]}],"relativePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),a={name:"firmware_guide/rest_api.md"},l=n("",33),o=[l];function p(r,c,i,d,y,h){return e(),t("div",null,o)}const u=s(a,[["render",p]]);export{m as __pageData,u as default};
      diff --git a/assets/firmware_guide_setup_vscode.md.ef0d7c21.js b/assets/firmware_guide_setup_vscode.md.a022729d.js
      similarity index 96%
      rename from assets/firmware_guide_setup_vscode.md.ef0d7c21.js
      rename to assets/firmware_guide_setup_vscode.md.a022729d.js
      index 3743f4e..f4dd979 100644
      --- a/assets/firmware_guide_setup_vscode.md.ef0d7c21.js
      +++ b/assets/firmware_guide_setup_vscode.md.a022729d.js
      @@ -1 +1 @@
      -import{_ as o,i as l}from"./chunks/index.99ba4c01.js";import{o as r,c as s,a as n,u as a,h as i,g as e,b as t}from"./app.24a1fc0a.js";const d=i('

      Setting up the environment

      This procedure will show how to prepare your system for uploading the firmware to your tracker.

      1. Install Visual Studio Code

      Download the latest Visual Studio Code and install it.

      Download


      ',6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-hidden":"true"},"#")],-1),c=e("br",null,null,-1),p=e("h2",{id:"_2-install-platformio-ide",tabindex:"-1"},[t("2. Install PlatformIO IDE "),e("a",{class:"header-anchor",href:"#_2-install-platformio-ide","aria-hidden":"true"},"#")],-1),_=e("p",null,[t("Once Visual Studio Code is installed, open it and install "),e("a",{href:"https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide",target:"_blank",rel:"noreferrer"},"PlatformIO IDE for VSCode"),t(", an extension that will allow you to connect to the tracker, build and upload the firmware.")],-1),u=i('

      3. Clone the firmware project

      Make sure you close any current projects you have open or open a new window before moving forward with these steps.

      1. Go to https://github.com/lorow/OpenIris and clone the latest version from the main branch.
        1. If you do not have git installed please install it from here.

        2. Open Git Bash.

      ',3),m=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:\\")])],-1),f=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/lorow/OpenIris.git")])],-1),g=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),w=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),v=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),b=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),T=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Install Visual Studio Code","slug":"_1-install-visual-studio-code","link":"#_1-install-visual-studio-code","children":[{"level":3,"title":"Download","slug":"download","link":"#download","children":[]},{"level":3,"title":"Install","slug":"install","link":"#install","children":[]}]},{"level":2,"title":"2. Install PlatformIO IDE","slug":"_2-install-platformio-ide","link":"#_2-install-platformio-ide","children":[]},{"level":2,"title":"3. Clone the firmware project","slug":"_3-clone-the-firmware-project","link":"#_3-clone-the-firmware-project","children":[]}],"relativePath":"firmware_guide/setup_vscode.md","lastUpdated":1676223729000}'),I={name:"firmware_guide/setup_vscode.md"},O=Object.assign(I,{setup(S){return(k,y)=>(r(),s("div",null,[d,n(o,{options:a(l).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:a(l).setup_vscode_image_two},null,8,["options"]),p,_,n(o,{options:a(l).setup_vscode_image_three},null,8,["options"]),u,n(o,{options:a(l).setup_vscode_image_four},null,8,["options"]),m,n(o,{options:a(l).setup_vscode_image_five},null,8,["options"]),f,n(o,{options:a(l).setup_vscode_image_six},null,8,["options"]),g,w,v,n(o,{options:a(l).setup_vscode_image_seven},null,8,["options"]),b]))}});export{T as __pageData,O as default}; +import{_ as o,i as l}from"./chunks/index.1d77087a.js";import{o as r,c as s,a as n,u as a,h as i,g as e,b as t}from"./app.ffc675f3.js";const d=i('

      Setting up the environment

      This procedure will show how to prepare your system for uploading the firmware to your tracker.

      1. Install Visual Studio Code

      Download the latest Visual Studio Code and install it.

      Download


      ',6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-hidden":"true"},"#")],-1),c=e("br",null,null,-1),p=e("h2",{id:"_2-install-platformio-ide",tabindex:"-1"},[t("2. Install PlatformIO IDE "),e("a",{class:"header-anchor",href:"#_2-install-platformio-ide","aria-hidden":"true"},"#")],-1),_=e("p",null,[t("Once Visual Studio Code is installed, open it and install "),e("a",{href:"https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide",target:"_blank",rel:"noreferrer"},"PlatformIO IDE for VSCode"),t(", an extension that will allow you to connect to the tracker, build and upload the firmware.")],-1),u=i('

      3. Clone the firmware project

      Make sure you close any current projects you have open or open a new window before moving forward with these steps.

      1. Go to https://github.com/lorow/OpenIris and clone the latest version from the main branch.
        1. If you do not have git installed please install it from here.

        2. Open Git Bash.

      ',3),m=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:\\")])],-1),f=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/lorow/OpenIris.git")])],-1),g=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),w=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),v=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),b=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),T=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Install Visual Studio Code","slug":"_1-install-visual-studio-code","link":"#_1-install-visual-studio-code","children":[{"level":3,"title":"Download","slug":"download","link":"#download","children":[]},{"level":3,"title":"Install","slug":"install","link":"#install","children":[]}]},{"level":2,"title":"2. Install PlatformIO IDE","slug":"_2-install-platformio-ide","link":"#_2-install-platformio-ide","children":[]},{"level":2,"title":"3. Clone the firmware project","slug":"_3-clone-the-firmware-project","link":"#_3-clone-the-firmware-project","children":[]}],"relativePath":"firmware_guide/setup_vscode.md","lastUpdated":1676223729000}'),I={name:"firmware_guide/setup_vscode.md"},O=Object.assign(I,{setup(S){return(k,y)=>(r(),s("div",null,[d,n(o,{options:a(l).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:a(l).setup_vscode_image_two},null,8,["options"]),p,_,n(o,{options:a(l).setup_vscode_image_three},null,8,["options"]),u,n(o,{options:a(l).setup_vscode_image_four},null,8,["options"]),m,n(o,{options:a(l).setup_vscode_image_five},null,8,["options"]),f,n(o,{options:a(l).setup_vscode_image_six},null,8,["options"]),g,w,v,n(o,{options:a(l).setup_vscode_image_seven},null,8,["options"]),b]))}});export{T as __pageData,O as default}; diff --git a/assets/firmware_guide_setup_vscode.md.ef0d7c21.lean.js b/assets/firmware_guide_setup_vscode.md.a022729d.lean.js similarity index 94% rename from assets/firmware_guide_setup_vscode.md.ef0d7c21.lean.js rename to assets/firmware_guide_setup_vscode.md.a022729d.lean.js index 72f11a2..0674b26 100644 --- a/assets/firmware_guide_setup_vscode.md.ef0d7c21.lean.js +++ b/assets/firmware_guide_setup_vscode.md.a022729d.lean.js @@ -1 +1 @@ -import{_ as o,i as l}from"./chunks/index.99ba4c01.js";import{o as r,c as s,a as n,u as a,h as i,g as e,b as t}from"./app.24a1fc0a.js";const d=i("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-hidden":"true"},"#")],-1),c=e("br",null,null,-1),p=e("h2",{id:"_2-install-platformio-ide",tabindex:"-1"},[t("2. Install PlatformIO IDE "),e("a",{class:"header-anchor",href:"#_2-install-platformio-ide","aria-hidden":"true"},"#")],-1),_=e("p",null,[t("Once Visual Studio Code is installed, open it and install "),e("a",{href:"https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide",target:"_blank",rel:"noreferrer"},"PlatformIO IDE for VSCode"),t(", an extension that will allow you to connect to the tracker, build and upload the firmware.")],-1),u=i("",3),m=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:\\")])],-1),f=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/lorow/OpenIris.git")])],-1),g=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),w=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),v=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),b=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),T=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Install Visual Studio Code","slug":"_1-install-visual-studio-code","link":"#_1-install-visual-studio-code","children":[{"level":3,"title":"Download","slug":"download","link":"#download","children":[]},{"level":3,"title":"Install","slug":"install","link":"#install","children":[]}]},{"level":2,"title":"2. Install PlatformIO IDE","slug":"_2-install-platformio-ide","link":"#_2-install-platformio-ide","children":[]},{"level":2,"title":"3. Clone the firmware project","slug":"_3-clone-the-firmware-project","link":"#_3-clone-the-firmware-project","children":[]}],"relativePath":"firmware_guide/setup_vscode.md","lastUpdated":1676223729000}'),I={name:"firmware_guide/setup_vscode.md"},O=Object.assign(I,{setup(S){return(k,y)=>(r(),s("div",null,[d,n(o,{options:a(l).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:a(l).setup_vscode_image_two},null,8,["options"]),p,_,n(o,{options:a(l).setup_vscode_image_three},null,8,["options"]),u,n(o,{options:a(l).setup_vscode_image_four},null,8,["options"]),m,n(o,{options:a(l).setup_vscode_image_five},null,8,["options"]),f,n(o,{options:a(l).setup_vscode_image_six},null,8,["options"]),g,w,v,n(o,{options:a(l).setup_vscode_image_seven},null,8,["options"]),b]))}});export{T as __pageData,O as default}; +import{_ as o,i as l}from"./chunks/index.1d77087a.js";import{o as r,c as s,a as n,u as a,h as i,g as e,b as t}from"./app.ffc675f3.js";const d=i("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-hidden":"true"},"#")],-1),c=e("br",null,null,-1),p=e("h2",{id:"_2-install-platformio-ide",tabindex:"-1"},[t("2. Install PlatformIO IDE "),e("a",{class:"header-anchor",href:"#_2-install-platformio-ide","aria-hidden":"true"},"#")],-1),_=e("p",null,[t("Once Visual Studio Code is installed, open it and install "),e("a",{href:"https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide",target:"_blank",rel:"noreferrer"},"PlatformIO IDE for VSCode"),t(", an extension that will allow you to connect to the tracker, build and upload the firmware.")],-1),u=i("",3),m=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:\\")])],-1),f=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/lorow/OpenIris.git")])],-1),g=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),w=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),v=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),b=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),T=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Install Visual Studio Code","slug":"_1-install-visual-studio-code","link":"#_1-install-visual-studio-code","children":[{"level":3,"title":"Download","slug":"download","link":"#download","children":[]},{"level":3,"title":"Install","slug":"install","link":"#install","children":[]}]},{"level":2,"title":"2. Install PlatformIO IDE","slug":"_2-install-platformio-ide","link":"#_2-install-platformio-ide","children":[]},{"level":2,"title":"3. Clone the firmware project","slug":"_3-clone-the-firmware-project","link":"#_3-clone-the-firmware-project","children":[]}],"relativePath":"firmware_guide/setup_vscode.md","lastUpdated":1676223729000}'),I={name:"firmware_guide/setup_vscode.md"},O=Object.assign(I,{setup(S){return(k,y)=>(r(),s("div",null,[d,n(o,{options:a(l).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:a(l).setup_vscode_image_two},null,8,["options"]),p,_,n(o,{options:a(l).setup_vscode_image_three},null,8,["options"]),u,n(o,{options:a(l).setup_vscode_image_four},null,8,["options"]),m,n(o,{options:a(l).setup_vscode_image_five},null,8,["options"]),f,n(o,{options:a(l).setup_vscode_image_six},null,8,["options"]),g,w,v,n(o,{options:a(l).setup_vscode_image_seven},null,8,["options"]),b]))}});export{T as __pageData,O as default}; diff --git a/assets/firmware_guide_update_platformio.md.4052d476.js b/assets/firmware_guide_update_platformio.md.4052d476.js new file mode 100644 index 0000000..16ab01f --- /dev/null +++ b/assets/firmware_guide_update_platformio.md.4052d476.js @@ -0,0 +1 @@ +import{_ as o,i as t}from"./chunks/index.1d77087a.js";import{o as s,c as d,a,u as l,h as n,g as i,b as e}from"./app.ffc675f3.js";const r=n('

      Updating Platformio

      Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

      It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

      Updating PlatformIO itself

      There are two ways to update your platformio installation

      Via CLI

      You can update it easily by simply typing in one command into your terminal.

      ',7),c=n('
      1. Open a terminal / command prompt
      2. Type pio upgrade and press enter
      3. Wait for it to finish
      4. Done

      Via PlatformIO in Visual Studio Code

      You can also update it using the platformio tab in your Visual Studio Code.

      1. Open VSC
      2. Click on that little and icon on the sidebar
      ',4),p=i("ol",{start:"3"},[i("li",null,[e("A side panel will open, there will be a couple of sections, one of them called "),i("code",null,"Quick Access"),e(", open it.")])],-1),u=i("ol",{start:"4"},[i("li",null,[e("In "),i("code",null,"Quick Access"),e(" section, click on the "),i("code",null,"Miscelleneous"),e(" tab")])],-1),h=i("ol",{start:"5"},[i("li",null,[e("Then, click on the "),i("code",null,"Upgrade PlatformIO Core")])],-1),_=n('
      1. Wait for it to finnish and done!

      Upgrading the SDK

      You'll also need to upgrade the SDK from timem to do this

      Upgrading the SDK via VSC

      1. Follow the guide above up until clicking on the Quick Access section.
      2. Instead, open the PIO Home and select Open
      ',5),m=i("ol",{start:"3"},[i("li",null,[e("This will open a window for PlatformIO dashboard, in there, click on a "),i("code",null,"Platforms"),e(" button on the sidebar")])],-1),f=i("ol",{start:"4"},[i("li",null,[e("Once there, you should see a couple of tabs next to the side bard, things like "),i("code",null,"Installed"),e(" or "),i("code",null,"Embedded"),e(". Click on "),i("code",null,"Updates")])],-1),g=i("ol",{start:"5"},[i("li",null,[e("Locate a platform called "),i("code",null,"Espressif 32"),e(" and click on "),i("code",null,"Update to ")])],-1),v=i("ol",{start:"6"},[i("li",null,"Wait until it is done and that's it!")],-1),P=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[{"level":2,"title":"Updating PlatformIO itself","slug":"updating-platformio-itself","link":"#updating-platformio-itself","children":[{"level":3,"title":"Via CLI","slug":"via-cli","link":"#via-cli","children":[]},{"level":3,"title":"Via PlatformIO in Visual Studio Code","slug":"via-platformio-in-visual-studio-code","link":"#via-platformio-in-visual-studio-code","children":[]}]},{"level":2,"title":"Upgrading the SDK","slug":"upgrading-the-sdk","link":"#upgrading-the-sdk","children":[{"level":3,"title":"Upgrading the SDK via VSC","slug":"upgrading-the-sdk-via-vsc","link":"#upgrading-the-sdk-via-vsc","children":[]}]}],"relativePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(b){return(S,T)=>(s(),d("div",null,[r,a(o,{options:l(t).pio_upgrade_command},null,8,["options"]),c,a(o,{options:l(t).ant_logo_platformio},null,8,["options"]),p,a(o,{options:l(t).platformio_quick_access},null,8,["options"]),u,a(o,{options:l(t).platformio_quick_access_miscellaneous},null,8,["options"]),h,a(o,{options:l(t).platformio_quick_access_upgrade_core},null,8,["options"]),_,a(o,{options:l(t).platformio_pio_home},null,8,["options"]),m,a(o,{options:l(t).platformio_pio_sidebar_platforms},null,8,["options"]),f,a(o,{options:l(t).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,a(o,{options:l(t).platformio_pio_espressif32},null,8,["options"]),v]))}});export{P as __pageData,w as default}; diff --git a/assets/firmware_guide_update_platformio.md.4052d476.lean.js b/assets/firmware_guide_update_platformio.md.4052d476.lean.js new file mode 100644 index 0000000..c0a73e9 --- /dev/null +++ b/assets/firmware_guide_update_platformio.md.4052d476.lean.js @@ -0,0 +1 @@ +import{_ as o,i as t}from"./chunks/index.1d77087a.js";import{o as s,c as d,a,u as l,h as n,g as i,b as e}from"./app.ffc675f3.js";const r=n("",7),c=n("",4),p=i("ol",{start:"3"},[i("li",null,[e("A side panel will open, there will be a couple of sections, one of them called "),i("code",null,"Quick Access"),e(", open it.")])],-1),u=i("ol",{start:"4"},[i("li",null,[e("In "),i("code",null,"Quick Access"),e(" section, click on the "),i("code",null,"Miscelleneous"),e(" tab")])],-1),h=i("ol",{start:"5"},[i("li",null,[e("Then, click on the "),i("code",null,"Upgrade PlatformIO Core")])],-1),_=n("",5),m=i("ol",{start:"3"},[i("li",null,[e("This will open a window for PlatformIO dashboard, in there, click on a "),i("code",null,"Platforms"),e(" button on the sidebar")])],-1),f=i("ol",{start:"4"},[i("li",null,[e("Once there, you should see a couple of tabs next to the side bard, things like "),i("code",null,"Installed"),e(" or "),i("code",null,"Embedded"),e(". Click on "),i("code",null,"Updates")])],-1),g=i("ol",{start:"5"},[i("li",null,[e("Locate a platform called "),i("code",null,"Espressif 32"),e(" and click on "),i("code",null,"Update to ")])],-1),v=i("ol",{start:"6"},[i("li",null,"Wait until it is done and that's it!")],-1),P=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[{"level":2,"title":"Updating PlatformIO itself","slug":"updating-platformio-itself","link":"#updating-platformio-itself","children":[{"level":3,"title":"Via CLI","slug":"via-cli","link":"#via-cli","children":[]},{"level":3,"title":"Via PlatformIO in Visual Studio Code","slug":"via-platformio-in-visual-studio-code","link":"#via-platformio-in-visual-studio-code","children":[]}]},{"level":2,"title":"Upgrading the SDK","slug":"upgrading-the-sdk","link":"#upgrading-the-sdk","children":[{"level":3,"title":"Upgrading the SDK via VSC","slug":"upgrading-the-sdk-via-vsc","link":"#upgrading-the-sdk-via-vsc","children":[]}]}],"relativePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(b){return(S,T)=>(s(),d("div",null,[r,a(o,{options:l(t).pio_upgrade_command},null,8,["options"]),c,a(o,{options:l(t).ant_logo_platformio},null,8,["options"]),p,a(o,{options:l(t).platformio_quick_access},null,8,["options"]),u,a(o,{options:l(t).platformio_quick_access_miscellaneous},null,8,["options"]),h,a(o,{options:l(t).platformio_quick_access_upgrade_core},null,8,["options"]),_,a(o,{options:l(t).platformio_pio_home},null,8,["options"]),m,a(o,{options:l(t).platformio_pio_sidebar_platforms},null,8,["options"]),f,a(o,{options:l(t).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,a(o,{options:l(t).platformio_pio_espressif32},null,8,["options"]),v]))}});export{P as __pageData,w as default}; diff --git a/assets/firmware_guide_upload_firmware.md.031e2368.js b/assets/firmware_guide_upload_and_update_firmware.md.b720563f.js similarity index 65% rename from assets/firmware_guide_upload_firmware.md.031e2368.js rename to assets/firmware_guide_upload_and_update_firmware.md.b720563f.js index 08fea79..2aa39ee 100644 --- a/assets/firmware_guide_upload_firmware.md.031e2368.js +++ b/assets/firmware_guide_upload_and_update_firmware.md.b720563f.js @@ -1,6 +1,6 @@ -import{_ as n,a as s}from"./chunks/index.47cb84cc.js";import{_ as t,i as r}from"./chunks/index.99ba4c01.js";import{o as l,c as u,a as e,w as p,u as o,h as a,g as i}from"./app.24a1fc0a.js";const d=a('

      Building and uploading the firmware manually

      Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

      1. Connect your tracker to your PC via the programmer

      First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable. In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your pc, once plugged in you can release the button.

      In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

      2. Build your firmware

      1. Press the build button at the bottom of Visual Studio Code.

      This builds the firmware, but does not send it to the ESP yet.

      img

      3. Upload your firmware

      • If you are using the OTA method, first make sure the tracker you wish to flash is turned on and connected to your network, then skip to the OTA section below.

      • Once the firmware has been built, press the upload button to upload the firmware.

        This sends the firmware to the ESP. img

      ',11),c=i("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),h=a(`
      • If the upload is successful, you should get an output that looks like this:

        img

      Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

      If you have trouble with uploading your firmware over cable check the following:

      1. Make sure your USB cable from the tracker is plugged firmly into your PC.
      2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
      3. Make sure that your drivers are up-to-date.
      4. Some ports might not work, try other ones.

      Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

      Uploading via OTA

      What is it?

      OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

      How do I use it?

      To use OTA, you need to have working firmware on your ESPs first.

      Once you have mnually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

      Coming Soon

      Currently, we only support OTA using platformio and Visual Studio Code. We are working on a new app, where you can upload your firmware to your ESPs over WiFi straight from the app.

      To do this, you need to change your environment to the OTA version of your working environment.

      For example, if you have a working esp32AIThinker environment, you would change your environment to esp32AIThinker_OTA.

      Once you have changed your environment, you can upload your firmware to your ESPs using the upload button, as you would normally.

      Once you have successfully connected your trackers to your WiFi, you can use OTA to handle all future firmware updates.

      1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
      2. In the ini/user_config.ini file:
        • Put IP or hostname of device into config file
      ini
      [ota]
      +import{_ as r,a as i}from"./chunks/index.5b1f69a8.js";import{_ as n,i as s}from"./chunks/index.1d77087a.js";import{o as u,c as p,a as e,w as l,u as o,h as t,g as a}from"./app.ffc675f3.js";const d=t('

      Building and uploading the firmware manually

      Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

      1. Connect your tracker to your PC via the programmer

      First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable. In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your pc, once plugged in you can release the button.

      In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

      2. Build your firmware

      1. Press the build button at the bottom of Visual Studio Code.

      This builds the firmware, but does not send it to the ESP yet.

      img

      3. Upload your firmware

      • If you are using the OTA method, first make sure the tracker you wish to flash is turned on and connected to your network, then skip to the OTA section below.

      • Once the firmware has been built, press the upload button to upload the firmware.

        This sends the firmware to the ESP. img

      ',11),h=a("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),c=t(`
      • If the upload is successful, you should get an output that looks like this:

        img

      Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

      If you have trouble with uploading your firmware over cable check the following:

      1. Make sure your USB cable from the tracker is plugged firmly into your PC.
      2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
      3. Make sure that your drivers are up-to-date.
      4. Some ports might not work, try other ones.

      Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

      Uploading via OTA

      What is it?

      OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

      How do I use it?

      To use OTA, you need to have working firmware on your ESPs first.

      Once you have mnually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

      Coming Soon

      Currently, we only support OTA using platformio and Visual Studio Code. We are working on a new app, where you can upload your firmware to your ESPs over WiFi straight from the app.

      To do this, you need to change your environment to the OTA version of your working environment.

      For example, if you have a working esp32AIThinker environment, you would change your environment to esp32AIThinker_OTA.

      Once you have changed your environment, you can upload your firmware to your ESPs using the upload button, as you would normally.

      Once you have successfully connected your trackers to your WiFi, you can use OTA to handle all future firmware updates.

      1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
      2. In the ini/user_config.ini file:
        • Put IP or hostname of device into config file
      ini
      [ota]
       enableota = 1
       otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
       otapassword = "12345678"
       otaserverport = 3232
      -
      1. Change to OTA env
      2. Restart the ESPs, they must be power cycled
      3. Press the upload button to upload the firmware.

        img
      4. Do not touch esps or move them during OTA upload
      5. Wait around 1 minute.
      6. Repeat for as many trackers as you need.

      Finding the IP address of your tracker

      Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.

      `,21),m=i("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),y=a('

      The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.

      Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.

      Troubleshooting

      If you encountered an issue while following these steps check the FAQ.

      If you don't find an answer to your question there ask in #questions channel in the discord, we will be happy to help.

      Adapted from the SlimeVR docs, Some Credit goes to the SlimeVR team here

      ',6),C=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Connect your tracker to your PC via the programmer","slug":"_1-connect-your-tracker-to-your-pc-via-the-programmer","link":"#_1-connect-your-tracker-to-your-pc-via-the-programmer","children":[]},{"level":2,"title":"2. Build your firmware","slug":"_2-build-your-firmware","link":"#_2-build-your-firmware","children":[]},{"level":2,"title":"3. Upload your firmware","slug":"_3-upload-your-firmware","link":"#_3-upload-your-firmware","children":[]},{"level":2,"title":"Uploading via OTA","slug":"uploading-via-ota","link":"#uploading-via-ota","children":[{"level":3,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":3,"title":"How do I use it?","slug":"how-do-i-use-it","link":"#how-do-i-use-it","children":[]}]},{"level":2,"title":"Finding the IP address of your tracker","slug":"finding-the-ip-address-of-your-tracker","link":"#finding-the-ip-address-of-your-tracker","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[]}],"relativePath":"firmware_guide/upload_firmware.md","lastUpdated":1678049194000}'),g={name:"firmware_guide/upload_firmware.md"},T=Object.assign(g,{setup(f){return(w,_)=>(l(),u("div",null,[d,e(n,{options:o(s).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),h,e(t,{options:o(r).upload_firmware_image_one},null,8,["options"]),m,e(t,{options:o(r).upload_firmware_image_two},null,8,["options"]),y]))}});export{C as __pageData,T as default}; +
      1. Change to OTA env
      2. Restart the ESPs, they must be power cycled
      3. Press the upload button to upload the firmware.

        img
      4. Do not touch esps or move them during OTA upload
      5. Wait around 1 minute.
      6. Repeat for as many trackers as you need.

      Finding the IP address of your tracker

      Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.

      `,21),m=a("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),g=t('

      The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.

      Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.

      Updating the firmware to the newest version

      To update the firmware you'll need to follow a couple of steps.

      1. Open a terminal and enter the directory you've cloned OpenIris into, for example cd D:/OpenIris/

      2. Save your current changes to the config using git stash

      3. Download the newest changes from the repo using git pull

      4. Apply your saved changes so that you don't have to retype your WI-FI credentials using git stash apply

      ',5),y=a("p",null," Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files. ",-1),f=t('

      4.1. If anything went wrong, you can reset everything to the default state using git reset --hard and then retyping your credentials

      1. Upload your firmware following steps from the uploading section

      Troubleshooting

      If you encountered an issue while following these steps check the FAQ.

      If you don't find an answer to your question there ask in #questions channel in the discord, we will be happy to help.

      Adapted from the SlimeVR docs, Some Credit goes to the SlimeVR team here

      ',6),A=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Connect your tracker to your PC via the programmer","slug":"_1-connect-your-tracker-to-your-pc-via-the-programmer","link":"#_1-connect-your-tracker-to-your-pc-via-the-programmer","children":[]},{"level":2,"title":"2. Build your firmware","slug":"_2-build-your-firmware","link":"#_2-build-your-firmware","children":[]},{"level":2,"title":"3. Upload your firmware","slug":"_3-upload-your-firmware","link":"#_3-upload-your-firmware","children":[]},{"level":2,"title":"Uploading via OTA","slug":"uploading-via-ota","link":"#uploading-via-ota","children":[{"level":3,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":3,"title":"How do I use it?","slug":"how-do-i-use-it","link":"#how-do-i-use-it","children":[]}]},{"level":2,"title":"Finding the IP address of your tracker","slug":"finding-the-ip-address-of-your-tracker","link":"#finding-the-ip-address-of-your-tracker","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[]}],"relativePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1678402493000}'),_={name:"firmware_guide/upload_and_update_firmware.md"},D=Object.assign(_,{setup(w){return(b,k)=>(u(),p("div",null,[d,e(r,{options:o(i).upload_firmware_one},{content:l(()=>[h]),_:1},8,["options"]),c,e(n,{options:o(s).upload_firmware_image_one},null,8,["options"]),m,e(n,{options:o(s).upload_firmware_image_two},null,8,["options"]),g,e(r,{options:o(i).user_warning},{content:l(()=>[y]),_:1},8,["options"]),f]))}});export{A as __pageData,D as default}; diff --git a/assets/firmware_guide_upload_and_update_firmware.md.b720563f.lean.js b/assets/firmware_guide_upload_and_update_firmware.md.b720563f.lean.js new file mode 100644 index 0000000..1adc326 --- /dev/null +++ b/assets/firmware_guide_upload_and_update_firmware.md.b720563f.lean.js @@ -0,0 +1 @@ +import{_ as r,a as i}from"./chunks/index.5b1f69a8.js";import{_ as n,i as s}from"./chunks/index.1d77087a.js";import{o as u,c as p,a as e,w as l,u as o,h as t,g as a}from"./app.ffc675f3.js";const d=t("",11),h=a("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),c=t("",21),m=a("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),g=t("",5),y=a("p",null," Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files. ",-1),f=t("",6),A=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Connect your tracker to your PC via the programmer","slug":"_1-connect-your-tracker-to-your-pc-via-the-programmer","link":"#_1-connect-your-tracker-to-your-pc-via-the-programmer","children":[]},{"level":2,"title":"2. Build your firmware","slug":"_2-build-your-firmware","link":"#_2-build-your-firmware","children":[]},{"level":2,"title":"3. Upload your firmware","slug":"_3-upload-your-firmware","link":"#_3-upload-your-firmware","children":[]},{"level":2,"title":"Uploading via OTA","slug":"uploading-via-ota","link":"#uploading-via-ota","children":[{"level":3,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":3,"title":"How do I use it?","slug":"how-do-i-use-it","link":"#how-do-i-use-it","children":[]}]},{"level":2,"title":"Finding the IP address of your tracker","slug":"finding-the-ip-address-of-your-tracker","link":"#finding-the-ip-address-of-your-tracker","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[]}],"relativePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1678402493000}'),_={name:"firmware_guide/upload_and_update_firmware.md"},D=Object.assign(_,{setup(w){return(b,k)=>(u(),p("div",null,[d,e(r,{options:o(i).upload_firmware_one},{content:l(()=>[h]),_:1},8,["options"]),c,e(n,{options:o(s).upload_firmware_image_one},null,8,["options"]),m,e(n,{options:o(s).upload_firmware_image_two},null,8,["options"]),g,e(r,{options:o(i).user_warning},{content:l(()=>[y]),_:1},8,["options"]),f]))}});export{A as __pageData,D as default}; diff --git a/assets/firmware_guide_upload_firmware.md.031e2368.lean.js b/assets/firmware_guide_upload_firmware.md.031e2368.lean.js deleted file mode 100644 index ac2cf12..0000000 --- a/assets/firmware_guide_upload_firmware.md.031e2368.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,a as s}from"./chunks/index.47cb84cc.js";import{_ as t,i as r}from"./chunks/index.99ba4c01.js";import{o as l,c as u,a as e,w as p,u as o,h as a,g as i}from"./app.24a1fc0a.js";const d=a("",11),c=i("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),h=a("",21),m=i("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),y=a("",6),C=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[{"level":2,"title":"1. Connect your tracker to your PC via the programmer","slug":"_1-connect-your-tracker-to-your-pc-via-the-programmer","link":"#_1-connect-your-tracker-to-your-pc-via-the-programmer","children":[]},{"level":2,"title":"2. Build your firmware","slug":"_2-build-your-firmware","link":"#_2-build-your-firmware","children":[]},{"level":2,"title":"3. Upload your firmware","slug":"_3-upload-your-firmware","link":"#_3-upload-your-firmware","children":[]},{"level":2,"title":"Uploading via OTA","slug":"uploading-via-ota","link":"#uploading-via-ota","children":[{"level":3,"title":"What is it?","slug":"what-is-it","link":"#what-is-it","children":[]},{"level":3,"title":"How do I use it?","slug":"how-do-i-use-it","link":"#how-do-i-use-it","children":[]}]},{"level":2,"title":"Finding the IP address of your tracker","slug":"finding-the-ip-address-of-your-tracker","link":"#finding-the-ip-address-of-your-tracker","children":[]},{"level":2,"title":"Troubleshooting","slug":"troubleshooting","link":"#troubleshooting","children":[]}],"relativePath":"firmware_guide/upload_firmware.md","lastUpdated":1678049194000}'),g={name:"firmware_guide/upload_firmware.md"},T=Object.assign(g,{setup(f){return(w,_)=>(l(),u("div",null,[d,e(n,{options:o(s).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),h,e(t,{options:o(r).upload_firmware_image_one},null,8,["options"]),m,e(t,{options:o(r).upload_firmware_image_two},null,8,["options"]),y]))}});export{C as __pageData,T as default}; diff --git a/assets/getting_started_intro.md.6511e2f7.js b/assets/getting_started_intro.md.6d59da76.js similarity index 97% rename from assets/getting_started_intro.md.6511e2f7.js rename to assets/getting_started_intro.md.6d59da76.js index 5a2cb01..953eabd 100644 --- a/assets/getting_started_intro.md.6511e2f7.js +++ b/assets/getting_started_intro.md.6d59da76.js @@ -1 +1 @@ -import{_ as i,a as s}from"./chunks/index.47cb84cc.js";import{_ as l,i as d}from"./chunks/index.99ba4c01.js";import{o as c,c as h,a,w as n,u as r,h as t,g as e,b as o}from"./app.24a1fc0a.js";const u=t('

      EyeTrackVR

      Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.

      Want to get started? Check out the getting started page and then the full build guide.

      ',4),p=e("p",null," This project is in active development. However, it is working for most users. ",-1),_=t('

      About IR Emitter Safety

      Please exercise caution when messing around with IR emitters.

      IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.

      DANGER

      It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

      The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.

      ',5),m=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and at around "),e("ins",{class:"font-bold"},"5ma"),o(" total power. ")],-1),f=t('
      Want to see the safety data sheets?

      Effect of infrared radiation on the lens

      AN002_Details on photobiological safety of LED light sources

      Training-library Nir Stds

      Hardware

      Please check out our parts list and hardware repo. for information regauring hardware.

      Firmware

      Our firmware called OpenIris is made by lorow found here.

      Headset support

      In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.

      Contact

      Please join our discord for updates and any questions. We hope to see you there!

      ',9),g=t('

      Licenses

      GitHub license

      All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.

      ',3),E=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[{"level":3,"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","slug":"welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","link":"#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","children":[]},{"level":2,"title":"About IR Emitter Safety","slug":"about-ir-emitter-safety","link":"#about-ir-emitter-safety","children":[]},{"level":2,"title":"Hardware","slug":"hardware","link":"#hardware","children":[]},{"level":2,"title":"Firmware","slug":"firmware","link":"#firmware","children":[]},{"level":2,"title":"Headset support","slug":"headset-support","link":"#headset-support","children":[]}],"relativePath":"getting_started/intro.md","lastUpdated":1675993113000}'),b={name:"getting_started/intro.md"},A=Object.assign(b,{setup(y){return(w,k)=>(c(),h("div",null,[u,a(i,{options:r(s).user_warning},{content:n(()=>[p]),_:1},8,["options"]),_,a(i,{options:r(s).led_power_warning},{content:n(()=>[m]),_:1},8,["options"]),f,a(l,{options:r(d).discord_content},null,8,["options"]),g]))}});export{E as __pageData,A as default}; +import{_ as i,a as s}from"./chunks/index.5b1f69a8.js";import{_ as l,i as d}from"./chunks/index.1d77087a.js";import{o as c,c as h,a,w as n,u as r,h as t,g as e,b as o}from"./app.ffc675f3.js";const u=t('

      EyeTrackVR

      Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.

      Want to get started? Check out the getting started page and then the full build guide.

      ',4),p=e("p",null," This project is in active development. However, it is working for most users. ",-1),_=t('

      About IR Emitter Safety

      Please exercise caution when messing around with IR emitters.

      IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.

      DANGER

      It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

      The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.

      ',5),m=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and at around "),e("ins",{class:"font-bold"},"5ma"),o(" total power. ")],-1),f=t('
      Want to see the safety data sheets?

      Effect of infrared radiation on the lens

      AN002_Details on photobiological safety of LED light sources

      Training-library Nir Stds

      Hardware

      Please check out our parts list and hardware repo. for information regauring hardware.

      Firmware

      Our firmware called OpenIris is made by lorow found here.

      Headset support

      In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.

      Contact

      Please join our discord for updates and any questions. We hope to see you there!

      ',9),g=t('

      Licenses

      GitHub license

      All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.

      ',3),E=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[{"level":3,"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","slug":"welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","link":"#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","children":[]},{"level":2,"title":"About IR Emitter Safety","slug":"about-ir-emitter-safety","link":"#about-ir-emitter-safety","children":[]},{"level":2,"title":"Hardware","slug":"hardware","link":"#hardware","children":[]},{"level":2,"title":"Firmware","slug":"firmware","link":"#firmware","children":[]},{"level":2,"title":"Headset support","slug":"headset-support","link":"#headset-support","children":[]}],"relativePath":"getting_started/intro.md","lastUpdated":1675993113000}'),b={name:"getting_started/intro.md"},A=Object.assign(b,{setup(y){return(w,k)=>(c(),h("div",null,[u,a(i,{options:r(s).user_warning},{content:n(()=>[p]),_:1},8,["options"]),_,a(i,{options:r(s).led_power_warning},{content:n(()=>[m]),_:1},8,["options"]),f,a(l,{options:r(d).discord_content},null,8,["options"]),g]))}});export{E as __pageData,A as default}; diff --git a/assets/getting_started_intro.md.6511e2f7.lean.js b/assets/getting_started_intro.md.6d59da76.lean.js similarity index 90% rename from assets/getting_started_intro.md.6511e2f7.lean.js rename to assets/getting_started_intro.md.6d59da76.lean.js index e7625c7..b1cb2d2 100644 --- a/assets/getting_started_intro.md.6511e2f7.lean.js +++ b/assets/getting_started_intro.md.6d59da76.lean.js @@ -1 +1 @@ -import{_ as i,a as s}from"./chunks/index.47cb84cc.js";import{_ as l,i as d}from"./chunks/index.99ba4c01.js";import{o as c,c as h,a,w as n,u as r,h as t,g as e,b as o}from"./app.24a1fc0a.js";const u=t("",4),p=e("p",null," This project is in active development. However, it is working for most users. ",-1),_=t("",5),m=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and at around "),e("ins",{class:"font-bold"},"5ma"),o(" total power. ")],-1),f=t("",9),g=t("",3),E=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[{"level":3,"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","slug":"welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","link":"#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","children":[]},{"level":2,"title":"About IR Emitter Safety","slug":"about-ir-emitter-safety","link":"#about-ir-emitter-safety","children":[]},{"level":2,"title":"Hardware","slug":"hardware","link":"#hardware","children":[]},{"level":2,"title":"Firmware","slug":"firmware","link":"#firmware","children":[]},{"level":2,"title":"Headset support","slug":"headset-support","link":"#headset-support","children":[]}],"relativePath":"getting_started/intro.md","lastUpdated":1675993113000}'),b={name:"getting_started/intro.md"},A=Object.assign(b,{setup(y){return(w,k)=>(c(),h("div",null,[u,a(i,{options:r(s).user_warning},{content:n(()=>[p]),_:1},8,["options"]),_,a(i,{options:r(s).led_power_warning},{content:n(()=>[m]),_:1},8,["options"]),f,a(l,{options:r(d).discord_content},null,8,["options"]),g]))}});export{E as __pageData,A as default}; +import{_ as i,a as s}from"./chunks/index.5b1f69a8.js";import{_ as l,i as d}from"./chunks/index.1d77087a.js";import{o as c,c as h,a,w as n,u as r,h as t,g as e,b as o}from"./app.ffc675f3.js";const u=t("",4),p=e("p",null," This project is in active development. However, it is working for most users. ",-1),_=t("",5),m=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and at around "),e("ins",{class:"font-bold"},"5ma"),o(" total power. ")],-1),f=t("",9),g=t("",3),E=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[{"level":3,"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","slug":"welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","link":"#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","children":[]},{"level":2,"title":"About IR Emitter Safety","slug":"about-ir-emitter-safety","link":"#about-ir-emitter-safety","children":[]},{"level":2,"title":"Hardware","slug":"hardware","link":"#hardware","children":[]},{"level":2,"title":"Firmware","slug":"firmware","link":"#firmware","children":[]},{"level":2,"title":"Headset support","slug":"headset-support","link":"#headset-support","children":[]}],"relativePath":"getting_started/intro.md","lastUpdated":1675993113000}'),b={name:"getting_started/intro.md"},A=Object.assign(b,{setup(y){return(w,k)=>(c(),h("div",null,[u,a(i,{options:r(s).user_warning},{content:n(()=>[p]),_:1},8,["options"]),_,a(i,{options:r(s).led_power_warning},{content:n(()=>[m]),_:1},8,["options"]),f,a(l,{options:r(d).discord_content},null,8,["options"]),g]))}});export{E as __pageData,A as default}; diff --git a/assets/getting_started_things_to_know.md.d3bf4f84.js b/assets/getting_started_things_to_know.md.24580896.js similarity index 98% rename from assets/getting_started_things_to_know.md.d3bf4f84.js rename to assets/getting_started_things_to_know.md.24580896.js index 056cc66..13921c8 100644 --- a/assets/getting_started_things_to_know.md.d3bf4f84.js +++ b/assets/getting_started_things_to_know.md.24580896.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,h as o}from"./app.24a1fc0a.js";const w=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will be an overview of things to know and understand before you start this project","slug":"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","link":"#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","children":[{"level":3,"title":"Software is not final","slug":"software-is-not-final","link":"#software-is-not-final","children":[]},{"level":3,"title":"Firmware may have user difficulties","slug":"firmware-may-have-user-difficulties","link":"#firmware-may-have-user-difficulties","children":[]},{"level":3,"title":"IR emitters are dangerous","slug":"ir-emitters-are-dangerous","link":"#ir-emitters-are-dangerous","children":[]},{"level":3,"title":"Documentation may be incomplete","slug":"documentation-may-be-incomplete","link":"#documentation-may-be-incomplete","children":[]},{"level":3,"title":"You will need to set up your avatar to use this","slug":"you-will-need-to-set-up-your-avatar-to-use-this","link":"#you-will-need-to-set-up-your-avatar-to-use-this","children":[]},{"level":3,"title":"Once you have acknowledged the items above, move on to the Full Build Guide","slug":"once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","link":"#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","children":[]}]}],"relativePath":"getting_started/things_to_know.md","lastUpdated":1676223729000}'),i={name:"getting_started/things_to_know.md"},n=o('

      Things To Know Before You Start

      This page will be an overview of things to know and understand before you start this project

      Software is not final

      Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

      Firmware may have user difficulties

      Our firmware has not been tested widely so issues may creep up.

      IR emitters are dangerous

      If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.

      Documentation may be incomplete

      Important steps may be missing.

      You will need to set up your avatar to use this

      This will require some basic Unity knowledge and owning your own avatar.

      Once you have acknowledged the items above, move on to the Full Build Guide

      ',13),r=[n];function s(l,d,u,h,c,f){return t(),a("div",null,r)}const p=e(i,[["render",s]]);export{w as __pageData,p as default}; +import{_ as e,o as t,c as a,h as o}from"./app.ffc675f3.js";const w=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will be an overview of things to know and understand before you start this project","slug":"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","link":"#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","children":[{"level":3,"title":"Software is not final","slug":"software-is-not-final","link":"#software-is-not-final","children":[]},{"level":3,"title":"Firmware may have user difficulties","slug":"firmware-may-have-user-difficulties","link":"#firmware-may-have-user-difficulties","children":[]},{"level":3,"title":"IR emitters are dangerous","slug":"ir-emitters-are-dangerous","link":"#ir-emitters-are-dangerous","children":[]},{"level":3,"title":"Documentation may be incomplete","slug":"documentation-may-be-incomplete","link":"#documentation-may-be-incomplete","children":[]},{"level":3,"title":"You will need to set up your avatar to use this","slug":"you-will-need-to-set-up-your-avatar-to-use-this","link":"#you-will-need-to-set-up-your-avatar-to-use-this","children":[]},{"level":3,"title":"Once you have acknowledged the items above, move on to the Full Build Guide","slug":"once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","link":"#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","children":[]}]}],"relativePath":"getting_started/things_to_know.md","lastUpdated":1676223729000}'),i={name:"getting_started/things_to_know.md"},n=o('

      Things To Know Before You Start

      This page will be an overview of things to know and understand before you start this project

      Software is not final

      Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

      Firmware may have user difficulties

      Our firmware has not been tested widely so issues may creep up.

      IR emitters are dangerous

      If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.

      Documentation may be incomplete

      Important steps may be missing.

      You will need to set up your avatar to use this

      This will require some basic Unity knowledge and owning your own avatar.

      Once you have acknowledged the items above, move on to the Full Build Guide

      ',13),r=[n];function s(l,d,u,h,c,f){return t(),a("div",null,r)}const p=e(i,[["render",s]]);export{w as __pageData,p as default}; diff --git a/assets/getting_started_things_to_know.md.d3bf4f84.lean.js b/assets/getting_started_things_to_know.md.24580896.lean.js similarity index 96% rename from assets/getting_started_things_to_know.md.d3bf4f84.lean.js rename to assets/getting_started_things_to_know.md.24580896.lean.js index 346bead..2411dc8 100644 --- a/assets/getting_started_things_to_know.md.d3bf4f84.lean.js +++ b/assets/getting_started_things_to_know.md.24580896.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,h as o}from"./app.24a1fc0a.js";const w=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will be an overview of things to know and understand before you start this project","slug":"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","link":"#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","children":[{"level":3,"title":"Software is not final","slug":"software-is-not-final","link":"#software-is-not-final","children":[]},{"level":3,"title":"Firmware may have user difficulties","slug":"firmware-may-have-user-difficulties","link":"#firmware-may-have-user-difficulties","children":[]},{"level":3,"title":"IR emitters are dangerous","slug":"ir-emitters-are-dangerous","link":"#ir-emitters-are-dangerous","children":[]},{"level":3,"title":"Documentation may be incomplete","slug":"documentation-may-be-incomplete","link":"#documentation-may-be-incomplete","children":[]},{"level":3,"title":"You will need to set up your avatar to use this","slug":"you-will-need-to-set-up-your-avatar-to-use-this","link":"#you-will-need-to-set-up-your-avatar-to-use-this","children":[]},{"level":3,"title":"Once you have acknowledged the items above, move on to the Full Build Guide","slug":"once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","link":"#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","children":[]}]}],"relativePath":"getting_started/things_to_know.md","lastUpdated":1676223729000}'),i={name:"getting_started/things_to_know.md"},n=o("",13),r=[n];function s(l,d,u,h,c,f){return t(),a("div",null,r)}const p=e(i,[["render",s]]);export{w as __pageData,p as default}; +import{_ as e,o as t,c as a,h as o}from"./app.ffc675f3.js";const w=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will be an overview of things to know and understand before you start this project","slug":"this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","link":"#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","children":[{"level":3,"title":"Software is not final","slug":"software-is-not-final","link":"#software-is-not-final","children":[]},{"level":3,"title":"Firmware may have user difficulties","slug":"firmware-may-have-user-difficulties","link":"#firmware-may-have-user-difficulties","children":[]},{"level":3,"title":"IR emitters are dangerous","slug":"ir-emitters-are-dangerous","link":"#ir-emitters-are-dangerous","children":[]},{"level":3,"title":"Documentation may be incomplete","slug":"documentation-may-be-incomplete","link":"#documentation-may-be-incomplete","children":[]},{"level":3,"title":"You will need to set up your avatar to use this","slug":"you-will-need-to-set-up-your-avatar-to-use-this","link":"#you-will-need-to-set-up-your-avatar-to-use-this","children":[]},{"level":3,"title":"Once you have acknowledged the items above, move on to the Full Build Guide","slug":"once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","link":"#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","children":[]}]}],"relativePath":"getting_started/things_to_know.md","lastUpdated":1676223729000}'),i={name:"getting_started/things_to_know.md"},n=o("",13),r=[n];function s(l,d,u,h,c,f){return t(),a("div",null,r)}const p=e(i,[["render",s]]);export{w as __pageData,p as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.38d8e455.js b/assets/how_to_build_creating_your_own_mount.md.a523561e.js similarity index 98% rename from assets/how_to_build_creating_your_own_mount.md.38d8e455.js rename to assets/how_to_build_creating_your_own_mount.md.a523561e.js index ee57156..ed27c5e 100644 --- a/assets/how_to_build_creating_your_own_mount.md.38d8e455.js +++ b/assets/how_to_build_creating_your_own_mount.md.a523561e.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,h as o}from"./app.24a1fc0a.js";const g=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","slug":"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","link":"#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","children":[]},{"level":2,"title":"Step 1: Find a way to mount to your headsets lens","slug":"step-1-find-a-way-to-mount-to-your-headsets-lens","link":"#step-1-find-a-way-to-mount-to-your-headsets-lens","children":[]},{"level":2,"title":"Step 2: Find a camera mount","slug":"step-2-find-a-camera-mount","link":"#step-2-find-a-camera-mount","children":[]},{"level":2,"title":"Step 3: Place the camera mount where it will give a good camera angle","slug":"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","link":"#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","children":[]},{"level":2,"title":"Step 4: Mount your LEDs","slug":"step-4-mount-your-leds","link":"#step-4-mount-your-leds","children":[]},{"level":2,"title":"Step 5: Test everything","slug":"step-5-test-everything","link":"#step-5-test-everything","children":[]},{"level":2,"title":"Step 6: Get your mounts listed","slug":"step-6-get-your-mounts-listed","link":"#step-6-get-your-mounts-listed","children":[]}],"relativePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1676223729000}'),n={name:"how_to_build/creating_your_own_mount.md"},r=o('

      Creating Your Own Mount

      This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

      So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

      Step 1: Find a way to mount to your headsets lens

      The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"

      Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

      Step 2: Find a camera mount

      Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here

      Alternatively, you can create your own mount if you have the skills.

      Step 3: Place the camera mount where it will give a good camera angle

      The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

      You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.

      Step 4: Mount your LEDs

      You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

      Step 5: Test everything

      It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

      Step 6: Get your mounts listed

      Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

      ',18),i=[r];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const w=e(n,[["render",s]]);export{g as __pageData,w as default}; +import{_ as e,o as t,c as a,h as o}from"./app.ffc675f3.js";const g=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","slug":"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","link":"#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","children":[]},{"level":2,"title":"Step 1: Find a way to mount to your headsets lens","slug":"step-1-find-a-way-to-mount-to-your-headsets-lens","link":"#step-1-find-a-way-to-mount-to-your-headsets-lens","children":[]},{"level":2,"title":"Step 2: Find a camera mount","slug":"step-2-find-a-camera-mount","link":"#step-2-find-a-camera-mount","children":[]},{"level":2,"title":"Step 3: Place the camera mount where it will give a good camera angle","slug":"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","link":"#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","children":[]},{"level":2,"title":"Step 4: Mount your LEDs","slug":"step-4-mount-your-leds","link":"#step-4-mount-your-leds","children":[]},{"level":2,"title":"Step 5: Test everything","slug":"step-5-test-everything","link":"#step-5-test-everything","children":[]},{"level":2,"title":"Step 6: Get your mounts listed","slug":"step-6-get-your-mounts-listed","link":"#step-6-get-your-mounts-listed","children":[]}],"relativePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1676223729000}'),n={name:"how_to_build/creating_your_own_mount.md"},r=o('

      Creating Your Own Mount

      This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

      So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

      Step 1: Find a way to mount to your headsets lens

      The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"

      Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

      Step 2: Find a camera mount

      Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here

      Alternatively, you can create your own mount if you have the skills.

      Step 3: Place the camera mount where it will give a good camera angle

      The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

      You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.

      Step 4: Mount your LEDs

      You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

      Step 5: Test everything

      It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

      Step 6: Get your mounts listed

      Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

      ',18),i=[r];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const w=e(n,[["render",s]]);export{g as __pageData,w as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.38d8e455.lean.js b/assets/how_to_build_creating_your_own_mount.md.a523561e.lean.js similarity index 96% rename from assets/how_to_build_creating_your_own_mount.md.38d8e455.lean.js rename to assets/how_to_build_creating_your_own_mount.md.a523561e.lean.js index e26ac25..343b13c 100644 --- a/assets/how_to_build_creating_your_own_mount.md.38d8e455.lean.js +++ b/assets/how_to_build_creating_your_own_mount.md.a523561e.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,h as o}from"./app.24a1fc0a.js";const g=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","slug":"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","link":"#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","children":[]},{"level":2,"title":"Step 1: Find a way to mount to your headsets lens","slug":"step-1-find-a-way-to-mount-to-your-headsets-lens","link":"#step-1-find-a-way-to-mount-to-your-headsets-lens","children":[]},{"level":2,"title":"Step 2: Find a camera mount","slug":"step-2-find-a-camera-mount","link":"#step-2-find-a-camera-mount","children":[]},{"level":2,"title":"Step 3: Place the camera mount where it will give a good camera angle","slug":"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","link":"#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","children":[]},{"level":2,"title":"Step 4: Mount your LEDs","slug":"step-4-mount-your-leds","link":"#step-4-mount-your-leds","children":[]},{"level":2,"title":"Step 5: Test everything","slug":"step-5-test-everything","link":"#step-5-test-everything","children":[]},{"level":2,"title":"Step 6: Get your mounts listed","slug":"step-6-get-your-mounts-listed","link":"#step-6-get-your-mounts-listed","children":[]}],"relativePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1676223729000}'),n={name:"how_to_build/creating_your_own_mount.md"},r=o("",18),i=[r];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const w=e(n,[["render",s]]);export{g as __pageData,w as default}; +import{_ as e,o as t,c as a,h as o}from"./app.ffc675f3.js";const g=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","slug":"this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","link":"#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","children":[]},{"level":2,"title":"Step 1: Find a way to mount to your headsets lens","slug":"step-1-find-a-way-to-mount-to-your-headsets-lens","link":"#step-1-find-a-way-to-mount-to-your-headsets-lens","children":[]},{"level":2,"title":"Step 2: Find a camera mount","slug":"step-2-find-a-camera-mount","link":"#step-2-find-a-camera-mount","children":[]},{"level":2,"title":"Step 3: Place the camera mount where it will give a good camera angle","slug":"step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","link":"#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","children":[]},{"level":2,"title":"Step 4: Mount your LEDs","slug":"step-4-mount-your-leds","link":"#step-4-mount-your-leds","children":[]},{"level":2,"title":"Step 5: Test everything","slug":"step-5-test-everything","link":"#step-5-test-everything","children":[]},{"level":2,"title":"Step 6: Get your mounts listed","slug":"step-6-get-your-mounts-listed","link":"#step-6-get-your-mounts-listed","children":[]}],"relativePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1676223729000}'),n={name:"how_to_build/creating_your_own_mount.md"},r=o("",18),i=[r];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const w=e(n,[["render",s]]);export{g as __pageData,w as default}; diff --git a/assets/how_to_build_full_build.md.d126a594.js b/assets/how_to_build_full_build.md.d126a594.js new file mode 100644 index 0000000..09b20a0 --- /dev/null +++ b/assets/how_to_build_full_build.md.d126a594.js @@ -0,0 +1 @@ +import{_ as r,a as l}from"./chunks/index.5b1f69a8.js";import{_ as h}from"./chunks/CheckBoxList.0e3746ef.js";import{_ as s,i}from"./chunks/index.1d77087a.js";import{o as d,c as p,a as t,u as o,g as e,w as u,h as a,b as n}from"./app.ffc675f3.js";const c={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=a('

      Build Guide

      This page will contain a step-by-step assembly guide

      Step 1: Make sure your have read the Things to know before you start guide

      This will give you a basic overview of the project's status and what to expect currently.

      Step 2: Order all the parts listed on our Parts list

      Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

      Step 3: Wait for things to arrive

      Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

      Step 4: Gather up all of your hardware

      Make sure you have at least the following:

      ',10),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-hidden":"true"},"#")],-1),g=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),w=e("p",null,"The first option is to use an external antenna.",-1),f=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/r4PsuWTFRBg",title:"How to add an external antenna to ESP32-CAM board",frameborder:"1",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-hidden":"true"},"#")],-1),T=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),P=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-hidden":"true"},"#")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=a('

      Step 8: Configure Visual Studio Code and prepare to flash the firmware

      Check out our guide on Setting up VS Code

      Once VS Code is set up, move on to the next step.

      Step 9: Plug in your ESP and flash the firmware

      Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

      Step 10: Connect your power wires to a USB Type-A board

      WARNING

      Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.

      Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

      ',8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-hidden":"true"},"#")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),L=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),R=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-hidden":"true"},"#")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),G=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-hidden":"true"},"#")],-1),O=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),U=a('

      Step 14: Solder the negative wire to ESP

      Repeat Step 12 but with the negative wires.

      INFO

      As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

      In the below example I put it on the top of the pin, It will be a week-ish joint but that's where glue comes in handy.

      ',4),W=a('

      Step 15: Wire up the 2nd ESP

      Repeat steps 12-14 with the 2nd ESP.

      Step 16: Prepare to solder IR LED PCBs

      Get your magnifying glass out, it's time to solder very smol things.

      Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

      ',5),H=e("p",null,"Here are the PCB pin-out labels:",-1),M=e("p",null,"LED labels:",-1),F=a('

      If you have different LEDs, please consult their datasheet.

      Some terminology related to them:

      5V: 5-volt power in.

      GND: Ground or power out.

      AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

      SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

      Negative: This marks the negative side of the LED.

      Positive: This marks the positive side of the LED.

      Step 18: Solder resistors on PCB V3

      You only need 1 PCB to have resistors per eye.

      Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

      ',11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),z=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),Y=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),$=e("p",null,"Flip the PCB and solder the other end.",-1),q=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-hidden":"true"},"#")],-1),Q=e("p",null,"Tin the LED pads.",-1),K=e("p",null,"Orientate the LED and hold it in place.",-1),X=e("p",null,"Solder one end.",-1),Z=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-hidden":"true"},"#")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),se=e("p",null,"Use the following diagram:",-1),ie=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ae=a('

      Step 19: 3D print mounts

      Head to the 3D printed parts section of the parts list here.

      Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

      Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

      There are 2 different types of mounts, how to secure the camera to each type will be documented below.

      Type 1

      ',6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ue=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-hidden":"true"},"#")],-1),ce=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),ge=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-hidden":"true"},"#")],-1),we=e("p",null,"This again differs from mount to mount.",-1),fe=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will contain a step-by-step assembly guide","slug":"this-page-will-contain-a-step-by-step-assembly-guide","link":"#this-page-will-contain-a-step-by-step-assembly-guide","children":[]},{"level":2,"title":"Step 1: Make sure your have read the Things to know before you start guide","slug":"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","link":"#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","children":[]},{"level":2,"title":"Step 2: Order all the parts listed on our Parts list","slug":"step-2-order-all-the-parts-listed-on-our-parts-list","link":"#step-2-order-all-the-parts-listed-on-our-parts-list","children":[]},{"level":2,"title":"Step 3: Wait for things to arrive","slug":"step-3-wait-for-things-to-arrive","link":"#step-3-wait-for-things-to-arrive","children":[]},{"level":2,"title":"Step 4: Gather up all of your hardware","slug":"step-4-gather-up-all-of-your-hardware","link":"#step-4-gather-up-all-of-your-hardware","children":[]},{"level":2,"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","slug":"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","link":"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","children":[]},{"level":2,"title":"Step 6: Attach cameras to ESPs","slug":"step-6-attach-cameras-to-esps","link":"#step-6-attach-cameras-to-esps","children":[]},{"level":2,"title":"Step 7: Connect ESP to the programmer to flash","slug":"step-7-connect-esp-to-the-programmer-to-flash","link":"#step-7-connect-esp-to-the-programmer-to-flash","children":[]},{"level":2,"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","slug":"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","link":"#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","children":[]},{"level":2,"title":"Step 9: Plug in your ESP and flash the firmware","slug":"step-9-plug-in-your-esp-and-flash-the-firmware","link":"#step-9-plug-in-your-esp-and-flash-the-firmware","children":[]},{"level":2,"title":"Step 10: Connect your power wires to a USB Type-A board","slug":"step-10-connect-your-power-wires-to-a-usb-type-a-board","link":"#step-10-connect-your-power-wires-to-a-usb-type-a-board","children":[]},{"level":2,"title":"Step 11: Cut wires for IR LEDs","slug":"step-11-cut-wires-for-ir-leds","link":"#step-11-cut-wires-for-ir-leds","children":[]},{"level":2,"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","slug":"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","link":"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","children":[]},{"level":2,"title":"Step 13: Solder the positive wire to ESP","slug":"step-13-solder-the-positive-wire-to-esp","link":"#step-13-solder-the-positive-wire-to-esp","children":[]},{"level":2,"title":"Step 14: Solder the negative wire to ESP","slug":"step-14-solder-the-negative-wire-to-esp","link":"#step-14-solder-the-negative-wire-to-esp","children":[]},{"level":2,"title":"Step 15: Wire up the 2nd ESP","slug":"step-15-wire-up-the-2nd-esp","link":"#step-15-wire-up-the-2nd-esp","children":[]},{"level":2,"title":"Step 16: Prepare to solder IR LED PCBs","slug":"step-16-prepare-to-solder-ir-led-pcbs","link":"#step-16-prepare-to-solder-ir-led-pcbs","children":[]},{"level":2,"title":"Step 18: Solder resistors on PCB V3","slug":"step-18-solder-resistors-on-pcb-v3","link":"#step-18-solder-resistors-on-pcb-v3","children":[]},{"level":2,"title":"Solder LEDs on PCB V3","slug":"solder-leds-on-pcb-v3","link":"#solder-leds-on-pcb-v3","children":[]},{"level":2,"title":"Wire up the PCBs V3","slug":"wire-up-the-pcbs-v3","link":"#wire-up-the-pcbs-v3","children":[]},{"level":2,"title":"Step 19: 3D print mounts","slug":"step-19-3d-print-mounts","link":"#step-19-3d-print-mounts","children":[{"level":3,"title":"Type 1","slug":"type-1","link":"#type-1","children":[]},{"level":3,"title":"Type 2","slug":"type-2","link":"#type-2","children":[]}]},{"level":2,"title":"IR LED mounting","slug":"ir-led-mounting","link":"#ir-led-mounting","children":[]}],"relativePath":"how_to_build/full_build.md","lastUpdated":1678402493000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Te)=>(d(),p("div",null,[_,t(h,{options:{...o(c)}},null,8,["options"]),t(s,{options:o(i).image_one},null,8,["options"]),m,g,w,f,t(s,{options:o(i).external_antenna},null,8,["options"]),b,t(s,{options:o(i).external_antenna_resistors},null,8,["options"]),y,v,S,k,T,t(s,{options:o(i).camera_socket},null,8,["options"]),P,t(s,{options:o(i).camera_socket_clip},null,8,["options"]),E,t(s,{options:o(i).camera_cable},null,8,["options"]),x,t(s,{options:o(i).camera_clip_close},null,8,["options"]),C,I,D,t(s,{options:o(i)._7_12_one},null,8,["options"]),A,t(s,{options:o(i)._7_12_two},null,8,["options"]),B,V,L,R,N,t(s,{options:o(i)._7_12_three},null,8,["options"]),G,O,t(s,{options:o(i)._13_18_one},null,8,["options"]),U,t(s,{options:o(i)._13_18_two},null,8,["options"]),W,t(s,{options:o(i)._13_18_three},null,8,["options"]),H,t(s,{options:o(i)._13_18_four},null,8,["options"]),M,t(s,{options:o(i)._13_18_five},null,8,["options"]),F,t(s,{options:o(i)._13_18_six},null,8,["options"]),j,t(s,{options:o(i)._13_18_seven},null,8,["options"]),z,Y,t(s,{options:o(i)._13_18_eight},null,8,["options"]),$,t(s,{options:o(i)._13_18_nine},null,8,["options"]),q,t(s,{options:o(i)._13_18_ten},null,8,["options"]),J,Q,t(s,{options:o(i).end_one},null,8,["options"]),K,t(s,{options:o(i).end_two},null,8,["options"]),X,t(s,{options:o(i).end_three},null,8,["options"]),Z,t(s,{options:o(i).end_four},null,8,["options"]),ee,te,oe,t(s,{options:o(i).end_five},null,8,["options"]),se,t(s,{options:o(i).end_six},null,8,["options"]),ie,t(s,{options:o(i).end_seven},null,8,["options"]),ne,t(s,{options:o(i).end_eight},null,8,["options"]),ae,t(s,{options:o(i).end_nine},null,8,["options"]),re,le,t(s,{options:o(i).end_ten},null,8,["options"]),he,t(s,{options:o(i).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:u(()=>[pe]),_:1},8,["options"])]),ue,t(s,{options:o(i).end_twelve},null,8,["options"]),ce,_e,t(s,{options:o(i).end_thirteen},null,8,["options"]),me,t(s,{options:o(i).end_fourteen},null,8,["options"]),ge,we,fe,t(s,{options:o(i).end_fifteen},null,8,["options"]),be,t(s,{options:o(i).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default}; diff --git a/assets/how_to_build_full_build.md.dccc50d8.lean.js b/assets/how_to_build_full_build.md.d126a594.lean.js similarity index 97% rename from assets/how_to_build_full_build.md.dccc50d8.lean.js rename to assets/how_to_build_full_build.md.d126a594.lean.js index 3dbb2b6..d57c12a 100644 --- a/assets/how_to_build_full_build.md.dccc50d8.lean.js +++ b/assets/how_to_build_full_build.md.d126a594.lean.js @@ -1 +1 @@ -import{_ as r,a as l}from"./chunks/index.47cb84cc.js";import{_ as h}from"./chunks/CheckBoxList.b2594454.js";import{_ as s,i}from"./chunks/index.99ba4c01.js";import{o as d,c as p,a as t,u as o,g as e,w as u,h as a,b as n}from"./app.24a1fc0a.js";const c={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=a("",10),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-hidden":"true"},"#")],-1),g=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),w=e("p",null,"The first option is to use an external antenna.",-1),f=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/r4PsuWTFRBg",title:"How to add an external antenna to ESP32-CAM board",frameborder:"1",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-hidden":"true"},"#")],-1),T=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),P=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-hidden":"true"},"#")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=a("",8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-hidden":"true"},"#")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),L=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),R=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-hidden":"true"},"#")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),G=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-hidden":"true"},"#")],-1),O=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),U=a("",4),W=a("",5),H=e("p",null,"Here are the PCB pin-out labels:",-1),M=e("p",null,"LED labels:",-1),F=a("",11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),z=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),Y=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),$=e("p",null,"Flip the PCB and solder the other end.",-1),q=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-hidden":"true"},"#")],-1),Q=e("p",null,"Tin the LED pads.",-1),K=e("p",null,"Orientate the LED and hold it in place.",-1),X=e("p",null,"Solder one end.",-1),Z=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-hidden":"true"},"#")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),se=e("p",null,"Use the following diagram:",-1),ie=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ae=a("",6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ue=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-hidden":"true"},"#")],-1),ce=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),ge=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-hidden":"true"},"#")],-1),we=e("p",null,"This again differs from mount to mount.",-1),fe=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will contain a step-by-step assembly guide","slug":"this-page-will-contain-a-step-by-step-assembly-guide","link":"#this-page-will-contain-a-step-by-step-assembly-guide","children":[]},{"level":2,"title":"Step 1: Make sure your have read the Things to know before you start guide","slug":"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","link":"#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","children":[]},{"level":2,"title":"Step 2: Order all the parts listed on our Parts list","slug":"step-2-order-all-the-parts-listed-on-our-parts-list","link":"#step-2-order-all-the-parts-listed-on-our-parts-list","children":[]},{"level":2,"title":"Step 3: Wait for things to arrive","slug":"step-3-wait-for-things-to-arrive","link":"#step-3-wait-for-things-to-arrive","children":[]},{"level":2,"title":"Step 4: Gather up all of your hardware","slug":"step-4-gather-up-all-of-your-hardware","link":"#step-4-gather-up-all-of-your-hardware","children":[]},{"level":2,"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","slug":"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","link":"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","children":[]},{"level":2,"title":"Step 6: Attach cameras to ESPs","slug":"step-6-attach-cameras-to-esps","link":"#step-6-attach-cameras-to-esps","children":[]},{"level":2,"title":"Step 7: Connect ESP to the programmer to flash","slug":"step-7-connect-esp-to-the-programmer-to-flash","link":"#step-7-connect-esp-to-the-programmer-to-flash","children":[]},{"level":2,"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","slug":"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","link":"#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","children":[]},{"level":2,"title":"Step 9: Plug in your ESP and flash the firmware","slug":"step-9-plug-in-your-esp-and-flash-the-firmware","link":"#step-9-plug-in-your-esp-and-flash-the-firmware","children":[]},{"level":2,"title":"Step 10: Connect your power wires to a USB Type-A board","slug":"step-10-connect-your-power-wires-to-a-usb-type-a-board","link":"#step-10-connect-your-power-wires-to-a-usb-type-a-board","children":[]},{"level":2,"title":"Step 11: Cut wires for IR LEDs","slug":"step-11-cut-wires-for-ir-leds","link":"#step-11-cut-wires-for-ir-leds","children":[]},{"level":2,"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","slug":"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","link":"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","children":[]},{"level":2,"title":"Step 13: Solder the positive wire to ESP","slug":"step-13-solder-the-positive-wire-to-esp","link":"#step-13-solder-the-positive-wire-to-esp","children":[]},{"level":2,"title":"Step 14: Solder the negative wire to ESP","slug":"step-14-solder-the-negative-wire-to-esp","link":"#step-14-solder-the-negative-wire-to-esp","children":[]},{"level":2,"title":"Step 15: Wire up the 2nd ESP","slug":"step-15-wire-up-the-2nd-esp","link":"#step-15-wire-up-the-2nd-esp","children":[]},{"level":2,"title":"Step 16: Prepare to solder IR LED PCBs","slug":"step-16-prepare-to-solder-ir-led-pcbs","link":"#step-16-prepare-to-solder-ir-led-pcbs","children":[]},{"level":2,"title":"Step 18: Solder resistors on PCB V3","slug":"step-18-solder-resistors-on-pcb-v3","link":"#step-18-solder-resistors-on-pcb-v3","children":[]},{"level":2,"title":"Solder LEDs on PCB V3","slug":"solder-leds-on-pcb-v3","link":"#solder-leds-on-pcb-v3","children":[]},{"level":2,"title":"Wire up the PCBs V3","slug":"wire-up-the-pcbs-v3","link":"#wire-up-the-pcbs-v3","children":[]},{"level":2,"title":"Step 19: 3D print mounts","slug":"step-19-3d-print-mounts","link":"#step-19-3d-print-mounts","children":[{"level":3,"title":"Type 1","slug":"type-1","link":"#type-1","children":[]},{"level":3,"title":"Type 2","slug":"type-2","link":"#type-2","children":[]}]},{"level":2,"title":"IR LED mounting","slug":"ir-led-mounting","link":"#ir-led-mounting","children":[]}],"relativePath":"how_to_build/full_build.md","lastUpdated":1676590091000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Te)=>(d(),p("div",null,[_,t(h,{options:{...o(c)}},null,8,["options"]),t(s,{options:o(i).image_one},null,8,["options"]),m,g,w,f,t(s,{options:o(i).external_antenna},null,8,["options"]),b,t(s,{options:o(i).external_antenna_resistors},null,8,["options"]),y,v,S,k,T,t(s,{options:o(i).camera_socket},null,8,["options"]),P,t(s,{options:o(i).camera_socket_clip},null,8,["options"]),E,t(s,{options:o(i).camera_cable},null,8,["options"]),x,t(s,{options:o(i).camera_clip_close},null,8,["options"]),C,I,D,t(s,{options:o(i)._7_12_one},null,8,["options"]),A,t(s,{options:o(i)._7_12_two},null,8,["options"]),B,V,L,R,N,t(s,{options:o(i)._7_12_three},null,8,["options"]),G,O,t(s,{options:o(i)._13_18_one},null,8,["options"]),U,t(s,{options:o(i)._13_18_two},null,8,["options"]),W,t(s,{options:o(i)._13_18_three},null,8,["options"]),H,t(s,{options:o(i)._13_18_four},null,8,["options"]),M,t(s,{options:o(i)._13_18_five},null,8,["options"]),F,t(s,{options:o(i)._13_18_six},null,8,["options"]),j,t(s,{options:o(i)._13_18_seven},null,8,["options"]),z,Y,t(s,{options:o(i)._13_18_eight},null,8,["options"]),$,t(s,{options:o(i)._13_18_nine},null,8,["options"]),q,t(s,{options:o(i)._13_18_ten},null,8,["options"]),J,Q,t(s,{options:o(i).end_one},null,8,["options"]),K,t(s,{options:o(i).end_two},null,8,["options"]),X,t(s,{options:o(i).end_three},null,8,["options"]),Z,t(s,{options:o(i).end_four},null,8,["options"]),ee,te,oe,t(s,{options:o(i).end_five},null,8,["options"]),se,t(s,{options:o(i).end_six},null,8,["options"]),ie,t(s,{options:o(i).end_seven},null,8,["options"]),ne,t(s,{options:o(i).end_eight},null,8,["options"]),ae,t(s,{options:o(i).end_nine},null,8,["options"]),re,le,t(s,{options:o(i).end_ten},null,8,["options"]),he,t(s,{options:o(i).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:u(()=>[pe]),_:1},8,["options"])]),ue,t(s,{options:o(i).end_twelve},null,8,["options"]),ce,_e,t(s,{options:o(i).end_thirteen},null,8,["options"]),me,t(s,{options:o(i).end_fourteen},null,8,["options"]),ge,we,fe,t(s,{options:o(i).end_fifteen},null,8,["options"]),be,t(s,{options:o(i).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default}; +import{_ as r,a as l}from"./chunks/index.5b1f69a8.js";import{_ as h}from"./chunks/CheckBoxList.0e3746ef.js";import{_ as s,i}from"./chunks/index.1d77087a.js";import{o as d,c as p,a as t,u as o,g as e,w as u,h as a,b as n}from"./app.ffc675f3.js";const c={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=a("",10),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-hidden":"true"},"#")],-1),g=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),w=e("p",null,"The first option is to use an external antenna.",-1),f=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/r4PsuWTFRBg",title:"How to add an external antenna to ESP32-CAM board",frameborder:"1",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-hidden":"true"},"#")],-1),T=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),P=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-hidden":"true"},"#")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=a("",8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-hidden":"true"},"#")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),L=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),R=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-hidden":"true"},"#")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),G=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-hidden":"true"},"#")],-1),O=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),U=a("",4),W=a("",5),H=e("p",null,"Here are the PCB pin-out labels:",-1),M=e("p",null,"LED labels:",-1),F=a("",11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),z=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),Y=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),$=e("p",null,"Flip the PCB and solder the other end.",-1),q=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-hidden":"true"},"#")],-1),Q=e("p",null,"Tin the LED pads.",-1),K=e("p",null,"Orientate the LED and hold it in place.",-1),X=e("p",null,"Solder one end.",-1),Z=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-hidden":"true"},"#")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),se=e("p",null,"Use the following diagram:",-1),ie=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ae=a("",6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ue=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-hidden":"true"},"#")],-1),ce=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),ge=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-hidden":"true"},"#")],-1),we=e("p",null,"This again differs from mount to mount.",-1),fe=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will contain a step-by-step assembly guide","slug":"this-page-will-contain-a-step-by-step-assembly-guide","link":"#this-page-will-contain-a-step-by-step-assembly-guide","children":[]},{"level":2,"title":"Step 1: Make sure your have read the Things to know before you start guide","slug":"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","link":"#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","children":[]},{"level":2,"title":"Step 2: Order all the parts listed on our Parts list","slug":"step-2-order-all-the-parts-listed-on-our-parts-list","link":"#step-2-order-all-the-parts-listed-on-our-parts-list","children":[]},{"level":2,"title":"Step 3: Wait for things to arrive","slug":"step-3-wait-for-things-to-arrive","link":"#step-3-wait-for-things-to-arrive","children":[]},{"level":2,"title":"Step 4: Gather up all of your hardware","slug":"step-4-gather-up-all-of-your-hardware","link":"#step-4-gather-up-all-of-your-hardware","children":[]},{"level":2,"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","slug":"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","link":"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","children":[]},{"level":2,"title":"Step 6: Attach cameras to ESPs","slug":"step-6-attach-cameras-to-esps","link":"#step-6-attach-cameras-to-esps","children":[]},{"level":2,"title":"Step 7: Connect ESP to the programmer to flash","slug":"step-7-connect-esp-to-the-programmer-to-flash","link":"#step-7-connect-esp-to-the-programmer-to-flash","children":[]},{"level":2,"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","slug":"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","link":"#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","children":[]},{"level":2,"title":"Step 9: Plug in your ESP and flash the firmware","slug":"step-9-plug-in-your-esp-and-flash-the-firmware","link":"#step-9-plug-in-your-esp-and-flash-the-firmware","children":[]},{"level":2,"title":"Step 10: Connect your power wires to a USB Type-A board","slug":"step-10-connect-your-power-wires-to-a-usb-type-a-board","link":"#step-10-connect-your-power-wires-to-a-usb-type-a-board","children":[]},{"level":2,"title":"Step 11: Cut wires for IR LEDs","slug":"step-11-cut-wires-for-ir-leds","link":"#step-11-cut-wires-for-ir-leds","children":[]},{"level":2,"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","slug":"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","link":"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","children":[]},{"level":2,"title":"Step 13: Solder the positive wire to ESP","slug":"step-13-solder-the-positive-wire-to-esp","link":"#step-13-solder-the-positive-wire-to-esp","children":[]},{"level":2,"title":"Step 14: Solder the negative wire to ESP","slug":"step-14-solder-the-negative-wire-to-esp","link":"#step-14-solder-the-negative-wire-to-esp","children":[]},{"level":2,"title":"Step 15: Wire up the 2nd ESP","slug":"step-15-wire-up-the-2nd-esp","link":"#step-15-wire-up-the-2nd-esp","children":[]},{"level":2,"title":"Step 16: Prepare to solder IR LED PCBs","slug":"step-16-prepare-to-solder-ir-led-pcbs","link":"#step-16-prepare-to-solder-ir-led-pcbs","children":[]},{"level":2,"title":"Step 18: Solder resistors on PCB V3","slug":"step-18-solder-resistors-on-pcb-v3","link":"#step-18-solder-resistors-on-pcb-v3","children":[]},{"level":2,"title":"Solder LEDs on PCB V3","slug":"solder-leds-on-pcb-v3","link":"#solder-leds-on-pcb-v3","children":[]},{"level":2,"title":"Wire up the PCBs V3","slug":"wire-up-the-pcbs-v3","link":"#wire-up-the-pcbs-v3","children":[]},{"level":2,"title":"Step 19: 3D print mounts","slug":"step-19-3d-print-mounts","link":"#step-19-3d-print-mounts","children":[{"level":3,"title":"Type 1","slug":"type-1","link":"#type-1","children":[]},{"level":3,"title":"Type 2","slug":"type-2","link":"#type-2","children":[]}]},{"level":2,"title":"IR LED mounting","slug":"ir-led-mounting","link":"#ir-led-mounting","children":[]}],"relativePath":"how_to_build/full_build.md","lastUpdated":1678402493000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Te)=>(d(),p("div",null,[_,t(h,{options:{...o(c)}},null,8,["options"]),t(s,{options:o(i).image_one},null,8,["options"]),m,g,w,f,t(s,{options:o(i).external_antenna},null,8,["options"]),b,t(s,{options:o(i).external_antenna_resistors},null,8,["options"]),y,v,S,k,T,t(s,{options:o(i).camera_socket},null,8,["options"]),P,t(s,{options:o(i).camera_socket_clip},null,8,["options"]),E,t(s,{options:o(i).camera_cable},null,8,["options"]),x,t(s,{options:o(i).camera_clip_close},null,8,["options"]),C,I,D,t(s,{options:o(i)._7_12_one},null,8,["options"]),A,t(s,{options:o(i)._7_12_two},null,8,["options"]),B,V,L,R,N,t(s,{options:o(i)._7_12_three},null,8,["options"]),G,O,t(s,{options:o(i)._13_18_one},null,8,["options"]),U,t(s,{options:o(i)._13_18_two},null,8,["options"]),W,t(s,{options:o(i)._13_18_three},null,8,["options"]),H,t(s,{options:o(i)._13_18_four},null,8,["options"]),M,t(s,{options:o(i)._13_18_five},null,8,["options"]),F,t(s,{options:o(i)._13_18_six},null,8,["options"]),j,t(s,{options:o(i)._13_18_seven},null,8,["options"]),z,Y,t(s,{options:o(i)._13_18_eight},null,8,["options"]),$,t(s,{options:o(i)._13_18_nine},null,8,["options"]),q,t(s,{options:o(i)._13_18_ten},null,8,["options"]),J,Q,t(s,{options:o(i).end_one},null,8,["options"]),K,t(s,{options:o(i).end_two},null,8,["options"]),X,t(s,{options:o(i).end_three},null,8,["options"]),Z,t(s,{options:o(i).end_four},null,8,["options"]),ee,te,oe,t(s,{options:o(i).end_five},null,8,["options"]),se,t(s,{options:o(i).end_six},null,8,["options"]),ie,t(s,{options:o(i).end_seven},null,8,["options"]),ne,t(s,{options:o(i).end_eight},null,8,["options"]),ae,t(s,{options:o(i).end_nine},null,8,["options"]),re,le,t(s,{options:o(i).end_ten},null,8,["options"]),he,t(s,{options:o(i).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:u(()=>[pe]),_:1},8,["options"])]),ue,t(s,{options:o(i).end_twelve},null,8,["options"]),ce,_e,t(s,{options:o(i).end_thirteen},null,8,["options"]),me,t(s,{options:o(i).end_fourteen},null,8,["options"]),ge,we,fe,t(s,{options:o(i).end_fifteen},null,8,["options"]),be,t(s,{options:o(i).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default}; diff --git a/assets/how_to_build_full_build.md.dccc50d8.js b/assets/how_to_build_full_build.md.dccc50d8.js deleted file mode 100644 index d162af6..0000000 --- a/assets/how_to_build_full_build.md.dccc50d8.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as r,a as l}from"./chunks/index.47cb84cc.js";import{_ as h}from"./chunks/CheckBoxList.b2594454.js";import{_ as s,i}from"./chunks/index.99ba4c01.js";import{o as d,c as p,a as t,u as o,g as e,w as u,h as a,b as n}from"./app.24a1fc0a.js";const c={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=a('

      Build Guide

      This page will contain a step-by-step assembly guide

      Step 1: Make sure your have read the Things to know before you start guide

      This will give you a basic overview of the project's status and what to expect currently.

      Step 2: Order all the parts listed on our Parts list

      Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

      Step 3: Wait for things to arrive

      Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

      Step 4: Gather up all of your hardware

      Make sure you have at least the following:

      ',10),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-hidden":"true"},"#")],-1),g=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),w=e("p",null,"The first option is to use an external antenna.",-1),f=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/r4PsuWTFRBg",title:"How to add an external antenna to ESP32-CAM board",frameborder:"1",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-hidden":"true"},"#")],-1),T=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),P=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-hidden":"true"},"#")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=a('

      Step 8: Configure Visual Studio Code and prepare to flash the firmware

      Check out our guide on Setting up VS Code

      Once VS Code is set up, move on to the next step.

      Step 9: Plug in your ESP and flash the firmware

      Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

      Step 10: Connect your power wires to a USB Type-A board

      WARNING

      Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.

      Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

      ',8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-hidden":"true"},"#")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),L=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),R=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-hidden":"true"},"#")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),G=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-hidden":"true"},"#")],-1),O=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),U=a('

      Step 14: Solder the negative wire to ESP

      Repeat Step 12 but with the negative wires.

      INFO

      As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

      In the below example I put it on the top of the pin, It will be a week-ish joint but that's where glue comes in handy.

      ',4),W=a('

      Step 15: Wire up the 2nd ESP

      Repeat steps 12-14 with the 2nd ESP.

      Step 16: Prepare to solder IR LED PCBs

      Get your magnifying glass out, it's time to solder very smol things.

      Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

      ',5),H=e("p",null,"Here are the PCB pin-out labels:",-1),M=e("p",null,"LED labels:",-1),F=a('

      If you have different LEDs, please consult their datasheet.

      Some terminology related to them:

      5V: 5-volt power in.

      GND: Ground or power out.

      AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

      SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

      Negative: This marks the negative side of the LED.

      Positive: This marks the positive side of the LED.

      Step 18: Solder resistors on PCB V3

      You only need 1 PCB to have resistors per eye.

      Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

      ',11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),z=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),Y=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),$=e("p",null,"Flip the PCB and solder the other end.",-1),q=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-hidden":"true"},"#")],-1),Q=e("p",null,"Tin the LED pads.",-1),K=e("p",null,"Orientate the LED and hold it in place.",-1),X=e("p",null,"Solder one end.",-1),Z=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-hidden":"true"},"#")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),se=e("p",null,"Use the following diagram:",-1),ie=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ae=a('

      Step 19: 3D print mounts

      Head to the 3D printed parts section of the parts list here.

      Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

      Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

      There are 2 different types of mounts, how to secure the camera to each type will be documented below.

      Type 1

      ',6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ue=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-hidden":"true"},"#")],-1),ce=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),ge=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-hidden":"true"},"#")],-1),we=e("p",null,"This again differs from mount to mount.",-1),fe=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will contain a step-by-step assembly guide","slug":"this-page-will-contain-a-step-by-step-assembly-guide","link":"#this-page-will-contain-a-step-by-step-assembly-guide","children":[]},{"level":2,"title":"Step 1: Make sure your have read the Things to know before you start guide","slug":"step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","link":"#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","children":[]},{"level":2,"title":"Step 2: Order all the parts listed on our Parts list","slug":"step-2-order-all-the-parts-listed-on-our-parts-list","link":"#step-2-order-all-the-parts-listed-on-our-parts-list","children":[]},{"level":2,"title":"Step 3: Wait for things to arrive","slug":"step-3-wait-for-things-to-arrive","link":"#step-3-wait-for-things-to-arrive","children":[]},{"level":2,"title":"Step 4: Gather up all of your hardware","slug":"step-4-gather-up-all-of-your-hardware","link":"#step-4-gather-up-all-of-your-hardware","children":[]},{"level":2,"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","slug":"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","link":"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","children":[]},{"level":2,"title":"Step 6: Attach cameras to ESPs","slug":"step-6-attach-cameras-to-esps","link":"#step-6-attach-cameras-to-esps","children":[]},{"level":2,"title":"Step 7: Connect ESP to the programmer to flash","slug":"step-7-connect-esp-to-the-programmer-to-flash","link":"#step-7-connect-esp-to-the-programmer-to-flash","children":[]},{"level":2,"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","slug":"step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","link":"#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","children":[]},{"level":2,"title":"Step 9: Plug in your ESP and flash the firmware","slug":"step-9-plug-in-your-esp-and-flash-the-firmware","link":"#step-9-plug-in-your-esp-and-flash-the-firmware","children":[]},{"level":2,"title":"Step 10: Connect your power wires to a USB Type-A board","slug":"step-10-connect-your-power-wires-to-a-usb-type-a-board","link":"#step-10-connect-your-power-wires-to-a-usb-type-a-board","children":[]},{"level":2,"title":"Step 11: Cut wires for IR LEDs","slug":"step-11-cut-wires-for-ir-leds","link":"#step-11-cut-wires-for-ir-leds","children":[]},{"level":2,"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","slug":"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","link":"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","children":[]},{"level":2,"title":"Step 13: Solder the positive wire to ESP","slug":"step-13-solder-the-positive-wire-to-esp","link":"#step-13-solder-the-positive-wire-to-esp","children":[]},{"level":2,"title":"Step 14: Solder the negative wire to ESP","slug":"step-14-solder-the-negative-wire-to-esp","link":"#step-14-solder-the-negative-wire-to-esp","children":[]},{"level":2,"title":"Step 15: Wire up the 2nd ESP","slug":"step-15-wire-up-the-2nd-esp","link":"#step-15-wire-up-the-2nd-esp","children":[]},{"level":2,"title":"Step 16: Prepare to solder IR LED PCBs","slug":"step-16-prepare-to-solder-ir-led-pcbs","link":"#step-16-prepare-to-solder-ir-led-pcbs","children":[]},{"level":2,"title":"Step 18: Solder resistors on PCB V3","slug":"step-18-solder-resistors-on-pcb-v3","link":"#step-18-solder-resistors-on-pcb-v3","children":[]},{"level":2,"title":"Solder LEDs on PCB V3","slug":"solder-leds-on-pcb-v3","link":"#solder-leds-on-pcb-v3","children":[]},{"level":2,"title":"Wire up the PCBs V3","slug":"wire-up-the-pcbs-v3","link":"#wire-up-the-pcbs-v3","children":[]},{"level":2,"title":"Step 19: 3D print mounts","slug":"step-19-3d-print-mounts","link":"#step-19-3d-print-mounts","children":[{"level":3,"title":"Type 1","slug":"type-1","link":"#type-1","children":[]},{"level":3,"title":"Type 2","slug":"type-2","link":"#type-2","children":[]}]},{"level":2,"title":"IR LED mounting","slug":"ir-led-mounting","link":"#ir-led-mounting","children":[]}],"relativePath":"how_to_build/full_build.md","lastUpdated":1676590091000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Te)=>(d(),p("div",null,[_,t(h,{options:{...o(c)}},null,8,["options"]),t(s,{options:o(i).image_one},null,8,["options"]),m,g,w,f,t(s,{options:o(i).external_antenna},null,8,["options"]),b,t(s,{options:o(i).external_antenna_resistors},null,8,["options"]),y,v,S,k,T,t(s,{options:o(i).camera_socket},null,8,["options"]),P,t(s,{options:o(i).camera_socket_clip},null,8,["options"]),E,t(s,{options:o(i).camera_cable},null,8,["options"]),x,t(s,{options:o(i).camera_clip_close},null,8,["options"]),C,I,D,t(s,{options:o(i)._7_12_one},null,8,["options"]),A,t(s,{options:o(i)._7_12_two},null,8,["options"]),B,V,L,R,N,t(s,{options:o(i)._7_12_three},null,8,["options"]),G,O,t(s,{options:o(i)._13_18_one},null,8,["options"]),U,t(s,{options:o(i)._13_18_two},null,8,["options"]),W,t(s,{options:o(i)._13_18_three},null,8,["options"]),H,t(s,{options:o(i)._13_18_four},null,8,["options"]),M,t(s,{options:o(i)._13_18_five},null,8,["options"]),F,t(s,{options:o(i)._13_18_six},null,8,["options"]),j,t(s,{options:o(i)._13_18_seven},null,8,["options"]),z,Y,t(s,{options:o(i)._13_18_eight},null,8,["options"]),$,t(s,{options:o(i)._13_18_nine},null,8,["options"]),q,t(s,{options:o(i)._13_18_ten},null,8,["options"]),J,Q,t(s,{options:o(i).end_one},null,8,["options"]),K,t(s,{options:o(i).end_two},null,8,["options"]),X,t(s,{options:o(i).end_three},null,8,["options"]),Z,t(s,{options:o(i).end_four},null,8,["options"]),ee,te,oe,t(s,{options:o(i).end_five},null,8,["options"]),se,t(s,{options:o(i).end_six},null,8,["options"]),ie,t(s,{options:o(i).end_seven},null,8,["options"]),ne,t(s,{options:o(i).end_eight},null,8,["options"]),ae,t(s,{options:o(i).end_nine},null,8,["options"]),re,le,t(s,{options:o(i).end_ten},null,8,["options"]),he,t(s,{options:o(i).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:u(()=>[pe]),_:1},8,["options"])]),ue,t(s,{options:o(i).end_twelve},null,8,["options"]),ce,_e,t(s,{options:o(i).end_thirteen},null,8,["options"]),me,t(s,{options:o(i).end_fourteen},null,8,["options"]),ge,we,fe,t(s,{options:o(i).end_fifteen},null,8,["options"]),be,t(s,{options:o(i).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default}; diff --git a/assets/how_to_build_parts_list.md.6275b3c3.js b/assets/how_to_build_parts_list.md.6275b3c3.js new file mode 100644 index 0000000..36f8791 --- /dev/null +++ b/assets/how_to_build_parts_list.md.6275b3c3.js @@ -0,0 +1 @@ +import{_ as o,a as i}from"./chunks/index.5b1f69a8.js";import{A as w}from"./chunks/Accordion.1bf3afe0.js";import{o as r,c as s,F as u,r as m,m as k,w as t,g as e,t as c,i as g,u as n,a,b as d,h as _}from"./app.ffc675f3.js";const y={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/EyeTrack_Arkfall_Quest_2_Mount_Edit_By_Prourtz.stl",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"★ ESP mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts/ESPCAMshellv7_by_G0LDJAY.stl",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},x={class:"font-semibold text-xl"},E={class:""},P={style:{"list-style":"none"}},A=["href"],R={__name:"PartsList",setup(f){return(p,b)=>(r(),s("div",null,[(r(!0),s(u,null,m(n(y).hmds,l=>(r(),k(w,{class:"mb-4"},{title:t(()=>[e("span",x,c(l.hmd),1)]),content:t(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",P,[l.hyper_links!=p.NULL&&l.hyper_links!=""?(r(!0),s(u,{key:0},m(l.hyper_links,h=>(r(),s("p",null,[e("a",{href:h.url,target:"_blank"},c(h.desc),9,A)]))),256)):g("",!0),(r(!0),s(u,null,m(l.parts,h=>(r(),s("li",{key:h},c(h),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[d("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-hidden":"true"},"#")],-1),S=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),C=e("h2",{id:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",tabindex:"-1"},[d("This page will include a basic part list for building an EyeTrackVR setup "),e("a",{class:"header-anchor",href:"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","aria-hidden":"true"},"#")],-1),I=e("p",null," It is recommended to source the main parts from AliExpress as it is much cheaper. ",-1),T=e("hr",null,null,-1),M=e("p",null," It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),D=_('

      Camera setup

      • 2x ESP-CAM-32 modules

      AliExpress

      • 2x ov2640 160° FOV IR / Night vers 75mm (850nm)

      AliExpress
      Amazon alternative (note that you will have to manually remove the IR filter)

      • 1x ESP-CAM programmer / MB

      AliExpress
      Amazon for 3 ESP32-Cams and programmers without the proper cameras

      • 1x USB type-A male port to power both ESPs

      Bare breakout on AliExpress
      Amazon

      Or one with a cover on AliExpress
      Amazon

      • 1x Lower gauge wire to power ESPs

      28 AWG gauge wire from AliExpress
      28 AWG Amazon

      • 2x External antennas for ESPs

      Small:
      AliExpress

      Large:
      AliExpress
      Amazon

      • Antennas

      Optional but recommended if you're running vive full body tracking or having issues with streaming:

      AliExpress

      IR Emitters

      IR LED kit

      If you do not want to source things from multiple places or save money or time on assembly, you can buy a LED kit from me.
      Pre soldered kit
      Raw component kit

      Alternatively you can source the parts yourself:

      • 4x Unfocused SMD IR emitters
        (Recomended) from LCSC here.
        (Alternative) from Digikey here.
        The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.
      ',24),V=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),B=e("p",null,[e("text",{class:"font-bold"},"DO NOT BUY FOCUSED ONES!"),e("br"),d(" If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link. ")],-1),L=_('
      • 4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.

      • 4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)

      • 357 ohm Digikey here

      • 348 ohm LCSC here

      This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.

      Misc parts

      3D Printed Mounts

      Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

      ',7),H=e("h3",{id:"other-headsets",tabindex:"-1"},[d("Other Headsets "),e("a",{class:"header-anchor",href:"#other-headsets","aria-hidden":"true"},"#")],-1),z=e("p",null,"If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.",-1),N=e("p",null,[d("Check out our basic guide on making your own mount "),e("a",{href:"./creating_your_own_mount"},"here.")],-1),O=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),Y=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic part list for building an EyeTrackVR setup","slug":"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","link":"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","children":[]},{"level":2,"title":"Camera setup","slug":"camera-setup","link":"#camera-setup","children":[]},{"level":2,"title":"Recommended:","slug":"recommended","link":"#recommended","children":[]},{"level":2,"title":"IR Emitters","slug":"ir-emitters","link":"#ir-emitters","children":[{"level":3,"title":"IR LED kit","slug":"ir-led-kit","link":"#ir-led-kit","children":[]},{"level":3,"title":"Alternatively you can source the parts yourself:","slug":"alternatively-you-can-source-the-parts-yourself","link":"#alternatively-you-can-source-the-parts-yourself","children":[]}]},{"level":2,"title":"Misc parts","slug":"misc-parts","link":"#misc-parts","children":[]},{"level":2,"title":"3D Printed Mounts","slug":"_3d-printed-mounts","link":"#_3d-printed-mounts","children":[{"level":3,"title":"Other Headsets","slug":"other-headsets","link":"#other-headsets","children":[]}]}],"relativePath":"how_to_build/parts_list.md","lastUpdated":1678402493000}'),Q={name:"how_to_build/parts_list.md"},Z=Object.assign(Q,{setup(f){return(p,b)=>(r(),s("div",null,[v,a(o,{options:n(i).parts_list_one},{content:t(()=>[S]),_:1},8,["options"]),C,a(o,{options:n(i).parts_list_two},{content:t(()=>[I]),_:1},8,["options"]),T,a(o,{options:n(i).parts_list_three},{content:t(()=>[M]),_:1},8,["options"]),D,a(o,{options:n(i).parts_list_four},{content:t(()=>[V]),_:1},8,["options"]),a(o,{options:n(i).parts_list_five},{content:t(()=>[B]),_:1},8,["options"]),L,a(R),H,z,N,a(o,{options:n(i).parts_list_six},{content:t(()=>[O]),_:1},8,["options"])]))}});export{Y as __pageData,Z as default}; diff --git a/assets/how_to_build_parts_list.md.89349130.lean.js b/assets/how_to_build_parts_list.md.6275b3c3.lean.js similarity index 76% rename from assets/how_to_build_parts_list.md.89349130.lean.js rename to assets/how_to_build_parts_list.md.6275b3c3.lean.js index 79f6c2d..cb56cf4 100644 --- a/assets/how_to_build_parts_list.md.89349130.lean.js +++ b/assets/how_to_build_parts_list.md.6275b3c3.lean.js @@ -1 +1 @@ -import{_ as n,a as i}from"./chunks/index.47cb84cc.js";import{A as w}from"./chunks/Accordion.2b657ffe.js";import{o as r,c as s,F as u,r as c,m as k,w as t,g as e,t as m,i as g,u as o,a,b as d,h as _}from"./app.24a1fc0a.js";const y={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/EyeTrack_Arkfall_Quest_2_Mount_Edit_By_Prourtz.stl",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"★ ESP mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts/ESPCAMshellv7_by_G0LDJAY.stl",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},x={class:"font-semibold text-xl"},E={class:""},P={style:{"list-style":"none"}},R=["href"],A={__name:"PartsList",setup(b){return(p,f)=>(r(),s("div",null,[(r(!0),s(u,null,c(o(y).hmds,l=>(r(),k(w,{class:"mb-4"},{title:t(()=>[e("span",x,m(l.hmd),1)]),content:t(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",P,[l.hyper_links!=p.NULL&&l.hyper_links!=""?(r(!0),s(u,{key:0},c(l.hyper_links,h=>(r(),s("p",null,[e("a",{href:h.url,target:"_blank"},m(h.desc),9,R)]))),256)):g("",!0),(r(!0),s(u,null,c(l.parts,h=>(r(),s("li",{key:h},m(h),1))),128))])])])])]),_:2},1024))),256))]))}},S=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[d("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-hidden":"true"},"#")],-1),v=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),C=e("h2",{id:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",tabindex:"-1"},[d("This page will include a basic part list for building an EyeTrackVR setup "),e("a",{class:"header-anchor",href:"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","aria-hidden":"true"},"#")],-1),I=e("p",null," It is recommended to source the main parts from AliExpress as it is much cheaper. ",-1),T=e("hr",null,null,-1),M=e("p",null," It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_("",22),D=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),L=e("p",null,[e("text",{class:"font-bold"},"DO NOT BUY FOCUSED ONES!"),e("br"),d(" If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link. ")],-1),B=_("",7),H=e("h3",{id:"other-headsets",tabindex:"-1"},[d("Other Headsets "),e("a",{class:"header-anchor",href:"#other-headsets","aria-hidden":"true"},"#")],-1),z=e("p",null,"If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.",-1),N=e("p",null,[d("Check out our basic guide on making your own mount "),e("a",{href:"./creating_your_own_mount"},"here.")],-1),O=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),U=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic part list for building an EyeTrackVR setup","slug":"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","link":"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","children":[]},{"level":2,"title":"Camera setup","slug":"camera-setup","link":"#camera-setup","children":[]},{"level":2,"title":"Recommended:","slug":"recommended","link":"#recommended","children":[]},{"level":2,"title":"IR Emitters","slug":"ir-emitters","link":"#ir-emitters","children":[{"level":3,"title":"IR LED kit","slug":"ir-led-kit","link":"#ir-led-kit","children":[]},{"level":3,"title":"Alternatively you can source the parts yourself:","slug":"alternatively-you-can-source-the-parts-yourself","link":"#alternatively-you-can-source-the-parts-yourself","children":[]}]},{"level":2,"title":"Misc parts","slug":"misc-parts","link":"#misc-parts","children":[]},{"level":2,"title":"3D Printed Mounts","slug":"_3d-printed-mounts","link":"#_3d-printed-mounts","children":[{"level":3,"title":"Other Headsets","slug":"other-headsets","link":"#other-headsets","children":[]}]}],"relativePath":"how_to_build/parts_list.md","lastUpdated":1678054742000}'),Q={name:"how_to_build/parts_list.md"},W=Object.assign(Q,{setup(b){return(p,f)=>(r(),s("div",null,[S,a(n,{options:o(i).parts_list_one},{content:t(()=>[v]),_:1},8,["options"]),C,a(n,{options:o(i).parts_list_two},{content:t(()=>[I]),_:1},8,["options"]),T,a(n,{options:o(i).parts_list_three},{content:t(()=>[M]),_:1},8,["options"]),V,a(n,{options:o(i).parts_list_four},{content:t(()=>[D]),_:1},8,["options"]),a(n,{options:o(i).parts_list_five},{content:t(()=>[L]),_:1},8,["options"]),B,a(A),H,z,N,a(n,{options:o(i).parts_list_six},{content:t(()=>[O]),_:1},8,["options"])]))}});export{U as __pageData,W as default}; +import{_ as o,a as i}from"./chunks/index.5b1f69a8.js";import{A as w}from"./chunks/Accordion.1bf3afe0.js";import{o as r,c as s,F as u,r as m,m as k,w as t,g as e,t as c,i as g,u as n,a,b as d,h as _}from"./app.ffc675f3.js";const y={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/EyeTrack_Arkfall_Quest_2_Mount_Edit_By_Prourtz.stl",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"★ ESP mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts/ESPCAMshellv7_by_G0LDJAY.stl",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},x={class:"font-semibold text-xl"},E={class:""},P={style:{"list-style":"none"}},A=["href"],R={__name:"PartsList",setup(f){return(p,b)=>(r(),s("div",null,[(r(!0),s(u,null,m(n(y).hmds,l=>(r(),k(w,{class:"mb-4"},{title:t(()=>[e("span",x,c(l.hmd),1)]),content:t(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",P,[l.hyper_links!=p.NULL&&l.hyper_links!=""?(r(!0),s(u,{key:0},m(l.hyper_links,h=>(r(),s("p",null,[e("a",{href:h.url,target:"_blank"},c(h.desc),9,A)]))),256)):g("",!0),(r(!0),s(u,null,m(l.parts,h=>(r(),s("li",{key:h},c(h),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[d("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-hidden":"true"},"#")],-1),S=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),C=e("h2",{id:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",tabindex:"-1"},[d("This page will include a basic part list for building an EyeTrackVR setup "),e("a",{class:"header-anchor",href:"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","aria-hidden":"true"},"#")],-1),I=e("p",null," It is recommended to source the main parts from AliExpress as it is much cheaper. ",-1),T=e("hr",null,null,-1),M=e("p",null," It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),D=_("",24),V=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),B=e("p",null,[e("text",{class:"font-bold"},"DO NOT BUY FOCUSED ONES!"),e("br"),d(" If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link. ")],-1),L=_("",7),H=e("h3",{id:"other-headsets",tabindex:"-1"},[d("Other Headsets "),e("a",{class:"header-anchor",href:"#other-headsets","aria-hidden":"true"},"#")],-1),z=e("p",null,"If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.",-1),N=e("p",null,[d("Check out our basic guide on making your own mount "),e("a",{href:"./creating_your_own_mount"},"here.")],-1),O=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),Y=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic part list for building an EyeTrackVR setup","slug":"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","link":"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","children":[]},{"level":2,"title":"Camera setup","slug":"camera-setup","link":"#camera-setup","children":[]},{"level":2,"title":"Recommended:","slug":"recommended","link":"#recommended","children":[]},{"level":2,"title":"IR Emitters","slug":"ir-emitters","link":"#ir-emitters","children":[{"level":3,"title":"IR LED kit","slug":"ir-led-kit","link":"#ir-led-kit","children":[]},{"level":3,"title":"Alternatively you can source the parts yourself:","slug":"alternatively-you-can-source-the-parts-yourself","link":"#alternatively-you-can-source-the-parts-yourself","children":[]}]},{"level":2,"title":"Misc parts","slug":"misc-parts","link":"#misc-parts","children":[]},{"level":2,"title":"3D Printed Mounts","slug":"_3d-printed-mounts","link":"#_3d-printed-mounts","children":[{"level":3,"title":"Other Headsets","slug":"other-headsets","link":"#other-headsets","children":[]}]}],"relativePath":"how_to_build/parts_list.md","lastUpdated":1678402493000}'),Q={name:"how_to_build/parts_list.md"},Z=Object.assign(Q,{setup(f){return(p,b)=>(r(),s("div",null,[v,a(o,{options:n(i).parts_list_one},{content:t(()=>[S]),_:1},8,["options"]),C,a(o,{options:n(i).parts_list_two},{content:t(()=>[I]),_:1},8,["options"]),T,a(o,{options:n(i).parts_list_three},{content:t(()=>[M]),_:1},8,["options"]),D,a(o,{options:n(i).parts_list_four},{content:t(()=>[V]),_:1},8,["options"]),a(o,{options:n(i).parts_list_five},{content:t(()=>[B]),_:1},8,["options"]),L,a(R),H,z,N,a(o,{options:n(i).parts_list_six},{content:t(()=>[O]),_:1},8,["options"])]))}});export{Y as __pageData,Z as default}; diff --git a/assets/how_to_build_parts_list.md.89349130.js b/assets/how_to_build_parts_list.md.89349130.js deleted file mode 100644 index 05b2e6e..0000000 --- a/assets/how_to_build_parts_list.md.89349130.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,a as i}from"./chunks/index.47cb84cc.js";import{A as w}from"./chunks/Accordion.2b657ffe.js";import{o as r,c as s,F as u,r as c,m as k,w as t,g as e,t as m,i as g,u as o,a,b as d,h as _}from"./app.24a1fc0a.js";const y={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/EyeTrack_Arkfall_Quest_2_Mount_Edit_By_Prourtz.stl",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"★ ESP mount by Arkfall"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/RedHawk989/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts/ESPCAMshellv7_by_G0LDJAY.stl",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},x={class:"font-semibold text-xl"},E={class:""},P={style:{"list-style":"none"}},R=["href"],A={__name:"PartsList",setup(b){return(p,f)=>(r(),s("div",null,[(r(!0),s(u,null,c(o(y).hmds,l=>(r(),k(w,{class:"mb-4"},{title:t(()=>[e("span",x,m(l.hmd),1)]),content:t(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",P,[l.hyper_links!=p.NULL&&l.hyper_links!=""?(r(!0),s(u,{key:0},c(l.hyper_links,h=>(r(),s("p",null,[e("a",{href:h.url,target:"_blank"},m(h.desc),9,R)]))),256)):g("",!0),(r(!0),s(u,null,c(l.parts,h=>(r(),s("li",{key:h},m(h),1))),128))])])])])]),_:2},1024))),256))]))}},S=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[d("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-hidden":"true"},"#")],-1),v=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),C=e("h2",{id:"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup",tabindex:"-1"},[d("This page will include a basic part list for building an EyeTrackVR setup "),e("a",{class:"header-anchor",href:"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","aria-hidden":"true"},"#")],-1),I=e("p",null," It is recommended to source the main parts from AliExpress as it is much cheaper. ",-1),T=e("hr",null,null,-1),M=e("p",null," It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_('

      Camera setup

      • 2x ESP-CAM-32 modules

      AliExpress

      • 2x ov2640 160° FOV IR / Night vers 75mm (850nm)

      AliExpress
      Amazon alternative (note that you will have to manually remove the IR filter)

      • 1x ESP-CAM programmer / MB

      AliExpress
      Amazon for 3 ESP32-Cams and programmers without the proper cameras

      • 1x USB type-A male port to power both ESPs

      Bare breakout on AliExpress
      Amazon

      Or one with a cover on AliExpress
      Amazon

      • 1x Lower gauge wire to power ESPs

      28 AWG gauge wire from AliExpress
      28 AWG Amazon

      • 2x External antennas for ESPs

      Small:
      AliExpress

      Large:
      AliExpress
      Amazon

      • 2x-4x Heatsinks

      AliExpress

      IR Emitters

      IR LED kit

      If you do not want to source things from multiple places or save money or time on assembly, you can buy a LED kit from me.
      Pre soldered kit
      Raw component kit

      Alternatively you can source the parts yourself:

      • 4x Unfocused SMD IR emitters
        (Recomended) from LCSC here.
        (Alternative) from Digikey here.
        The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.
      ',22),D=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),L=e("p",null,[e("text",{class:"font-bold"},"DO NOT BUY FOCUSED ONES!"),e("br"),d(" If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link. ")],-1),B=_('
      • 4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.

      • 4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)

      • 357 ohm Digikey here

      • 348 ohm LCSC here

      This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.

      Misc parts

      3D Printed Mounts

      Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

      ',7),H=e("h3",{id:"other-headsets",tabindex:"-1"},[d("Other Headsets "),e("a",{class:"header-anchor",href:"#other-headsets","aria-hidden":"true"},"#")],-1),z=e("p",null,"If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.",-1),N=e("p",null,[d("Check out our basic guide on making your own mount "),e("a",{href:"./creating_your_own_mount"},"here.")],-1),O=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),U=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[{"level":2,"title":"This page will include a basic part list for building an EyeTrackVR setup","slug":"this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","link":"#this-page-will-include-a-basic-part-list-for-building-an-eyetrackvr-setup","children":[]},{"level":2,"title":"Camera setup","slug":"camera-setup","link":"#camera-setup","children":[]},{"level":2,"title":"Recommended:","slug":"recommended","link":"#recommended","children":[]},{"level":2,"title":"IR Emitters","slug":"ir-emitters","link":"#ir-emitters","children":[{"level":3,"title":"IR LED kit","slug":"ir-led-kit","link":"#ir-led-kit","children":[]},{"level":3,"title":"Alternatively you can source the parts yourself:","slug":"alternatively-you-can-source-the-parts-yourself","link":"#alternatively-you-can-source-the-parts-yourself","children":[]}]},{"level":2,"title":"Misc parts","slug":"misc-parts","link":"#misc-parts","children":[]},{"level":2,"title":"3D Printed Mounts","slug":"_3d-printed-mounts","link":"#_3d-printed-mounts","children":[{"level":3,"title":"Other Headsets","slug":"other-headsets","link":"#other-headsets","children":[]}]}],"relativePath":"how_to_build/parts_list.md","lastUpdated":1678054742000}'),Q={name:"how_to_build/parts_list.md"},W=Object.assign(Q,{setup(b){return(p,f)=>(r(),s("div",null,[S,a(n,{options:o(i).parts_list_one},{content:t(()=>[v]),_:1},8,["options"]),C,a(n,{options:o(i).parts_list_two},{content:t(()=>[I]),_:1},8,["options"]),T,a(n,{options:o(i).parts_list_three},{content:t(()=>[M]),_:1},8,["options"]),V,a(n,{options:o(i).parts_list_four},{content:t(()=>[D]),_:1},8,["options"]),a(n,{options:o(i).parts_list_five},{content:t(()=>[L]),_:1},8,["options"]),B,a(A),H,z,N,a(n,{options:o(i).parts_list_six},{content:t(()=>[O]),_:1},8,["options"])]))}});export{U as __pageData,W as default}; diff --git a/assets/index.md.2dbdc712.js b/assets/index.md.da681b8b.js similarity index 95% rename from assets/index.md.2dbdc712.js rename to assets/index.md.da681b8b.js index ecab33b..01c5100 100644 --- a/assets/index.md.2dbdc712.js +++ b/assets/index.md.da681b8b.js @@ -1 +1 @@ -import{_ as e,o as t,c as o}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/RedHawk989/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","lastUpdated":1674229165000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default}; +import{_ as e,o as t,c as o}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/RedHawk989/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","lastUpdated":1674229165000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default}; diff --git a/assets/index.md.2dbdc712.lean.js b/assets/index.md.da681b8b.lean.js similarity index 95% rename from assets/index.md.2dbdc712.lean.js rename to assets/index.md.da681b8b.lean.js index ecab33b..01c5100 100644 --- a/assets/index.md.2dbdc712.lean.js +++ b/assets/index.md.da681b8b.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o}from"./app.24a1fc0a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/RedHawk989/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","lastUpdated":1674229165000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default}; +import{_ as e,o as t,c as o}from"./app.ffc675f3.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/RedHawk989/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","lastUpdated":1674229165000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default}; diff --git a/assets/misc_faq.md.32afa1d2.js b/assets/misc_faq.md.648fb0ec.js similarity index 96% rename from assets/misc_faq.md.32afa1d2.js rename to assets/misc_faq.md.648fb0ec.js index bffc071..c3dd255 100644 --- a/assets/misc_faq.md.32afa1d2.js +++ b/assets/misc_faq.md.648fb0ec.js @@ -1 +1 @@ -import{A as d}from"./chunks/Accordion.2b657ffe.js";import{o as s,c as a,F as c,r as h,m as u,w as o,g as e,t as n,i as p,u as f,a as _,b as y}from"./app.24a1fc0a.js";const m={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eyetracker for Socail games like VRChat as well as provide an open eyetracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $25-40. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Testing is still being done to validate our current hardware choice, no hardware has been fully confirmed therefore I cannot recommend you buy parts and assemble one yourself unless you are good with losing money and are going to be actively contributing to the project. This stands true still as of 5/3.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},w={class:"font-semibold text-xl"},k={class:""},g={style:{"list-style":"none"}},b={key:0},q=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(c,null,h(f(m).faq,t=>(s(),u(d,{class:"mb-4"},{title:o(()=>[e("span",w,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",k,[e("blockquote",null,[e("ul",g,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",b,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,q)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[y("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-hidden":"true"},"#")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),N=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},R=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{N as __pageData,R as default}; +import{A as d}from"./chunks/Accordion.1bf3afe0.js";import{o as s,c as a,F as c,r as h,m as u,w as o,g as e,t as n,i as p,u as f,a as _,b as y}from"./app.ffc675f3.js";const m={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eyetracker for Socail games like VRChat as well as provide an open eyetracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $25-40. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Testing is still being done to validate our current hardware choice, no hardware has been fully confirmed therefore I cannot recommend you buy parts and assemble one yourself unless you are good with losing money and are going to be actively contributing to the project. This stands true still as of 5/3.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},w={class:"font-semibold text-xl"},k={class:""},g={style:{"list-style":"none"}},b={key:0},q=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(c,null,h(f(m).faq,t=>(s(),u(d,{class:"mb-4"},{title:o(()=>[e("span",w,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",k,[e("blockquote",null,[e("ul",g,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",b,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,q)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[y("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-hidden":"true"},"#")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),N=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},R=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{N as __pageData,R as default}; diff --git a/assets/misc_faq.md.32afa1d2.lean.js b/assets/misc_faq.md.648fb0ec.lean.js similarity index 96% rename from assets/misc_faq.md.32afa1d2.lean.js rename to assets/misc_faq.md.648fb0ec.lean.js index bffc071..c3dd255 100644 --- a/assets/misc_faq.md.32afa1d2.lean.js +++ b/assets/misc_faq.md.648fb0ec.lean.js @@ -1 +1 @@ -import{A as d}from"./chunks/Accordion.2b657ffe.js";import{o as s,c as a,F as c,r as h,m as u,w as o,g as e,t as n,i as p,u as f,a as _,b as y}from"./app.24a1fc0a.js";const m={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eyetracker for Socail games like VRChat as well as provide an open eyetracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $25-40. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Testing is still being done to validate our current hardware choice, no hardware has been fully confirmed therefore I cannot recommend you buy parts and assemble one yourself unless you are good with losing money and are going to be actively contributing to the project. This stands true still as of 5/3.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},w={class:"font-semibold text-xl"},k={class:""},g={style:{"list-style":"none"}},b={key:0},q=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(c,null,h(f(m).faq,t=>(s(),u(d,{class:"mb-4"},{title:o(()=>[e("span",w,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",k,[e("blockquote",null,[e("ul",g,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",b,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,q)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[y("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-hidden":"true"},"#")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),N=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},R=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{N as __pageData,R as default}; +import{A as d}from"./chunks/Accordion.1bf3afe0.js";import{o as s,c as a,F as c,r as h,m as u,w as o,g as e,t as n,i as p,u as f,a as _,b as y}from"./app.ffc675f3.js";const m={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eyetracker for Socail games like VRChat as well as provide an open eyetracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $25-40. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Testing is still being done to validate our current hardware choice, no hardware has been fully confirmed therefore I cannot recommend you buy parts and assemble one yourself unless you are good with losing money and are going to be actively contributing to the project. This stands true still as of 5/3.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},w={class:"font-semibold text-xl"},k={class:""},g={style:{"list-style":"none"}},b={key:0},q=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(c,null,h(f(m).faq,t=>(s(),u(d,{class:"mb-4"},{title:o(()=>[e("span",w,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",k,[e("blockquote",null,[e("ul",g,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",b,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,q)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[y("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-hidden":"true"},"#")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),N=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},R=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{N as __pageData,R as default}; diff --git a/assets/misc_vrc_avatar_setup.md.ac5fcc57.js b/assets/misc_vrc_avatar_setup.md.12b4199c.js similarity index 90% rename from assets/misc_vrc_avatar_setup.md.ac5fcc57.js rename to assets/misc_vrc_avatar_setup.md.12b4199c.js index 35515ad..f25d889 100644 --- a/assets/misc_vrc_avatar_setup.md.ac5fcc57.js +++ b/assets/misc_vrc_avatar_setup.md.12b4199c.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.47cb84cc.js";import{o as r,c as o,g as e,a as s,w as c,u as n,b as i,h as d}from"./app.24a1fc0a.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-hidden":"true"},"#")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),h=d('

      Another good resource is the VRC Face Tracking Wiki and their Discord.

      We currently use the following paramaters

      LeftEyeX

      RightEyeX

      EyesY

      LeftEyeLidExpandedSqueeze

      RightEyeLidExpandedSqueeze

      ',7),_={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[{"level":3,"title":"We currently use the following paramaters","slug":"we-currently-use-the-following-paramaters","link":"#we-currently-use-the-following-paramaters","children":[]}],"relativePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),g={name:"misc/vrc_avatar_setup.md"},E=Object.assign(g,{setup(y){return(m,w)=>(r(),o("div",null,[l,p,u,h,e("div",_,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,E as default}; +import{_ as t,a}from"./chunks/index.5b1f69a8.js";import{o as r,c as o,g as e,a as s,w as c,u as n,b as i,h as d}from"./app.ffc675f3.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-hidden":"true"},"#")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),h=d('

      Another good resource is the VRC Face Tracking Wiki and their Discord.

      We currently use the following paramaters

      LeftEyeX

      RightEyeX

      EyesY

      LeftEyeLidExpandedSqueeze

      RightEyeLidExpandedSqueeze

      ',7),_={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[{"level":3,"title":"We currently use the following paramaters","slug":"we-currently-use-the-following-paramaters","link":"#we-currently-use-the-following-paramaters","children":[]}],"relativePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),g={name:"misc/vrc_avatar_setup.md"},E=Object.assign(g,{setup(y){return(m,w)=>(r(),o("div",null,[l,p,u,h,e("div",_,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,E as default}; diff --git a/assets/misc_vrc_avatar_setup.md.ac5fcc57.lean.js b/assets/misc_vrc_avatar_setup.md.12b4199c.lean.js similarity index 86% rename from assets/misc_vrc_avatar_setup.md.ac5fcc57.lean.js rename to assets/misc_vrc_avatar_setup.md.12b4199c.lean.js index ee615fc..b432008 100644 --- a/assets/misc_vrc_avatar_setup.md.ac5fcc57.lean.js +++ b/assets/misc_vrc_avatar_setup.md.12b4199c.lean.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.47cb84cc.js";import{o as r,c as o,g as e,a as s,w as c,u as n,b as i,h as d}from"./app.24a1fc0a.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-hidden":"true"},"#")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),h=d("",7),_={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[{"level":3,"title":"We currently use the following paramaters","slug":"we-currently-use-the-following-paramaters","link":"#we-currently-use-the-following-paramaters","children":[]}],"relativePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),g={name:"misc/vrc_avatar_setup.md"},E=Object.assign(g,{setup(y){return(m,w)=>(r(),o("div",null,[l,p,u,h,e("div",_,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,E as default}; +import{_ as t,a}from"./chunks/index.5b1f69a8.js";import{o as r,c as o,g as e,a as s,w as c,u as n,b as i,h as d}from"./app.ffc675f3.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-hidden":"true"},"#")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),h=d("",7),_={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[{"level":3,"title":"We currently use the following paramaters","slug":"we-currently-use-the-following-paramaters","link":"#we-currently-use-the-following-paramaters","children":[]}],"relativePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),g={name:"misc/vrc_avatar_setup.md"},E=Object.assign(g,{setup(y){return(m,w)=>(r(),o("div",null,[l,p,u,h,e("div",_,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,E as default}; diff --git a/assets/software_guide_build_software.md.42e93d17.js b/assets/software_guide_build_software.md.a50bc6e6.js similarity index 95% rename from assets/software_guide_build_software.md.42e93d17.js rename to assets/software_guide_build_software.md.a50bc6e6.js index affe7e0..e0f5ccc 100644 --- a/assets/software_guide_build_software.md.42e93d17.js +++ b/assets/software_guide_build_software.md.a50bc6e6.js @@ -1 +1 @@ -import{_ as r,a as i}from"./chunks/index.47cb84cc.js";import{_ as l}from"./chunks/CheckBoxList.b2594454.js";import{o as n,c as s,a as o,w as h,u as a,g as e,b as t,h as d}from"./app.24a1fc0a.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-hidden":"true"},"#")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-hidden":"true"},"#")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),y=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-hidden":"true"},"#")],-1),_=d('

      Install Python

      EyetrackVR is currently using Python 3.11.0 Before you continue, please install it.

      Installing Poetry

      Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

      To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

      Poetry Documentation

      Install the required Python modules

      After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

      This should install all of the required modules.

      Build the app

      Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

      Give it time to build the app. Once done, the app should be under dist/eyetrackapp

      ',12),q=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[{"level":2,"title":"This guide will show how to build the app from source","slug":"this-guide-will-show-how-to-build-the-app-from-source","link":"#this-guide-will-show-how-to-build-the-app-from-source","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[]},{"level":2,"title":"Install Python","slug":"install-python","link":"#install-python","children":[]},{"level":2,"title":"Installing Poetry","slug":"installing-poetry","link":"#installing-poetry","children":[]},{"level":2,"title":"Install the required Python modules","slug":"install-the-required-python-modules","link":"#install-the-required-python-modules","children":[]},{"level":2,"title":"Build the app","slug":"build-the-app","link":"#build-the-app","children":[]}],"relativePath":"software_guide/build_software.md","lastUpdated":1676223729000}'),f={name:"software_guide/build_software.md"},v=Object.assign(f,{setup(w){return(b,g)=>(n(),s("div",null,[u,c,o(r,{options:a(i).build_software_one},{content:h(()=>[m]),_:1},8,["options"]),y,o(l,{options:{...a(p)}},null,8,["options"]),_]))}});export{q as __pageData,v as default}; +import{_ as r,a as i}from"./chunks/index.5b1f69a8.js";import{_ as l}from"./chunks/CheckBoxList.0e3746ef.js";import{o as n,c as s,a as o,w as h,u as a,g as e,b as t,h as d}from"./app.ffc675f3.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-hidden":"true"},"#")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-hidden":"true"},"#")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),y=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-hidden":"true"},"#")],-1),_=d('

      Install Python

      EyetrackVR is currently using Python 3.11.0 Before you continue, please install it.

      Installing Poetry

      Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

      To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

      Poetry Documentation

      Install the required Python modules

      After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

      This should install all of the required modules.

      Build the app

      Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

      Give it time to build the app. Once done, the app should be under dist/eyetrackapp

      ',12),q=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[{"level":2,"title":"This guide will show how to build the app from source","slug":"this-guide-will-show-how-to-build-the-app-from-source","link":"#this-guide-will-show-how-to-build-the-app-from-source","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[]},{"level":2,"title":"Install Python","slug":"install-python","link":"#install-python","children":[]},{"level":2,"title":"Installing Poetry","slug":"installing-poetry","link":"#installing-poetry","children":[]},{"level":2,"title":"Install the required Python modules","slug":"install-the-required-python-modules","link":"#install-the-required-python-modules","children":[]},{"level":2,"title":"Build the app","slug":"build-the-app","link":"#build-the-app","children":[]}],"relativePath":"software_guide/build_software.md","lastUpdated":1676223729000}'),f={name:"software_guide/build_software.md"},v=Object.assign(f,{setup(w){return(b,g)=>(n(),s("div",null,[u,c,o(r,{options:a(i).build_software_one},{content:h(()=>[m]),_:1},8,["options"]),y,o(l,{options:{...a(p)}},null,8,["options"]),_]))}});export{q as __pageData,v as default}; diff --git a/assets/software_guide_build_software.md.42e93d17.lean.js b/assets/software_guide_build_software.md.a50bc6e6.lean.js similarity index 91% rename from assets/software_guide_build_software.md.42e93d17.lean.js rename to assets/software_guide_build_software.md.a50bc6e6.lean.js index 76f1552..54cf69d 100644 --- a/assets/software_guide_build_software.md.42e93d17.lean.js +++ b/assets/software_guide_build_software.md.a50bc6e6.lean.js @@ -1 +1 @@ -import{_ as r,a as i}from"./chunks/index.47cb84cc.js";import{_ as l}from"./chunks/CheckBoxList.b2594454.js";import{o as n,c as s,a as o,w as h,u as a,g as e,b as t,h as d}from"./app.24a1fc0a.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-hidden":"true"},"#")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-hidden":"true"},"#")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),y=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-hidden":"true"},"#")],-1),_=d("",12),q=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[{"level":2,"title":"This guide will show how to build the app from source","slug":"this-guide-will-show-how-to-build-the-app-from-source","link":"#this-guide-will-show-how-to-build-the-app-from-source","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[]},{"level":2,"title":"Install Python","slug":"install-python","link":"#install-python","children":[]},{"level":2,"title":"Installing Poetry","slug":"installing-poetry","link":"#installing-poetry","children":[]},{"level":2,"title":"Install the required Python modules","slug":"install-the-required-python-modules","link":"#install-the-required-python-modules","children":[]},{"level":2,"title":"Build the app","slug":"build-the-app","link":"#build-the-app","children":[]}],"relativePath":"software_guide/build_software.md","lastUpdated":1676223729000}'),f={name:"software_guide/build_software.md"},v=Object.assign(f,{setup(w){return(b,g)=>(n(),s("div",null,[u,c,o(r,{options:a(i).build_software_one},{content:h(()=>[m]),_:1},8,["options"]),y,o(l,{options:{...a(p)}},null,8,["options"]),_]))}});export{q as __pageData,v as default}; +import{_ as r,a as i}from"./chunks/index.5b1f69a8.js";import{_ as l}from"./chunks/CheckBoxList.0e3746ef.js";import{o as n,c as s,a as o,w as h,u as a,g as e,b as t,h as d}from"./app.ffc675f3.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-hidden":"true"},"#")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-hidden":"true"},"#")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),y=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-hidden":"true"},"#")],-1),_=d("",12),q=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[{"level":2,"title":"This guide will show how to build the app from source","slug":"this-guide-will-show-how-to-build-the-app-from-source","link":"#this-guide-will-show-how-to-build-the-app-from-source","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[]},{"level":2,"title":"Install Python","slug":"install-python","link":"#install-python","children":[]},{"level":2,"title":"Installing Poetry","slug":"installing-poetry","link":"#installing-poetry","children":[]},{"level":2,"title":"Install the required Python modules","slug":"install-the-required-python-modules","link":"#install-the-required-python-modules","children":[]},{"level":2,"title":"Build the app","slug":"build-the-app","link":"#build-the-app","children":[]}],"relativePath":"software_guide/build_software.md","lastUpdated":1676223729000}'),f={name:"software_guide/build_software.md"},v=Object.assign(f,{setup(w){return(b,g)=>(n(),s("div",null,[u,c,o(r,{options:a(i).build_software_one},{content:h(()=>[m]),_:1},8,["options"]),y,o(l,{options:{...a(p)}},null,8,["options"]),_]))}});export{q as __pageData,v as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.js b/assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.js similarity index 98% rename from assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.js rename to assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.js index 545dd96..8e67fc4 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.js @@ -1 +1 @@ -import{_ as s,a as l}from"./chunks/index.47cb84cc.js";import{_ as n,i as r}from"./chunks/index.99ba4c01.js";import{o as h,c,a,u as o,w as d,h as i,g as e,b as t}from"./app.24a1fc0a.js";const p=i('

      How to install, run and adjust the EyeTrackVR app.

      Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

      Go to the latest GitHub release here and download the .zip

      Extract the zip file and then run the .exe as administrator. You will be greeted with a window that looks like this:

      ',4),u=e("p",null,[t("By default, it will install to "),e("code",null,"C:\\Program Files\\EyeTrackVR"),t(" and create a shortcut on your desktop. Pressing the "),e("code",null,"Change Install Path"),t(" button will open up a window where you can navigate to an alternate install path.")],-1),y=e("p",null,[t("Press "),e("code",null,"Install"),t(" to install the app.")],-1),g=e("p",null," The installer can also be used to update the app, just go through the install process again. ",-1),_=e("p",null,"If it has been successfully installed it should change to look like this:",-1),k=e("h2",{id:"step-2-run-the-eyetrackvr-app",tabindex:"-1"},[t("Step 2: Run the EyeTrackVR app "),e("a",{class:"header-anchor",href:"#step-2-run-the-eyetrackvr-app","aria-hidden":"true"},"#")],-1),f=e("p",null,[t("If the "),e("code",null,"Create Desktop Shortcut"),t(" option was checked you should see an icon on your desktop, double click it to run.")],-1),m=e("p",null,"You then should be greeted with a GUI that looks like this:",-1),w=i('

      Step 3: Getting familiar with settings and terminology

      Let's go over some basic terminology you will find in the app.

      Starting from the top:

      Right eye

      Shows the right eye feed and settings only.

      Left eye

      Shows the left eye feed and settings only.

      Both eyes

      Shows both eyes' feed and settings.

      Camera Address

      This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

      Tracking Mode

      This changes the GUI to the tracking mode where it outputs values.

      Cropping Mode

      This is where you will crop out your eye.

      Threshold

      This is used to cut out things that aren't dark like your pupil.

      Rotation

      For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

      Restart Calibrationn

      This will start a calibration mode for your eye where you look to all extremes.

      Recenter Eye

      This will recenter your eye to whatever point you are looking at.

      Step 4: Adding your cameras to the software and configuring them

      Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

      Copy that IP address and then close the browser tab with it open.

      Enter that IP address into the app's Camera Address field and press the Save and Restart Tracking button.

      Don't see your camera feed? That's because we haven't set an ROI.

      ',28),b=e("p",null,[t("Now press the "),e("code",null,"Cropping Mode"),t(" button. You should see a feed of your camera.")],-1),v=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),T=e("p",null,"You should see something like this:",-1),R=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),x=e("p",null,"A good example of an ROI",-1),S=e("p",null,[t("Head back over to the "),e("code",null,"Tracking mode"),t(".")],-1),C=e("p",null,[t("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),t(" slider.")],-1),E=e("p",null,"From this:",-1),V=e("p",null,"To this:",-1),I=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),A=e("p",null,"Example of a threshold being too low:",-1),N=e("p",null,"Example of too high of a threshold:",-1),j=e("p",null,"Example of a good threshold:",-1),z=i('

      Repeat everything in this step for your left eye.

      Step 5: Calibrating your eyes

      Once your eye is trackable by the software we need to calibrate it.

      Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

      The next step is to center your eye.

      Look straight forward and press the Recenter Eye button.

      Your eye is now fully calibrated.

      Repeat for your other eye.

      ',8),D=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),B=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[t("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),t(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-hidden":"true"},"#")],-1),F=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[{"level":3,"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","slug":"step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","link":"#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 2: Run the EyeTrackVR app","slug":"step-2-run-the-eyetrackvr-app","link":"#step-2-run-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 3: Getting familiar with settings and terminology","slug":"step-3-getting-familiar-with-settings-and-terminology","link":"#step-3-getting-familiar-with-settings-and-terminology","children":[{"level":3,"title":"Right eye","slug":"right-eye","link":"#right-eye","children":[]},{"level":3,"title":"Left eye","slug":"left-eye","link":"#left-eye","children":[]},{"level":3,"title":"Both eyes","slug":"both-eyes","link":"#both-eyes","children":[]},{"level":3,"title":"Camera Address","slug":"camera-address","link":"#camera-address","children":[]},{"level":3,"title":"Tracking Mode","slug":"tracking-mode","link":"#tracking-mode","children":[]},{"level":3,"title":"Cropping Mode","slug":"cropping-mode","link":"#cropping-mode","children":[]},{"level":3,"title":"Threshold","slug":"threshold","link":"#threshold","children":[]},{"level":3,"title":"Rotation","slug":"rotation","link":"#rotation","children":[]},{"level":3,"title":"Restart Calibrationn","slug":"restart-calibrationn","link":"#restart-calibrationn","children":[]},{"level":3,"title":"Recenter Eye","slug":"recenter-eye","link":"#recenter-eye","children":[]}]},{"level":2,"title":"Step 4: Adding your cameras to the software and configuring them","slug":"step-4-adding-your-cameras-to-the-software-and-configuring-them","link":"#step-4-adding-your-cameras-to-the-software-and-configuring-them","children":[]},{"level":2,"title":"Step 5: Calibrating your eyes","slug":"step-5-calibrating-your-eyes","link":"#step-5-calibrating-your-eyes","children":[]},{"level":2,"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","slug":"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","link":"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","children":[]}],"relativePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1676223729000}'),G={name:"software_guide/eyetrackvr_app_guide.md"},$=Object.assign(G,{setup(L){return(M,O)=>(h(),c("div",null,[p,a(n,{options:o(r).eyetrack_vr_guide_one},null,8,["options"]),u,y,a(s,{options:o(l).eyetrack_vr_guide_one},{content:d(()=>[g]),_:1},8,["options"]),_,a(n,{options:o(r).eyetrack_vr_guide_two},null,8,["options"]),k,f,m,a(n,{options:o(r).eyetrack_vr_guide_three},null,8,["options"]),w,a(n,{options:o(r).eyetrack_vr_guide_four},null,8,["options"]),b,v,T,a(n,{options:o(r).eyetrack_vr_guide_five},null,8,["options"]),R,x,a(n,{options:o(r).eyetrack_vr_guide_six},null,8,["options"]),S,C,E,a(n,{options:o(r).eyetrack_vr_guide_seven},null,8,["options"]),V,a(n,{options:o(r).eyetrack_vr_guide_eight},null,8,["options"]),I,P,A,a(n,{options:o(r).eyetrack_vr_guide_nine},null,8,["options"]),N,a(n,{options:o(r).eyetrack_vr_guide_ten},null,8,["options"]),j,a(n,{options:o(r).eyetrack_vr_guide_eleven},null,8,["options"]),z,a(s,{options:o(l).eyetrack_vr_guide_two},{content:d(()=>[D]),_:1},8,["options"]),B]))}});export{F as __pageData,$ as default}; +import{_ as s,a as l}from"./chunks/index.5b1f69a8.js";import{_ as n,i as r}from"./chunks/index.1d77087a.js";import{o as h,c,a,u as o,w as d,h as i,g as e,b as t}from"./app.ffc675f3.js";const p=i('

      How to install, run and adjust the EyeTrackVR app.

      Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

      Go to the latest GitHub release here and download the .zip

      Extract the zip file and then run the .exe as administrator. You will be greeted with a window that looks like this:

      ',4),u=e("p",null,[t("By default, it will install to "),e("code",null,"C:\\Program Files\\EyeTrackVR"),t(" and create a shortcut on your desktop. Pressing the "),e("code",null,"Change Install Path"),t(" button will open up a window where you can navigate to an alternate install path.")],-1),y=e("p",null,[t("Press "),e("code",null,"Install"),t(" to install the app.")],-1),g=e("p",null," The installer can also be used to update the app, just go through the install process again. ",-1),_=e("p",null,"If it has been successfully installed it should change to look like this:",-1),k=e("h2",{id:"step-2-run-the-eyetrackvr-app",tabindex:"-1"},[t("Step 2: Run the EyeTrackVR app "),e("a",{class:"header-anchor",href:"#step-2-run-the-eyetrackvr-app","aria-hidden":"true"},"#")],-1),f=e("p",null,[t("If the "),e("code",null,"Create Desktop Shortcut"),t(" option was checked you should see an icon on your desktop, double click it to run.")],-1),m=e("p",null,"You then should be greeted with a GUI that looks like this:",-1),w=i('

      Step 3: Getting familiar with settings and terminology

      Let's go over some basic terminology you will find in the app.

      Starting from the top:

      Right eye

      Shows the right eye feed and settings only.

      Left eye

      Shows the left eye feed and settings only.

      Both eyes

      Shows both eyes' feed and settings.

      Camera Address

      This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

      Tracking Mode

      This changes the GUI to the tracking mode where it outputs values.

      Cropping Mode

      This is where you will crop out your eye.

      Threshold

      This is used to cut out things that aren't dark like your pupil.

      Rotation

      For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

      Restart Calibrationn

      This will start a calibration mode for your eye where you look to all extremes.

      Recenter Eye

      This will recenter your eye to whatever point you are looking at.

      Step 4: Adding your cameras to the software and configuring them

      Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

      Copy that IP address and then close the browser tab with it open.

      Enter that IP address into the app's Camera Address field and press the Save and Restart Tracking button.

      Don't see your camera feed? That's because we haven't set an ROI.

      ',28),b=e("p",null,[t("Now press the "),e("code",null,"Cropping Mode"),t(" button. You should see a feed of your camera.")],-1),v=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),T=e("p",null,"You should see something like this:",-1),R=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),x=e("p",null,"A good example of an ROI",-1),S=e("p",null,[t("Head back over to the "),e("code",null,"Tracking mode"),t(".")],-1),C=e("p",null,[t("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),t(" slider.")],-1),E=e("p",null,"From this:",-1),V=e("p",null,"To this:",-1),I=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),A=e("p",null,"Example of a threshold being too low:",-1),N=e("p",null,"Example of too high of a threshold:",-1),j=e("p",null,"Example of a good threshold:",-1),z=i('

      Repeat everything in this step for your left eye.

      Step 5: Calibrating your eyes

      Once your eye is trackable by the software we need to calibrate it.

      Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

      The next step is to center your eye.

      Look straight forward and press the Recenter Eye button.

      Your eye is now fully calibrated.

      Repeat for your other eye.

      ',8),D=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),B=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[t("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),t(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-hidden":"true"},"#")],-1),F=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[{"level":3,"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","slug":"step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","link":"#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 2: Run the EyeTrackVR app","slug":"step-2-run-the-eyetrackvr-app","link":"#step-2-run-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 3: Getting familiar with settings and terminology","slug":"step-3-getting-familiar-with-settings-and-terminology","link":"#step-3-getting-familiar-with-settings-and-terminology","children":[{"level":3,"title":"Right eye","slug":"right-eye","link":"#right-eye","children":[]},{"level":3,"title":"Left eye","slug":"left-eye","link":"#left-eye","children":[]},{"level":3,"title":"Both eyes","slug":"both-eyes","link":"#both-eyes","children":[]},{"level":3,"title":"Camera Address","slug":"camera-address","link":"#camera-address","children":[]},{"level":3,"title":"Tracking Mode","slug":"tracking-mode","link":"#tracking-mode","children":[]},{"level":3,"title":"Cropping Mode","slug":"cropping-mode","link":"#cropping-mode","children":[]},{"level":3,"title":"Threshold","slug":"threshold","link":"#threshold","children":[]},{"level":3,"title":"Rotation","slug":"rotation","link":"#rotation","children":[]},{"level":3,"title":"Restart Calibrationn","slug":"restart-calibrationn","link":"#restart-calibrationn","children":[]},{"level":3,"title":"Recenter Eye","slug":"recenter-eye","link":"#recenter-eye","children":[]}]},{"level":2,"title":"Step 4: Adding your cameras to the software and configuring them","slug":"step-4-adding-your-cameras-to-the-software-and-configuring-them","link":"#step-4-adding-your-cameras-to-the-software-and-configuring-them","children":[]},{"level":2,"title":"Step 5: Calibrating your eyes","slug":"step-5-calibrating-your-eyes","link":"#step-5-calibrating-your-eyes","children":[]},{"level":2,"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","slug":"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","link":"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","children":[]}],"relativePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1676223729000}'),G={name:"software_guide/eyetrackvr_app_guide.md"},$=Object.assign(G,{setup(L){return(M,O)=>(h(),c("div",null,[p,a(n,{options:o(r).eyetrack_vr_guide_one},null,8,["options"]),u,y,a(s,{options:o(l).eyetrack_vr_guide_one},{content:d(()=>[g]),_:1},8,["options"]),_,a(n,{options:o(r).eyetrack_vr_guide_two},null,8,["options"]),k,f,m,a(n,{options:o(r).eyetrack_vr_guide_three},null,8,["options"]),w,a(n,{options:o(r).eyetrack_vr_guide_four},null,8,["options"]),b,v,T,a(n,{options:o(r).eyetrack_vr_guide_five},null,8,["options"]),R,x,a(n,{options:o(r).eyetrack_vr_guide_six},null,8,["options"]),S,C,E,a(n,{options:o(r).eyetrack_vr_guide_seven},null,8,["options"]),V,a(n,{options:o(r).eyetrack_vr_guide_eight},null,8,["options"]),I,P,A,a(n,{options:o(r).eyetrack_vr_guide_nine},null,8,["options"]),N,a(n,{options:o(r).eyetrack_vr_guide_ten},null,8,["options"]),j,a(n,{options:o(r).eyetrack_vr_guide_eleven},null,8,["options"]),z,a(s,{options:o(l).eyetrack_vr_guide_two},{content:d(()=>[D]),_:1},8,["options"]),B]))}});export{F as __pageData,$ as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.lean.js b/assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.lean.js similarity index 96% rename from assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.lean.js rename to assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.lean.js index b4c6163..d12d70c 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.0fcbbf63.lean.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.00e33ae4.lean.js @@ -1 +1 @@ -import{_ as s,a as l}from"./chunks/index.47cb84cc.js";import{_ as n,i as r}from"./chunks/index.99ba4c01.js";import{o as h,c,a,u as o,w as d,h as i,g as e,b as t}from"./app.24a1fc0a.js";const p=i("",4),u=e("p",null,[t("By default, it will install to "),e("code",null,"C:\\Program Files\\EyeTrackVR"),t(" and create a shortcut on your desktop. Pressing the "),e("code",null,"Change Install Path"),t(" button will open up a window where you can navigate to an alternate install path.")],-1),y=e("p",null,[t("Press "),e("code",null,"Install"),t(" to install the app.")],-1),g=e("p",null," The installer can also be used to update the app, just go through the install process again. ",-1),_=e("p",null,"If it has been successfully installed it should change to look like this:",-1),k=e("h2",{id:"step-2-run-the-eyetrackvr-app",tabindex:"-1"},[t("Step 2: Run the EyeTrackVR app "),e("a",{class:"header-anchor",href:"#step-2-run-the-eyetrackvr-app","aria-hidden":"true"},"#")],-1),f=e("p",null,[t("If the "),e("code",null,"Create Desktop Shortcut"),t(" option was checked you should see an icon on your desktop, double click it to run.")],-1),m=e("p",null,"You then should be greeted with a GUI that looks like this:",-1),w=i("",28),b=e("p",null,[t("Now press the "),e("code",null,"Cropping Mode"),t(" button. You should see a feed of your camera.")],-1),v=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),T=e("p",null,"You should see something like this:",-1),R=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),x=e("p",null,"A good example of an ROI",-1),S=e("p",null,[t("Head back over to the "),e("code",null,"Tracking mode"),t(".")],-1),C=e("p",null,[t("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),t(" slider.")],-1),E=e("p",null,"From this:",-1),V=e("p",null,"To this:",-1),I=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),A=e("p",null,"Example of a threshold being too low:",-1),N=e("p",null,"Example of too high of a threshold:",-1),j=e("p",null,"Example of a good threshold:",-1),z=i("",8),D=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),B=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[t("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),t(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-hidden":"true"},"#")],-1),F=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[{"level":3,"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","slug":"step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","link":"#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 2: Run the EyeTrackVR app","slug":"step-2-run-the-eyetrackvr-app","link":"#step-2-run-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 3: Getting familiar with settings and terminology","slug":"step-3-getting-familiar-with-settings-and-terminology","link":"#step-3-getting-familiar-with-settings-and-terminology","children":[{"level":3,"title":"Right eye","slug":"right-eye","link":"#right-eye","children":[]},{"level":3,"title":"Left eye","slug":"left-eye","link":"#left-eye","children":[]},{"level":3,"title":"Both eyes","slug":"both-eyes","link":"#both-eyes","children":[]},{"level":3,"title":"Camera Address","slug":"camera-address","link":"#camera-address","children":[]},{"level":3,"title":"Tracking Mode","slug":"tracking-mode","link":"#tracking-mode","children":[]},{"level":3,"title":"Cropping Mode","slug":"cropping-mode","link":"#cropping-mode","children":[]},{"level":3,"title":"Threshold","slug":"threshold","link":"#threshold","children":[]},{"level":3,"title":"Rotation","slug":"rotation","link":"#rotation","children":[]},{"level":3,"title":"Restart Calibrationn","slug":"restart-calibrationn","link":"#restart-calibrationn","children":[]},{"level":3,"title":"Recenter Eye","slug":"recenter-eye","link":"#recenter-eye","children":[]}]},{"level":2,"title":"Step 4: Adding your cameras to the software and configuring them","slug":"step-4-adding-your-cameras-to-the-software-and-configuring-them","link":"#step-4-adding-your-cameras-to-the-software-and-configuring-them","children":[]},{"level":2,"title":"Step 5: Calibrating your eyes","slug":"step-5-calibrating-your-eyes","link":"#step-5-calibrating-your-eyes","children":[]},{"level":2,"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","slug":"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","link":"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","children":[]}],"relativePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1676223729000}'),G={name:"software_guide/eyetrackvr_app_guide.md"},$=Object.assign(G,{setup(L){return(M,O)=>(h(),c("div",null,[p,a(n,{options:o(r).eyetrack_vr_guide_one},null,8,["options"]),u,y,a(s,{options:o(l).eyetrack_vr_guide_one},{content:d(()=>[g]),_:1},8,["options"]),_,a(n,{options:o(r).eyetrack_vr_guide_two},null,8,["options"]),k,f,m,a(n,{options:o(r).eyetrack_vr_guide_three},null,8,["options"]),w,a(n,{options:o(r).eyetrack_vr_guide_four},null,8,["options"]),b,v,T,a(n,{options:o(r).eyetrack_vr_guide_five},null,8,["options"]),R,x,a(n,{options:o(r).eyetrack_vr_guide_six},null,8,["options"]),S,C,E,a(n,{options:o(r).eyetrack_vr_guide_seven},null,8,["options"]),V,a(n,{options:o(r).eyetrack_vr_guide_eight},null,8,["options"]),I,P,A,a(n,{options:o(r).eyetrack_vr_guide_nine},null,8,["options"]),N,a(n,{options:o(r).eyetrack_vr_guide_ten},null,8,["options"]),j,a(n,{options:o(r).eyetrack_vr_guide_eleven},null,8,["options"]),z,a(s,{options:o(l).eyetrack_vr_guide_two},{content:d(()=>[D]),_:1},8,["options"]),B]))}});export{F as __pageData,$ as default}; +import{_ as s,a as l}from"./chunks/index.5b1f69a8.js";import{_ as n,i as r}from"./chunks/index.1d77087a.js";import{o as h,c,a,u as o,w as d,h as i,g as e,b as t}from"./app.ffc675f3.js";const p=i("",4),u=e("p",null,[t("By default, it will install to "),e("code",null,"C:\\Program Files\\EyeTrackVR"),t(" and create a shortcut on your desktop. Pressing the "),e("code",null,"Change Install Path"),t(" button will open up a window where you can navigate to an alternate install path.")],-1),y=e("p",null,[t("Press "),e("code",null,"Install"),t(" to install the app.")],-1),g=e("p",null," The installer can also be used to update the app, just go through the install process again. ",-1),_=e("p",null,"If it has been successfully installed it should change to look like this:",-1),k=e("h2",{id:"step-2-run-the-eyetrackvr-app",tabindex:"-1"},[t("Step 2: Run the EyeTrackVR app "),e("a",{class:"header-anchor",href:"#step-2-run-the-eyetrackvr-app","aria-hidden":"true"},"#")],-1),f=e("p",null,[t("If the "),e("code",null,"Create Desktop Shortcut"),t(" option was checked you should see an icon on your desktop, double click it to run.")],-1),m=e("p",null,"You then should be greeted with a GUI that looks like this:",-1),w=i("",28),b=e("p",null,[t("Now press the "),e("code",null,"Cropping Mode"),t(" button. You should see a feed of your camera.")],-1),v=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),T=e("p",null,"You should see something like this:",-1),R=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),x=e("p",null,"A good example of an ROI",-1),S=e("p",null,[t("Head back over to the "),e("code",null,"Tracking mode"),t(".")],-1),C=e("p",null,[t("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),t(" slider.")],-1),E=e("p",null,"From this:",-1),V=e("p",null,"To this:",-1),I=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),A=e("p",null,"Example of a threshold being too low:",-1),N=e("p",null,"Example of too high of a threshold:",-1),j=e("p",null,"Example of a good threshold:",-1),z=i("",8),D=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),B=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[t("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),t(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-hidden":"true"},"#")],-1),F=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[{"level":3,"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","slug":"step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","link":"#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 2: Run the EyeTrackVR app","slug":"step-2-run-the-eyetrackvr-app","link":"#step-2-run-the-eyetrackvr-app","children":[]},{"level":2,"title":"Step 3: Getting familiar with settings and terminology","slug":"step-3-getting-familiar-with-settings-and-terminology","link":"#step-3-getting-familiar-with-settings-and-terminology","children":[{"level":3,"title":"Right eye","slug":"right-eye","link":"#right-eye","children":[]},{"level":3,"title":"Left eye","slug":"left-eye","link":"#left-eye","children":[]},{"level":3,"title":"Both eyes","slug":"both-eyes","link":"#both-eyes","children":[]},{"level":3,"title":"Camera Address","slug":"camera-address","link":"#camera-address","children":[]},{"level":3,"title":"Tracking Mode","slug":"tracking-mode","link":"#tracking-mode","children":[]},{"level":3,"title":"Cropping Mode","slug":"cropping-mode","link":"#cropping-mode","children":[]},{"level":3,"title":"Threshold","slug":"threshold","link":"#threshold","children":[]},{"level":3,"title":"Rotation","slug":"rotation","link":"#rotation","children":[]},{"level":3,"title":"Restart Calibrationn","slug":"restart-calibrationn","link":"#restart-calibrationn","children":[]},{"level":3,"title":"Recenter Eye","slug":"recenter-eye","link":"#recenter-eye","children":[]}]},{"level":2,"title":"Step 4: Adding your cameras to the software and configuring them","slug":"step-4-adding-your-cameras-to-the-software-and-configuring-them","link":"#step-4-adding-your-cameras-to-the-software-and-configuring-them","children":[]},{"level":2,"title":"Step 5: Calibrating your eyes","slug":"step-5-calibrating-your-eyes","link":"#step-5-calibrating-your-eyes","children":[]},{"level":2,"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","slug":"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","link":"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","children":[]}],"relativePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1676223729000}'),G={name:"software_guide/eyetrackvr_app_guide.md"},$=Object.assign(G,{setup(L){return(M,O)=>(h(),c("div",null,[p,a(n,{options:o(r).eyetrack_vr_guide_one},null,8,["options"]),u,y,a(s,{options:o(l).eyetrack_vr_guide_one},{content:d(()=>[g]),_:1},8,["options"]),_,a(n,{options:o(r).eyetrack_vr_guide_two},null,8,["options"]),k,f,m,a(n,{options:o(r).eyetrack_vr_guide_three},null,8,["options"]),w,a(n,{options:o(r).eyetrack_vr_guide_four},null,8,["options"]),b,v,T,a(n,{options:o(r).eyetrack_vr_guide_five},null,8,["options"]),R,x,a(n,{options:o(r).eyetrack_vr_guide_six},null,8,["options"]),S,C,E,a(n,{options:o(r).eyetrack_vr_guide_seven},null,8,["options"]),V,a(n,{options:o(r).eyetrack_vr_guide_eight},null,8,["options"]),I,P,A,a(n,{options:o(r).eyetrack_vr_guide_nine},null,8,["options"]),N,a(n,{options:o(r).eyetrack_vr_guide_ten},null,8,["options"]),j,a(n,{options:o(r).eyetrack_vr_guide_eleven},null,8,["options"]),z,a(s,{options:o(l).eyetrack_vr_guide_two},{content:d(()=>[D]),_:1},8,["options"]),B]))}});export{F as __pageData,$ as default}; diff --git a/contact/index.html b/contact/index.html index 2554bb7..7bd0e8f 100644 --- a/contact/index.html +++ b/contact/index.html @@ -6,16 +6,16 @@ EyeTrackVR Docs | EyeTrackVR Docs - - - + + + -
      Skip to content
      On this page

      Contact Us


      Please join our Discord for updates and any questions.

      Released under the MIT License.

      - - + + + \ No newline at end of file diff --git a/dev_roadmap/index.html b/dev_roadmap/index.html index 845c004..f217d73 100644 --- a/dev_roadmap/index.html +++ b/dev_roadmap/index.html @@ -6,17 +6,17 @@ EyeTrackVR Development Roadmap | EyeTrackVR Docs - - - - + + + + - - - + + + \ No newline at end of file diff --git a/development/docs/dev_docs/index.html b/development/docs/dev_docs/index.html index c289642..91473de 100644 --- a/development/docs/dev_docs/index.html +++ b/development/docs/dev_docs/index.html @@ -6,20 +6,20 @@ Development Documentation for the EyeTrackVR Docs Site | EyeTrackVR Docs - - - + + + -
      Skip to content
      On this page

      Development Documentation for the EyeTrackVR Docs Site

      This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

      Getting Started

      Prerequisites

      • Node.js (v14.15.4 or higher)
      • Yarn (v1.22.10 or higher)
      • Git (v2.30.1 or higher)
      • VSCode (v1.56.2 or higher)

      Installation

      1. Clone the repo

        sh
        git clone https://github.com/RedHawk989/EyeTrackVR-Docs.git
        +    
        Skip to content
        On this page

        Development Documentation for the EyeTrackVR Docs Site

        This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

        Getting Started

        Prerequisites

        • Node.js (v14.15.4 or higher)
        • Yarn (v1.22.10 or higher)
        • Git (v2.30.1 or higher)
        • VSCode (v1.56.2 or higher)

        Installation

        1. Clone the repo

          sh
          git clone https://github.com/RedHawk989/EyeTrackVR-Docs.git
           
        2. Navigate to the vitepress folder

          sh
          cd vitepress
           
        3. Install Yarn packages

          sh
           yarn
           
        4. Start the dev server

          sh
          yarn dev
           
        5. Open the site in your browser

        Contributing

        Project Structure

        1. Familiarize yourself with the VitePress documentation.
        2. Then, move on to our project specific documentation below.

        Standards

        • All documentation should be written in Markdown or Vue components.
        • All file names are snake case and lowercase letters.
        • Do not make naming changes to the vitepress folder.
        • Do not make major changes to the vitepress folder structure without proir consultation of team members.
        • For Vue componentes, follow the Vue3 docs.

        Released under the MIT License.

        - - + + \ No newline at end of file diff --git a/development/docs/pages/index.html b/development/docs/pages/index.html index d3a0b4a..0a91026 100644 --- a/development/docs/pages/index.html +++ b/development/docs/pages/index.html @@ -6,14 +6,14 @@ Pages | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        Pages

        This section will cover how to add or edit pages on the docs website.

        Please use the Github Markdown flavour for your Markdown files.

        Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

        Adding a Page

        To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.

        Sub-directories

        You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.

        This is useful for organizing pages into categories.

        Adding a Page to the Sidebar

        To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

        To do this, you will need to add the page to the sidebar object.

        For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

        js
        {
        +    
        Skip to content
        On this page

        Pages

        This section will cover how to add or edit pages on the docs website.

        Please use the Github Markdown flavour for your Markdown files.

        Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

        Adding a Page

        To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.

        Sub-directories

        You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.

        This is useful for organizing pages into categories.

        Adding a Page to the Sidebar

        To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

        To do this, you will need to add the page to the sidebar object.

        For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

        js
        {
             text: "Getting Started",
             collapsible: true,
             items: [
        @@ -25,8 +25,8 @@
         

        Note

        The link property does not require a file extension. Please do not add it.

        Title Style

        The title style is the style of the title that appears at the top of the page.

        We like to keep this cohesive, so please use the following style:

        md
        # My Page {.text-[var(--font-accent)]}
         

        This will give the title a nice orange colour.

        The {} are required, and the .text-[#e67e22] is the colour using TailWindCSS classes. You can also use our built in CSS variables {.text-[var(--font-accent)]}. You will find these in the src/styles/theme.css file. You can change this to any colour you like, but please keep it consistent with the rest of the site.

        Tip

        This entire site supports TailWindCSS classes. You can find the documentation here.

        All classes you wish to add, must be prefaced with a . when inside of the {}.

        When using classes on HTML elements, you can use the class attribute. For example:

        html
        <h1 class="text-[#e67e22]">My Page</h1>
         

        Editing a Page

        To edit a page, you will need to edit the Markdown file in the vitepress/docs/src/pages folder.

        Released under the MIT License.

        - - + + \ No newline at end of file diff --git a/development/docs/standards/index.html b/development/docs/standards/index.html index 23b1b03..dfcbd7f 100644 --- a/development/docs/standards/index.html +++ b/development/docs/standards/index.html @@ -6,14 +6,14 @@ Standards Guide | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        Standards Guide

        Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

        Code Standards

        General

        It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

        We have only a few rules for the documentation site:

        • All code should be written in English.
        • All code should be written in a way that is easy to understand.
        • All code should be written in a way that is easy to maintain.
        • All code should be written in a way that is easy to extend.
        • Our git commit style is to be followed, in english only.

        Git Commit Style

        We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

        Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

        The following is a list of the customizations that we have made to the Conventional Commits standard:

        • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

        Our git commit style is as follows:

        bash
        <type>[optional scope]: <description>
        +    
        Skip to content
        On this page

        Standards Guide

        Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

        Code Standards

        General

        It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

        We have only a few rules for the documentation site:

        • All code should be written in English.
        • All code should be written in a way that is easy to understand.
        • All code should be written in a way that is easy to maintain.
        • All code should be written in a way that is easy to extend.
        • Our git commit style is to be followed, in english only.

        Git Commit Style

        We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

        Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

        The following is a list of the customizations that we have made to the Conventional Commits standard:

        • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

        Our git commit style is as follows:

        bash
        <type>[optional scope]: <description>
         
         [optional body]
         
        @@ -24,8 +24,8 @@
         
         BREAKING CHANGE: this is a breaking change #this line is optionaland only used if needed
         

        Released under the MIT License.

        - - + + \ No newline at end of file diff --git a/firmware_guide/configure_firmware/index.html b/firmware_guide/configure_firmware/index.html index 192174a..d2cf02b 100644 --- a/firmware_guide/configure_firmware/index.html +++ b/firmware_guide/configure_firmware/index.html @@ -6,18 +6,18 @@ Configuring the firmware | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        Configuring the firmware

        Once you have opened the project, you should see something on the left side like this

        'img'

        Open the ini/user_config.ini file

        'img'

        Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.

        INFO

        Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

        Spaces are not supported either. If you have a space in either, you will need to change it.

        The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.

        Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

        You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

        Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

        CAUTION

        Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required.

        Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

        Additonal configuration

        mDNS

        If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.

        OTA

        The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

        You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

        REST API

        The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

        This feature is used more for advanced users, and is not required for basic operation.

        The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

        The full REST API is documented here.

        Environments

        The firmware supports multiple environments. This means that we have full support for multiple types of esps. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one. The environments are as follows:

        • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
        • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
        • esp32M5Stack - This is for ESP32M5Stack.
        • esp32WRover - This is for the ESP32WRover.
        • esp-eye - This is for the ESP-EYE (not the S3 variant).

        Each environment has a debug and release configuration. The debug configuration is for debugging, and the release configuration is for production. The debug configuration is not recommended for production, as it will use more memory, and will be slower. However we recommend using the debug configuration for initial configuration and testing, as it will be easier to debug, for you and for us. Once you are confident that the firmware is working correctly, you can switch to the release configuration.

        The debug configuration will print out debug messages to the serial port. The release configuration will not print out debug messages to the serial port, and will only print errors. This will save memory, and will make the firmware faster.

        The default configutration is debug for the espAIThinker environment. If you are using a different ESP, please follow the GIF(s) below to change the environment.

        Coming Soon

        GIF(s) for changing the environment will be added soon.

        Want to help? Submit a PR to add the GIF(s).

        Coming Soon

        We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.

        Now, move on to uploading the firmware

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Configuring the firmware

        Once you have opened the project, you should see something on the left side like this

        'img'

        Open the ini/user_config.ini file

        'img'

        Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.

        INFO

        Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

        Spaces are not supported either. If you have a space in either, you will need to change it.

        The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.

        Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

        You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

        Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

        CAUTION

        Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required.

        Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

        Additonal configuration

        mDNS

        If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.

        OTA

        The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

        You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

        REST API

        The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

        This feature is used more for advanced users, and is not required for basic operation.

        The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

        The full REST API is documented here.

        Environments

        The firmware supports multiple environments. This means that we have full support for multiple types of esps. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one. The environments are as follows:

        • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
        • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
        • esp32M5Stack - This is for ESP32M5Stack.
        • esp32WRover - This is for the ESP32WRover.
        • esp-eye - This is for the ESP-EYE (not the S3 variant).

        Each environment has a debug and release configuration. The debug configuration is for debugging, and the release configuration is for production. The debug configuration is not recommended for production, as it will use more memory, and will be slower. However we recommend using the debug configuration for initial configuration and testing, as it will be easier to debug, for you and for us. Once you are confident that the firmware is working correctly, you can switch to the release configuration.

        The debug configuration will print out debug messages to the serial port. The release configuration will not print out debug messages to the serial port, and will only print errors. This will save memory, and will make the firmware faster.

        The default configutration is debug for the espAIThinker environment. If you are using a different ESP, please follow the GIF(s) below to change the environment.

        Coming Soon

        GIF(s) for changing the environment will be added soon.

        Want to help? Submit a PR to add the GIF(s).

        Coming Soon

        We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.

        Now, move on to uploading the firmware

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/firmware_guide/environments/index.html b/firmware_guide/environments/index.html index 983e424..86e5652 100644 --- a/firmware_guide/environments/index.html +++ b/firmware_guide/environments/index.html @@ -6,16 +6,16 @@ Firmware Environments | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        Firmware Environments

        What is it?

        A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

        We use environments to store the firmware config for each device, so that you can easily switch between them.

        Envrionments are broken up into two distinct parts:

        • The build type (e.g. debug, release)
        • The board type (e.g. espaithinker, esp32cam)

        Build Types

        We now have a couple of options letting us decide how we want to build the firmaware.

        • Debug - Has a lot of logging, useful for getting everything setup for the first time and to see what is going on.

        The debug environment is the default environment, so you don't need to specify it when building.

        All debug environments are the default board environments, only OTA and release are specified in the name.

        Tip

        We recommend starting with a debug environment, and then switching to release once everything is working.

        • Release - Has a lot less debugging, may also be missing some things availible only in debug for debug purposes, this should be flashed when everything is working.

        • OTA - Just like release, but it will upload your firmware to your esp wirelessly.

        Warning

        You need to change the IP to which board we should upload to, the setting is called the otaserverip and can be found in the user_config.ini file.

        The otaserverip setting supports both IPv4 and mDNS names, as long as the mDNS name is resolvable on your network (i.e: you have bonjour installed on your computer).

        You can also change the port and password, but it's not recommended.

        Board Types

        We currently support a few different boards, and we are working on adding more.

        Warning

        It is important to note that the esp32AIThinker environment is the default environment, and will work for the vast majority of users. Do not switch your environment unless you know what you are doing, and have tested the default environment first, and verified that it does not work for you.

        Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

        Currently supported boards:

        • esp32AIThinker - The ESP32 Ai Thinker.
        • esp32cam - The ESP32 Camera.
        • esp_eye - The Non-Esp32S3 version of the ESP-EYE camera.
        • esp32M5Stack - The ESP32 M5Stack camera.
        • wrover - The ESP32 WRover (Non-ESP32-S3 variant).

        Coming Soon

        • esp32s3cam - The ESP32-S3 Camera boards.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Firmware Environments

        What is it?

        A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

        We use environments to store the firmware config for each device, so that you can easily switch between them.

        Environments are broken up into two distinct parts:

        • The build type (e.g. debug, release)
        • The board type (e.g. espaithinker, esp32cam)

        Build Types

        We now have a couple of options letting us decide how we want to build the firmaware.

        • Debug - Has a lot of logging, useful for getting everything setup for the first time and to see what is going on.

        The debug environment is the default environment, so you don't need to specify it when building.

        All debug environments are the default board environments, only OTA and release are specified in the name.

        Tip

        We recommend starting with a debug environment, and then switching to release once everything is working.

        • Release - Has a lot less debugging, may also be missing some things availible only in debug for debug purposes, this should be flashed when everything is working.

        • OTA - Just like release, but it will upload your firmware to your esp wirelessly.

        Warning

        You need to change the IP to which board we should upload to, the setting is called the otaserverip and can be found in the user_config.ini file.

        The otaserverip setting supports both IPv4 and mDNS names, as long as the mDNS name is resolvable on your network (i.e: you have bonjour installed on your computer).

        You can also change the port and password, but it's not recommended.

        Board Types

        We currently support a few different boards, and we are working on adding more.

        Warning

        It is important to note that the esp32AIThinker environment is the default environment, and will work for the vast majority of users. Do not switch your environment unless you know what you are doing, and have tested the default environment first, and verified that it does not work for you.

        Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

        Currently supported boards:

        • esp32AIThinker - The ESP32 Ai Thinker.
        • esp32cam - The ESP32 Camera.
        • esp_eye - The Non-Esp32S3 version of the ESP-EYE camera.
        • esp32M5Stack - The ESP32 M5Stack camera.
        • wrover - The ESP32 WRover (Non-ESP32-S3 variant).

        Coming Soon

        • esp32s3cam - The ESP32-S3 Camera boards.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/firmware_guide/firmware/index.html b/firmware_guide/firmware/index.html index ceee25a..ae4bd8d 100644 --- a/firmware_guide/firmware/index.html +++ b/firmware_guide/firmware/index.html @@ -6,16 +6,16 @@ What is this? | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        What is this?

        Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.

        What should I download and where?

        Current testing has been on our own solution called OpenIris, found here. To check the status of the project, please visit the Development Road Map

        How do download this?

        Follow the steps described here

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        What is this?

        Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.

        What should I download and where?

        Current testing has been on our own solution called OpenIris, found here. To check the status of the project, please visit the Development Road Map

        How do download this?

        Follow the steps described here

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/firmware_guide/mdns/index.html b/firmware_guide/mdns/index.html index 1fb8269..66f2497 100644 --- a/firmware_guide/mdns/index.html +++ b/firmware_guide/mdns/index.html @@ -6,17 +6,17 @@ MDNS | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        MDNS

        What is it?

        mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

        In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

        How to use it

        Enable mDNS

        The mDNS is enabled by default on the new firmware, and can not be disabled.

        To use it, all you need to do is set the name of the device in the firmware config file.

        This setting can be located under the [wifi] section of the ini/user_config.ini file.

        ini
        mdnsname = "openiristracker" # do not add .local
        -

        By default, the name of the device is openiristracker, however you can change it to whatever you want.

        Change the name

        Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

        Connect to the device

        To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

        Prerequisites Bonjour

        Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

        You can also get the fully tested Bonjour package from us here (for Windows only).

        Troubleshooting

        Can not connect to the device

        If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

        If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        MDNS

        What is it?

        mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

        In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

        How to use it

        Enable mDNS

        The mDNS is enabled by default on the new firmware, and can not be disabled.

        To use it, all you need to do is set the name of the device in the firmware config file.

        This setting can be located under the [wifi] section of the ini/user_config.ini file.

        ini
        mdnsname = "openiristracker" # do not add .local
        +

        By default, the name of the device is openiristracker, however you can change it to whatever you want.

        Change the name

        Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

        Connect to the device

        To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

        Prerequisites Bonjour

        Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

        You can also get the fully tested Bonjour package from us here (for Windows only).

        Troubleshooting

        Can not connect to the device

        If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

        If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/firmware_guide/rest_api/index.html b/firmware_guide/rest_api/index.html index bad1539..485ff74 100644 --- a/firmware_guide/rest_api/index.html +++ b/firmware_guide/rest_api/index.html @@ -6,14 +6,14 @@ REST API | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        REST API

        What is it?

        A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

        We developed a REST API for this project so that we can control the devices more easily from our new app.

        How to use it

        REST API Client

        Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

        For basic GET requests, you can use your browser of choice.

        Standard

        The REST API follows the following standard:

        txt
        http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}
        +    
        Skip to content
        On this page

        REST API

        What is it?

        A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

        We developed a REST API for this project so that we can control the devices more easily from our new app.

        How to use it

        REST API Client

        Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

        For basic GET requests, you can use your browser of choice.

        Standard

        The REST API follows the following standard:

        txt
        http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}
         

        For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

        Endpoints

        Note

        Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

        If you would like to help us implement these endpoints, please contact us.

        We are also open to suggestions for new endpoints.

        Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

        The REST API has the following endpoints:

        EndpointMethodDescription
        /pingGETReturns the status of the device.
        /saveGETWrites any changes to the flash.
        /restartDeviceGETRestarts the ESP itself.
        /restartCameraGETRestarts the camera.
        /resetConfigGETClears the current config in memory and RAM
        /getStoredConfigGETReturns a JSON object of the devices current config.
        /setTxPowerPOSTSets the Transmission Power of the ESPs
        /setDevicePOSTSets the OTA and mDNS settings
        /setCameraPOSTSets all of the camera settings
        /wifiPOSTAdds a new wifi network, or writes over an existing one
        /wifiDELETEDeletes a wifi network **

        Note

        /wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

        Params

        The REST API has the following params:

        Feature not a bug

        All params for a given URL are required, even if you are not changing that params value.

        If you do not supply a param, that param will be set to default settings.

        URL params are passed in the URL as a query string, using the following format:

        http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

        /wifi

        Note

        We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

        ParamDescription
        ssidThe ssid of the network.
        passwordThe password of the network.
        networkNameThe unique name (given by you) to refer to that network in memory.
        channelThe channel for the wifi network to broadcast on
        only 1 - 14 are allowed.
        powerThe Transmittion power of the ESP for that network config.
        adhocWhether to enable AP mode or not.

        Note - Transmission Power

        You must follow the following format for the power param:

        Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

        cpp
        typedef enum {
             WIFI_POWER_19_5dBm = 78,// 19.5dBm
             WIFI_POWER_19dBm = 76,// 19dBm
        @@ -43,8 +43,8 @@
             WIFI_POWER_MINUS_1dBm = -4// -1dBm
         } wifi_power_t;
         
        ParamDescription
        txPowerThe power level to set.

        Camera Params

        Coming Soon

        We are currently working on this section of documentation.

        Released under the MIT License.

        - - + + \ No newline at end of file diff --git a/firmware_guide/setup_vscode/index.html b/firmware_guide/setup_vscode/index.html index c4c2537..da6b73d 100644 --- a/firmware_guide/setup_vscode/index.html +++ b/firmware_guide/setup_vscode/index.html @@ -6,17 +6,17 @@ Setting up the environment | EyeTrackVR Docs - - - - + + + + -
        Skip to content
        On this page

        Setting up the environment

        This procedure will show how to prepare your system for uploading the firmware to your tracker.

        1. Install Visual Studio Code

        Download the latest Visual Studio Code and install it.

        Download


        'img'

        Install


        'img'

        2. Install PlatformIO IDE

        Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

        'img'

        3. Clone the firmware project

        Make sure you close any current projects you have open or open a new window before moving forward with these steps.

        1. Go to https://github.com/lorow/OpenIris and clone the latest version from the main branch.
          1. If you do not have git installed please install it from here.

          2. Open Git Bash.

        'img'
        1. Change the directory to the directory that you want the firmware to be cloned. Ex: cd C:\
        'img'
        1. Clone the repository by entering the command: git clone https://github.com/lorow/OpenIris.git
        'img'

        For more info about cloning please refer to this documentation

        Do not download as a zip - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.

        1. Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to OpenIris/ESP folder and opening it.
        'img'

        This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team adapted from here

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Setting up the environment

        This procedure will show how to prepare your system for uploading the firmware to your tracker.

        1. Install Visual Studio Code

        Download the latest Visual Studio Code and install it.

        Download


        'img'

        Install


        'img'

        2. Install PlatformIO IDE

        Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

        'img'

        3. Clone the firmware project

        Make sure you close any current projects you have open or open a new window before moving forward with these steps.

        1. Go to https://github.com/lorow/OpenIris and clone the latest version from the main branch.
          1. If you do not have git installed please install it from here.

          2. Open Git Bash.

        'img'
        1. Change the directory to the directory that you want the firmware to be cloned. Ex: cd C:\
        'img'
        1. Clone the repository by entering the command: git clone https://github.com/lorow/OpenIris.git
        'img'

        For more info about cloning please refer to this documentation

        Do not download as a zip - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.

        1. Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to OpenIris/ESP folder and opening it.
        'img'

        This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team adapted from here

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/firmware_guide/update_platformio/index.html b/firmware_guide/update_platformio/index.html new file mode 100644 index 0000000..3302945 --- /dev/null +++ b/firmware_guide/update_platformio/index.html @@ -0,0 +1,22 @@ + + + + + + Updating Platformio | EyeTrackVR Docs + + + + + + + + + + +
        Skip to content
        On this page

        Updating Platformio

        Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

        It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

        Updating PlatformIO itself

        There are two ways to update your platformio installation

        Via CLI

        You can update it easily by simply typing in one command into your terminal.

        pio upgrade command in the terminal
        1. Open a terminal / command prompt
        2. Type pio upgrade and press enter
        3. Wait for it to finish
        4. Done

        Via PlatformIO in Visual Studio Code

        You can also update it using the platformio tab in your Visual Studio Code.

        1. Open VSC
        2. Click on that little and icon on the sidebar
        Platformio logo button
        1. A side panel will open, there will be a couple of sections, one of them called Quick Access, open it.
        Platformio logo Quick Access Section
        1. In Quick Access section, click on the Miscelleneous tab
        Platformio miscellaneous section
        1. Then, click on the Upgrade PlatformIO Core
        Platformio upgrade core button
        1. Wait for it to finnish and done!

        Upgrading the SDK

        You'll also need to upgrade the SDK from timem to do this

        Upgrading the SDK via VSC

        1. Follow the guide above up until clicking on the Quick Access section.
        2. Instead, open the PIO Home and select Open
        Platformio open home
        1. This will open a window for PlatformIO dashboard, in there, click on a Platforms button on the sidebar
        Platformio platforms sidebar
        1. Once there, you should see a couple of tabs next to the side bard, things like Installed or Embedded. Click on Updates
        Platformio platforms sections
        1. Locate a platform called Espressif 32 and click on Update to <version>
        Platformio platforms update view
        1. Wait until it is done and that's it!

        Released under the MIT License.

        + + + + + \ No newline at end of file diff --git a/firmware_guide/upload_firmware/index.html b/firmware_guide/upload_and_update_firmware/index.html similarity index 55% rename from firmware_guide/upload_firmware/index.html rename to firmware_guide/upload_and_update_firmware/index.html index 50325c8..a08a4e3 100644 --- a/firmware_guide/upload_firmware/index.html +++ b/firmware_guide/upload_and_update_firmware/index.html @@ -6,23 +6,23 @@ Building and uploading the firmware manually | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        Building and uploading the firmware manually

        Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

        1. Connect your tracker to your PC via the programmer

        First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable. In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your pc, once plugged in you can release the button.

        In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

        2. Build your firmware

        1. Press the build button at the bottom of Visual Studio Code.

        This builds the firmware, but does not send it to the ESP yet.

        img

        3. Upload your firmware

        • If you are using the OTA method, first make sure the tracker you wish to flash is turned on and connected to your network, then skip to the OTA section below.

        • Once the firmware has been built, press the upload button to upload the firmware.

          This sends the firmware to the ESP. img

        NOTE

        The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials)

        • If the upload is successful, you should get an output that looks like this:

          img

        Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

        If you have trouble with uploading your firmware over cable check the following:

        1. Make sure your USB cable from the tracker is plugged firmly into your PC.
        2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
        3. Make sure that your drivers are up-to-date.
        4. Some ports might not work, try other ones.

        Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

        Uploading via OTA

        What is it?

        OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

        How do I use it?

        To use OTA, you need to have working firmware on your ESPs first.

        Once you have mnually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

        Coming Soon

        Currently, we only support OTA using platformio and Visual Studio Code. We are working on a new app, where you can upload your firmware to your ESPs over WiFi straight from the app.

        To do this, you need to change your environment to the OTA version of your working environment.

        For example, if you have a working esp32AIThinker environment, you would change your environment to esp32AIThinker_OTA.

        Once you have changed your environment, you can upload your firmware to your ESPs using the upload button, as you would normally.

        Once you have successfully connected your trackers to your WiFi, you can use OTA to handle all future firmware updates.

        1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
        2. In the ini/user_config.ini file:
          • Put IP or hostname of device into config file
        ini
        [ota]
        +    
        Skip to content
        On this page

        Building and uploading the firmware manually

        Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

        1. Connect your tracker to your PC via the programmer

        First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable. In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your pc, once plugged in you can release the button.

        In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

        2. Build your firmware

        1. Press the build button at the bottom of Visual Studio Code.

        This builds the firmware, but does not send it to the ESP yet.

        img

        3. Upload your firmware

        • If you are using the OTA method, first make sure the tracker you wish to flash is turned on and connected to your network, then skip to the OTA section below.

        • Once the firmware has been built, press the upload button to upload the firmware.

          This sends the firmware to the ESP. img

        NOTE

        The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials)

        • If the upload is successful, you should get an output that looks like this:

          img

        Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

        If you have trouble with uploading your firmware over cable check the following:

        1. Make sure your USB cable from the tracker is plugged firmly into your PC.
        2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
        3. Make sure that your drivers are up-to-date.
        4. Some ports might not work, try other ones.

        Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

        Uploading via OTA

        What is it?

        OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

        How do I use it?

        To use OTA, you need to have working firmware on your ESPs first.

        Once you have mnually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

        Coming Soon

        Currently, we only support OTA using platformio and Visual Studio Code. We are working on a new app, where you can upload your firmware to your ESPs over WiFi straight from the app.

        To do this, you need to change your environment to the OTA version of your working environment.

        For example, if you have a working esp32AIThinker environment, you would change your environment to esp32AIThinker_OTA.

        Once you have changed your environment, you can upload your firmware to your ESPs using the upload button, as you would normally.

        Once you have successfully connected your trackers to your WiFi, you can use OTA to handle all future firmware updates.

        1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
        2. In the ini/user_config.ini file:
          • Put IP or hostname of device into config file
        ini
        [ota]
         enableota = 1
         otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
         otapassword = "12345678"
         otaserverport = 3232
        -
        1. Change to OTA env
        2. Restart the ESPs, they must be power cycled
        3. Press the upload button to upload the firmware.

          img
        4. Do not touch esps or move them during OTA upload
        5. Wait around 1 minute.
        6. Repeat for as many trackers as you need.

        Finding the IP address of your tracker

        Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.

        'platformio serial monitor button'

        Now, press the restart button on the esp itself. watch the monitor for output like this:

        'img of platformio serial monitor'

        The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.

        Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.

        Troubleshooting

        If you encountered an issue while following these steps check the FAQ.

        If you don't find an answer to your question there ask in #questions channel in the discord, we will be happy to help.

        Adapted from the SlimeVR docs, Some Credit goes to the SlimeVR team here

        Released under the MIT License.

        - - +
        1. Change to OTA env
        2. Restart the ESPs, they must be power cycled
        3. Press the upload button to upload the firmware.

          img
        4. Do not touch esps or move them during OTA upload
        5. Wait around 1 minute.
        6. Repeat for as many trackers as you need.

        Finding the IP address of your tracker

        Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.

        'platformio serial monitor button'

        Now, press the restart button on the esp itself. watch the monitor for output like this:

        'img of platformio serial monitor'

        The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.

        Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.

        Updating the firmware to the newest version

        To update the firmware you'll need to follow a couple of steps.

        1. Open a terminal and enter the directory you've cloned OpenIris into, for example cd D:/OpenIris/

        2. Save your current changes to the config using git stash

        3. Download the newest changes from the repo using git pull

        4. Apply your saved changes so that you don't have to retype your WI-FI credentials using git stash apply

        CAUTION

        Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files.

        4.1. If anything went wrong, you can reset everything to the default state using git reset --hard and then retyping your credentials

        1. Upload your firmware following steps from the uploading section

        Troubleshooting

        If you encountered an issue while following these steps check the FAQ.

        If you don't find an answer to your question there ask in #questions channel in the discord, we will be happy to help.

        Adapted from the SlimeVR docs, Some Credit goes to the SlimeVR team here

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/getting_started/intro/index.html b/getting_started/intro/index.html index 9c2d383..789b296 100644 --- a/getting_started/intro/index.html +++ b/getting_started/intro/index.html @@ -6,18 +6,18 @@ EyeTrackVR | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        EyeTrackVR

        Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.

        Want to get started? Check out the getting started page and then the full build guide.

        CAUTION

        This project is in active development. However, it is working for most users.

        About IR Emitter Safety

        Please exercise caution when messing around with IR emitters.

        IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.

        DANGER

        It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

        The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.

        WARNING
        Please pay attention

        Make sure you are using non-focused emitters and at around 5ma total power.

        Want to see the safety data sheets?

        Effect of infrared radiation on the lens

        AN002_Details on photobiological safety of LED light sources

        Training-library Nir Stds

        Hardware

        Please check out our parts list and hardware repo. for information regauring hardware.

        Firmware

        Our firmware called OpenIris is made by lorow found here.

        Headset support

        In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.

        Contact

        Please join our discord for updates and any questions. We hope to see you there!

        'discord banner'

        Licenses

        GitHub license

        All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        EyeTrackVR

        Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.

        Want to get started? Check out the getting started page and then the full build guide.

        CAUTION

        This project is in active development. However, it is working for most users.

        About IR Emitter Safety

        Please exercise caution when messing around with IR emitters.

        IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.

        DANGER

        It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

        The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.

        WARNING
        Please pay attention

        Make sure you are using non-focused emitters and at around 5ma total power.

        Want to see the safety data sheets?

        Effect of infrared radiation on the lens

        AN002_Details on photobiological safety of LED light sources

        Training-library Nir Stds

        Hardware

        Please check out our parts list and hardware repo. for information regauring hardware.

        Firmware

        Our firmware called OpenIris is made by lorow found here.

        Headset support

        In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.

        Contact

        Please join our discord for updates and any questions. We hope to see you there!

        'discord banner'

        Licenses

        GitHub license

        All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/getting_started/things_to_know/index.html b/getting_started/things_to_know/index.html index 88b5a10..3a8b1df 100644 --- a/getting_started/things_to_know/index.html +++ b/getting_started/things_to_know/index.html @@ -6,16 +6,16 @@ Things To Know Before You Start | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        Things To Know Before You Start

        This page will be an overview of things to know and understand before you start this project

        Software is not final

        Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

        Firmware may have user difficulties

        Our firmware has not been tested widely so issues may creep up.

        IR emitters are dangerous

        If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.

        Documentation may be incomplete

        Important steps may be missing.

        You will need to set up your avatar to use this

        This will require some basic Unity knowledge and owning your own avatar.

        Once you have acknowledged the items above, move on to the Full Build Guide

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Things To Know Before You Start

        This page will be an overview of things to know and understand before you start this project

        Software is not final

        Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

        Firmware may have user difficulties

        Our firmware has not been tested widely so issues may creep up.

        IR emitters are dangerous

        If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.

        Documentation may be incomplete

        Important steps may be missing.

        You will need to set up your avatar to use this

        This will require some basic Unity knowledge and owning your own avatar.

        Once you have acknowledged the items above, move on to the Full Build Guide

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 8e8ac8d..f14283a 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"development_docs_standards.md":"bb372161","contact.md":"0d2a9076","dev_roadmap.md":"787025a7","misc_faq.md":"32afa1d2","misc_vrc_avatar_setup.md":"ac5fcc57","software_guide_build_software.md":"42e93d17","software_guide_eyetrackvr_app_guide.md":"0fcbbf63","firmware_guide_configure_firmware.md":"064ffccc","firmware_guide_environments.md":"216a4654","firmware_guide_setup_vscode.md":"ef0d7c21","development_docs_pages.md":"59411662","getting_started_intro.md":"6511e2f7","getting_started_things_to_know.md":"d3bf4f84","about.md":"a8923db4","how_to_build_creating_your_own_mount.md":"38d8e455","index.md":"2dbdc712","how_to_build_full_build.md":"dccc50d8","development_docs_dev_docs.md":"f24037a5","how_to_build_parts_list.md":"89349130","firmware_guide_mdns.md":"803194e9","firmware_guide_firmware.md":"58eb9ad7","firmware_guide_rest_api.md":"38976bc1","firmware_guide_upload_firmware.md":"031e2368","archive_fox_ir_v2_build_instructions.md":"583f5276"} +{"firmware_guide_environments.md":"36d19564","about.md":"3352f48a","archive_fox_ir_v2_build_instructions.md":"f4e1b25e","contact.md":"c7df13d0","development_docs_dev_docs.md":"c984c92b","development_docs_pages.md":"08f3671d","firmware_guide_configure_firmware.md":"3641ea6f","firmware_guide_firmware.md":"5b8407e9","how_to_build_full_build.md":"d126a594","getting_started_things_to_know.md":"24580896","dev_roadmap.md":"ff471091","firmware_guide_upload_and_update_firmware.md":"b720563f","development_docs_standards.md":"4c4a8f40","how_to_build_creating_your_own_mount.md":"a523561e","firmware_guide_setup_vscode.md":"a022729d","firmware_guide_update_platformio.md":"4052d476","firmware_guide_mdns.md":"089ec198","firmware_guide_rest_api.md":"cdbe96a3","getting_started_intro.md":"6d59da76","misc_faq.md":"648fb0ec","software_guide_build_software.md":"a50bc6e6","index.md":"da681b8b","how_to_build_parts_list.md":"6275b3c3","misc_vrc_avatar_setup.md":"12b4199c","software_guide_eyetrackvr_app_guide.md":"00e33ae4"} diff --git a/how_to_build/creating_your_own_mount/index.html b/how_to_build/creating_your_own_mount/index.html index 3f25e02..162f09a 100644 --- a/how_to_build/creating_your_own_mount/index.html +++ b/how_to_build/creating_your_own_mount/index.html @@ -6,16 +6,16 @@ Creating Your Own Mount | EyeTrackVR Docs - - - + + + -
        Skip to content
        On this page

        Creating Your Own Mount

        This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

        So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

        Step 1: Find a way to mount to your headsets lens

        The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"

        Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

        Step 2: Find a camera mount

        Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here

        Alternatively, you can create your own mount if you have the skills.

        Step 3: Place the camera mount where it will give a good camera angle

        The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

        You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.

        Step 4: Mount your LEDs

        You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

        Step 5: Test everything

        It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

        Step 6: Get your mounts listed

        Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Creating Your Own Mount

        This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

        So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

        Step 1: Find a way to mount to your headsets lens

        The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"

        Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

        Step 2: Find a camera mount

        Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here

        Alternatively, you can create your own mount if you have the skills.

        Step 3: Place the camera mount where it will give a good camera angle

        The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

        You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.

        Step 4: Mount your LEDs

        You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

        Step 5: Test everything

        It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

        Step 6: Get your mounts listed

        Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/how_to_build/full_build/index.html b/how_to_build/full_build/index.html index 0a219a3..d661d98 100644 --- a/how_to_build/full_build/index.html +++ b/how_to_build/full_build/index.html @@ -6,19 +6,19 @@ Build Guide | EyeTrackVR Docs - - - - - - + + + + + + -
        Skip to content
        On this page

        Build Guide

        This page will contain a step-by-step assembly guide

        Step 1: Make sure your have read the Things to know before you start guide

        This will give you a basic overview of the project's status and what to expect currently.

        Step 2: Order all the parts listed on our Parts list

        Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

        Step 3: Wait for things to arrive

        Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

        Step 4: Gather up all of your hardware

        Make sure you have at least the following:

        'img of components'

        'ESPs, cams, a programmer and a USB connector'

        Step 5: Install external antennas or shield ESP antenna with an antistatic bag

        Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.

        The first option is to use an external antenna.

        This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a REQUIRED step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.

        Below is an example of bridging the connections and attaching an antenna.

        'img of external antenna resistors'

        The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.

        Step 6: Attach cameras to ESPs

        Look at your ESP and locate the camera ribbon cable connector as circled below.

        'img of camera socket'

        Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.

        'img of camera clip'

        Now slide in a camera, please note that the pins are facing down, you should only see the black part.

        'img of camera cable'

        Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.

        'img of camera cable'

        Step 7: Connect ESP to the programmer to flash

        Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.

        Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.

        Step 8: Configure Visual Studio Code and prepare to flash the firmware

        Check out our guide on Setting up VS Code

        Once VS Code is set up, move on to the next step.

        Step 9: Plug in your ESP and flash the firmware

        Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

        Step 10: Connect your power wires to a USB Type-A board

        WARNING

        Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.

        Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

        Step 11: Cut wires for IR LEDs

        To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.

        Once cut, strip them to around 4mm of exposed wire.

        Step 12: Twist the positive USB wire and positive IR LED wires together and tin them

        Once twisted together add solder to keep them together. This makes the connection much easier.

        Step 13: Solder the positive wire to ESP

        Lay the wire on the outside of the 5V pin and apply solder.

        Step 14: Solder the negative wire to ESP

        Repeat Step 12 but with the negative wires.

        INFO

        As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

        In the below example I put it on the top of the pin, It will be a week-ish joint but that's where glue comes in handy.

        Step 15: Wire up the 2nd ESP

        Repeat steps 12-14 with the 2nd ESP.

        Step 16: Prepare to solder IR LED PCBs

        Get your magnifying glass out, it's time to solder very smol things.

        Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.


        357ohm resistors and V3 PCBs

        Here are the PCB pin-out labels:


        V3

        LED labels:


        The green markings and notched corners mark the positive sides of the LEDs pictured above.

        If you have different LEDs, please consult their datasheet.

        Some terminology related to them:

        5V: 5-volt power in.

        GND: Ground or power out.

        AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

        SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

        Negative: This marks the negative side of the LED.

        Positive: This marks the positive side of the LED.

        Step 18: Solder resistors on PCB V3

        You only need 1 PCB to have resistors per eye.

        Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

        Next, grab a resistor and hold it on the pads.

        While holding the resistor add solder to your soldering iron and apply it to the resistor.

        I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.

        Flip the PCB and solder the other end.

        Now repeat for the other one.

        Solder LEDs on PCB V3

        Tin the LED pads.

        Orientate the LED and hold it in place.

        Solder one end.

        Flip around and solder the other end.

        Wire up the PCBs V3

        WARNING

        Pay attention to the direction of the LEDs on the PCBs.

        If the green dot is facing inwards toward the text like in the picture below:

        Use the following diagram:

        If the green dot is facing away from the text like the picture below:

        Use the following diagram:

        Step 19: 3D print mounts

        Head to the 3D printed parts section of the parts list here.

        Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

        Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

        There are 2 different types of mounts, how to secure the camera to each type will be documented below.

        Type 1

        This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.

        Place the camera into the mount

        Slowly apply pressure inwards until the camera snaps into place.

        NOTE

        There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed.

        Type 2

        This uses the method of gluing the camera.

        Apply a bit of glue to the bottom of the camera mount.

        Place the camera on the mount.

        IR LED mounting

        This again differs from mount to mount.

        In some cases, there are designated spots for the LEDs to go.

        In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.

        TIP

        Use rubbing alcohol to easily remove hot glue.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Build Guide

        This page will contain a step-by-step assembly guide

        Step 1: Make sure your have read the Things to know before you start guide

        This will give you a basic overview of the project's status and what to expect currently.

        Step 2: Order all the parts listed on our Parts list

        Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

        Step 3: Wait for things to arrive

        Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

        Step 4: Gather up all of your hardware

        Make sure you have at least the following:

        'img of components'

        'ESPs, cams, a programmer and a USB connector'

        Step 5: Install external antennas or shield ESP antenna with an antistatic bag

        Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.

        The first option is to use an external antenna.

        This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a REQUIRED step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.

        Below is an example of bridging the connections and attaching an antenna.

        'img of external antenna resistors'

        The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.

        Step 6: Attach cameras to ESPs

        Look at your ESP and locate the camera ribbon cable connector as circled below.

        'img of camera socket'

        Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.

        'img of camera clip'

        Now slide in a camera, please note that the pins are facing down, you should only see the black part.

        'img of camera cable'

        Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.

        'img of camera cable'

        Step 7: Connect ESP to the programmer to flash

        Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.

        Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.

        Step 8: Configure Visual Studio Code and prepare to flash the firmware

        Check out our guide on Setting up VS Code

        Once VS Code is set up, move on to the next step.

        Step 9: Plug in your ESP and flash the firmware

        Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

        Step 10: Connect your power wires to a USB Type-A board

        WARNING

        Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.

        Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

        Step 11: Cut wires for IR LEDs

        To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.

        Once cut, strip them to around 4mm of exposed wire.

        Step 12: Twist the positive USB wire and positive IR LED wires together and tin them

        Once twisted together add solder to keep them together. This makes the connection much easier.

        Step 13: Solder the positive wire to ESP

        Lay the wire on the outside of the 5V pin and apply solder.

        Step 14: Solder the negative wire to ESP

        Repeat Step 12 but with the negative wires.

        INFO

        As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

        In the below example I put it on the top of the pin, It will be a week-ish joint but that's where glue comes in handy.

        Step 15: Wire up the 2nd ESP

        Repeat steps 12-14 with the 2nd ESP.

        Step 16: Prepare to solder IR LED PCBs

        Get your magnifying glass out, it's time to solder very smol things.

        Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.


        357ohm resistors and V3 PCBs

        Here are the PCB pin-out labels:


        V3

        LED labels:


        The green markings and notched corners mark the positive sides of the LEDs pictured above.

        If you have different LEDs, please consult their datasheet.

        Some terminology related to them:

        5V: 5-volt power in.

        GND: Ground or power out.

        AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

        SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

        Negative: This marks the negative side of the LED.

        Positive: This marks the positive side of the LED.

        Step 18: Solder resistors on PCB V3

        You only need 1 PCB to have resistors per eye.

        Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

        Next, grab a resistor and hold it on the pads.

        While holding the resistor add solder to your soldering iron and apply it to the resistor.

        I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.

        Flip the PCB and solder the other end.

        Now repeat for the other one.

        Solder LEDs on PCB V3

        Tin the LED pads.

        Orientate the LED and hold it in place.

        Solder one end.

        Flip around and solder the other end.

        Wire up the PCBs V3

        WARNING

        Pay attention to the direction of the LEDs on the PCBs.

        If the green dot is facing inwards toward the text like in the picture below:

        Use the following diagram:

        If the green dot is facing away from the text like the picture below:

        Use the following diagram:

        Step 19: 3D print mounts

        Head to the 3D printed parts section of the parts list here.

        Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

        Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

        There are 2 different types of mounts, how to secure the camera to each type will be documented below.

        Type 1

        This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.

        Place the camera into the mount

        Slowly apply pressure inwards until the camera snaps into place.

        NOTE

        There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed.

        Type 2

        This uses the method of gluing the camera.

        Apply a bit of glue to the bottom of the camera mount.

        Place the camera on the mount.

        IR LED mounting

        This again differs from mount to mount.

        In some cases, there are designated spots for the LEDs to go.

        In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.

        TIP

        Use rubbing alcohol to easily remove hot glue.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/how_to_build/parts_list/index.html b/how_to_build/parts_list/index.html index cccdf2c..99762dc 100644 --- a/how_to_build/parts_list/index.html +++ b/how_to_build/parts_list/index.html @@ -6,18 +6,18 @@ Parts List | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        Parts List

        CAUTION

        Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes.

        This page will include a basic part list for building an EyeTrackVR setup

        NOTE

        It is recommended to source the main parts from AliExpress as it is much cheaper.


        NOTE

        It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay.

        Camera setup

        • 2x ESP-CAM-32 modules

        AliExpress

        • 2x ov2640 160° FOV IR / Night vers 75mm (850nm)

        AliExpress
        Amazon alternative (note that you will have to manually remove the IR filter)

        • 1x ESP-CAM programmer / MB

        AliExpress
        Amazon for 3 ESP32-Cams and programmers without the proper cameras

        • 1x USB type-A male port to power both ESPs

        Bare breakout on AliExpress
        Amazon

        Or one with a cover on AliExpress
        Amazon

        • 1x Lower gauge wire to power ESPs

        28 AWG gauge wire from AliExpress
        28 AWG Amazon

        • 2x External antennas for ESPs

        Small:
        AliExpress

        Large:
        AliExpress
        Amazon

        • 2x-4x Heatsinks

        AliExpress

        IR Emitters

        IR LED kit

        If you do not want to source things from multiple places or save money or time on assembly, you can buy a LED kit from me.
        Pre soldered kit
        Raw component kit

        Alternatively you can source the parts yourself:

        • 4x Unfocused SMD IR emitters
          (Recomended) from LCSC here.
          (Alternative) from Digikey here.
          The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.
        NOTE

        The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.

        CAUTION

        DO NOT BUY FOCUSED ONES!
        If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

        • 4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.

        • 4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)

        • 357 ohm Digikey here

        • 348 ohm LCSC here

        This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.

        Misc parts

        3D Printed Mounts

        Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

        Other Headsets

        If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

        Check out our basic guide on making your own mount here.

        TIP

        If you have a headset mount that is not listed above, please let us know in the discord so it can be added here.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Parts List

        CAUTION

        Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes.

        This page will include a basic part list for building an EyeTrackVR setup

        NOTE

        It is recommended to source the main parts from AliExpress as it is much cheaper.


        NOTE

        It is good practice to buy more than needed in some cases, namely programmers and ESPs, this reduces the risk of a DOA (dead on arrival) causing a delay.

        Camera setup

        • 2x ESP-CAM-32 modules

        AliExpress

        • 2x ov2640 160° FOV IR / Night vers 75mm (850nm)

        AliExpress
        Amazon alternative (note that you will have to manually remove the IR filter)

        • 1x ESP-CAM programmer / MB

        AliExpress
        Amazon for 3 ESP32-Cams and programmers without the proper cameras

        • 1x USB type-A male port to power both ESPs

        Bare breakout on AliExpress
        Amazon

        Or one with a cover on AliExpress
        Amazon

        • 1x Lower gauge wire to power ESPs

        28 AWG gauge wire from AliExpress
        28 AWG Amazon

        • 2x External antennas for ESPs

        Small:
        AliExpress

        Large:
        AliExpress
        Amazon

        • Antennas

        Optional but recommended if you're running vive full body tracking or having issues with streaming:

        AliExpress

        IR Emitters

        IR LED kit

        If you do not want to source things from multiple places or save money or time on assembly, you can buy a LED kit from me.
        Pre soldered kit
        Raw component kit

        Alternatively you can source the parts yourself:

        • 4x Unfocused SMD IR emitters
          (Recomended) from LCSC here.
          (Alternative) from Digikey here.
          The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.
        NOTE

        The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.

        CAUTION

        DO NOT BUY FOCUSED ONES!
        If they look like something you would find in a TV remote, do not use them. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

        • 4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.

        • 4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)

        • 357 ohm Digikey here

        • 348 ohm LCSC here

        This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.

        Misc parts

        3D Printed Mounts

        Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

        Other Headsets

        If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

        Check out our basic guide on making your own mount here.

        TIP

        If you have a headset mount that is not listed above, please let us know in the discord so it can be added here.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/index.html b/index.html index 574e235..1a70520 100644 --- a/index.html +++ b/index.html @@ -6,16 +6,16 @@ EyeTrackVR Docs | EyeTrackVR Docs - - - + + +
        Skip to content

        EyeTrackVR Docs

        Opensource and affordable VR eye tracking.

        For Social VR Games via OSC and UDP protocol.

        ETRVR logo
        ⚡️

        Open Source

        fully open source and free to use.

        🎉

        Community Driven

        built by you for you.

        💰

        Affordable

        affordable and easy to use.

        🎮

        Nearly All VR Headsets

        EyeTrackVR works with nearly all VR headsets.

        🔨

        Completely DIY

        completely DIY and easy to build.

        🌐

        Open Platform

        open platform and works with any Social VR game.

        🔏

        Privacy Focused

        privacy focused and does not collect any data, hosted on your own PC.

        📡

        Open Protocol

        EyeTrackVR uses the Open Sound Control (OSC) protocol.

        Released under the MIT License.

        - - + + \ No newline at end of file diff --git a/misc/faq/index.html b/misc/faq/index.html index 0f456c9..74fb530 100644 --- a/misc/faq/index.html +++ b/misc/faq/index.html @@ -6,17 +6,17 @@ Frequently Asked Questions | EyeTrackVR Docs - - - - + + + + -
        Skip to content
        On this page

        Frequently Asked Questions



        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Frequently Asked Questions



        Released under the MIT License.

        + + \ No newline at end of file diff --git a/misc/vrc_avatar_setup/index.html b/misc/vrc_avatar_setup/index.html index 140305d..b7a75be 100644 --- a/misc/vrc_avatar_setup/index.html +++ b/misc/vrc_avatar_setup/index.html @@ -6,17 +6,17 @@ How to set up your avatar for eye tracking: | EyeTrackVR Docs - - - - + + + + -
        Skip to content
        On this page

        How to set up your avatar for eye tracking:

        Here is an avatar setup video created by a contributor:

        Another good resource is the VRC Face Tracking Wiki and their Discord.

        We currently use the following paramaters

        LeftEyeX

        RightEyeX

        EyesY

        LeftEyeLidExpandedSqueeze

        RightEyeLidExpandedSqueeze

        NOTE

        We currently only support float parameters, please adjust your setup accordingly.

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        How to set up your avatar for eye tracking:

        Here is an avatar setup video created by a contributor:

        Another good resource is the VRC Face Tracking Wiki and their Discord.

        We currently use the following paramaters

        LeftEyeX

        RightEyeX

        EyesY

        LeftEyeLidExpandedSqueeze

        RightEyeLidExpandedSqueeze

        NOTE

        We currently only support float parameters, please adjust your setup accordingly.

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/software_guide/build_software/index.html b/software_guide/build_software/index.html index 58b27fc..75b5681 100644 --- a/software_guide/build_software/index.html +++ b/software_guide/build_software/index.html @@ -6,18 +6,18 @@ Build the app from source | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        Build the app from source

        This guide will show how to build the app from source

        NOTE

        This is NOT a required step, you do not need to build the app from source.

        Requirements

        Install Python

        EyetrackVR is currently using Python 3.11.0 Before you continue, please install it.

        Installing Poetry

        Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

        To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

        Poetry Documentation

        Install the required Python modules

        After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

        This should install all of the required modules.

        Build the app

        Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

        Give it time to build the app. Once done, the app should be under dist/eyetrackapp

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        Build the app from source

        This guide will show how to build the app from source

        NOTE

        This is NOT a required step, you do not need to build the app from source.

        Requirements

        Install Python

        EyetrackVR is currently using Python 3.11.0 Before you continue, please install it.

        Installing Poetry

        Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

        To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

        Poetry Documentation

        Install the required Python modules

        After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

        This should install all of the required modules.

        Build the app

        Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

        Give it time to build the app. Once done, the app should be under dist/eyetrackapp

        Released under the MIT License.

        + + \ No newline at end of file diff --git a/software_guide/eyetrackvr_app_guide/index.html b/software_guide/eyetrackvr_app_guide/index.html index 8d44e0d..0f7396a 100644 --- a/software_guide/eyetrackvr_app_guide/index.html +++ b/software_guide/eyetrackvr_app_guide/index.html @@ -6,18 +6,18 @@ How to install, run and adjust the EyeTrackVR app. | EyeTrackVR Docs - - - - - + + + + + -
        Skip to content
        On this page

        How to install, run and adjust the EyeTrackVR app.

        Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

        Go to the latest GitHub release here and download the .zip

        Extract the zip file and then run the .exe as administrator. You will be greeted with a window that looks like this:

        'img'

        By default, it will install to C:\Program Files\EyeTrackVR and create a shortcut on your desktop. Pressing the Change Install Path button will open up a window where you can navigate to an alternate install path.

        Press Install to install the app.

        NOTE

        The installer can also be used to update the app, just go through the install process again.

        If it has been successfully installed it should change to look like this:

        'img'

        Step 2: Run the EyeTrackVR app

        If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

        You then should be greeted with a GUI that looks like this:

        'img'

        Step 3: Getting familiar with settings and terminology

        Let's go over some basic terminology you will find in the app.

        Starting from the top:

        Right eye

        Shows the right eye feed and settings only.

        Left eye

        Shows the left eye feed and settings only.

        Both eyes

        Shows both eyes' feed and settings.

        Camera Address

        This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

        Tracking Mode

        This changes the GUI to the tracking mode where it outputs values.

        Cropping Mode

        This is where you will crop out your eye.

        Threshold

        This is used to cut out things that aren't dark like your pupil.

        Rotation

        For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

        Restart Calibrationn

        This will start a calibration mode for your eye where you look to all extremes.

        Recenter Eye

        This will recenter your eye to whatever point you are looking at.

        Step 4: Adding your cameras to the software and configuring them

        Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

        Copy that IP address and then close the browser tab with it open.

        Enter that IP address into the app's Camera Address field and press the Save and Restart Tracking button.

        Don't see your camera feed? That's because we haven't set an ROI.

        'img'

        See the Awating Eye Cropping Settings text?

        Now press the Cropping Mode button. You should see a feed of your camera.

        Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)

        You should see something like this:

        'img'

        :O It's my eye!

        Now, Draw a rectangle that selects your eye.

        A good example of an ROI

        'img'

        Head back over to the Tracking mode.

        We will now adjust our rotation by moving the Rotation slider.

        From this:

        'img'

        It's crooked!

        To this:

        'img'

        Much better!

        Now we will adjust our threshold.

        Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.

        Example of a threshold being too low:

        'img'

        Much better!

        Example of too high of a threshold:

        'img'

        Much better!

        Example of a good threshold:

        'img'

        Much better!

        Repeat everything in this step for your left eye.

        Step 5: Calibrating your eyes

        Once your eye is trackable by the software we need to calibrate it.

        Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

        The next step is to center your eye.

        Look straight forward and press the Recenter Eye button.

        Your eye is now fully calibrated.

        Repeat for your other eye.

        NOTE

        To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes.

        See anything outdated on this guide? Let me know! Prohurtz#0001

        Released under the MIT License.

        - - +
        Skip to content
        On this page

        How to install, run and adjust the EyeTrackVR app.

        Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

        Go to the latest GitHub release here and download the .zip

        Extract the zip file and then run the .exe as administrator. You will be greeted with a window that looks like this:

        'img'

        By default, it will install to C:\Program Files\EyeTrackVR and create a shortcut on your desktop. Pressing the Change Install Path button will open up a window where you can navigate to an alternate install path.

        Press Install to install the app.

        NOTE

        The installer can also be used to update the app, just go through the install process again.

        If it has been successfully installed it should change to look like this:

        'img'

        Step 2: Run the EyeTrackVR app

        If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

        You then should be greeted with a GUI that looks like this:

        'img'

        Step 3: Getting familiar with settings and terminology

        Let's go over some basic terminology you will find in the app.

        Starting from the top:

        Right eye

        Shows the right eye feed and settings only.

        Left eye

        Shows the left eye feed and settings only.

        Both eyes

        Shows both eyes' feed and settings.

        Camera Address

        This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

        Tracking Mode

        This changes the GUI to the tracking mode where it outputs values.

        Cropping Mode

        This is where you will crop out your eye.

        Threshold

        This is used to cut out things that aren't dark like your pupil.

        Rotation

        For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

        Restart Calibrationn

        This will start a calibration mode for your eye where you look to all extremes.

        Recenter Eye

        This will recenter your eye to whatever point you are looking at.

        Step 4: Adding your cameras to the software and configuring them

        Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

        Copy that IP address and then close the browser tab with it open.

        Enter that IP address into the app's Camera Address field and press the Save and Restart Tracking button.

        Don't see your camera feed? That's because we haven't set an ROI.

        'img'

        See the Awating Eye Cropping Settings text?

        Now press the Cropping Mode button. You should see a feed of your camera.

        Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)

        You should see something like this:

        'img'

        :O It's my eye!

        Now, Draw a rectangle that selects your eye.

        A good example of an ROI

        'img'

        Head back over to the Tracking mode.

        We will now adjust our rotation by moving the Rotation slider.

        From this:

        'img'

        It's crooked!

        To this:

        'img'

        Much better!

        Now we will adjust our threshold.

        Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.

        Example of a threshold being too low:

        'img'

        Much better!

        Example of too high of a threshold:

        'img'

        Much better!

        Example of a good threshold:

        'img'

        Much better!

        Repeat everything in this step for your left eye.

        Step 5: Calibrating your eyes

        Once your eye is trackable by the software we need to calibrate it.

        Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

        The next step is to center your eye.

        Look straight forward and press the Recenter Eye button.

        Your eye is now fully calibrated.

        Repeat for your other eye.

        NOTE

        To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes.

        See anything outdated on this guide? Let me know! Prohurtz#0001

        Released under the MIT License.

        + + \ No newline at end of file