From 2c100e87e1c39e6baaf60cc0883c0f66363f5324 Mon Sep 17 00:00:00 2001 From: ZanzyTHEbar Date: Thu, 26 Oct 2023 10:18:30 +0000 Subject: [PATCH] feat: add docs for firmware flashing tool --- 404.html | 6 ++--- about.html | 12 ++++----- archive/fox_ir_v2_build_instructions.html | 14 +++++----- ...ut.md.c167d8c9.js => about.md.e87a2ce6.js} | 2 +- ...d8c9.lean.js => about.md.e87a2ce6.lean.js} | 2 +- assets/{app.29c19915.js => app.ca327012.js} | 2 +- ...x_ir_v2_build_instructions.md.b320b3b5.js} | 2 +- ...v2_build_instructions.md.b320b3b5.lean.js} | 2 +- .../chunks/@localSearchIndexroot.b0007708.js | 1 - .../chunks/@localSearchIndexroot.ecff9080.js | 1 + ...dion.990634ba.js => Accordion.a0a88ff3.js} | 2 +- ...t.26e03ba7.js => CheckBoxList.9fb033ec.js} | 2 +- assets/chunks/VPLocalSearchBox.03f5fd54.js | 7 ----- assets/chunks/VPLocalSearchBox.9f9b3188.js | 7 +++++ assets/chunks/framework.1f7cb35e.js | 2 -- assets/chunks/framework.e4c952c1.js | 2 ++ .../{index.03b5fd27.js => index.0e6ad99c.js} | 2 +- .../{index.2510e13f.js => index.8ad7dc66.js} | 2 +- .../{theme.3f27bc77.js => theme.bd876814.js} | 2 +- ....md.a2c6963a.js => contact.md.c2e94634.js} | 2 +- ...3a.lean.js => contact.md.c2e94634.lean.js} | 2 +- ...c17da989.js => dev_roadmap.md.e0297856.js} | 2 +- ...ean.js => dev_roadmap.md.e0297856.lean.js} | 2 +- ... development_docs_dev_docs.md.c7de805c.js} | 2 +- ...lopment_docs_dev_docs.md.c7de805c.lean.js} | 2 +- ... => development_docs_pages.md.ec947cc8.js} | 2 +- ...evelopment_docs_pages.md.ec947cc8.lean.js} | 2 +- ...development_docs_standards.md.20a7ac2c.js} | 2 +- ...opment_docs_standards.md.20a7ac2c.lean.js} | 2 +- ...re_guide_configure_firmware.md.7852fa9f.js | 1 + ...de_configure_firmware.md.7852fa9f.lean.js} | 2 +- ...re_guide_configure_firmware.md.d87cb28a.js | 1 - ...irmware_guide_environments.md.5499e526.js} | 2 +- ...re_guide_environments.md.5499e526.lean.js} | 2 +- assets/firmware_guide_firmware.md.2745189a.js | 1 + ...irmware_guide_firmware.md.2745189a.lean.js | 1 + assets/firmware_guide_firmware.md.343c04a7.js | 1 - ...irmware_guide_firmware.md.343c04a7.lean.js | 1 - ...irmware_guide_flashing_tool.md.52fe420e.js | 1 + ...re_guide_flashing_tool.md.52fe420e.lean.js | 1 + ....js => firmware_guide_mdns.md.7fbdf94c.js} | 2 +- ...> firmware_guide_mdns.md.7fbdf94c.lean.js} | 2 +- ...=> firmware_guide_rest_api.md.4fe3ee89.js} | 2 +- ...rmware_guide_rest_api.md.4fe3ee89.lean.js} | 2 +- ...irmware_guide_setup_vscode.md.bc9620d8.js} | 2 +- ...re_guide_setup_vscode.md.bc9620d8.lean.js} | 2 +- ...re_guide_update_platformio.md.af6d4d76.js} | 2 +- ...ide_update_platformio.md.af6d4d76.lean.js} | 2 +- ...upload_and_update_firmware.md.1076bd51.js} | 2 +- ...d_and_update_firmware.md.1076bd51.lean.js} | 2 +- ...s => getting_started_intro.md.193e8e8d.js} | 2 +- ...getting_started_intro.md.193e8e8d.lean.js} | 2 +- ...getting_started_led_safety.md.694b59dc.js} | 2 +- ...ng_started_led_safety.md.694b59dc.lean.js} | 2 +- ...ing_started_things_to_know.md.b44e9a98.js} | 2 +- ...tarted_things_to_know.md.b44e9a98.lean.js} | 2 +- ...ld_creating_your_own_mount.md.3ddf5184.js} | 2 +- ...eating_your_own_mount.md.3ddf5184.lean.js} | 2 +- ...=> how_to_build_full_build.md.b9c84c14.js} | 2 +- ...w_to_build_full_build.md.b9c84c14.lean.js} | 2 +- ...=> how_to_build_parts_list.md.aba29938.js} | 2 +- ...w_to_build_parts_list.md.aba29938.lean.js} | 2 +- ...ex.md.ca39f1a7.js => index.md.0b651dfd.js} | 2 +- ...f1a7.lean.js => index.md.0b651dfd.lean.js} | 2 +- ...md.3dbf62c9.js => misc_faq.md.314d6845.js} | 2 +- ...9.lean.js => misc_faq.md.314d6845.lean.js} | 2 +- ...s => misc_vrc_avatar_setup.md.e817a3ae.js} | 2 +- ...misc_vrc_avatar_setup.md.e817a3ae.lean.js} | 2 +- ...tware_guide_build_software.md.067d21a0.js} | 2 +- ..._guide_build_software.md.067d21a0.lean.js} | 2 +- ...guide_eyetrackvr_app_guide.md.7beed7fa.js} | 2 +- ..._eyetrackvr_app_guide.md.7beed7fa.lean.js} | 2 +- ...> software_guide_osc_setup.md.5969c73c.js} | 2 +- ...tware_guide_osc_setup.md.5969c73c.lean.js} | 2 +- contact.html | 12 ++++----- dev_roadmap.html | 14 +++++----- development/docs/dev_docs.html | 12 ++++----- development/docs/pages.html | 12 ++++----- development/docs/standards.html | 14 +++++----- firmware_guide/configure_firmware.html | 16 ++++++------ firmware_guide/environments.html | 14 +++++----- firmware_guide/firmware.html | 12 ++++----- firmware_guide/flashing_tool.html | 24 ++++++++++++++++++ firmware_guide/mdns.html | 12 ++++----- firmware_guide/rest_api.html | 12 ++++----- firmware_guide/setup_vscode.html | 14 +++++----- firmware_guide/update_platformio.html | 14 +++++----- .../upload_and_update_firmware.html | 18 ++++++------- getting_started/intro.html | 16 ++++++------ getting_started/led_safety.html | 14 +++++----- getting_started/things_to_know.html | 12 ++++----- hashmap.json | 2 +- how_to_build/creating_your_own_mount.html | 12 ++++----- how_to_build/full_build.html | 18 ++++++------- how_to_build/parts_list.html | 16 ++++++------ imgs/flashingtool.png | Bin 0 -> 116506 bytes imgs/flashingtool_1.png | Bin 0 -> 127303 bytes index.html | 12 ++++----- misc/faq.html | 14 +++++----- misc/vrc_avatar_setup.html | 14 +++++----- software_guide/build_software.html | 16 ++++++------ software_guide/eyetrackvr_app_guide.html | 16 ++++++------ software_guide/osc_setup.html | 16 ++++++------ 103 files changed, 289 insertions(+), 263 deletions(-) rename assets/{about.md.c167d8c9.js => about.md.e87a2ce6.js} (95%) rename assets/{about.md.c167d8c9.lean.js => about.md.e87a2ce6.lean.js} (95%) rename assets/{app.29c19915.js => app.ca327012.js} (91%) rename assets/{archive_fox_ir_v2_build_instructions.md.37294e54.js => archive_fox_ir_v2_build_instructions.md.b320b3b5.js} (97%) rename assets/{archive_fox_ir_v2_build_instructions.md.37294e54.lean.js => archive_fox_ir_v2_build_instructions.md.b320b3b5.lean.js} (96%) delete mode 100644 assets/chunks/@localSearchIndexroot.b0007708.js create mode 100644 assets/chunks/@localSearchIndexroot.ecff9080.js rename assets/chunks/{Accordion.990634ba.js => Accordion.a0a88ff3.js} (93%) rename assets/chunks/{CheckBoxList.26e03ba7.js => CheckBoxList.9fb033ec.js} (92%) delete mode 100644 assets/chunks/VPLocalSearchBox.03f5fd54.js create mode 100644 assets/chunks/VPLocalSearchBox.9f9b3188.js delete mode 100644 assets/chunks/framework.1f7cb35e.js create mode 100644 assets/chunks/framework.e4c952c1.js rename assets/chunks/{index.03b5fd27.js => index.0e6ad99c.js} (69%) rename assets/chunks/{index.2510e13f.js => index.8ad7dc66.js} (97%) rename assets/chunks/{theme.3f27bc77.js => theme.bd876814.js} (87%) rename assets/{contact.md.a2c6963a.js => contact.md.c2e94634.js} (92%) rename assets/{contact.md.a2c6963a.lean.js => contact.md.c2e94634.lean.js} (92%) rename assets/{dev_roadmap.md.c17da989.js => dev_roadmap.md.e0297856.js} (94%) rename assets/{dev_roadmap.md.c17da989.lean.js => dev_roadmap.md.e0297856.lean.js} (94%) rename assets/{development_docs_dev_docs.md.88818b58.js => development_docs_dev_docs.md.c7de805c.js} (97%) rename assets/{development_docs_dev_docs.md.88818b58.lean.js => development_docs_dev_docs.md.c7de805c.lean.js} (74%) rename assets/{development_docs_pages.md.69bf3e35.js => development_docs_pages.md.ec947cc8.js} (98%) rename assets/{development_docs_pages.md.69bf3e35.lean.js => development_docs_pages.md.ec947cc8.lean.js} (70%) rename assets/{development_docs_standards.md.413d5844.js => development_docs_standards.md.20a7ac2c.js} (98%) rename assets/{development_docs_standards.md.413d5844.lean.js => development_docs_standards.md.20a7ac2c.lean.js} (72%) create mode 100644 assets/firmware_guide_configure_firmware.md.7852fa9f.js rename assets/{firmware_guide_configure_firmware.md.d87cb28a.lean.js => firmware_guide_configure_firmware.md.7852fa9f.lean.js} (75%) delete mode 100644 assets/firmware_guide_configure_firmware.md.d87cb28a.js rename assets/{firmware_guide_environments.md.4794ed72.js => firmware_guide_environments.md.5499e526.js} (95%) rename assets/{firmware_guide_environments.md.4794ed72.lean.js => firmware_guide_environments.md.5499e526.lean.js} (66%) create mode 100644 assets/firmware_guide_firmware.md.2745189a.js create mode 100644 assets/firmware_guide_firmware.md.2745189a.lean.js delete mode 100644 assets/firmware_guide_firmware.md.343c04a7.js delete mode 100644 assets/firmware_guide_firmware.md.343c04a7.lean.js create mode 100644 assets/firmware_guide_flashing_tool.md.52fe420e.js create mode 100644 assets/firmware_guide_flashing_tool.md.52fe420e.lean.js rename assets/{firmware_guide_mdns.md.219d73d2.js => firmware_guide_mdns.md.7fbdf94c.js} (97%) rename assets/{firmware_guide_mdns.md.219d73d2.lean.js => firmware_guide_mdns.md.7fbdf94c.lean.js} (70%) rename assets/{firmware_guide_rest_api.md.c9512bce.js => firmware_guide_rest_api.md.4fe3ee89.js} (99%) rename assets/{firmware_guide_rest_api.md.c9512bce.lean.js => firmware_guide_rest_api.md.4fe3ee89.lean.js} (71%) rename assets/{firmware_guide_setup_vscode.md.17bb0fe1.js => firmware_guide_setup_vscode.md.bc9620d8.js} (97%) rename assets/{firmware_guide_setup_vscode.md.17bb0fe1.lean.js => firmware_guide_setup_vscode.md.bc9620d8.lean.js} (94%) rename assets/{firmware_guide_update_platformio.md.9b9a64fd.js => firmware_guide_update_platformio.md.af6d4d76.js} (97%) rename assets/{firmware_guide_update_platformio.md.9b9a64fd.lean.js => firmware_guide_update_platformio.md.af6d4d76.lean.js} (94%) rename assets/{firmware_guide_upload_and_update_firmware.md.2c6d4eed.js => firmware_guide_upload_and_update_firmware.md.1076bd51.js} (98%) rename assets/{firmware_guide_upload_and_update_firmware.md.2c6d4eed.lean.js => firmware_guide_upload_and_update_firmware.md.1076bd51.lean.js} (94%) rename assets/{getting_started_intro.md.f3812501.js => getting_started_intro.md.193e8e8d.js} (96%) rename assets/{getting_started_intro.md.f3812501.lean.js => getting_started_intro.md.193e8e8d.lean.js} (76%) rename assets/{getting_started_led_safety.md.ee0ec671.js => getting_started_led_safety.md.694b59dc.js} (97%) rename assets/{getting_started_led_safety.md.ee0ec671.lean.js => getting_started_led_safety.md.694b59dc.lean.js} (82%) rename assets/{getting_started_things_to_know.md.21105a37.js => getting_started_things_to_know.md.b44e9a98.js} (96%) rename assets/{getting_started_things_to_know.md.21105a37.lean.js => getting_started_things_to_know.md.b44e9a98.lean.js} (73%) rename assets/{how_to_build_creating_your_own_mount.md.5fb1a297.js => how_to_build_creating_your_own_mount.md.3ddf5184.js} (97%) rename assets/{how_to_build_creating_your_own_mount.md.5fb1a297.lean.js => how_to_build_creating_your_own_mount.md.3ddf5184.lean.js} (74%) rename assets/{how_to_build_full_build.md.5bb31bfb.js => how_to_build_full_build.md.b9c84c14.js} (98%) rename assets/{how_to_build_full_build.md.5bb31bfb.lean.js => how_to_build_full_build.md.b9c84c14.lean.js} (97%) rename assets/{how_to_build_parts_list.md.d6d922fd.js => how_to_build_parts_list.md.aba29938.js} (99%) rename assets/{how_to_build_parts_list.md.d6d922fd.lean.js => how_to_build_parts_list.md.aba29938.lean.js} (97%) rename assets/{index.md.ca39f1a7.js => index.md.0b651dfd.js} (96%) rename assets/{index.md.ca39f1a7.lean.js => index.md.0b651dfd.lean.js} (96%) rename assets/{misc_faq.md.3dbf62c9.js => misc_faq.md.314d6845.js} (96%) rename assets/{misc_faq.md.3dbf62c9.lean.js => misc_faq.md.314d6845.lean.js} (96%) rename assets/{misc_vrc_avatar_setup.md.bfdb6de4.js => misc_vrc_avatar_setup.md.e817a3ae.js} (94%) rename assets/{misc_vrc_avatar_setup.md.bfdb6de4.lean.js => misc_vrc_avatar_setup.md.e817a3ae.lean.js} (90%) rename assets/{software_guide_build_software.md.10b4fcdc.js => software_guide_build_software.md.067d21a0.js} (94%) rename assets/{software_guide_build_software.md.10b4fcdc.lean.js => software_guide_build_software.md.067d21a0.lean.js} (89%) rename assets/{software_guide_eyetrackvr_app_guide.md.dcb1818d.js => software_guide_eyetrackvr_app_guide.md.7beed7fa.js} (98%) rename assets/{software_guide_eyetrackvr_app_guide.md.dcb1818d.lean.js => software_guide_eyetrackvr_app_guide.md.7beed7fa.lean.js} (93%) rename assets/{software_guide_osc_setup.md.bb0fc577.js => software_guide_osc_setup.md.5969c73c.js} (96%) rename assets/{software_guide_osc_setup.md.bb0fc577.lean.js => software_guide_osc_setup.md.5969c73c.lean.js} (94%) create mode 100644 firmware_guide/flashing_tool.html create mode 100644 imgs/flashingtool.png create mode 100644 imgs/flashingtool_1.png diff --git a/404.html b/404.html index d4e95f6..1748438 100644 --- a/404.html +++ b/404.html @@ -7,14 +7,14 @@ - + -
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.

- +
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.html b/about.html index df2a403..27f93c6 100644 --- a/about.html +++ b/about.html @@ -7,17 +7,17 @@ - + - - - + + + -
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.html b/archive/fox_ir_v2_build_instructions.html index dc5ef86..37ad110 100644 --- a/archive/fox_ir_v2_build_instructions.html +++ b/archive/fox_ir_v2_build_instructions.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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

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.c167d8c9.js b/assets/about.md.e87a2ce6.js similarity index 95% rename from assets/about.md.c167d8c9.js rename to assets/about.md.e87a2ce6.js index 15a3b2f..23a9f2c 100644 --- a/assets/about.md.c167d8c9.js +++ b/assets/about.md.e87a2ce6.js @@ -1 +1 @@ -import{V as i,a as s,b as l,c as r}from"./chunks/theme.3f27bc77.js";import{o as u,c,H as n,w as a,l as o,a as e,k as t}from"./chunks/framework.1f7cb35e.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),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,H)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),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,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default}; +import{V as i,a as s,b as l,c as r}from"./chunks/theme.bd876814.js";import{o as u,c,H as n,w as a,l as o,a as e,k as t}from"./chunks/framework.e4c952c1.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),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,H)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),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,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default}; diff --git a/assets/about.md.c167d8c9.lean.js b/assets/about.md.e87a2ce6.lean.js similarity index 95% rename from assets/about.md.c167d8c9.lean.js rename to assets/about.md.e87a2ce6.lean.js index 15a3b2f..23a9f2c 100644 --- a/assets/about.md.c167d8c9.lean.js +++ b/assets/about.md.e87a2ce6.lean.js @@ -1 +1 @@ -import{V as i,a as s,b as l,c as r}from"./chunks/theme.3f27bc77.js";import{o as u,c,H as n,w as a,l as o,a as e,k as t}from"./chunks/framework.1f7cb35e.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),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,H)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),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,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default}; +import{V as i,a as s,b as l,c as r}from"./chunks/theme.bd876814.js";import{o as u,c,H as n,w as a,l as o,a as e,k as t}from"./chunks/framework.e4c952c1.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),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,H)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),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,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default}; diff --git a/assets/app.29c19915.js b/assets/app.ca327012.js similarity index 91% rename from assets/app.29c19915.js rename to assets/app.ca327012.js index 0dbe693..4f6a9c7 100644 --- a/assets/app.29c19915.js +++ b/assets/app.ca327012.js @@ -1 +1 @@ -import{u as p,y as i,s,a3 as c,a4 as l,a5 as f,a6 as d,a7 as m,a8 as h,a9 as g,aa as A,ab as v,ac as C,V as P,d as y,j as _,ad as w,ae as T,af as b,ag as E}from"./chunks/framework.1f7cb35e.js";import{t as R}from"./chunks/theme.3f27bc77.js";const D={};const S={...R,setup(){const{lang:e}=p();i(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...D};function u(e){if(e.extends){const t=u(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const o=u(S),j=y({name:"VitePressApp",setup(){const{site:e}=p();return _(()=>{i(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),T(),b(),o.setup&&o.setup(),()=>E(o.Layout)}});async function x(){const e=V(),t=O();t.provide(l,e);const a=f(e.route);return t.provide(d,a),t.component("Content",m),t.component("ClientOnly",h),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:t,router:e,siteData:g}),{app:t,router:e,data:a}}function O(){return A(j)}function V(){let e=s,t;return v(a=>{let n=C(a),r=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&x().then(({app:e,router:t,data:a})=>{t.go().then(()=>{c(t.route,a.site),e.mount("#app")})});export{x as createApp}; +import{u as p,y as i,s,a3 as c,a4 as l,a5 as f,a6 as d,a7 as m,a8 as h,a9 as g,aa as A,ab as v,ac as C,V as P,d as y,j as _,ad as w,ae as T,af as b,ag as E}from"./chunks/framework.e4c952c1.js";import{t as R}from"./chunks/theme.bd876814.js";const D={};const S={...R,setup(){const{lang:e}=p();i(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...D};function u(e){if(e.extends){const t=u(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const o=u(S),j=y({name:"VitePressApp",setup(){const{site:e}=p();return _(()=>{i(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),T(),b(),o.setup&&o.setup(),()=>E(o.Layout)}});async function x(){const e=V(),t=O();t.provide(l,e);const a=f(e.route);return t.provide(d,a),t.component("Content",m),t.component("ClientOnly",h),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:t,router:e,siteData:g}),{app:t,router:e,data:a}}function O(){return A(j)}function V(){let e=s,t;return v(a=>{let n=C(a),r=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&x().then(({app:e,router:t,data:a})=>{t.go().then(()=>{c(t.route,a.site),e.mount("#app")})});export{x as createApp}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.37294e54.js b/assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.js similarity index 97% rename from assets/archive_fox_ir_v2_build_instructions.md.37294e54.js rename to assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.js index bd25ab1..b755d84 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.37294e54.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.03b5fd27.js";import{o as r,c as l,H as s,l as i,k as e,a as n,Q as a}from"./chunks/framework.1f7cb35e.js";const d=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-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1),_=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-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1),p=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=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 17: Solder resistors on PCB V2

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

',10),m=e("p",null,"Tin the resistor pads.",-1),b=e("p",null,"Hold the resistor in place.",-1),v=e("p",null,"Solder one end.",-1),x=e("p",null,"Flip to the other side of the resistor and solder it.",-1),P=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-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1),g=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-label":'Permalink to "Wire up the PCBs V2"'},"​")],-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),k=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},L=Object.assign(T,{setup(I){return(D,E)=>(r(),l("div",null,[d,_,p,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"]),m,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),g,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{k as __pageData,L as default}; +import{_ as o,i as t}from"./chunks/index.0e6ad99c.js";import{o as r,c as l,H as s,l as i,k as e,a as n,Q as a}from"./chunks/framework.e4c952c1.js";const d=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-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1),_=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-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1),p=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=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 17: Solder resistors on PCB V2

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

',10),m=e("p",null,"Tin the resistor pads.",-1),b=e("p",null,"Hold the resistor in place.",-1),v=e("p",null,"Solder one end.",-1),x=e("p",null,"Flip to the other side of the resistor and solder it.",-1),P=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-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1),g=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-label":'Permalink to "Wire up the PCBs V2"'},"​")],-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),k=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},L=Object.assign(T,{setup(I){return(D,E)=>(r(),l("div",null,[d,_,p,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"]),m,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),g,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{k as __pageData,L as default}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.37294e54.lean.js b/assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.lean.js similarity index 96% rename from assets/archive_fox_ir_v2_build_instructions.md.37294e54.lean.js rename to assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.lean.js index 3a3193a..1516952 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.37294e54.lean.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.b320b3b5.lean.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.03b5fd27.js";import{o as r,c as l,H as s,l as i,k as e,a as n,Q as a}from"./chunks/framework.1f7cb35e.js";const d=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-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1),_=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-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1),p=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=a("",10),m=e("p",null,"Tin the resistor pads.",-1),b=e("p",null,"Hold the resistor in place.",-1),v=e("p",null,"Solder one end.",-1),x=e("p",null,"Flip to the other side of the resistor and solder it.",-1),P=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-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1),g=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-label":'Permalink to "Wire up the PCBs V2"'},"​")],-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),k=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},L=Object.assign(T,{setup(I){return(D,E)=>(r(),l("div",null,[d,_,p,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"]),m,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),g,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{k as __pageData,L as default}; +import{_ as o,i as t}from"./chunks/index.0e6ad99c.js";import{o as r,c as l,H as s,l as i,k as e,a as n,Q as a}from"./chunks/framework.e4c952c1.js";const d=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-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1),_=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-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1),p=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=a("",10),m=e("p",null,"Tin the resistor pads.",-1),b=e("p",null,"Hold the resistor in place.",-1),v=e("p",null,"Solder one end.",-1),x=e("p",null,"Flip to the other side of the resistor and solder it.",-1),P=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-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1),g=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-label":'Permalink to "Wire up the PCBs V2"'},"​")],-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),k=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},L=Object.assign(T,{setup(I){return(D,E)=>(r(),l("div",null,[d,_,p,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"]),m,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),g,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{k as __pageData,L as default}; diff --git a/assets/chunks/@localSearchIndexroot.b0007708.js b/assets/chunks/@localSearchIndexroot.b0007708.js deleted file mode 100644 index 58e2598..0000000 --- a/assets/chunks/@localSearchIndexroot.b0007708.js +++ /dev/null @@ -1 +0,0 @@ -const e=`{"documentCount":197,"nextId":197,"documentIds":{"0":"/archive/fox_ir_v2_build_instructions#fox-ir-v2-buil-dinstructions","1":"/archive/fox_ir_v2_build_instructions#step-15-prepare-to-solder-ir-led-pcb-v2s","2":"/archive/fox_ir_v2_build_instructions#step-17-solder-resistors-on-pcb-v2","3":"/archive/fox_ir_v2_build_instructions#solder-leds-on-pcb-v2","4":"/archive/fox_ir_v2_build_instructions#wire-up-the-pcbs-v2","5":"/dev_roadmap#eyetrackvr-development-roadmap","6":"/dev_roadmap#completed","7":"/dev_roadmap#in-progress","8":"/dev_roadmap#planned","9":"/development/docs/dev_docs#development-documentation-for-the-eyetrackvr-docs-site","10":"/development/docs/dev_docs#getting-started","11":"/development/docs/dev_docs#prerequisites","12":"/development/docs/dev_docs#installation","13":"/development/docs/dev_docs#contributing","14":"/development/docs/dev_docs#project-structure","15":"/development/docs/dev_docs#standards","16":"/development/docs/pages#pages","17":"/development/docs/pages#adding-a-page","18":"/development/docs/pages#sub-directories","19":"/development/docs/pages#adding-a-page-to-the-sidebar","20":"/development/docs/pages#title-style","21":"/development/docs/pages#editing-a-page","22":"/development/docs/standards#standards-guide","23":"/development/docs/standards#code-standards","24":"/development/docs/standards#general","25":"/development/docs/standards#git-commit-style","26":"/firmware_guide/configure_firmware#configuring-the-firmware","27":"/firmware_guide/configure_firmware#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","28":"/firmware_guide/configure_firmware#open-the-ini-user-config-ini-file","29":"/firmware_guide/configure_firmware#additonal-configuration","30":"/firmware_guide/configure_firmware#mdns","31":"/firmware_guide/configure_firmware#ota","32":"/firmware_guide/configure_firmware#rest-api","33":"/firmware_guide/configure_firmware#environments","34":"/firmware_guide/environments#firmware-environments","35":"/firmware_guide/environments#what-is-it","36":"/firmware_guide/environments#build-types","37":"/firmware_guide/environments#board-types","38":"/firmware_guide/firmware#what-is-this","39":"/firmware_guide/firmware#what-should-i-download-and-where","40":"/firmware_guide/firmware#how-do-download-this","41":"/firmware_guide/mdns#mdns","42":"/firmware_guide/mdns#what-is-it","43":"/firmware_guide/mdns#how-to-use-it","44":"/firmware_guide/mdns#enable-mdns","45":"/firmware_guide/mdns#connect-to-the-device","46":"/firmware_guide/mdns#prerequisites-bonjour","47":"/firmware_guide/mdns#troubleshooting","48":"/firmware_guide/mdns#can-not-connect-to-the-device","49":"/firmware_guide/rest_api#rest-api","50":"/firmware_guide/rest_api#what-is-it","51":"/firmware_guide/rest_api#how-to-use-it","52":"/firmware_guide/rest_api#rest-api-client","53":"/firmware_guide/rest_api#standard","54":"/firmware_guide/rest_api#endpoints","55":"/firmware_guide/rest_api#params","56":"/firmware_guide/rest_api#wifi","57":"/firmware_guide/rest_api#setdevice","58":"/firmware_guide/rest_api#settxpower","59":"/firmware_guide/rest_api#camera-params","60":"/firmware_guide/setup_vscode#setting-up-the-environment","61":"/firmware_guide/setup_vscode#_1-install-visual-studio-code","62":"/firmware_guide/setup_vscode#download","63":"/firmware_guide/setup_vscode#install","64":"/firmware_guide/setup_vscode#_2-install-the-drivers","65":"/firmware_guide/setup_vscode#_3-install-platformio-ide","66":"/firmware_guide/setup_vscode#_4-clone-the-firmware-project","67":"/firmware_guide/update_platformio#updating-platformio","68":"/firmware_guide/update_platformio#updating-platformio-itself","69":"/firmware_guide/update_platformio#via-cli","70":"/firmware_guide/update_platformio#via-platformio-in-visual-studio-code","71":"/firmware_guide/update_platformio#upgrading-the-sdk","72":"/firmware_guide/update_platformio#upgrading-the-sdk-via-vsc","73":"/firmware_guide/upload_and_update_firmware#building-and-uploading-the-firmware-manually","74":"/firmware_guide/upload_and_update_firmware#_1-connect-your-tracker-to-your-pc","75":"/firmware_guide/upload_and_update_firmware#option-1-connect-esp32-cam-via-the-programmer","76":"/firmware_guide/upload_and_update_firmware#option-2-connect-esp32-s3-via-usb-c-directly","77":"/firmware_guide/upload_and_update_firmware#_2-build-your-firmware","78":"/firmware_guide/upload_and_update_firmware#_3-upload-your-firmware","79":"/firmware_guide/upload_and_update_firmware#uploading-via-ota","80":"/firmware_guide/upload_and_update_firmware#what-is-it","81":"/firmware_guide/upload_and_update_firmware#how-do-i-use-it","82":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-1-1-0-and-up","83":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-of-1-0-0-and-under","84":"/firmware_guide/upload_and_update_firmware#finding-the-ip-address-of-your-tracker","85":"/firmware_guide/upload_and_update_firmware#updating-the-firmware-to-the-newest-version","86":"/firmware_guide/upload_and_update_firmware#troubleshooting","87":"/getting_started/intro#eyetrackvr","88":"/getting_started/intro#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","89":"/getting_started/intro#about-ir-emitter-safety","90":"/getting_started/intro#hardware","91":"/getting_started/intro#firmware","92":"/getting_started/intro#headset-support","93":"/getting_started/intro#contact","94":"/getting_started/intro#licenses","95":"/getting_started/led_safety#about-ir-emitter-safety","96":"/getting_started/led_safety#what-we-care-about","97":"/getting_started/led_safety#v3-hardware-safety-outline-and-exposure-numbers","98":"/getting_started/led_safety#v4-hardware-safety-outline-and-exposure-numbers","99":"/getting_started/things_to_know#things-to-know-before-you-start","100":"/getting_started/things_to_know#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","101":"/getting_started/things_to_know#software-is-not-final","102":"/getting_started/things_to_know#firmware-may-have-user-difficulties","103":"/getting_started/things_to_know#ir-emitters-are-dangerous","104":"/getting_started/things_to_know#documentation-may-be-incomplete","105":"/getting_started/things_to_know#you-will-need-to-set-up-your-avatar-to-use-this","106":"/getting_started/things_to_know#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","107":"/how_to_build/creating_your_own_mount#creating-your-own-mount","108":"/how_to_build/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","109":"/how_to_build/creating_your_own_mount#step-1-find-a-way-to-mount-to-your-headsets-lens","110":"/how_to_build/creating_your_own_mount#step-2-find-a-camera-mount","111":"/how_to_build/creating_your_own_mount#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","112":"/how_to_build/creating_your_own_mount#step-4-mount-your-leds","113":"/how_to_build/creating_your_own_mount#step-5-test-everything","114":"/how_to_build/creating_your_own_mount#step-6-get-your-mounts-listed","115":"/how_to_build/full_build#build-guide","116":"/how_to_build/full_build#this-page-will-contain-a-step-by-step-assembly-guide","117":"/how_to_build/full_build#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","118":"/how_to_build/full_build#step-2-order-all-the-parts-listed-on-our-parts-list","119":"/how_to_build/full_build#step-3-wait-for-things-to-arrive","120":"/how_to_build/full_build#step-4-gather-up-all-of-your-hardware","121":"/how_to_build/full_build#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","122":"/how_to_build/full_build#step-6-attach-cameras-to-esps","123":"/how_to_build/full_build#step-7-connect-esp-to-the-programmer-to-flash","124":"/how_to_build/full_build#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","125":"/how_to_build/full_build#step-9-plug-in-your-esp-and-flash-the-firmware","126":"/how_to_build/full_build#step-10-connect-your-power-wires-to-a-usb-type-a-board","127":"/how_to_build/full_build#step-11-cut-wires-for-ir-leds","128":"/how_to_build/full_build#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","129":"/how_to_build/full_build#step-13-solder-the-positive-wire-to-esp","130":"/how_to_build/full_build#step-14-solder-the-negative-wire-to-esp","131":"/how_to_build/full_build#step-15-wire-up-the-2nd-esp","132":"/how_to_build/full_build#step-16-prepare-to-solder-ir-led-pcbs","133":"/how_to_build/full_build#step-18-solder-resistors-on-pcb-v3","134":"/how_to_build/full_build#solder-leds-on-pcb-v3","135":"/how_to_build/full_build#wire-up-the-pcbs-v3","136":"/how_to_build/full_build#step-19-3d-print-mounts","137":"/how_to_build/full_build#type-1","138":"/how_to_build/full_build#type-2","139":"/how_to_build/full_build#ir-led-mounting","140":"/how_to_build/parts_list#parts-list","141":"/how_to_build/parts_list#esp-setup-options","142":"/how_to_build/parts_list#option-1-wireless-over-wifi-2-4-ghz","143":"/how_to_build/parts_list#option-2-wired-over-usb-serial-in-beta","144":"/how_to_build/parts_list#required-parts","145":"/how_to_build/parts_list#tracker-boards","146":"/how_to_build/parts_list#recommended","147":"/how_to_build/parts_list#a-cheaper-wireless-only-alternative","148":"/how_to_build/parts_list#cameras","149":"/how_to_build/parts_list#camera-modules","150":"/how_to_build/parts_list#_2x-ov2640-160°-fov-ir-night-vers-75mm-850nm","151":"/how_to_build/parts_list#optional-ribbon-extensions","152":"/how_to_build/parts_list#usb-hubs-for-if-you-are-building-the-wired-version","153":"/how_to_build/parts_list#wires-and-adapters","154":"/how_to_build/parts_list#ir-emitters","155":"/how_to_build/parts_list#recommended-1","156":"/how_to_build/parts_list#alternatively-you-can-source-the-parts-for-v3-yourself","157":"/how_to_build/parts_list#_3d-printed-mounts","158":"/how_to_build/parts_list#misc-parts-tools","159":"/how_to_build/parts_list#other-headsets","160":"/misc/faq#frequently-asked-questions","161":"/misc/vrc_avatar_setup#how-to-set-up-your-avatar-for-eye-tracking","162":"/misc/vrc_avatar_setup#we-currently-use-the-following-paramaters","163":"/software_guide/build_software#build-the-app-from-source","164":"/software_guide/build_software#this-guide-will-show-how-to-build-the-app-from-source","165":"/software_guide/build_software#requirements","166":"/software_guide/build_software#install-python","167":"/software_guide/build_software#installing-poetry","168":"/software_guide/build_software#install-the-required-python-modules","169":"/software_guide/build_software#build-the-app","170":"/software_guide/eyetrackvr_app_guide#how-to-install-run-and-adjust-the-eyetrackvr-app","171":"/software_guide/eyetrackvr_app_guide#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","172":"/software_guide/eyetrackvr_app_guide#step-2-run-the-eyetrackvr-app","173":"/software_guide/eyetrackvr_app_guide#step-3-getting-familiar-with-settings-and-terminology","174":"/software_guide/eyetrackvr_app_guide#right-eye","175":"/software_guide/eyetrackvr_app_guide#left-eye","176":"/software_guide/eyetrackvr_app_guide#both-eyes","177":"/software_guide/eyetrackvr_app_guide#camera-address","178":"/software_guide/eyetrackvr_app_guide#tracking-mode","179":"/software_guide/eyetrackvr_app_guide#cropping-mode","180":"/software_guide/eyetrackvr_app_guide#threshold","181":"/software_guide/eyetrackvr_app_guide#rotation","182":"/software_guide/eyetrackvr_app_guide#restart-calibrationn","183":"/software_guide/eyetrackvr_app_guide#recenter-eye","184":"/software_guide/eyetrackvr_app_guide#step-4-adding-your-cameras-to-the-software-and-configuring-them","185":"/software_guide/eyetrackvr_app_guide#wireless-configuration","186":"/software_guide/eyetrackvr_app_guide#wired-configuration-experimental","187":"/software_guide/eyetrackvr_app_guide#note-this-is-a-beta-app-feature-only-please-use-the-latest-open-beta-in-the-discord","188":"/software_guide/eyetrackvr_app_guide#setting-up-roi","189":"/software_guide/eyetrackvr_app_guide#step-5-calibrating-your-eyes","190":"/software_guide/eyetrackvr_app_guide#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","191":"/software_guide/osc_setup#setting-up-recalibration-and-recentering-from-vrchat","192":"/software_guide/osc_setup#setting-up-your-parameters","193":"/software_guide/osc_setup#adding-parameters","194":"/software_guide/osc_setup#adding-buttons-to-the-menu","195":"/software_guide/osc_setup#reseting-the-osc-config-in-case-the-parameters-don-t-work","196":"/software_guide/osc_setup#other-platforms"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[9,5,86],"2":[7,5,28],"3":[5,5,31],"4":[5,5,45],"5":[3,1,15],"6":[1,3,1],"7":[2,3,1],"8":[1,3,1],"9":[7,1,13],"10":[2,7,1],"11":[1,9,19],"12":[1,9,32],"13":[1,7,1],"14":[2,8,15],"15":[1,10,41],"16":[1,1,33],"17":[3,1,34],"18":[2,4,37],"19":[6,4,63],"20":[2,4,96],"21":[3,1,18],"22":[2,1,19],"23":[2,2,1],"24":[1,3,43],"25":[3,3,160],"26":[3,1,1],"27":[14,3,1],"28":[6,3,122],"29":[2,8,1],"30":[1,10,51],"31":[1,10,67],"32":[2,10,68],"33":[1,10,86],"34":[2,1,1],"35":[4,2,55],"36":[2,2,81],"37":[2,2,113],"38":[4,1,26],"39":[7,4,24],"40":[5,4,6],"41":[1,1,1],"42":[4,1,45],"43":[4,1,1],"44":[2,5,70],"45":[4,5,22],"46":[2,1,33],"47":[1,1,1],"48":[6,2,22],"49":[2,1,1],"50":[4,2,41],"51":[4,2,1],"52":[3,6,39],"53":[1,6,36],"54":[1,6,118],"55":[1,6,54],"56":[2,7,106],"57":[2,7,40],"58":[2,7,57],"59":[2,6,12],"60":[4,1,15],"61":[5,4,10],"62":[1,9,1],"63":[1,9,1],"64":[4,4,29],"65":[4,4,28],"66":[5,4,110],"67":[2,1,46],"68":[3,2,10],"69":[2,4,29],"70":[6,4,53],"71":[3,2,13],"72":[5,5,65],"73":[6,1,27],"74":[6,6,1],"75":[8,12,69],"76":[9,12,52],"77":[4,6,22],"78":[4,6,105],"79":[3,6,1],"80":[4,9,21],"81":[6,9,52],"82":[8,15,134],"83":[9,15,125],"84":[7,6,69],"85":[6,1,83],"86":[1,6,40],"87":[1,1,16],"88":[22,2,27],"89":[4,1,167],"90":[1,1,13],"91":[1,1,11],"92":[2,1,54],"93":[1,25,16],"94":[1,1,19],"95":[4,1,131],"96":[5,5,209],"97":[8,1,105],"98":[8,1,97],"99":[6,1,1],"100":[17,6,1],"101":[4,23,29],"102":[5,23,13],"103":[4,23,40],"104":[4,23,6],"105":[10,23,29],"106":[10,23,1],"107":[4,1,1],"108":[25,4,29],"109":[10,4,43],"110":[6,4,32],"111":[13,4,48],"112":[5,4,28],"113":[4,4,24],"114":[6,4,25],"115":[2,1,1],"116":[9,2,53],"117":[8,2,18],"118":[9,2,25],"119":[7,2,20],"120":[8,2,9],"121":[13,2,124],"122":[6,2,69],"123":[8,2,35],"124":[12,2,18],"125":[10,2,35],"126":[12,2,67],"127":[7,2,59],"128":[14,2,15],"129":[8,2,12],"130":[8,2,48],"131":[7,2,9],"132":[8,2,87],"133":[7,2,65],"134":[5,2,18],"135":[5,2,28],"136":[5,2,84],"137":[2,7,59],"138":[2,7,17],"139":[3,2,49],"140":[2,1,48],"141":[4,2,32],"142":[8,6,81],"143":[9,6,58],"144":[2,2,12],"145":[3,4,1],"146":[1,7,45],"147":[6,7,77],"148":[1,4,1],"149":[3,5,51],"150":[10,5,69],"151":[4,5,56],"152":[10,4,79],"153":[3,4,38],"154":[2,4,1],"155":[2,6,22],"156":[10,6,136],"157":[3,2,41],"158":[3,2,33],"159":[2,5,69],"160":[3,1,1],"161":[10,1,22],"162":[6,10,17],"163":[5,1,1],"164":[11,5,17],"165":[1,5,1],"166":[2,5,15],"167":[2,5,45],"168":[5,5,25],"169":[3,5,30],"170":[10,1,1],"171":[9,10,19],"172":[6,10,33],"173":[8,10,17],"174":[2,16,9],"175":[2,16,9],"176":[2,16,7],"177":[2,16,30],"178":[2,16,12],"179":[2,16,10],"180":[1,16,15],"181":[1,16,23],"182":[2,16,16],"183":[2,16,13],"184":[11,10,1],"185":[2,17,49],"186":[4,17,1],"187":[16,21,32],"188":[3,17,94],"189":[5,10,66],"190":[11,10,1],"191":[8,1,57],"192":[4,8,1],"193":[2,9,84],"194":[5,9,116],"195":[10,8,52],"196":[2,8,49]},"averageFieldLength":[4.842639593908631,5.852791878172587,38.72588832487309],"storedFields":{"0":{"title":"Fox IR V2 Buil dInstructions","titles":[]},"1":{"title":"Step 15: Prepare to solder IR LED PCB V2s","titles":["Fox IR V2 Buil dInstructions"]},"2":{"title":"Step 17: Solder resistors on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"3":{"title":"Solder LEDs on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"4":{"title":"Wire up the PCBs V2","titles":["Fox IR V2 Buil dInstructions"]},"5":{"title":"EyeTrackVR Development Roadmap","titles":[]},"6":{"title":"Completed","titles":["EyeTrackVR Development Roadmap"]},"7":{"title":"In Progress","titles":["EyeTrackVR Development Roadmap"]},"8":{"title":"Planned","titles":["EyeTrackVR Development Roadmap"]},"9":{"title":"Development Documentation for the EyeTrackVR Docs Site","titles":[]},"10":{"title":"Getting Started","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"11":{"title":"Prerequisites","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"12":{"title":"Installation","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"13":{"title":"Contributing","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"14":{"title":"Project Structure","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing"]},"15":{"title":"Standards","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing","Project Structure"]},"16":{"title":"Pages","titles":[]},"17":{"title":"Adding a Page","titles":["Pages"]},"18":{"title":"Sub-directories","titles":["Pages","Adding a Page"]},"19":{"title":"Adding a Page to the Sidebar","titles":["Pages","Adding a Page"]},"20":{"title":"Title Style","titles":["Pages","Adding a Page"]},"21":{"title":"Editing a Page","titles":["Pages"]},"22":{"title":"Standards Guide","titles":[]},"23":{"title":"Code Standards","titles":["Standards Guide"]},"24":{"title":"General","titles":["Standards Guide","Code Standards"]},"25":{"title":"Git Commit Style","titles":["Standards Guide","Code Standards"]},"26":{"title":"Configuring the firmware","titles":[]},"27":{"title":"Once you have opened the project, you should see something on the left side like this","titles":["Configuring the firmware"]},"28":{"title":"Open the ini/user_config.ini file","titles":["Configuring the firmware"]},"29":{"title":"Additonal configuration","titles":["Configuring the firmware","Open the ini/user_config.ini file"]},"30":{"title":"mDNS","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additonal configuration"]},"31":{"title":"OTA","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additonal configuration"]},"32":{"title":"REST API","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additonal configuration"]},"33":{"title":"Environments","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additonal configuration"]},"34":{"title":"Firmware Environments","titles":[]},"35":{"title":"What is it?","titles":["Firmware Environments"]},"36":{"title":"Build Types","titles":["Firmware Environments"]},"37":{"title":"Board Types","titles":["Firmware Environments"]},"38":{"title":"What is this?","titles":[]},"39":{"title":"What should I download and where?","titles":["What is this?"]},"40":{"title":"How do download this?","titles":["What is this?"]},"41":{"title":"MDNS","titles":[]},"42":{"title":"What is it?","titles":["MDNS"]},"43":{"title":"How to use it","titles":["MDNS"]},"44":{"title":"Enable mDNS","titles":["MDNS","How to use it"]},"45":{"title":"Connect to the device","titles":["MDNS","How to use it"]},"46":{"title":"Prerequisites Bonjour","titles":["MDNS"]},"47":{"title":"Troubleshooting","titles":["MDNS"]},"48":{"title":"Can not connect to the device","titles":["MDNS","Troubleshooting"]},"49":{"title":"REST API","titles":[]},"50":{"title":"What is it?","titles":["REST API"]},"51":{"title":"How to use it","titles":["REST API"]},"52":{"title":"REST API Client","titles":["REST API","How to use it"]},"53":{"title":"Standard","titles":["REST API","How to use it"]},"54":{"title":"Endpoints","titles":["REST API","How to use it"]},"55":{"title":"Params","titles":["REST API","How to use it"]},"56":{"title":"/wifi","titles":["REST API","How to use it","Params"]},"57":{"title":"/setDevice","titles":["REST API","How to use it","Params"]},"58":{"title":"/setTxPower","titles":["REST API","How to use it","Params"]},"59":{"title":"Camera Params","titles":["REST API","How to use it"]},"60":{"title":"Setting up the environment","titles":[]},"61":{"title":"1. Install Visual Studio Code","titles":["Setting up the environment"]},"62":{"title":"Download","titles":["Setting up the environment","1. Install Visual Studio Code"]},"63":{"title":"Install","titles":["Setting up the environment","1. Install Visual Studio Code"]},"64":{"title":"2. Install the drivers","titles":["Setting up the environment"]},"65":{"title":"3. Install PlatformIO IDE","titles":["Setting up the environment"]},"66":{"title":"4. Clone the firmware project","titles":["Setting up the environment"]},"67":{"title":"Updating Platformio","titles":[]},"68":{"title":"Updating PlatformIO itself","titles":["Updating Platformio"]},"69":{"title":"Via CLI","titles":["Updating Platformio","Updating PlatformIO itself"]},"70":{"title":"Via PlatformIO in Visual Studio Code","titles":["Updating Platformio","Updating PlatformIO itself"]},"71":{"title":"Upgrading the SDK","titles":["Updating Platformio"]},"72":{"title":"Upgrading the SDK via VSC","titles":["Updating Platformio","Upgrading the SDK"]},"73":{"title":"Building and uploading the firmware manually","titles":[]},"74":{"title":"1. Connect your tracker to your PC","titles":["Building and uploading the firmware manually"]},"75":{"title":"Option 1: Connect ESP32-CAM via the programmer","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"76":{"title":"Option 2: Connect ESP32-S3 via USB-C directly","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"77":{"title":"2. Build your firmware","titles":["Building and uploading the firmware manually"]},"78":{"title":"3. Upload your firmware","titles":["Building and uploading the firmware manually"]},"79":{"title":"Uploading via OTA","titles":["Building and uploading the firmware manually"]},"80":{"title":"What is it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"81":{"title":"How do I use it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"82":{"title":"For firmware versions 1.1.0 and up:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"83":{"title":"For firmware versions of 1.0.0 and under:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"84":{"title":"Finding the IP address of your tracker","titles":["Building and uploading the firmware manually"]},"85":{"title":"Updating the firmware to the newest version","titles":[]},"86":{"title":"Troubleshooting","titles":["Updating the firmware to the newest version"]},"87":{"title":"EyeTrackVR","titles":[]},"88":{"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","titles":["EyeTrackVR",null]},"89":{"title":"About IR Emitter Safety","titles":["EyeTrackVR"]},"90":{"title":"Hardware","titles":["EyeTrackVR"]},"91":{"title":"Firmware","titles":["EyeTrackVR"]},"92":{"title":"Headset support","titles":["EyeTrackVR"]},"93":{"title":"Contact","titles":["EyeTrackVR","Headset support","Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project."]},"94":{"title":"Licenses","titles":[]},"95":{"title":"About IR Emitter Safety","titles":[null]},"96":{"title":"What we care about:","titles":[null,"About IR Emitter Safety"]},"97":{"title":"V3 Hardware Safety Outline and Exposure Numbers:","titles":[]},"98":{"title":"V4 Hardware Safety Outline and Exposure Numbers:","titles":[]},"99":{"title":"Things To Know Before You Start","titles":[]},"100":{"title":"This page will be an overview of things to know and understand before you start this project","titles":["Things To Know Before You Start"]},"101":{"title":"Software is not final","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"102":{"title":"Firmware may have user difficulties","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"103":{"title":"IR emitters are dangerous","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"104":{"title":"Documentation may be incomplete","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"105":{"title":"You will need to set up your avatar to use this","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"106":{"title":"Once you have acknowledged the items above, move on to the","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"107":{"title":"Creating Your Own Mount","titles":[]},"108":{"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","titles":["Creating Your Own Mount"]},"109":{"title":"Step 1: Find a way to mount to your headsets lens","titles":["Creating Your Own Mount"]},"110":{"title":"Step 2: Find a camera mount","titles":["Creating Your Own Mount"]},"111":{"title":"Step 3: Place the camera mount where it will give a good camera angle","titles":["Creating Your Own Mount"]},"112":{"title":"Step 4: Mount your LEDs","titles":["Creating Your Own Mount"]},"113":{"title":"Step 5: Test everything","titles":["Creating Your Own Mount"]},"114":{"title":"Step 6: Get your mounts listed","titles":["Creating Your Own Mount"]},"115":{"title":"Build Guide","titles":[]},"116":{"title":"This page will contain a step-by-step assembly guide","titles":["Build Guide"]},"117":{"title":"Step 1: Make sure your have read the","titles":["Build Guide"]},"118":{"title":"Step 2: Order all the parts listed on our","titles":["Build Guide"]},"119":{"title":"Step 3: Wait for things to arrive","titles":["Build Guide"]},"120":{"title":"Step 4: Gather up all of your hardware","titles":["Build Guide"]},"121":{"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","titles":["Build Guide"]},"122":{"title":"Step 6: Attach cameras to ESPs","titles":["Build Guide"]},"123":{"title":"Step 7: Connect ESP to the programmer to flash","titles":["Build Guide"]},"124":{"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","titles":["Build Guide"]},"125":{"title":"Step 9: Plug in your ESP and flash the firmware","titles":["Build Guide"]},"126":{"title":"Step 10: Connect your power wires to a USB Type-A board","titles":["Build Guide"]},"127":{"title":"Step 11: Cut wires for IR LEDs","titles":["Build Guide"]},"128":{"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","titles":["Build Guide"]},"129":{"title":"Step 13: Solder the positive wire to ESP","titles":["Build Guide"]},"130":{"title":"Step 14: Solder the negative wire to ESP","titles":["Build Guide"]},"131":{"title":"Step 15: Wire up the 2nd ESP","titles":["Build Guide"]},"132":{"title":"Step 16: Prepare to solder IR LED PCBs","titles":["Build Guide"]},"133":{"title":"Step 18: Solder resistors on PCB V3","titles":["Build Guide"]},"134":{"title":"Solder LEDs on PCB V3","titles":["Build Guide"]},"135":{"title":"Wire up the PCBs V3","titles":["Build Guide"]},"136":{"title":"Step 19: 3D print mounts","titles":["Build Guide"]},"137":{"title":"Type 1","titles":["Build Guide","Step 19: 3D print mounts"]},"138":{"title":"Type 2","titles":["Build Guide","Step 19: 3D print mounts"]},"139":{"title":"IR LED mounting","titles":["Build Guide"]},"140":{"title":"Parts List","titles":[]},"141":{"title":"ESP setup options:","titles":["Parts List"]},"142":{"title":"Option 1: Wireless over WiFi 2.4 GHz","titles":["Parts List","ESP setup options:"]},"143":{"title":"Option 2: Wired over USB Serial (in beta)","titles":["Parts List","ESP setup options:"]},"144":{"title":"Required parts","titles":["Parts List"]},"145":{"title":"Tracker boards:","titles":["Parts List","Required parts"]},"146":{"title":"Recommended","titles":["Parts List","Required parts","Tracker boards:"]},"147":{"title":"A cheaper, wireless only alternative:","titles":["Parts List","Required parts","Tracker boards:"]},"148":{"title":"Cameras","titles":["Parts List","Required parts"]},"149":{"title":"Camera modules:","titles":["Parts List","Required parts","Cameras"]},"150":{"title":"2x OV2640 160° FOV IR / Night vers 75mm (850nm)","titles":["Parts List","Required parts","Cameras"]},"151":{"title":"Optional Ribbon extensions:","titles":["Parts List","Required parts","Cameras"]},"152":{"title":"USB Hubs - for if you are building the wired version","titles":["Parts List","Required parts"]},"153":{"title":"Wires and adapters","titles":["Parts List","Required parts"]},"154":{"title":"IR emitters","titles":["Parts List","Required parts"]},"155":{"title":"Recommended:","titles":["Parts List","Required parts","IR emitters"]},"156":{"title":"Alternatively you can source the parts for V3 yourself:","titles":["Parts List","Required parts","IR emitters"]},"157":{"title":"3D Printed Mounts","titles":["Parts List"]},"158":{"title":"Misc parts/tools","titles":["Parts List"]},"159":{"title":"Other Headsets","titles":["Parts List","Misc parts/tools"]},"160":{"title":"Frequently Asked Questions","titles":[]},"161":{"title":"How to set up your avatar for eye tracking:","titles":[]},"162":{"title":"We currently use the following paramaters","titles":["How to set up your avatar for eye tracking:",null]},"163":{"title":"Build the app from source","titles":[]},"164":{"title":"This guide will show how to build the app from source","titles":["Build the app from source"]},"165":{"title":"Requirements","titles":["Build the app from source"]},"166":{"title":"Install Python","titles":["Build the app from source"]},"167":{"title":"Installing Poetry","titles":["Build the app from source"]},"168":{"title":"Install the required Python modules","titles":["Build the app from source"]},"169":{"title":"Build the app","titles":["Build the app from source"]},"170":{"title":"How to install, run and adjust the EyeTrackVR app.","titles":[]},"171":{"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app.",null]},"172":{"title":"Step 2: Run the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app."]},"173":{"title":"Step 3: Getting familiar with settings and terminology","titles":["How to install, run and adjust the EyeTrackVR app."]},"174":{"title":"Right eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"175":{"title":"Left eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"176":{"title":"Both eyes","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"177":{"title":"Camera Address","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"178":{"title":"Tracking Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"179":{"title":"Cropping Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"180":{"title":"Threshold","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"181":{"title":"Rotation","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"182":{"title":"Restart Calibrationn","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"183":{"title":"Recenter Eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"184":{"title":"Step 4: Adding your cameras to the software and configuring them","titles":["How to install, run and adjust the EyeTrackVR app."]},"185":{"title":"Wireless configuration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"186":{"title":"Wired configuration (experimental)","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"187":{"title":"Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them","Wired configuration (experimental)"]},"188":{"title":"Setting up ROI","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"189":{"title":"Step 5: Calibrating your eyes","titles":["How to install, run and adjust the EyeTrackVR app."]},"190":{"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","titles":["How to install, run and adjust the EyeTrackVR app."]},"191":{"title":"Setting up recalibration and recentering from VRChat.","titles":[]},"192":{"title":"Setting up your parameters","titles":["Setting up recalibration and recentering from VRChat."]},"193":{"title":"Adding parameters","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"194":{"title":"Adding buttons to the menu","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"195":{"title":"Reseting the OSC config in case the parameters don't work","titles":["Setting up recalibration and recentering from VRChat."]},"196":{"title":"Other platforms","titles":["Setting up recalibration and recentering from VRChat."]}},"dirtCount":0,"index":[["|",{"2":{"167":1}}],["+",{"2":{"158":1}}],["★",{"2":{"157":1}}],["9001",{"2":{"196":1}}],["9",{"0":{"125":1}}],["qdot",{"2":{"110":1}}],["quality",{"2":{"142":1,"152":1}}],["quite",{"2":{"96":1}}],["quick",{"2":{"70":2,"72":1}}],["quest",{"2":{"109":1,"151":1}}],["questions",{"0":{"160":1},"2":{"86":1,"93":1}}],["question",{"2":{"86":1}}],["query",{"2":{"55":1}}],["quot",{"2":{"19":14,"20":2,"44":2,"83":4,"96":14,"97":2,"98":2,"109":2,"111":2,"193":4,"194":6}}],["~350ohm",{"2":{"132":1}}],["~2",{"2":{"98":1}}],["~700ohm",{"2":{"1":2,"132":1}}],["≈",{"2":{"97":1}}],["λ",{"2":{"96":1}}],["µm",{"2":{"89":1,"96":1}}],["job",{"2":{"111":1}}],["joint",{"2":{"130":1}}],["join",{"2":{"93":1}}],["just",{"2":{"82":1,"89":1,"95":1,"109":1,"112":1,"114":1,"147":1}}],["json",{"2":{"54":1}}],["js",{"2":{"11":1,"19":2}}],["0+",{"2":{"152":1}}],["0001",{"0":{"190":1},"2":{"114":1,"136":1}}],["00314",{"2":{"97":2}}],["0",{"0":{"82":1,"83":2},"2":{"82":1,"89":1,"94":1,"96":1,"97":6,"98":4,"105":1,"121":1,"151":1,"166":1,"167":1}}],["zip",{"2":{"66":1}}],["8mm",{"2":{"158":1}}],["850nm",{"0":{"150":1}}],["8",{"0":{"124":1},"2":{"56":3,"58":3,"97":4}}],["81",{"2":{"53":2,"55":1,"82":1}}],["6",{"0":{"114":1,"122":1},"2":{"97":1,"98":4}}],["60",{"2":{"56":1,"58":1}}],["68",{"2":{"56":1,"58":1}}],["75mm",{"0":{"150":1}}],["70",{"2":{"143":1}}],["700",{"2":{"97":2}}],["7",{"0":{"123":1},"2":{"167":1}}],["7dbm",{"2":{"56":2,"58":2}}],["74",{"2":{"56":1,"58":1}}],["76",{"2":{"56":1,"58":1}}],["780nm",{"2":{"96":1}}],["78",{"2":{"56":1,"58":1}}],["357",{"2":{"156":1}}],["350ohm",{"2":{"156":1}}],["3mm",{"2":{"126":1}}],["3653631",{"2":{"109":1}}],["3μm",{"2":{"96":1}}],["3d",{"0":{"136":1,"157":1},"1":{"137":1,"138":1},"2":{"92":1,"109":1,"136":1}}],["38",{"2":{"89":1,"96":1}}],["3232",{"2":{"83":1}}],["32",{"2":{"72":1,"146":1}}],["348",{"2":{"156":1}}],["34",{"2":{"56":1,"58":1,"153":1,"156":1}}],["3",{"0":{"65":1,"78":1,"111":1,"119":1,"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"56":2,"89":1,"96":1,"97":3,"127":1,"147":1,"152":1,"166":1}}],["30",{"2":{"11":1}}],["=",{"2":{"44":1,"53":2,"55":2,"56":13,"58":13,"83":4,"97":4,"98":3}}],["xiaos",{"2":{"146":1}}],["xiaosenses3",{"2":{"36":2,"37":2}}],["xiao",{"2":{"146":1}}],["xaio",{"2":{"37":2}}],["kit",{"2":{"155":2}}],["kits",{"2":{"155":1}}],["kind",{"2":{"136":1}}],["keep",{"2":{"20":2,"30":1,"42":1,"84":1,"128":1,"150":1}}],["knowledge",{"2":{"105":1}}],["known",{"2":{"96":1}}],["know",{"0":{"99":1,"100":1,"190":1},"1":{"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"19":2,"42":1,"89":1,"95":1,"159":2}}],["m⁻²",{"2":{"96":1}}],["mw",{"2":{"89":1,"96":5,"97":6,"98":6}}],["mb",{"2":{"75":1,"78":1}}],["mit",{"2":{"94":1}}],["minimum",{"2":{"97":1,"98":1}}],["mind",{"2":{"84":1,"144":1,"150":1}}],["minute",{"2":{"83":1}}],["minus",{"2":{"56":1,"58":1}}],["might",{"2":{"78":1}}],["micro",{"2":{"75":1}}],["misc",{"0":{"158":1},"1":{"159":1}}],["miscelleneous",{"2":{"70":1}}],["mishap",{"2":{"156":1}}],["missing",{"2":{"25":2,"36":1,"104":1}}],["mute",{"2":{"151":2}}],["much",{"2":{"128":1,"133":1,"143":1,"146":1}}],["multiple",{"2":{"33":2,"35":1,"96":1,"136":1}}],["must",{"2":{"20":1,"56":1,"58":1,"73":1,"83":1,"167":1}}],["mock",{"2":{"127":1}}],["months",{"2":{"119":1}}],["monitor",{"2":{"83":1,"84":2}}],["monitoring",{"2":{"83":1}}],["mounted",{"2":{"143":1,"151":1}}],["mounting",{"0":{"139":1},"2":{"137":1}}],["mount",{"0":{"107":1,"108":1,"109":1,"110":1,"111":1,"112":1},"1":{"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1},"2":{"92":1,"108":1,"110":2,"112":1,"113":2,"114":1,"136":1,"137":3,"138":2,"139":2,"151":1,"157":2,"159":5}}],["mounts",{"0":{"108":1,"114":1,"136":1,"157":1},"1":{"137":1,"138":1},"2":{"92":2,"108":1,"111":1,"136":2,"151":1,"157":2,"159":1}}],["moment",{"2":{"67":1}}],["moving",{"2":{"66":1,"96":1,"188":1,"189":1}}],["movement",{"2":{"98":1}}],["moves",{"2":{"96":1}}],["move",{"0":{"106":1},"2":{"14":1,"83":1,"96":2,"121":1,"124":1,"188":1}}],["mobile",{"2":{"50":1}}],["more",{"2":{"32":1,"33":1,"37":1,"50":1,"56":1,"66":1,"82":1,"89":1,"96":1,"118":1,"140":1,"142":2,"143":1,"194":1}}],["mostly",{"2":{"116":1}}],["most",{"2":{"28":1,"37":1,"88":1,"157":1}}],["mod",{"2":{"151":1}}],["modules",{"0":{"149":1,"168":1},"2":{"146":1,"147":1,"168":1}}],["module",{"2":{"142":1}}],["modeling",{"2":{"159":1}}],["mode",{"0":{"178":1,"179":1},"2":{"28":9,"37":6,"56":1,"76":1,"121":1,"178":1,"182":1,"188":2,"189":1}}],["modify",{"2":{"25":1}}],["menu",{"0":{"194":1},"2":{"194":3}}],["mentioned",{"2":{"193":1,"194":1,"196":1}}],["mechanism",{"2":{"191":1}}],["me",{"0":{"190":1},"2":{"114":2,"136":1}}],["measures",{"2":{"89":1,"95":1}}],["means",{"2":{"31":1,"32":1,"33":1,"42":1,"67":1,"89":1,"95":1,"156":1,"159":1}}],["meaning",{"2":{"25":1,"193":1}}],["mess",{"2":{"126":1,"139":1}}],["messing",{"2":{"89":1,"95":1}}],["messages",{"2":{"191":1,"196":1}}],["message",{"2":{"85":1}}],["member",{"2":{"92":1}}],["members",{"2":{"15":1}}],["memory",{"2":{"54":1,"56":2,"193":1}}],["method",{"2":{"54":3,"78":1,"137":2,"138":1,"181":1}}],["mdns",{"0":{"30":1,"41":1,"44":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"30":3,"31":2,"42":2,"44":1,"46":1,"54":1,"57":2,"82":3,"83":2}}],["md",{"2":{"17":1,"18":1,"19":1,"20":1}}],["my",{"2":{"17":2,"18":4,"19":4,"20":2,"96":1,"97":1,"98":1,"126":1,"133":2}}],["male",{"2":{"153":1}}],["making",{"2":{"136":1,"141":1,"159":1}}],["makes",{"2":{"54":1,"128":1}}],["make",{"0":{"117":1},"2":{"15":2,"28":1,"33":1,"44":1,"48":2,"66":1,"75":1,"78":3,"84":1,"89":2,"92":1,"95":1,"103":1,"120":1,"121":1,"123":1,"125":1,"127":1,"136":1,"142":1,"159":1,"191":1,"194":1}}],["margins",{"2":{"96":1}}],["mark",{"2":{"127":1}}],["marker",{"2":{"127":1}}],["marked",{"2":{"54":1}}],["markdown",{"2":{"15":1,"16":3,"17":1,"21":1}}],["marks",{"2":{"1":2,"132":2}}],["match",{"2":{"103":1}}],["matches",{"2":{"83":1}}],["math",{"2":{"96":1,"97":1,"98":1}}],["ma",{"2":{"96":1,"98":1}}],["manager",{"2":{"187":1}}],["manage",{"2":{"142":1,"167":1}}],["many",{"2":{"83":1}}],["manual",{"2":{"81":1}}],["manually",{"0":{"73":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1},"2":{"30":1,"81":1,"125":1,"150":2}}],["main",{"2":{"66":1}}],["mainly",{"2":{"64":1,"188":1}}],["maintain",{"2":{"24":2,"25":1}}],["macos",{"2":{"46":1}}],["mac",{"2":{"46":1}}],["map",{"2":{"39":1}}],["may",{"0":{"102":1,"104":1,"108":1},"2":{"36":1,"37":1,"67":2,"76":1,"92":1,"101":1,"102":1,"104":1,"118":1,"136":1,"137":1,"146":1,"147":1,"149":1,"151":1,"152":2}}],["made",{"2":{"25":1,"91":1,"92":1,"136":1}}],["major",{"2":{"15":1}}],["max",{"2":{"3":1,"96":1,"97":1,"98":1}}],["magnifying",{"2":{"1":1,"132":1}}],["yet",{"2":{"77":1,"92":1,"101":1,"159":1}}],["yaml",{"2":{"25":1}}],["yarn",{"2":{"11":1,"12":2,"25":1}}],["yml",{"2":{"25":1}}],["youtube",{"2":{"149":1}}],["you",{"0":{"27":2,"88":1,"99":1,"100":1,"105":1,"106":1,"152":1,"156":1},"1":{"93":1,"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"1":2,"2":1,"17":2,"18":2,"19":5,"20":7,"21":1,"28":15,"30":7,"31":16,"32":2,"33":4,"35":2,"37":3,"42":5,"44":7,"45":2,"46":4,"48":1,"50":1,"52":1,"53":1,"54":1,"55":2,"56":6,"58":2,"64":1,"65":1,"66":5,"67":1,"69":1,"70":1,"71":1,"72":1,"73":2,"75":2,"76":2,"78":7,"81":4,"82":4,"83":4,"84":2,"85":4,"86":2,"89":6,"92":1,"93":1,"95":5,"96":5,"103":2,"108":2,"110":3,"111":1,"112":3,"113":2,"114":1,"117":1,"120":1,"121":6,"122":1,"123":2,"125":1,"127":1,"130":1,"132":2,"133":1,"136":2,"137":1,"139":1,"141":1,"142":1,"147":2,"149":1,"150":2,"151":1,"152":3,"155":1,"156":10,"157":1,"159":4,"164":1,"166":1,"167":1,"169":1,"172":2,"173":1,"177":1,"179":1,"181":1,"182":1,"183":1,"188":2,"189":2,"191":1,"193":1,"194":7}}],["yourself",{"0":{"156":1},"2":{"14":1,"89":1,"95":1,"136":1}}],["your",{"0":{"74":2,"77":1,"78":1,"84":1,"105":1,"107":1,"108":1,"109":1,"112":1,"114":1,"117":1,"120":1,"125":1,"126":1,"161":1,"184":1,"189":1,"192":1},"1":{"75":2,"76":2,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"162":1,"185":1,"186":1,"187":1,"188":1,"193":1,"194":1},"2":{"1":1,"12":1,"16":1,"28":8,"30":1,"31":1,"37":1,"38":1,"52":1,"60":2,"68":1,"69":1,"70":1,"73":3,"75":4,"76":2,"78":6,"80":3,"81":4,"82":7,"83":3,"84":2,"85":6,"86":1,"89":2,"92":1,"95":2,"96":6,"103":2,"105":1,"109":2,"110":1,"112":1,"121":1,"122":1,"123":1,"125":2,"127":1,"132":1,"133":1,"136":1,"139":1,"140":1,"141":2,"143":1,"149":1,"152":1,"155":1,"159":1,"162":1,"172":1,"177":1,"179":1,"180":1,"181":1,"182":1,"183":1,"185":4,"187":1,"188":8,"189":5,"191":2,"193":4,"194":3,"195":1}}],["ribbon",{"0":{"151":1},"2":{"122":1}}],["rift",{"2":{"109":1}}],["risk",{"2":{"89":1,"95":1,"140":1,"142":1,"156":1}}],["righteyelidexpandedsqueeze",{"2":{"162":1}}],["righteyex",{"2":{"162":1}}],["right",{"0":{"174":1},"2":{"56":1,"58":1,"174":1,"185":2}}],["rated",{"2":{"156":1}}],["radio",{"2":{"142":2}}],["radiance",{"2":{"96":1}}],["radiation",{"2":{"89":2,"96":5}}],["randomnerdtutorials",{"2":{"78":1}}],["ram",{"2":{"54":1}}],["rubbing",{"2":{"139":1}}],["running",{"2":{"147":1}}],["rundown",{"0":{"108":1}}],["run",{"0":{"170":1,"172":1},"1":{"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"66":1,"67":1,"167":1,"168":1,"169":2,"172":1}}],["rule",{"2":{"25":1}}],["rules",{"2":{"24":1}}],["roi",{"0":{"188":1},"2":{"188":2}}],["rotation",{"0":{"181":1},"2":{"188":2}}],["rough",{"2":{"116":1}}],["route",{"2":{"103":1,"127":1}}],["router",{"2":{"28":1,"48":1,"142":1}}],["round",{"2":{"97":1}}],["road",{"2":{"39":1}}],["roadmap",{"0":{"5":1},"1":{"6":1,"7":1,"8":1}}],["remake",{"2":{"195":1}}],["remote",{"2":{"156":1}}],["removal",{"2":{"149":1}}],["remove",{"2":{"121":1,"139":1,"149":1,"150":2}}],["removed",{"2":{"57":1,"149":1}}],["removing",{"2":{"121":1}}],["regenerate",{"2":{"195":1}}],["regulator",{"2":{"158":1}}],["regular",{"2":{"156":1}}],["regauring",{"2":{"90":1}}],["regauding",{"0":{"88":1},"1":{"93":1}}],["reasonable",{"2":{"142":1}}],["ready",{"2":{"169":1}}],["read",{"0":{"117":1}}],["reading",{"2":{"28":1}}],["real",{"2":{"96":1}}],["really",{"2":{"96":1,"141":1}}],["reduces",{"2":{"140":1}}],["reduce",{"2":{"89":1,"95":1}}],["retyping",{"2":{"85":1}}],["retype",{"2":{"85":2}}],["retrieve",{"2":{"83":1}}],["returns",{"2":{"54":2}}],["re",{"2":{"78":1,"147":1}}],["refuse",{"2":{"67":1}}],["refer",{"2":{"56":1,"66":1}}],["reference",{"2":{"33":1}}],["refactor",{"2":{"25":1}}],["requests",{"2":{"32":1,"50":1,"52":1}}],["requirements",{"0":{"165":1}}],["requirement",{"2":{"152":1}}],["requires",{"2":{"137":1,"142":2,"143":1,"147":2,"152":1,"155":2}}],["required",{"0":{"144":1,"168":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1},"2":{"20":1,"28":1,"32":1,"46":1,"55":1,"121":1,"143":1,"144":1,"147":1,"152":1,"153":1,"164":1,"167":1,"168":1}}],["require",{"2":{"19":1,"37":1,"54":1,"105":2,"146":1,"147":1,"150":1,"151":2,"152":1}}],["repeat",{"2":{"82":1,"83":1,"113":1,"130":1,"131":1,"133":1,"188":1,"189":1,"194":1}}],["replace",{"2":{"28":1}}],["repository",{"2":{"66":1}}],["repo",{"2":{"12":1,"85":1,"90":1}}],["reverts",{"2":{"25":1}}],["revert",{"2":{"25":1}}],["reliable",{"2":{"101":1}}],["releasing",{"2":{"76":1}}],["released",{"2":{"96":1}}],["release",{"2":{"25":3,"33":1,"35":1,"36":4,"75":1,"171":1}}],["related",{"0":{"88":1},"1":{"93":1},"2":{"1":1,"132":1}}],["resolve",{"2":{"195":1}}],["resource",{"2":{"161":1}}],["resources",{"0":{"88":1},"1":{"93":1}}],["resizing",{"2":{"136":1}}],["resistance",{"2":{"97":1}}],["resistor",{"2":{"1":3,"2":4,"3":2,"4":3,"121":2,"132":3,"133":4}}],["resistors",{"0":{"2":1,"133":1},"2":{"1":2,"132":1,"133":1,"156":2}}],["results",{"2":{"126":1}}],["result",{"2":{"89":2,"95":2,"121":1,"150":1}}],["reseting",{"0":{"195":1}}],["resetting",{"2":{"78":1}}],["reset",{"2":{"76":1,"85":2}}],["resetconfig",{"2":{"54":1}}],["respected",{"2":{"157":1}}],["respectfully",{"2":{"28":1}}],["responsibility",{"2":{"89":1,"95":1}}],["responsibilities",{"2":{"89":1,"95":1}}],["responsible",{"2":{"38":1,"103":1}}],["restartcamera",{"2":{"54":1}}],["restarts",{"2":{"54":2}}],["restartdevice",{"2":{"54":1}}],["restart",{"0":{"182":1},"2":{"48":2,"54":1,"83":1,"84":1,"185":1,"187":1,"189":1}}],["rest",{"0":{"32":1,"49":1,"52":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1},"2":{"20":1,"32":6,"50":2,"52":2,"53":1,"54":1,"55":1,"159":1}}],["recalibrate",{"2":{"191":1,"193":1,"194":2,"196":1}}],["recalibration",{"0":{"191":1},"1":{"192":1,"193":1,"194":1,"195":1,"196":1}}],["rectangle",{"2":{"188":1}}],["recentering",{"0":{"191":1},"1":{"192":1,"193":1,"194":1,"195":1,"196":1}}],["recenter",{"0":{"183":1},"2":{"183":1,"189":2,"191":1,"193":1,"194":2,"196":2}}],["receive",{"2":{"196":1}}],["receives",{"2":{"4":1}}],["receiving",{"2":{"96":1}}],["recommendation",{"2":{"150":1}}],["recommend",{"2":{"36":1,"52":1,"111":1,"155":1}}],["recommended",{"0":{"146":1,"155":1},"2":{"1":1,"3":1,"28":2,"31":1,"89":1,"92":1,"95":1,"96":1,"132":1,"136":1,"137":1,"143":1,"156":4,"157":1,"158":1}}],["www",{"2":{"109":1,"149":1}}],["w",{"2":{"96":2}}],["won",{"2":{"193":1,"195":1}}],["worse",{"2":{"121":1,"136":1}}],["worst",{"2":{"96":1,"97":3,"98":3}}],["worth",{"2":{"96":1,"116":1,"150":1,"152":1}}],["world",{"2":{"96":1}}],["works",{"2":{"112":1,"139":1,"157":1}}],["working",{"2":{"33":1,"36":2,"37":2,"59":1,"81":2,"83":1,"88":1,"108":1}}],["work",{"0":{"195":1},"2":{"30":1,"33":1,"37":2,"78":1,"108":1,"123":1,"126":1,"136":2,"149":1,"156":1,"181":1}}],["would",{"2":{"54":1,"83":1,"97":1,"98":1,"156":1}}],["wroom",{"2":{"146":1}}],["wrooms3usb",{"2":{"37":1}}],["wrooms3qiousb",{"2":{"37":1}}],["wrooms3qio",{"2":{"37":1}}],["wrooms3",{"2":{"37":1}}],["wrong",{"2":{"85":1,"103":1}}],["writes",{"2":{"54":2}}],["write",{"2":{"54":2}}],["written",{"2":{"15":1,"24":4,"54":1}}],["walkthrough",{"2":{"116":1}}],["warm",{"2":{"89":1,"95":1}}],["warmth",{"2":{"89":1,"95":1,"96":1}}],["warning",{"2":{"37":1,"126":1,"135":1}}],["watch",{"2":{"84":1,"149":1}}],["wait",{"0":{"119":1},"2":{"69":1,"70":1,"72":1,"82":2,"83":1,"92":1,"189":1}}],["was",{"2":{"32":1,"137":1,"172":1}}],["ways",{"2":{"68":1}}],["way",{"0":{"109":1},"2":{"24":3,"35":1,"50":1,"75":1,"80":1,"109":1,"110":1,"133":1,"188":1,"189":1}}],["want",{"2":{"19":1,"35":1,"36":1,"42":1,"44":1,"50":1,"66":1,"88":1,"89":1,"111":1,"181":1,"194":1}}],["why",{"2":{"123":1,"156":1}}],["who",{"2":{"116":1}}],["whether",{"2":{"56":1}}],["wherever",{"2":{"152":1}}],["where",{"0":{"39":1,"111":1},"2":{"64":1,"66":1,"81":1,"82":1,"126":1,"130":1,"137":1,"177":1,"178":1,"179":1,"181":1,"182":1}}],["when",{"2":{"20":2,"28":1,"36":1,"57":1,"66":1,"67":2,"89":1,"95":1,"96":2,"111":1,"121":1,"137":1}}],["whatever",{"2":{"44":1,"183":1}}],["what",{"0":{"35":1,"38":1,"39":1,"42":1,"50":1,"80":1,"96":1},"1":{"39":1,"40":1},"2":{"36":1,"89":2,"95":2,"112":1,"117":1,"139":1,"147":1,"156":1,"157":1,"185":1}}],["while",{"2":{"28":1,"75":1,"76":1,"84":1,"86":1,"89":2,"95":2,"96":1,"133":1,"149":1,"191":1}}],["white",{"2":{"25":1}}],["which",{"2":{"4":1,"54":1,"96":2,"97":1,"98":1,"101":1,"105":1,"121":1,"126":1,"136":1,"152":1,"156":1}}],["weight",{"2":{"142":1}}],["weird",{"2":{"67":1}}],["week",{"2":{"130":1}}],["weeks",{"2":{"119":1}}],["well",{"2":{"96":2,"97":2,"98":2,"108":1,"146":1,"152":1,"156":1}}],["welcome",{"0":{"88":1},"1":{"93":1}}],["weaker",{"2":{"96":1}}],["wear",{"2":{"54":1,"149":1}}],["were",{"2":{"89":1,"95":1,"97":1,"98":1,"150":1}}],["went",{"2":{"85":1}}],["webrequest",{"2":{"167":1}}],["web",{"2":{"81":1}}],["website",{"0":{"88":1},"1":{"93":1},"2":{"16":1,"109":1}}],["we",{"0":{"96":1,"162":1},"2":{"20":1,"24":2,"25":5,"33":3,"35":1,"36":3,"37":2,"50":2,"52":1,"54":1,"56":1,"59":1,"66":1,"81":2,"82":1,"83":1,"86":1,"89":3,"92":1,"93":1,"95":3,"96":7,"97":8,"98":7,"103":1,"110":1,"118":1,"155":1,"162":1,"167":1,"188":3,"189":1,"194":1}}],["wider",{"2":{"142":1}}],["widely",{"2":{"102":1}}],["wip",{"2":{"116":1}}],["wiki",{"2":{"94":1,"161":1}}],["window",{"2":{"66":1,"72":1}}],["windows",{"2":{"30":1,"46":3,"82":1,"167":1}}],["wifi",{"0":{"56":1,"142":1},"2":{"28":4,"44":1,"54":7,"56":15,"58":13,"73":1,"81":1,"142":2}}],["wi",{"2":{"28":1,"82":2,"85":1}}],["wish",{"2":{"20":1,"30":1,"31":5,"56":1,"83":1}}],["willing",{"2":{"159":1}}],["will",{"0":{"88":1,"100":1,"105":1,"108":1,"111":1,"116":1,"164":1},"1":{"93":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"5":1,"16":1,"17":3,"18":1,"19":3,"20":2,"21":1,"25":1,"28":7,"30":2,"31":7,"33":4,"37":2,"42":1,"44":1,"54":3,"55":1,"56":1,"57":1,"60":1,"65":1,"66":2,"67":2,"70":2,"72":1,"76":1,"81":1,"83":2,"86":1,"96":1,"97":4,"98":2,"101":1,"103":2,"105":1,"108":1,"113":1,"117":1,"121":2,"122":1,"126":1,"127":1,"130":1,"136":1,"139":1,"149":2,"150":1,"151":1,"156":2,"173":1,"179":1,"182":1,"183":1,"188":2,"193":1,"194":3,"195":1}}],["wiring",{"2":{"4":1,"116":1}}],["wires",{"0":{"126":1,"127":1,"128":1,"153":1},"2":{"126":1,"130":1,"155":2}}],["wired",{"0":{"143":1,"152":1,"186":1},"1":{"187":1},"2":{"37":3,"116":1,"141":1,"142":2,"143":2,"146":2,"177":1}}],["wireless",{"0":{"142":1,"147":1,"185":1},"2":{"37":3,"116":1,"141":1,"143":1,"146":2,"147":1}}],["wire",{"0":{"4":1,"128":1,"129":1,"130":1,"131":1,"135":1},"2":{"126":3,"127":5,"129":1,"153":3,"156":1}}],["within",{"2":{"97":1,"98":1,"191":1}}],["withing",{"2":{"96":1}}],["without",{"2":{"15":1,"31":2,"33":1,"80":1,"82":2,"130":1,"147":1,"189":1,"191":1}}],["with",{"0":{"121":1,"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"3":1,"4":1,"14":1,"20":2,"25":2,"28":2,"31":1,"35":1,"36":1,"37":3,"50":1,"52":1,"54":1,"56":1,"66":1,"67":1,"75":1,"78":2,"82":1,"89":2,"92":1,"95":2,"97":1,"98":1,"103":1,"118":2,"121":2,"130":2,"131":1,"139":1,"142":1,"143":3,"144":1,"147":1,"149":1,"150":3,"153":1,"157":1,"169":1,"172":1,"185":1,"188":1,"191":1}}],["uuid",{"2":{"195":1}}],["uri",{"2":{"167":1}}],["url",{"2":{"17":2,"18":1,"55":3}}],["u",{"2":{"119":1}}],["udp",{"2":{"87":1}}],["unfocused",{"2":{"156":1}}],["unfortunately",{"2":{"121":1}}],["unusable",{"2":{"121":1}}],["unit",{"2":{"156":1}}],["unity",{"2":{"105":1,"193":1}}],["unique",{"2":{"56":1}}],["unless",{"2":{"89":1,"95":1}}],["unlikely",{"2":{"37":1,"113":1}}],["until",{"2":{"72":2,"113":1,"137":1,"188":1}}],["under",{"0":{"83":1},"2":{"44":1,"94":2,"169":1,"195":1}}],["understand",{"0":{"100":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"22":1,"24":2,"25":1,"95":1}}],["uplaod",{"2":{"83":1}}],["uploaded",{"2":{"78":1}}],["upload",{"0":{"78":1},"2":{"65":1,"78":3,"81":1,"82":1,"83":3,"85":1,"114":1,"194":1}}],["uploading",{"0":{"73":1,"79":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":2,"81":2,"82":2,"83":2,"84":1},"2":{"60":1,"67":1,"73":1,"78":1,"82":1,"85":1,"125":1}}],["upate",{"2":{"81":1}}],["upgrading",{"0":{"71":1,"72":1},"1":{"72":1}}],["upgrade",{"2":{"69":1,"70":1,"71":1}}],["updating",{"0":{"67":1,"68":1,"85":1},"1":{"68":1,"69":2,"70":2,"71":1,"72":1,"86":1},"2":{"31":1}}],["updated",{"2":{"85":1,"194":1}}],["update",{"2":{"31":8,"67":1,"68":1,"69":1,"70":1,"72":1,"73":1,"80":1,"82":1,"85":2}}],["updates",{"2":{"31":2,"72":1,"93":1}}],["up",{"0":{"4":1,"60":1,"82":1,"105":1,"120":1,"131":1,"135":1,"161":1,"188":1,"191":1,"192":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"162":1,"192":1,"193":2,"194":2,"195":1,"196":1},"2":{"35":1,"56":1,"72":1,"75":1,"78":1,"82":1,"84":1,"97":1,"102":1,"112":1,"122":1,"124":2,"126":1,"127":1,"133":1,"136":1,"142":1,"143":1,"159":1,"188":1,"189":1}}],["usually",{"2":{"67":1}}],["us",{"2":{"36":1,"46":1,"54":2,"96":2,"159":2}}],["usb",{"0":{"76":1,"126":1,"128":1,"143":1,"152":1},"2":{"28":1,"37":1,"75":1,"76":1,"78":2,"123":1,"143":2,"152":10,"153":1}}],["using",{"2":{"1":1,"9":1,"20":2,"28":3,"30":2,"31":1,"32":2,"33":2,"42":3,"45":1,"46":2,"50":1,"52":1,"53":1,"55":1,"56":1,"58":1,"70":1,"78":2,"81":1,"82":2,"85":4,"89":2,"95":1,"96":1,"97":1,"116":1,"132":1,"142":1,"156":1,"166":1,"167":1}}],["usebasicparsing",{"2":{"167":1}}],["useability",{"2":{"101":1}}],["uses",{"2":{"54":1,"105":1,"137":1,"138":1,"142":1,"147":1}}],["users",{"2":{"32":1,"88":1,"143":1,"195":1}}],["user",{"0":{"28":1,"102":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"44":1,"82":1,"83":1,"89":1,"95":1,"130":1,"142":1,"157":1,"195":2}}],["useful",{"2":{"18":1,"35":1,"36":1,"42":2,"50":1}}],["use",{"0":{"43":1,"51":1,"81":1,"105":1,"162":1,"187":1},"1":{"44":1,"45":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"82":1,"83":1},"2":{"1":1,"16":2,"20":3,"24":1,"25":3,"31":4,"33":1,"35":1,"36":1,"37":1,"44":1,"45":1,"46":1,"52":1,"56":1,"73":1,"81":2,"83":1,"84":1,"89":3,"95":3,"97":1,"98":1,"121":1,"132":1,"133":1,"135":2,"139":1,"141":1,"147":1,"151":1,"156":1,"181":1,"188":1,"191":1,"194":1}}],["used",{"2":{"1":1,"22":2,"25":2,"32":4,"36":1,"52":1,"57":1,"126":1,"132":1,"177":1,"180":1}}],["cvr",{"2":{"191":1}}],["center",{"2":{"189":2}}],["certain",{"2":{"89":1,"95":1,"121":1,"151":1}}],["crop",{"2":{"179":1}}],["cropping",{"0":{"179":1},"2":{"188":1}}],["creep",{"2":{"102":1}}],["creating",{"0":{"107":1},"1":{"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1}}],["creative",{"2":{"94":1}}],["created",{"2":{"110":1,"161":1,"194":1}}],["create",{"0":{"108":1},"2":{"17":2,"18":2,"92":1,"110":1,"172":1,"194":1}}],["credit",{"2":{"66":1,"86":1,"116":1}}],["credentials",{"2":{"28":1,"85":3}}],["cm⁻²",{"2":{"96":1}}],["cm2",{"2":{"96":3,"97":3,"98":3}}],["cm^2",{"2":{"96":1}}],["cc",{"2":{"94":1}}],["cycled",{"2":{"83":1}}],["c",{"0":{"76":1},"2":{"66":1,"85":1,"152":5,"195":1}}],["cd",{"2":{"66":1,"85":1}}],["cpptypedef",{"2":{"56":1,"58":1}}],["cuts",{"2":{"127":1}}],["cut",{"0":{"127":1},"2":{"126":1,"127":2,"180":1}}],["cura",{"2":{"78":1}}],["current",{"2":{"39":1,"54":2,"66":1,"82":1,"83":1,"85":1,"118":1}}],["currently",{"0":{"162":1},"2":{"33":1,"37":2,"54":1,"59":1,"81":1,"117":1,"162":1,"166":1}}],["customizations",{"2":{"25":2}}],["custom",{"2":{"19":1,"35":1,"83":1}}],["cheaper",{"0":{"147":1},"2":{"142":1,"147":1}}],["checked",{"2":{"172":1}}],["checking",{"2":{"89":1,"95":1}}],["checkmark",{"2":{"82":1}}],["check",{"2":{"28":1,"33":1,"39":1,"78":1,"86":1,"88":1,"90":1,"124":1,"156":2,"159":1}}],["china",{"2":{"119":1}}],["chip",{"2":{"38":1}}],["ch340",{"2":{"64":2}}],["chose",{"2":{"96":1}}],["choice",{"2":{"52":1}}],["choose",{"2":{"28":1}}],["chore",{"2":{"25":1}}],["charging",{"2":{"78":1}}],["character",{"2":{"28":1}}],["characters",{"2":{"28":1}}],["chance",{"2":{"137":1}}],["channel",{"2":{"56":2,"86":1}}],["changing",{"2":{"37":1,"55":1}}],["changed",{"2":{"85":1,"196":1}}],["changelog",{"2":{"25":1}}],["change",{"2":{"20":1,"25":8,"28":2,"33":1,"37":1,"42":1,"44":3,"66":1,"82":1,"83":2,"118":1}}],["changes",{"2":{"15":2,"25":5,"42":1,"54":4,"85":3,"140":1,"178":1,"195":1}}],["circled",{"2":{"122":1}}],["ci",{"2":{"25":2}}],["css",{"2":{"20":2}}],["cluttered",{"2":{"194":1}}],["clearer",{"2":{"150":1}}],["clears",{"2":{"54":1}}],["clicking",{"2":{"72":1,"193":1}}],["click",{"2":{"70":3,"72":3,"82":1,"83":1,"172":1,"193":3,"194":2}}],["cli",{"0":{"69":1}}],["client",{"0":{"52":1},"2":{"32":2,"52":2,"84":1}}],["cloning",{"2":{"66":1,"168":1}}],["cloned",{"2":{"66":1,"82":1,"85":1}}],["clone",{"0":{"66":1},"2":{"12":2,"66":5}}],["closer",{"2":{"96":1}}],["close",{"2":{"66":1,"84":1,"97":1,"111":1,"185":1}}],["class=",{"2":{"20":1}}],["class",{"2":{"20":1}}],["classes",{"2":{"20":4}}],["capable",{"2":{"142":1}}],["calibrated",{"2":{"189":1}}],["calibrate",{"2":{"189":1}}],["calibrating",{"0":{"189":1}}],["calibration",{"2":{"182":1,"189":1,"196":1}}],["calibrationn",{"0":{"182":1}}],["calculating",{"2":{"96":1}}],["call",{"2":{"54":2}}],["called",{"2":{"17":1,"18":2,"19":1,"39":1,"70":1,"72":1,"91":1}}],["cataractogenesis",{"2":{"96":1}}],["categories",{"2":{"18":1,"141":1}}],["care",{"0":{"96":1},"2":{"96":2}}],["careful",{"2":{"3":1}}],["causing",{"2":{"140":1}}],["caused",{"2":{"78":1,"103":1}}],["cause",{"2":{"54":1,"78":1,"103":1}}],["caution",{"2":{"89":1,"95":1}}],["cables",{"2":{"78":1,"142":1,"150":1,"152":2}}],["cable",{"2":{"73":1,"75":1,"78":5,"122":1,"151":2}}],["cams",{"2":{"147":1,"159":1}}],["came",{"2":{"75":1}}],["cameras",{"0":{"122":1,"148":1,"184":1},"1":{"149":1,"150":1,"151":1,"185":1,"186":1,"187":1,"188":1},"2":{"122":1,"140":1,"147":1,"149":2,"150":3,"177":1,"185":1}}],["camera",{"0":{"59":1,"108":1,"110":1,"111":2,"149":1,"177":1},"2":{"54":2,"84":2,"89":1,"95":1,"110":1,"111":1,"122":3,"123":1,"127":1,"136":1,"137":5,"138":3,"151":2,"157":1,"159":1,"177":1,"185":2,"187":1,"188":2}}],["cam",{"0":{"75":1},"2":{"37":2,"75":2,"121":1,"142":1,"158":1,"177":1}}],["can",{"0":{"48":1,"156":1},"2":{"18":1,"20":4,"28":2,"30":2,"31":3,"32":5,"35":1,"37":1,"42":2,"44":3,"45":1,"46":2,"48":1,"50":1,"52":2,"53":1,"54":1,"69":1,"70":1,"73":1,"75":1,"78":2,"81":1,"83":1,"84":1,"85":1,"89":2,"95":2,"96":2,"97":1,"98":1,"101":1,"103":1,"110":1,"112":1,"114":1,"121":5,"130":1,"136":1,"142":1,"143":2,"149":1,"150":2,"156":2,"159":3,"177":1,"185":1,"191":1,"194":1,"196":1}}],["cases",{"2":{"75":1,"121":2,"139":1,"140":1}}],["case",{"0":{"195":1},"2":{"15":1,"28":1,"75":2,"96":2,"97":2,"98":2,"121":1,"126":1,"141":1,"181":1}}],["copy",{"2":{"185":1}}],["copper",{"2":{"126":1}}],["costly",{"2":{"143":1}}],["count",{"2":{"193":1}}],["could",{"2":{"89":1,"95":1}}],["couple",{"2":{"36":1,"70":1,"72":1,"82":1,"83":1,"85":1}}],["corners",{"2":{"111":1}}],["cornea",{"2":{"96":2}}],["core",{"2":{"70":1}}],["corresponds",{"2":{"56":1}}],["correctly",{"2":{"28":1,"126":1}}],["correcting",{"2":{"25":1}}],["correct",{"2":{"3":1,"28":1,"33":1,"48":2,"67":1,"89":1,"95":1,"156":1}}],["codes",{"2":{"156":1}}],["code",{"0":{"23":1,"61":1,"70":1,"124":1},"1":{"24":1,"25":1,"62":1,"63":1},"2":{"24":4,"25":3,"61":1,"65":1,"67":1,"70":1,"77":1,"83":1,"124":2}}],["colors",{"2":{"126":1}}],["colons",{"2":{"25":1}}],["colour",{"2":{"20":3}}],["collapsible",{"2":{"19":1}}],["cohesive",{"2":{"20":1}}],["cover",{"2":{"16":1,"121":1,"133":1,"153":1}}],["com4",{"2":{"187":1}}],["comes",{"2":{"121":1,"130":1}}],["come",{"2":{"67":1,"149":1,"150":1}}],["coming",{"2":{"33":1,"59":1,"81":1,"122":1}}],["commission",{"2":{"96":1}}],["commits",{"2":{"25":6}}],["commit",{"0":{"25":1},"2":{"24":1,"25":6}}],["commons",{"2":{"94":1}}],["community",{"0":{"108":1},"2":{"92":1,"159":1}}],["communicate",{"2":{"50":1,"52":1,"195":1}}],["communication",{"2":{"28":1}}],["command",{"2":{"53":2,"55":1,"66":2,"69":2,"167":1,"168":2,"169":2}}],["compact",{"2":{"152":1}}],["compatible",{"2":{"92":1,"159":1}}],["completely",{"2":{"121":2}}],["completed",{"0":{"6":1},"2":{"5":1,"76":1}}],["complain",{"2":{"67":1}}],["computer",{"2":{"28":2,"30":1,"50":1,"80":1}}],["componentes",{"2":{"15":1}}],["components",{"2":{"15":1}}],["com",{"2":{"12":1,"64":1,"66":2,"78":1,"109":1,"149":1,"187":2}}],["conflicts",{"2":{"143":1}}],["configs",{"2":{"35":1}}],["config",{"0":{"28":1,"195":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"35":2,"44":2,"54":3,"56":1,"83":2,"85":2,"193":2,"195":1}}],["configure",{"0":{"124":1},"2":{"33":3,"147":1}}],["configured",{"2":{"33":1}}],["configuring",{"0":{"26":1,"184":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"185":1,"186":1,"187":1,"188":1}}],["configuration",{"0":{"29":1,"185":1,"186":1},"1":{"30":1,"31":1,"32":1,"33":1,"187":1},"2":{"25":1,"195":1}}],["convenient",{"2":{"194":1}}],["conventional",{"2":{"25":3}}],["convert",{"2":{"97":2,"98":1}}],["cone",{"2":{"96":1}}],["congratulations",{"2":{"78":1}}],["connectors",{"2":{"151":1,"152":1}}],["connector",{"2":{"122":3,"151":1}}],["connections",{"2":{"121":3}}],["connection",{"2":{"76":1,"128":1}}],["connecting",{"2":{"75":1,"127":1}}],["connected",{"2":{"30":1,"48":3,"73":1,"82":2,"121":1,"122":1}}],["connect",{"0":{"45":1,"48":1,"74":1,"75":1,"76":1,"123":1,"126":1},"1":{"75":1,"76":1},"2":{"28":3,"30":1,"31":1,"33":1,"42":2,"44":1,"45":2,"48":1,"53":1,"65":1,"75":1,"76":1,"80":1,"82":1,"84":1,"152":1}}],["cons",{"2":{"142":1,"143":1}}],["consider",{"2":{"141":1,"152":1}}],["consistent",{"2":{"20":1,"22":1}}],["consultation",{"2":{"15":1}}],["consult",{"2":{"1":1,"132":1}}],["continuing",{"2":{"188":1}}],["continue",{"2":{"166":1}}],["contents",{"2":{"195":1}}],["content",{"2":{"167":1,"193":1}}],["contact",{"0":{"93":1},"2":{"54":1}}],["contains",{"2":{"194":1}}],["contain",{"0":{"116":1},"2":{"5":1}}],["contributor",{"2":{"161":1}}],["contributing",{"0":{"13":1},"1":{"14":1,"15":1}}],["control",{"2":{"32":1,"50":2,"53":2,"55":1,"194":1}}],["fwvdbdc",{"2":{"149":1}}],["fps",{"2":{"143":1}}],["fbt",{"2":{"142":1,"143":1}}],["f",{"2":{"119":1}}],["familiar",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1}}],["familiarize",{"2":{"14":1}}],["face",{"2":{"152":2,"161":1}}],["facial",{"2":{"151":1}}],["facing",{"2":{"122":1,"135":2}}],["fact",{"2":{"118":1}}],["far",{"2":{"96":1,"98":1}}],["failure",{"2":{"89":1,"95":1}}],["faq",{"2":{"86":1}}],["ftdi",{"2":{"75":1,"78":1}}],["function",{"2":{"101":1}}],["functionality",{"2":{"32":1,"196":1}}],["further",{"2":{"89":1,"95":1,"96":1,"97":1,"98":1}}],["future",{"2":{"54":1,"73":1}}],["fully",{"2":{"32":1,"46":1,"101":1,"140":1,"189":1}}],["full",{"2":{"4":1,"32":1,"33":1,"88":1,"147":2}}],["fetch",{"2":{"167":1}}],["feed",{"2":{"174":1,"175":1,"176":1,"188":2}}],["feedback",{"2":{"157":1}}],["feeling",{"2":{"89":1,"95":1}}],["feel",{"2":{"89":1,"95":1,"96":1}}],["featured",{"2":{"32":1}}],["feature",{"0":{"187":1},"2":{"25":3,"30":1,"32":2,"55":1,"82":1}}],["features",{"2":{"5":1,"89":1,"95":1,"101":1}}],["feat",{"2":{"25":1}}],["few",{"2":{"24":1}}],["frunk",{"2":{"151":1}}],["framerates",{"2":{"143":1}}],["framework",{"2":{"24":1}}],["friend",{"2":{"139":1}}],["friendly",{"2":{"82":1,"194":1}}],["front",{"2":{"82":1,"96":1}}],["from",{"0":{"163":1,"164":1,"191":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"4":1,"37":1,"38":1,"46":2,"50":2,"54":1,"64":1,"66":4,"71":1,"78":2,"81":1,"82":1,"85":2,"86":1,"96":4,"98":1,"110":1,"119":2,"121":1,"123":1,"126":1,"135":1,"139":1,"153":1,"156":4,"164":1,"173":1,"188":1,"191":2}}],["free",{"2":{"52":1,"121":1}}],["freenove",{"2":{"37":4,"146":1}}],["frequently",{"0":{"160":1},"2":{"33":1}}],["float",{"2":{"162":1}}],["flashed",{"2":{"36":1,"81":1,"125":1}}],["flash",{"0":{"123":1,"124":1,"125":1},"2":{"33":1,"37":2,"54":5,"64":1,"83":1,"123":1,"125":1,"147":1}}],["flavour",{"2":{"16":1}}],["flip",{"2":{"2":1,"122":1,"133":1,"134":1}}],["figure",{"2":{"187":1}}],["fields",{"2":{"194":1}}],["field",{"2":{"185":1,"187":1,"193":1}}],["filters",{"2":{"150":1}}],["filter",{"2":{"149":4,"150":1}}],["files",{"2":{"16":1,"25":2,"66":1,"82":2,"85":1,"156":1,"157":1,"195":2}}],["file",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"15":1,"17":3,"18":1,"19":3,"20":1,"21":1,"44":2,"57":1,"82":1,"83":2,"171":1,"177":1,"193":2,"194":1}}],["fit",{"2":{"136":2,"159":1}}],["finger",{"2":{"185":1}}],["fingernails",{"2":{"122":1}}],["fine",{"2":{"122":1}}],["final",{"0":{"101":1},"2":{"116":1,"121":1}}],["finally",{"2":{"76":1}}],["finnish",{"2":{"70":1}}],["finish",{"2":{"69":1,"82":1}}],["finding",{"0":{"84":1}}],["find",{"0":{"88":1,"109":1,"110":1},"1":{"93":1},"2":{"20":2,"82":1,"86":1,"109":1,"127":1,"136":1,"139":1,"156":1,"173":1,"185":1,"187":1,"193":2}}],["fi",{"2":{"28":1,"82":2,"85":1}}],["firmly",{"2":{"78":1}}],["firmware",{"0":{"26":1,"34":1,"66":1,"73":1,"77":1,"78":1,"82":1,"83":1,"85":1,"91":1,"102":1,"124":1,"125":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":1},"2":{"28":1,"31":6,"32":1,"33":5,"35":4,"36":1,"38":1,"44":2,"57":1,"60":1,"64":1,"65":1,"66":2,"67":1,"73":2,"77":1,"78":5,"80":1,"81":3,"82":1,"83":1,"85":2,"91":1,"102":1,"125":1,"147":1}}],["firstly",{"2":{"194":1}}],["first",{"2":{"4":1,"36":1,"37":1,"73":1,"75":1,"81":1,"113":1,"121":1,"167":1}}],["fixes",{"2":{"25":1}}],["fix",{"2":{"25":2,"195":1}}],["footprint",{"2":{"156":1}}],["footer",{"2":{"25":1}}],["fov",{"0":{"150":1},"2":{"150":1}}],["focused",{"2":{"89":1,"156":1}}],["found",{"2":{"39":1,"83":1,"91":1}}],["font",{"2":{"20":2}}],["follows",{"2":{"25":2,"53":1}}],["followed",{"2":{"24":1,"45":1}}],["following",{"0":{"162":1},"2":{"19":1,"20":1,"25":2,"30":2,"53":1,"54":1,"55":2,"56":2,"58":2,"78":1,"85":1,"86":1,"120":1,"135":2,"167":1}}],["follow",{"2":{"15":1,"25":1,"40":1,"56":1,"58":1,"72":1,"78":1,"81":1,"85":1,"171":1}}],["folder",{"2":{"12":1,"15":2,"17":1,"18":4,"19":1,"21":1,"66":1,"168":1,"169":1}}],["force",{"2":{"122":2}}],["form",{"2":{"108":1,"158":1,"194":1}}],["format",{"2":{"30":1,"55":1,"56":1,"58":1}}],["formatting",{"2":{"25":1}}],["formatted",{"2":{"16":1}}],["forward",{"2":{"66":1,"189":1}}],["for",{"0":{"9":1,"82":1,"83":1,"108":1,"119":1,"127":1,"152":1,"156":1,"161":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"162":1},"2":{"9":1,"15":1,"16":2,"17":1,"18":2,"19":1,"20":1,"22":1,"24":2,"25":2,"28":4,"31":1,"32":2,"33":2,"35":2,"36":4,"37":14,"38":1,"44":1,"45":1,"46":2,"50":1,"52":1,"53":1,"54":1,"55":1,"56":3,"57":6,"58":1,"60":1,"65":1,"66":1,"69":1,"70":1,"72":1,"75":1,"78":1,"80":1,"82":5,"83":2,"84":3,"85":1,"87":1,"88":1,"89":1,"90":1,"92":1,"93":1,"95":1,"96":4,"97":3,"98":3,"103":1,"108":1,"109":4,"111":1,"112":2,"119":1,"121":1,"126":2,"127":5,"133":1,"136":1,"139":2,"142":1,"143":1,"144":1,"147":5,"151":2,"152":3,"156":3,"157":4,"158":3,"159":2,"177":1,"181":1,"182":1,"185":1,"188":1,"189":3,"193":1,"194":2}}],["fox",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["etvr",{"2":{"191":1,"193":2,"196":2}}],["etc",{"2":{"25":1,"89":1,"95":1,"188":1,"189":1}}],["effect",{"2":{"89":1}}],["effects",{"2":{"89":1,"95":1,"96":1}}],["empty",{"2":{"194":1}}],["emitters",{"0":{"103":1,"154":1},"1":{"155":1,"156":1},"2":{"89":4,"95":3,"153":1,"156":4,"157":1,"159":1}}],["emitter",{"0":{"89":1,"95":1},"1":{"96":1},"2":{"156":2}}],["embedded",{"2":{"72":1}}],["error",{"2":{"67":1}}],["every",{"2":{"92":1}}],["everything",{"0":{"113":1},"2":{"36":3,"85":1,"119":1,"188":1}}],["event",{"2":{"156":1}}],["even",{"2":{"42":1,"55":1,"67":1,"97":1,"98":1,"156":1}}],["equation",{"2":{"38":1}}],["e",{"2":{"35":2,"143":1,"187":1}}],["espcam32",{"2":{"147":1}}],["espressif",{"2":{"72":1}}],["espaithinker",{"2":{"35":1}}],["esp32wrover",{"2":{"37":2}}],["esp32m5stack",{"2":{"37":2}}],["esp32aithinker",{"2":{"37":3,"83":2}}],["esp32cams",{"2":{"37":1}}],["esp32cam",{"2":{"35":1,"37":3}}],["esp32",{"0":{"75":1,"76":1},"2":{"31":2,"37":8,"38":1,"44":1,"45":2,"53":2,"75":2,"76":1,"142":1,"146":1,"147":1,"150":1,"152":2,"158":1}}],["esp",{"0":{"121":1,"123":1,"125":1,"129":1,"130":1,"131":1,"141":1},"1":{"142":1,"143":1},"2":{"28":7,"31":4,"33":2,"37":3,"50":1,"52":1,"54":1,"56":1,"57":1,"66":1,"77":1,"78":1,"82":1,"84":2,"121":3,"122":1,"123":2,"125":1,"131":1,"142":1,"146":1,"147":1,"158":1}}],["esps",{"0":{"122":1},"2":{"4":1,"28":2,"30":3,"31":1,"32":2,"33":1,"54":1,"81":3,"83":2,"140":1,"147":1,"152":1,"153":2,"185":1,"187":1}}],["either",{"2":{"28":2,"67":1,"109":1,"112":1,"121":1,"132":1,"194":1}}],["easiest",{"2":{"109":1}}],["easier",{"2":{"33":1,"128":1,"142":1}}],["easily",{"2":{"35":1,"50":1,"69":1,"139":1}}],["easy",{"2":{"22":1,"24":5,"25":3,"75":1,"121":1}}],["each",{"2":{"3":1,"28":1,"33":1,"35":1,"44":1,"136":2,"151":1,"189":1}}],["elements",{"2":{"20":1}}],["enough",{"2":{"133":1,"195":1}}],["encountered",{"2":{"86":1}}],["enum",{"2":{"56":2,"58":2}}],["env",{"2":{"82":1,"83":1}}],["envs",{"2":{"37":1}}],["enviroment",{"2":{"37":1}}],["enviroments",{"2":{"33":1}}],["environnement",{"2":{"36":1}}],["environment",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1},"2":{"33":2,"35":1,"36":5,"37":10,"81":1,"82":4,"83":3}}],["environments",{"0":{"33":1,"34":1},"1":{"35":1,"36":1,"37":1},"2":{"28":1,"33":1,"35":2,"83":1}}],["enter",{"2":{"69":1,"85":1,"177":1,"185":1,"187":1}}],["entering",{"2":{"66":1}}],["entered",{"2":{"28":1}}],["entire",{"2":{"20":1}}],["enableota",{"2":{"31":1,"83":1}}],["enabled",{"2":{"30":1,"32":1,"44":1}}],["enable",{"0":{"44":1},"2":{"30":2,"31":1,"56":1}}],["enableadhoc",{"2":{"28":2}}],["enabling",{"2":{"28":1}}],["english",{"2":{"24":2}}],["ensures",{"2":{"156":1}}],["ensure",{"2":{"22":1,"24":2,"25":2,"96":1,"97":1,"98":1,"136":1,"152":2}}],["endpoints",{"0":{"54":1},"2":{"54":3}}],["endpoint",{"2":{"53":2,"54":3,"55":1}}],["end",{"2":{"2":1,"133":1,"134":2}}],["e67e22",{"2":{"20":2}}],["exe",{"2":{"171":1}}],["exercise",{"2":{"89":1,"95":1}}],["extremes",{"2":{"111":1,"182":1,"189":1}}],["external",{"0":{"121":1},"2":{"25":1,"121":2,"142":1,"147":1}}],["extend",{"2":{"24":2,"25":1}}],["extensions",{"0":{"151":1},"2":{"151":2}}],["extension",{"2":{"19":1,"52":1,"65":1,"150":1,"151":1}}],["excessive",{"2":{"95":1}}],["expand",{"2":{"193":1,"194":1}}],["expressions",{"2":{"193":1,"194":1}}],["explains",{"2":{"191":1}}],["experimental",{"0":{"186":1},"1":{"187":1},"2":{"150":1}}],["experiment",{"2":{"112":1}}],["experience",{"2":{"89":1,"95":1,"101":1}}],["expect",{"2":{"101":1,"117":1}}],["exposures",{"2":{"96":1}}],["exposure",{"0":{"97":1,"98":1},"2":{"89":1,"96":3,"97":2,"98":2}}],["exposed",{"2":{"89":1,"95":1,"96":2,"126":1,"127":1}}],["exactly",{"2":{"89":2,"95":2,"103":1,"156":1}}],["example",{"2":{"17":1,"18":1,"19":1,"20":1,"25":3,"31":1,"45":1,"53":1,"82":1,"83":1,"85":1,"109":1,"121":1,"130":1,"133":1,"188":4}}],["examples",{"2":{"16":1,"36":1}}],["exists",{"2":{"75":1}}],["existing",{"0":{"108":1},"2":{"25":1,"54":1}}],["ex",{"2":{"66":1,"151":1}}],["editing",{"0":{"21":1}}],["edit",{"2":{"16":1,"21":2,"116":1,"136":1}}],["eyetrackapp",{"2":{"168":1,"169":3}}],["eyetrackvr",{"0":{"5":1,"9":1,"87":1,"88":1,"170":1,"171":2,"172":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":2,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"9":1,"12":2,"17":1,"18":1,"22":1,"57":1,"66":2,"78":1,"89":1,"95":1,"166":1,"167":1}}],["eyesy",{"2":{"162":1}}],["eyestrain",{"2":{"96":1}}],["eyes",{"0":{"176":1,"189":1},"2":{"89":3,"95":3,"96":1,"103":1,"176":1,"189":2,"194":1}}],["eye",{"0":{"161":1,"174":1,"175":1,"183":1},"1":{"162":1},"2":{"2":1,"37":2,"87":1,"95":1,"96":3,"98":1,"105":1,"111":1,"116":1,"127":2,"133":1,"149":1,"150":1,"174":1,"175":1,"179":1,"181":1,"182":1,"183":1,"185":2,"188":2,"189":7}}],["1x",{"2":{"152":1,"153":3,"156":1,"158":2}}],["160°",{"0":{"150":1}}],["16",{"0":{"132":1}}],["13",{"0":{"129":1}}],["13dbm",{"2":{"56":2,"58":2}}],["1206",{"2":{"156":1}}],["120°",{"2":{"150":1}}],["12",{"0":{"128":1},"2":{"130":1,"131":1}}],["12345678",{"2":{"83":1}}],["1234567891011121314",{"2":{"56":1,"58":1}}],["123456789note",{"2":{"19":1}}],["12345",{"2":{"25":1,"83":1}}],["12345the",{"2":{"25":1}}],["11",{"0":{"127":1},"2":{"166":1}}],["11dbm",{"2":{"56":2,"58":2}}],["1cm2",{"2":{"97":2,"98":2}}],["1cm",{"2":{"97":3,"98":3}}],["1dbm",{"2":{"56":2,"58":2}}],["18",{"0":{"133":1},"2":{"56":2,"58":2}}],["19dbm",{"2":{"56":2,"58":2}}],["19",{"0":{"136":1},"1":{"137":1,"138":1},"2":{"56":2,"58":2}}],["14mm",{"2":{"158":1}}],["14",{"0":{"130":1},"2":{"56":1,"131":1}}],["1by",{"2":{"44":1}}],["1this",{"2":{"20":1}}],["1000",{"2":{"96":1}}],["100",{"2":{"96":1,"101":1}}],["10",{"0":{"126":1},"2":{"11":1,"96":2}}],["17dbm",{"2":{"56":2,"58":2}}],["17",{"0":{"2":1}}],["1",{"0":{"61":1,"74":1,"75":1,"82":2,"83":1,"109":1,"117":1,"137":1,"142":1,"171":1},"1":{"62":1,"63":1,"75":1,"76":1},"2":{"1":1,"2":1,"11":1,"12":4,"20":1,"28":2,"31":1,"53":1,"56":1,"82":2,"83":2,"85":1,"96":1,"97":4,"98":1,"109":1,"132":1,"133":1,"167":1}}],["1st",{"2":{"1":1,"132":1}}],["15dbm",{"2":{"56":2,"58":2}}],["15",{"0":{"1":1,"131":1},"2":{"11":1}}],["n",{"2":{"119":1}}],["night",{"0":{"150":1}}],["nir",{"2":{"89":1}}],["nice",{"2":{"20":1}}],["numbers",{"0":{"97":1,"98":1},"2":{"187":1}}],["number",{"2":{"56":1,"58":1,"96":1,"97":1,"98":1,"177":1,"187":1}}],["npm",{"2":{"25":1}}],["native",{"2":{"105":1}}],["navigating",{"2":{"66":1}}],["navigate",{"2":{"12":1,"82":1}}],["namely",{"2":{"140":1}}],["named",{"2":{"82":1,"193":1}}],["name",{"2":{"17":1,"28":2,"30":1,"31":1,"42":3,"44":5,"45":2,"48":2,"53":2,"55":1,"56":1,"57":2,"82":3,"83":2,"194":2}}],["names",{"2":{"15":1}}],["naming",{"2":{"15":1}}],["none",{"2":{"108":1,"136":1,"194":1}}],["non",{"2":{"89":1,"96":1}}],["now",{"2":{"36":1,"78":1,"84":1,"97":2,"98":2,"110":1,"122":1,"133":1,"169":1,"188":4,"189":1,"193":1,"194":3}}],["no",{"2":{"25":1,"89":1,"137":1,"139":1,"140":1,"143":1,"155":1,"159":1}}],["normal",{"2":{"97":1}}],["normalized",{"2":{"96":1}}],["normalize",{"2":{"96":2}}],["nor",{"2":{"25":1,"193":1}}],["node",{"2":{"11":1}}],["noting",{"2":{"116":1,"150":1,"152":1}}],["nothing",{"2":{"31":1}}],["noted",{"2":{"121":1}}],["note",{"0":{"187":1},"2":{"28":1,"37":1,"54":3,"56":2,"58":1,"66":1,"84":1,"105":1,"118":1,"122":2,"123":1,"133":1,"140":1,"150":1,"191":1,"196":1}}],["not",{"0":{"48":1,"101":1,"108":1},"2":{"1":2,"3":1,"4":1,"15":2,"19":2,"25":2,"28":5,"30":1,"31":2,"32":3,"33":1,"36":2,"37":3,"42":3,"44":4,"48":2,"54":1,"55":3,"56":1,"66":2,"77":1,"78":1,"83":1,"89":5,"92":2,"95":6,"96":6,"98":1,"101":2,"102":1,"103":1,"105":1,"108":1,"121":5,"122":1,"126":1,"132":2,"146":3,"149":1,"150":1,"151":1,"156":5,"159":2,"164":2,"193":1,"196":1}}],["neos",{"2":{"191":1}}],["near",{"2":{"127":1,"139":1,"151":1}}],["nearly",{"2":{"111":1}}],["nevertheless",{"2":{"116":1}}],["next",{"2":{"72":1,"82":1,"83":1,"124":1,"125":1,"133":1,"157":1,"189":1}}],["networkname",{"2":{"56":1}}],["networks",{"2":{"56":1}}],["network",{"2":{"28":1,"30":1,"31":1,"48":2,"54":4,"56":6,"57":1,"83":1}}],["neither",{"2":{"25":1}}],["newest",{"0":{"85":1},"1":{"86":1},"2":{"85":1}}],["new",{"2":{"17":1,"25":4,"32":1,"33":1,"44":1,"50":1,"54":3,"66":1,"76":1,"81":1}}],["needs",{"2":{"96":1,"142":1,"196":1}}],["need",{"0":{"105":1},"2":{"2":1,"17":1,"19":3,"21":1,"28":6,"31":5,"33":1,"36":1,"37":1,"44":2,"45":1,"64":1,"71":1,"81":1,"83":1,"85":1,"96":1,"97":1,"98":1,"110":1,"121":2,"127":1,"133":1,"146":1,"147":1,"151":1,"152":1,"157":1,"164":1,"189":1,"191":1,"193":3,"194":1,"196":1}}],["needed",{"2":{"1":1,"25":1,"66":1,"132":1,"137":1,"140":1}}],["negative",{"0":{"130":1},"2":{"1":2,"126":1,"130":1,"132":2}}],["black",{"2":{"122":2}}],["bit",{"2":{"138":1,"142":1}}],["biggest",{"2":{"111":1}}],["bigger",{"2":{"96":1}}],["bizarre",{"2":{"67":1}}],["binary",{"2":{"57":1}}],["bare",{"2":{"153":1}}],["bard",{"2":{"72":1}}],["bag",{"0":{"121":1},"2":{"121":2}}],["backing",{"2":{"188":1}}],["back",{"2":{"33":1,"122":1,"188":1,"194":1}}],["band",{"2":{"28":3,"89":1,"96":1}}],["based",{"2":{"97":1,"98":1,"157":1}}],["bashfeat",{"2":{"25":1}}],["bash",{"2":{"25":1,"66":1}}],["basic",{"0":{"108":1},"2":{"4":1,"32":1,"52":1,"105":1,"110":1,"117":1,"159":2,"173":1}}],["bounces",{"2":{"194":1}}],["bool",{"2":{"193":3,"196":1}}],["boot",{"2":{"76":3}}],["bodily",{"2":{"89":1,"95":1}}],["body",{"2":{"25":1,"147":1}}],["bottom",{"2":{"77":1,"127":1,"138":1,"151":1}}],["both",{"0":{"176":1},"2":{"28":2,"44":1,"121":1,"152":1,"153":1,"157":2,"176":1,"185":1,"189":1,"193":2}}],["bonjour",{"0":{"46":1},"2":{"46":4}}],["board",{"0":{"37":1,"126":1},"2":{"35":1,"37":3,"75":1,"76":1,"78":1,"83":1,"121":1,"126":1,"147":4}}],["boards",{"0":{"145":1},"1":{"146":1,"147":1},"2":{"1":1,"33":1,"37":5,"112":1,"121":1,"132":1,"142":1,"149":1,"150":1,"151":1,"152":1,"155":1,"157":1}}],["breakout",{"2":{"153":1}}],["break",{"2":{"137":1,"149":1}}],["breaking",{"2":{"25":7,"137":1}}],["bridging",{"2":{"121":1}}],["bridge",{"2":{"121":3}}],["brighter",{"2":{"96":1}}],["brightness",{"2":{"89":1,"95":1}}],["branch",{"2":{"66":1}}],["broader",{"2":{"96":1}}],["broad",{"2":{"89":1,"96":1}}],["broadcast",{"2":{"56":1}}],["broken",{"2":{"35":1}}],["broccoli",{"2":{"25":1}}],["browser",{"2":{"12":1,"32":1,"52":1,"82":1,"84":1,"125":1,"185":2,"193":1}}],["bypass",{"2":{"89":1,"95":1}}],["by",{"0":{"116":1},"2":{"24":1,"30":1,"32":4,"37":1,"44":1,"45":1,"56":1,"57":1,"66":2,"69":1,"76":1,"78":1,"82":1,"83":1,"84":1,"91":1,"94":1,"96":4,"133":1,"161":1,"185":1,"188":1,"189":1,"194":1}}],["bunch",{"2":{"194":1}}],["burn",{"2":{"156":1}}],["buying",{"2":{"156":1}}],["buy",{"2":{"103":1,"140":1,"156":2}}],["bugs",{"2":{"101":1}}],["bug",{"2":{"25":2,"55":1}}],["buttons",{"0":{"194":1},"2":{"83":1,"194":2}}],["button",{"2":{"72":1,"75":3,"76":3,"77":1,"78":1,"82":2,"83":2,"84":1,"185":1,"187":1,"188":1,"189":3,"193":1,"194":2}}],["but",{"2":{"20":1,"28":2,"33":1,"37":1,"42":1,"77":1,"81":1,"82":1,"122":1,"130":2,"149":1,"150":1}}],["builds",{"2":{"77":1}}],["building",{"0":{"73":1,"88":1,"152":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"93":1},"2":{"67":1,"81":1,"125":1}}],["build",{"0":{"36":1,"77":1,"115":1,"163":1,"164":1,"169":1},"1":{"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1},"2":{"25":2,"35":1,"36":1,"65":1,"67":1,"77":1,"82":3,"88":1,"147":1,"164":1,"167":1,"169":2,"194":1}}],["builtin",{"2":{"53":2,"55":1}}],["built",{"2":{"9":1,"20":1,"78":1}}],["buil",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["because",{"2":{"188":1}}],["better",{"2":{"136":1,"143":1}}],["beta",{"0":{"143":1,"187":2},"2":{"105":1}}],["between",{"2":{"35":1,"156":1}}],["begin",{"2":{"76":1}}],["being",{"2":{"54":1,"89":1,"95":1,"96":1,"156":1,"188":2,"193":1}}],["been",{"2":{"39":1,"78":1,"92":1,"102":1,"122":1,"140":1,"167":1}}],["best",{"2":{"28":1,"112":1,"121":2,"139":1,"157":1,"181":1,"189":1}}],["before",{"0":{"99":1,"100":1},"1":{"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"19":1,"66":1,"123":2,"141":1,"166":1}}],["below",{"2":{"14":1,"78":1,"97":1,"98":1,"121":2,"122":1,"130":1,"135":2,"136":1}}],["be",{"0":{"100":1,"104":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"1":1,"3":1,"15":1,"17":2,"18":1,"20":1,"24":5,"31":1,"32":4,"33":1,"36":4,"42":1,"44":3,"52":1,"54":1,"55":1,"56":1,"57":2,"66":3,"70":1,"73":1,"76":1,"78":2,"81":1,"83":3,"86":1,"89":1,"95":1,"96":1,"97":2,"98":2,"103":1,"104":1,"114":1,"121":3,"122":3,"130":1,"132":1,"133":1,"136":1,"137":1,"142":1,"143":2,"146":1,"149":1,"156":2,"159":2,"169":2,"171":1,"172":1,"177":1,"181":1,"185":1,"191":1,"193":3,"194":1,"196":2}}],["ov2640",{"0":{"150":1},"2":{"150":1}}],["overview",{"0":{"100":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"117":1}}],["overwritten",{"2":{"56":1}}],["over",{"0":{"142":1,"143":1},"2":{"54":1,"73":1,"78":1,"80":1,"81":1,"96":1,"173":1,"185":1,"188":1}}],["occur",{"2":{"101":1}}],["octal",{"2":{"37":2}}],["ohm",{"2":{"97":1,"121":1,"156":2}}],["ohms",{"2":{"97":1}}],["osc",{"0":{"195":1},"2":{"87":1,"191":2,"195":1,"196":1}}],["oldest",{"2":{"56":1}}],["otaserverport",{"2":{"83":1}}],["otaserverip",{"2":{"31":2,"83":1}}],["otapassword",{"2":{"31":2,"83":1}}],["ota",{"0":{"31":1,"79":1},"1":{"80":1,"81":1,"82":1,"83":1},"2":{"31":2,"54":1,"57":6,"73":1,"78":2,"80":1,"81":3,"82":3,"83":5}}],["others",{"2":{"139":1}}],["other",{"0":{"88":1,"159":1,"196":1},"1":{"93":1},"2":{"2":1,"16":1,"25":1,"28":2,"78":2,"111":1,"127":1,"133":2,"134":1,"142":1,"189":1,"194":1}}],["opinion",{"2":{"96":1}}],["optimal",{"2":{"127":1,"139":2,"142":1}}],["optical",{"2":{"89":1,"96":1}}],["option",{"0":{"75":1,"76":1,"142":1,"143":1},"2":{"121":2,"150":1,"172":1}}],["options",{"0":{"141":1},"1":{"142":1,"143":1},"2":{"36":1,"141":1}}],["optionaland",{"2":{"25":1}}],["optional",{"0":{"151":1},"2":{"25":3,"158":1}}],["opt",{"2":{"73":1}}],["operation",{"2":{"32":1}}],["opening",{"2":{"66":1,"185":1}}],["openiristrackerl",{"2":{"83":1}}],["openiristracker",{"2":{"44":2,"57":1,"82":2}}],["openiris",{"2":{"39":1,"66":3,"85":2,"91":1}}],["opened",{"0":{"27":1},"2":{"194":1}}],["open",{"0":{"28":1,"187":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"12":1,"54":1,"65":1,"66":6,"69":1,"70":3,"72":3,"82":3,"83":1,"84":1,"85":1,"87":1,"122":1,"167":1,"168":1,"169":1,"185":1}}],["owning",{"2":{"105":1}}],["own",{"0":{"107":1,"108":1},"1":{"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1},"2":{"25":1,"39":1,"103":1,"105":1,"110":1,"155":1,"159":2}}],["objects",{"2":{"122":1}}],["object",{"2":{"19":2,"54":1,"96":1}}],["our",{"0":{"118":1},"2":{"14":1,"20":1,"24":1,"25":7,"32":1,"33":1,"39":1,"50":1,"90":1,"91":1,"92":1,"93":1,"102":1,"124":1,"125":1,"130":1,"143":1,"159":1,"181":1,"188":2}}],["outdated",{"0":{"190":1}}],["outline",{"0":{"97":1,"98":1}}],["outside",{"2":{"96":1,"97":1,"129":1}}],["outputs",{"2":{"178":1}}],["output",{"2":{"78":1,"83":1,"84":1}}],["out",{"2":{"1":3,"54":1,"88":1,"90":1,"122":1,"124":1,"132":3,"156":2,"159":1,"179":1,"180":1,"187":1}}],["often",{"2":{"54":1}}],["official",{"2":{"155":1}}],["offers",{"2":{"142":1}}],["off",{"2":{"32":1,"188":1,"194":1}}],["of",{"0":{"83":1,"84":1,"100":1,"120":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"1":2,"2":1,"3":3,"4":3,"5":1,"15":1,"16":1,"17":1,"20":4,"25":4,"28":4,"30":1,"31":3,"33":1,"36":2,"38":1,"39":1,"42":8,"44":5,"45":2,"48":2,"52":1,"53":1,"54":4,"56":4,"57":1,"58":1,"59":1,"66":1,"70":2,"72":1,"75":2,"76":1,"77":1,"78":1,"82":2,"83":4,"84":2,"85":1,"89":5,"92":1,"95":1,"96":9,"97":7,"98":6,"108":1,"111":2,"116":4,"117":1,"118":1,"121":3,"122":4,"126":2,"127":3,"129":1,"130":1,"132":2,"133":1,"135":1,"136":4,"137":3,"138":3,"140":1,"141":1,"142":1,"149":1,"150":1,"151":1,"152":1,"156":1,"158":1,"159":1,"167":1,"168":1,"177":1,"188":6,"191":3,"193":3,"194":4,"195":1,"196":1}}],["once",{"0":{"27":1,"106":1},"2":{"36":1,"65":1,"72":1,"73":1,"75":1,"76":1,"78":1,"81":2,"82":1,"89":1,"95":1,"122":1,"124":1,"127":1,"128":1,"169":1,"189":2,"194":2}}],["only",{"0":{"147":1,"187":1},"2":{"1":1,"2":1,"24":2,"25":2,"28":2,"30":1,"32":1,"36":1,"37":1,"46":2,"56":1,"66":1,"81":1,"84":1,"97":1,"98":1,"103":1,"122":1,"132":1,"133":2,"147":2,"152":1,"162":1,"174":1,"175":1,"188":1,"196":1}}],["ones",{"2":{"78":1,"103":2,"127":3,"150":1,"156":3}}],["one",{"2":{"1":1,"2":1,"4":2,"28":1,"33":1,"54":1,"69":1,"70":1,"78":1,"82":2,"83":1,"84":1,"92":1,"132":1,"133":1,"134":1,"136":1,"147":1,"152":2,"153":1,"189":1,"194":2}}],["on",{"0":{"2":1,"3":1,"27":1,"106":1,"108":1,"118":1,"133":1,"134":1,"190":1},"2":{"1":4,"3":1,"4":1,"14":1,"16":1,"20":1,"30":1,"31":1,"33":2,"36":1,"37":1,"38":1,"39":1,"44":1,"56":1,"57":1,"59":1,"70":4,"72":5,"75":1,"76":1,"81":2,"82":3,"83":1,"84":1,"89":3,"92":1,"95":1,"96":2,"97":2,"98":2,"110":1,"112":1,"113":1,"116":1,"121":1,"124":2,"125":1,"129":1,"130":1,"132":4,"133":2,"135":1,"137":1,"138":1,"140":1,"143":2,"147":1,"150":1,"152":1,"153":2,"157":2,"159":1,"172":1,"188":2,"193":5,"194":3,"196":1}}],["org",{"2":{"167":1}}],["organizing",{"2":{"18":1}}],["orientate",{"2":{"134":1}}],["orientation",{"2":{"3":1,"121":1}}],["order",{"0":{"118":1},"2":{"57":1,"64":1,"147":1}}],["orange",{"2":{"20":1}}],["or",{"0":{"121":1},"2":{"1":1,"11":4,"15":1,"16":1,"25":4,"28":1,"32":1,"33":1,"37":1,"42":1,"50":1,"54":1,"56":1,"66":1,"67":1,"72":1,"78":1,"82":2,"83":4,"89":3,"92":1,"95":4,"96":2,"101":1,"103":2,"108":1,"109":1,"111":1,"112":1,"114":2,"116":1,"121":1,"122":1,"127":2,"132":1,"136":2,"142":1,"143":2,"146":1,"147":2,"153":3,"156":3,"158":1,"159":1,"177":1,"194":2}}],["5mm",{"2":{"151":1}}],["5mw",{"2":{"97":1,"98":1}}],["52",{"2":{"56":1,"58":1}}],["5dbm",{"2":{"56":8,"58":8}}],["5ghz",{"2":{"28":1}}],["56mm",{"2":{"126":1}}],["56",{"2":{"11":1}}],["5",{"0":{"113":1,"121":1,"189":1},"2":{"1":1,"89":1,"97":2,"98":2,"132":1}}],["5v",{"2":{"1":2,"4":1,"97":2,"126":1,"129":1,"132":2}}],["due",{"2":{"142":1}}],["during",{"2":{"83":1}}],["draw",{"2":{"97":1,"188":1}}],["dry",{"2":{"89":1,"95":1}}],["drivers",{"0":{"64":1},"2":{"64":3,"78":1}}],["dbm",{"2":{"56":1}}],["dab",{"2":{"137":1}}],["damaged",{"2":{"103":1}}],["damage",{"2":{"89":1,"95":1,"103":1}}],["dark",{"2":{"89":1,"95":1,"180":1}}],["danger",{"2":{"89":1,"95":1,"141":1,"149":1,"156":1}}],["dangerous",{"0":{"103":1},"2":{"89":1,"95":1}}],["dashboard",{"2":{"72":1}}],["daily",{"2":{"36":1}}],["data",{"2":{"38":1,"78":1,"89":1}}],["datasheet",{"2":{"1":1,"97":1,"98":1,"132":1}}],["date",{"2":{"33":1,"78":1}}],["dns",{"2":{"31":1}}],["decision",{"2":{"141":1}}],["decide",{"2":{"36":1,"149":1}}],["dead",{"2":{"140":1,"150":1}}],["definitely",{"2":{"96":1}}],["default",{"2":{"36":1,"37":4,"44":2,"55":1,"82":2,"85":1,"150":1}}],["defaults",{"2":{"28":1}}],["defauly",{"2":{"32":1}}],["deleting",{"2":{"195":1}}],["deletes",{"2":{"54":1}}],["delete",{"2":{"54":3,"195":1}}],["delay",{"2":{"140":1}}],["delayed",{"2":{"96":1}}],["delivers",{"2":{"126":1}}],["denotes",{"2":{"85":1,"126":1}}],["demonstration",{"2":{"84":1}}],["depending",{"2":{"137":1,"152":1,"194":1}}],["dependencies",{"2":{"25":1,"167":2}}],["depricated",{"2":{"57":1}}],["debugging",{"2":{"36":1}}],["debug",{"2":{"35":1,"36":7}}],["details",{"2":{"89":1}}],["detail",{"2":{"25":1}}],["desktop",{"2":{"172":2,"188":3}}],["descriptor",{"2":{"193":1}}],["description",{"2":{"25":1,"54":1,"56":1,"57":1,"58":1}}],["described",{"2":{"40":1}}],["designed",{"2":{"159":1}}],["designated",{"2":{"139":1}}],["design",{"2":{"24":1,"110":1,"159":1}}],["devices",{"2":{"35":1,"44":2,"50":2,"52":1,"54":1,"57":2,"78":1,"142":1}}],["device",{"0":{"45":1,"48":1},"2":{"35":2,"42":9,"44":5,"45":4,"48":7,"50":2,"53":3,"54":2,"55":1,"76":1,"80":1,"83":1,"187":1}}],["developed",{"2":{"32":1,"50":1,"101":1}}],["developments",{"2":{"118":1}}],["development",{"0":{"5":1,"9":1,"88":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"93":1},"2":{"32":1,"39":1,"88":1}}],["dev",{"2":{"12":2,"17":1,"18":1}}],["doa",{"2":{"140":1,"150":1}}],["doubt",{"2":{"89":1,"95":1}}],["double",{"2":{"28":1,"172":1}}],["doing",{"2":{"89":1,"95":1,"149":2,"156":1}}],["dot",{"2":{"82":1,"135":2}}],["down",{"2":{"76":2,"122":2,"125":1,"136":1}}],["downloaded",{"2":{"66":1}}],["download",{"0":{"39":1,"40":1,"62":1,"171":1},"2":{"33":1,"46":1,"61":1,"66":1,"85":1,"171":1}}],["dont",{"2":{"89":1}}],["done",{"2":{"69":1,"70":1,"72":1,"73":1,"82":2,"89":1,"95":1,"169":1,"185":1,"189":1,"191":1,"194":1}}],["don",{"0":{"195":1},"2":{"25":1,"82":1,"85":1,"86":1,"89":1,"95":2,"96":1,"157":1,"188":1,"193":1}}],["do",{"0":{"40":1,"81":1},"1":{"82":1,"83":1},"2":{"15":2,"19":2,"25":1,"28":1,"30":1,"31":1,"33":1,"42":2,"44":3,"55":1,"66":2,"71":1,"83":2,"89":6,"95":6,"96":2,"101":1,"109":1,"111":1,"121":1,"122":1,"125":1,"133":1,"149":1,"150":1,"151":1,"156":2,"164":1,"191":1,"193":2}}],["documented",{"2":{"32":1,"136":1}}],["documentation",{"0":{"9":1,"88":2,"104":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"93":2},"2":{"9":1,"14":2,"15":1,"20":1,"24":4,"25":1,"59":1,"66":1,"94":1,"167":1}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"15":1,"16":1,"17":2,"18":2,"19":1,"21":1,"25":1,"86":1,"114":1,"116":1}}],["does",{"2":{"4":1,"19":1,"36":1,"37":1,"42":1,"77":1,"78":1,"85":1,"105":1,"108":1,"121":2,"146":3}}],["digikey",{"2":{"156":3}}],["dim",{"2":{"126":1}}],["difficulties",{"0":{"102":1}}],["difference",{"2":{"156":1}}],["different",{"2":{"1":1,"28":2,"33":2,"35":1,"37":1,"44":1,"89":2,"95":3,"126":1,"127":1,"132":1,"136":1}}],["differs",{"2":{"139":1}}],["differnt",{"2":{"89":1}}],["direction",{"2":{"135":1}}],["directly",{"0":{"76":1},"2":{"76":1,"96":2,"191":1,"194":2}}],["directory",{"2":{"66":2,"82":1,"85":1,"195":1}}],["directories",{"0":{"18":1},"2":{"18":1,"82":1}}],["discount",{"2":{"156":1}}],["discord",{"0":{"187":1},"2":{"86":1,"93":1,"114":1,"116":1,"130":1,"159":2,"161":1}}],["dist",{"2":{"169":1}}],["distance",{"2":{"96":3,"97":2,"98":2}}],["distinct",{"2":{"35":1}}],["disabled",{"2":{"44":1}}],["diagram",{"2":{"4":2,"135":2}}],["dinstructions",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["hmd",{"2":{"157":1}}],["hubs",{"0":{"152":1}}],["hub",{"2":{"143":1,"152":2}}],["hit",{"2":{"189":1}}],["his",{"2":{"110":1}}],["hinder",{"2":{"101":1}}],["hidden",{"2":{"82":1}}],["highligh",{"2":{"193":1}}],["highlighted",{"2":{"84":1,"193":1}}],["highly",{"2":{"126":1,"156":1}}],["higher",{"2":{"11":4,"97":1,"98":1,"143":1,"146":1,"153":1}}],["high",{"2":{"3":1,"96":1,"188":1}}],["hence",{"2":{"156":1}}],["heatsinks",{"2":{"158":1}}],["heats",{"2":{"142":1}}],["head",{"2":{"136":1,"188":1}}],["headsets",{"0":{"109":1,"159":1},"2":{"143":1,"151":1}}],["headset",{"0":{"92":1,"108":1},"1":{"93":1},"2":{"92":2,"108":1,"109":2,"111":2,"136":1,"142":1,"143":1,"151":1,"159":3,"188":2}}],["help",{"2":{"54":1,"86":1,"121":3}}],["here",{"0":{"88":1},"1":{"93":1},"2":{"1":1,"20":1,"22":1,"32":1,"39":1,"40":1,"46":2,"64":1,"66":2,"82":1,"83":1,"86":1,"91":1,"108":1,"109":2,"110":1,"114":1,"126":1,"132":1,"136":1,"144":1,"149":1,"156":5,"159":3,"161":1,"171":1,"191":1,"194":1}}],["happens",{"2":{"137":1}}],["happy",{"2":{"86":1}}],["handled",{"2":{"103":1}}],["handy",{"2":{"67":1,"130":1}}],["harm",{"2":{"89":2,"95":2}}],["hardware",{"0":{"90":1,"97":1,"98":1,"120":1},"2":{"90":2,"96":1,"97":1,"98":1,"110":1,"118":2,"140":2}}],["hard",{"2":{"33":1,"85":1,"96":1}}],["had",{"2":{"85":1}}],["having",{"2":{"31":1,"33":1,"80":1,"82":1,"133":1,"136":1,"147":1}}],["haven",{"2":{"188":1}}],["have",{"0":{"27":1,"102":1,"106":1,"108":1,"117":1},"2":{"1":1,"2":1,"4":1,"24":1,"25":1,"28":3,"30":1,"33":2,"35":1,"36":1,"37":1,"42":1,"44":1,"66":2,"73":1,"76":1,"78":2,"81":2,"82":2,"83":1,"84":1,"85":1,"92":1,"96":1,"97":1,"98":1,"108":2,"110":2,"113":1,"120":1,"121":5,"123":1,"132":1,"133":1,"136":2,"139":1,"149":1,"150":1,"159":2,"167":1,"189":1,"193":1,"194":2}}],["has",{"2":{"28":2,"36":2,"39":1,"54":1,"55":1,"78":1,"83":1,"102":1,"122":1,"125":2,"130":1,"140":1,"152":2,"191":1}}],["h1",{"2":{"20":2}}],["htc",{"2":{"152":1}}],["http",{"2":{"30":1,"31":2,"45":1,"50":1,"53":1,"55":1,"82":3}}],["https",{"2":{"12":1,"17":1,"18":1,"64":1,"66":2,"109":1,"149":1,"167":1}}],["html",{"2":{"20":2}}],["hole",{"2":{"156":1}}],["holding",{"2":{"76":2,"112":1,"133":1,"185":1}}],["hold",{"2":{"2":1,"75":1,"89":1,"95":1,"133":1,"134":1}}],["hot",{"2":{"137":1,"139":2,"158":1}}],["hope",{"2":{"93":1}}],["hogging",{"2":{"78":1}}],["home",{"2":{"72":1}}],["hostname",{"2":{"57":2,"83":1}}],["however",{"2":{"31":1,"32":1,"44":1,"88":1,"92":1,"121":1,"142":1}}],["how",{"0":{"40":1,"43":1,"51":1,"81":1,"108":1,"161":1,"164":1,"170":1},"1":{"44":1,"45":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"82":1,"83":1,"162":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"16":3,"36":1,"60":1,"64":1,"75":1,"125":1,"136":1,"147":1,"149":1,"191":2}}],["lcsc",{"2":{"156":4}}],["luck",{"2":{"113":1}}],["ll",{"2":{"64":1,"71":1,"82":1,"85":1,"147":1,"157":1,"193":1,"194":1}}],["large",{"2":{"147":1}}],["larger",{"2":{"146":1}}],["lay",{"2":{"129":1}}],["labeled",{"2":{"75":1}}],["labels",{"2":{"1":2,"132":2}}],["latency",{"2":{"143":1}}],["later",{"2":{"66":1}}],["latest",{"0":{"187":1},"2":{"61":1,"66":1,"143":1,"171":1}}],["lt",{"2":{"20":2,"25":2,"30":1,"53":1,"55":6,"72":1,"82":1,"96":2,"195":2}}],["limit",{"2":{"96":1,"97":1,"98":1}}],["limited",{"2":{"96":1,"98":1,"196":1}}],["limits",{"2":{"89":1,"96":1}}],["license",{"2":{"94":2}}],["licenses",{"0":{"94":1}}],["library",{"2":{"89":1}}],["lightweight",{"2":{"152":1}}],["lightly",{"2":{"133":1}}],["light",{"2":{"89":2,"95":1,"96":3}}],["little",{"2":{"70":1,"136":1}}],["lives",{"2":{"38":1}}],["likely",{"2":{"96":1,"126":1,"137":1}}],["like",{"0":{"27":1},"2":{"20":2,"32":1,"37":1,"54":1,"72":1,"78":1,"82":2,"83":1,"84":1,"96":1,"109":1,"118":1,"121":1,"133":1,"135":2,"151":2,"156":1,"172":1,"180":1,"188":1,"194":2,"196":1}}],["line",{"2":{"19":1,"25":1}}],["linked",{"2":{"78":1,"103":1}}],["link",{"2":{"19":4,"156":1}}],["listening",{"2":{"195":1}}],["listens",{"2":{"191":1,"196":1}}],["listed",{"0":{"114":1,"118":1},"2":{"22":1,"83":1,"92":1,"159":2}}],["lists",{"2":{"97":1,"98":1}}],["list",{"0":{"140":1},"1":{"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1},"2":{"5":1,"25":2,"83":1,"90":1,"92":2,"136":2}}],["low",{"2":{"142":1,"156":1,"188":1}}],["lower",{"2":{"111":1,"126":1,"143":1,"153":1,"156":1}}],["lowercase",{"2":{"15":1}}],["loss",{"2":{"140":1}}],["longer",{"2":{"127":2}}],["long",{"2":{"119":1}}],["lorow",{"2":{"91":1}}],["location",{"2":{"111":1}}],["locate",{"2":{"72":1,"82":1,"83":1,"122":1}}],["located",{"2":{"44":1,"156":1}}],["locallow",{"2":{"195":1}}],["local",{"2":{"30":1,"31":2,"44":1,"45":2,"53":2,"55":1,"82":2,"83":1}}],["logging",{"2":{"36":1}}],["lot",{"2":{"36":2}}],["looking",{"2":{"96":2,"111":2,"183":1}}],["looks",{"2":{"78":1,"172":1}}],["look",{"2":{"16":1,"57":2,"92":1,"96":2,"122":1,"141":1,"156":1,"182":1,"189":4}}],["let",{"0":{"190":1},"2":{"159":2,"173":1,"194":1,"195":1}}],["letting",{"2":{"36":1}}],["letters",{"2":{"15":1}}],["length",{"2":{"126":1,"127":1}}],["lengthy",{"2":{"96":1}}],["lenses",{"2":{"150":1}}],["lens",{"0":{"109":1},"2":{"89":1,"96":1,"109":3,"111":1}}],["least",{"2":{"81":1,"120":1}}],["learned",{"2":{"130":1}}],["learn",{"2":{"64":1}}],["leave",{"2":{"28":2,"194":1}}],["levels",{"2":{"96":1}}],["level",{"2":{"58":1,"89":1,"95":1,"181":1}}],["less",{"2":{"36":1,"97":1,"98":2,"142":2,"143":1,"155":1,"194":1}}],["lefteyelidexpandedsqueeze",{"2":{"162":1}}],["lefteyex",{"2":{"162":1}}],["left",{"0":{"27":1,"175":1},"2":{"175":1,"188":1,"189":1}}],["leds",{"0":{"3":1,"112":1,"127":1,"134":1},"2":{"1":2,"96":2,"97":1,"98":1,"126":1,"132":2,"135":1,"139":2,"153":1}}],["led",{"0":{"1":1,"128":1,"132":1,"139":1},"2":{"1":3,"89":1,"96":2,"97":2,"98":2,"112":1,"116":1,"127":1,"132":3,"134":2,"155":1}}],["auto",{"2":{"195":1}}],["automatically",{"2":{"25":1}}],["awg",{"2":{"153":3,"156":1}}],["away",{"2":{"96":3,"123":1,"135":1}}],["again",{"2":{"139":1}}],["average",{"2":{"97":1,"98":1}}],["avoid",{"2":{"96":1}}],["avatars",{"2":{"195":2}}],["avatar",{"0":{"105":1,"161":1},"1":{"162":1},"2":{"105":2,"161":1,"191":1,"193":2,"194":1,"196":2}}],["avalable",{"0":{"88":1},"1":{"93":1}}],["available",{"2":{"36":1,"83":1,"156":1}}],["ammount",{"2":{"122":1}}],["amount",{"2":{"96":1,"122":1}}],["amps",{"2":{"97":1}}],["amp",{"2":{"53":1,"55":1}}],["amazon",{"2":{"37":1,"146":1,"147":2,"150":1,"153":3,"158":3}}],["aid",{"2":{"121":1}}],["air",{"2":{"80":1,"133":1}}],["ai",{"2":{"37":1}}],["adresses",{"2":{"196":1}}],["adoption",{"2":{"142":1}}],["adjust",{"0":{"170":1},"1":{"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"76":1,"113":1,"162":1,"181":1,"188":2}}],["adapters",{"0":{"153":1},"2":{"152":1}}],["adapted",{"2":{"66":1,"86":1}}],["adaptation",{"2":{"66":1}}],["adhoc",{"2":{"56":1}}],["advanced",{"2":{"32":1,"143":1}}],["address",{"0":{"84":1,"177":1},"2":{"31":2,"42":6,"84":1,"177":1,"185":4,"187":1}}],["addresses",{"2":{"30":1,"196":1}}],["additional",{"2":{"146":1}}],["additionally",{"2":{"78":1}}],["additonal",{"0":{"29":1},"1":{"30":1,"31":1,"32":1,"33":1}}],["adding",{"0":{"17":1,"19":1,"184":1,"193":1,"194":1},"1":{"18":1,"19":1,"20":1,"185":1,"186":1,"187":1,"188":1},"2":{"25":1,"37":1}}],["added",{"2":{"25":1,"114":1,"159":2}}],["adds",{"2":{"25":1,"54":1}}],["add",{"2":{"16":1,"17":1,"19":7,"20":1,"25":1,"44":1,"54":1,"56":1,"112":1,"128":1,"133":1,"136":1,"193":3,"194":5}}],["above",{"0":{"106":1},"2":{"72":1,"78":1,"156":1,"159":2,"193":1,"194":1}}],["about",{"0":{"89":1,"95":1,"96":1},"1":{"96":1},"2":{"25":1,"28":1,"66":1,"96":3,"126":1}}],["able",{"2":{"31":1,"44":1,"81":1,"137":1,"194":1}}],["api",{"0":{"32":1,"49":1,"52":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1},"2":{"32":6,"50":2,"52":2,"53":1,"54":1,"55":1}}],["ap",{"2":{"28":17,"56":1}}],["appdata",{"2":{"195":1}}],["appropriate",{"2":{"152":1}}],["approach",{"2":{"82":1}}],["apply",{"2":{"85":2,"129":1,"133":1,"137":1,"138":1}}],["application",{"2":{"188":1}}],["applications",{"2":{"83":1}}],["applicable",{"2":{"28":1,"116":1}}],["app",{"0":{"163":1,"164":1,"169":1,"170":1,"171":1,"172":1,"187":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"32":1,"33":1,"50":1,"81":2,"84":1,"105":1,"164":1,"167":2,"169":3,"171":1,"173":1,"185":1,"187":1,"191":2,"196":2}}],["appears",{"2":{"20":1}}],["acquire",{"2":{"152":1}}],["actual",{"2":{"194":1}}],["actually",{"2":{"123":1}}],["action",{"2":{"194":2}}],["actions",{"2":{"25":2}}],["actively",{"2":{"89":1,"95":1,"98":1}}],["active",{"2":{"88":1,"121":1}}],["achieve",{"2":{"111":1}}],["acknowledged",{"0":{"106":1}}],["accordingly",{"2":{"162":1}}],["account",{"2":{"96":1,"97":1,"98":1}}],["acceptable",{"2":{"156":1}}],["access",{"2":{"28":1,"70":2,"72":1,"142":1}}],["accent",{"2":{"20":2}}],["affordable",{"2":{"87":1}}],["affect",{"2":{"25":2}}],["after",{"2":{"1":1,"4":1,"54":1,"73":1,"89":1,"95":1,"96":1,"125":1,"132":1,"168":1}}],["antistatic",{"0":{"121":1},"2":{"121":2}}],["antenna",{"0":{"121":1},"2":{"121":5,"146":1,"147":1}}],["antennas",{"0":{"121":1},"2":{"121":1,"142":1,"146":1,"147":2}}],["angle",{"0":{"111":1}}],["an002",{"2":{"89":1}}],["answer",{"2":{"86":1}}],["another",{"2":{"37":1,"127":1,"158":1,"159":1,"161":1}}],["an",{"0":{"100":1,"121":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"25":1,"37":1,"42":1,"54":1,"65":1,"66":1,"75":1,"78":1,"82":1,"86":2,"89":1,"95":1,"121":6,"136":1,"146":1,"149":1,"150":1,"161":1,"172":1,"188":3,"194":1}}],["anywhere",{"2":{"119":1}}],["anything",{"0":{"190":1},"2":{"85":1}}],["anyone",{"2":{"31":1,"195":1}}],["any",{"0":{"108":1},"2":{"20":1,"32":1,"52":1,"54":3,"66":1,"82":1,"89":2,"93":1,"95":2,"108":1,"159":1}}],["and",{"0":{"39":1,"73":1,"82":1,"83":1,"88":1,"97":1,"98":1,"100":1,"124":1,"125":1,"128":2,"153":1,"170":1,"171":1,"173":1,"184":1,"191":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"93":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"171":1,"172":1,"173":1,"174":2,"175":2,"176":2,"177":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":1,"185":2,"186":2,"187":2,"188":2,"189":1,"190":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"1":1,"2":1,"4":1,"5":1,"15":1,"16":1,"20":1,"22":1,"24":1,"25":3,"28":9,"30":2,"32":2,"33":2,"36":3,"37":3,"38":1,"44":1,"46":1,"52":1,"54":5,"57":2,"61":1,"65":2,"66":2,"67":4,"69":1,"70":2,"72":3,"75":1,"76":2,"78":2,"80":1,"82":6,"83":2,"84":2,"85":2,"87":2,"88":1,"89":2,"90":1,"92":1,"93":1,"95":1,"96":10,"97":4,"98":4,"101":2,"103":1,"105":1,"109":1,"112":1,"113":1,"117":1,"121":5,"122":1,"123":1,"125":2,"126":4,"127":4,"129":1,"132":1,"133":4,"134":2,"136":1,"140":1,"141":2,"142":4,"143":2,"146":2,"147":2,"150":1,"151":1,"152":2,"156":3,"157":1,"158":1,"159":2,"161":1,"167":1,"168":1,"171":2,"174":1,"175":1,"176":1,"185":4,"187":2,"188":1,"189":3,"191":2,"193":2,"194":5,"195":1,"196":2}}],["alcohol",{"2":{"139":1}}],["alter",{"2":{"156":1}}],["alternative",{"0":{"147":1},"2":{"150":1,"156":1}}],["alternatively",{"0":{"156":1},"2":{"110":1,"146":1,"177":1}}],["although",{"2":{"118":1}}],["alone",{"2":{"96":1}}],["already",{"2":{"46":1}}],["alibaba",{"2":{"37":1}}],["aliexpress",{"2":{"37":2,"147":4,"150":1,"151":2,"153":4,"156":1,"158":3}}],["always",{"2":{"28":1,"42":1}}],["also",{"2":{"18":1,"20":1,"24":1,"25":1,"31":1,"32":1,"36":1,"42":1,"46":1,"54":1,"70":1,"71":1,"96":1,"116":1,"147":1,"156":1,"194":1}}],["allowed",{"2":{"56":1}}],["allows",{"2":{"42":1,"191":1}}],["allow",{"2":{"28":1,"30":1,"31":1,"33":2,"56":1,"65":1,"119":1,"122":1}}],["all",{"0":{"88":1,"118":1,"120":1},"1":{"93":1},"2":{"15":2,"20":1,"24":4,"44":1,"54":1,"55":1,"64":1,"76":1,"83":1,"89":1,"94":2,"95":1,"96":2,"97":1,"98":1,"101":1,"111":1,"121":2,"136":1,"137":1,"140":1,"141":1,"168":1,"182":1,"188":1,"189":2,"191":1}}],["attention",{"2":{"135":1}}],["attempt",{"2":{"76":1}}],["attaching",{"2":{"121":1,"147":1}}],["attached",{"2":{"121":1}}],["attach",{"0":{"122":1},"2":{"110":1}}],["attribute",{"2":{"20":1}}],["at",{"2":{"3":1,"16":1,"20":1,"33":1,"44":1,"77":1,"81":1,"89":1,"92":1,"95":1,"96":3,"97":1,"98":1,"101":1,"111":2,"120":1,"121":1,"122":1,"127":2,"140":1,"141":1,"151":1,"156":2,"183":1,"189":1}}],["a",{"0":{"17":1,"19":1,"21":1,"108":2,"109":1,"110":1,"111":1,"116":1,"126":2,"147":1,"187":1},"1":{"18":1,"19":1,"20":1},"2":{"2":1,"3":2,"4":1,"5":1,"17":3,"18":2,"19":3,"20":2,"21":1,"24":5,"25":14,"28":4,"31":2,"32":3,"33":5,"35":3,"36":5,"37":1,"42":5,"50":5,"52":1,"54":7,"55":4,"66":2,"69":1,"70":2,"72":4,"75":2,"76":2,"78":1,"80":1,"81":1,"82":4,"83":6,"84":1,"85":2,"89":1,"92":3,"95":1,"96":5,"97":2,"98":2,"105":1,"108":2,"109":4,"110":2,"111":3,"113":2,"116":2,"117":1,"121":2,"122":2,"125":1,"126":1,"127":2,"130":2,"133":2,"136":3,"137":3,"138":1,"140":2,"141":1,"142":3,"146":2,"147":2,"150":2,"151":5,"152":4,"153":2,"156":3,"157":3,"159":5,"161":1,"164":1,"168":1,"169":1,"172":1,"177":1,"182":1,"185":1,"188":6,"191":1,"194":4,"196":1}}],["assign",{"2":{"194":1}}],["assigned",{"2":{"193":1}}],["asset",{"2":{"193":2}}],["assembbly",{"2":{"116":1}}],["assembled",{"2":{"123":1}}],["assemblly",{"2":{"116":1}}],["assembly",{"0":{"116":1},"2":{"116":1,"153":1}}],["associated",{"2":{"193":1}}],["assume",{"2":{"97":2,"98":2}}],["assuming",{"2":{"96":1}}],["asked",{"0":{"160":1}}],["ask",{"2":{"86":1}}],["as",{"2":{"1":3,"25":3,"28":2,"30":1,"31":1,"52":1,"55":1,"66":1,"75":3,"82":1,"83":2,"89":4,"95":4,"96":5,"111":2,"122":1,"130":1,"132":3,"137":1,"142":1,"143":2,"146":1,"152":5,"156":2,"194":3}}],["arrival",{"2":{"140":1,"150":1}}],["arrive",{"0":{"119":1},"2":{"119":1}}],["artifacts",{"2":{"126":1}}],["around",{"2":{"83":1,"89":1,"95":1,"96":1,"127":1,"134":1,"137":1,"139":1,"189":1}}],["arduinosdk",{"2":{"67":1}}],["argument",{"2":{"37":1}}],["ar",{"2":{"1":1,"4":1,"132":1}}],["area",{"2":{"96":2}}],["aren",{"2":{"75":1,"156":1,"180":1}}],["are",{"0":{"103":1,"152":1},"2":{"1":4,"5":1,"15":1,"16":1,"20":1,"22":3,"25":3,"28":6,"30":2,"31":2,"33":3,"35":1,"37":1,"42":1,"46":2,"54":1,"55":3,"56":1,"59":1,"68":1,"78":2,"81":1,"89":3,"92":1,"95":3,"97":2,"98":3,"101":1,"103":1,"116":3,"118":1,"119":1,"121":1,"122":2,"126":1,"132":4,"136":3,"139":2,"140":1,"141":1,"142":2,"144":1,"147":1,"150":1,"151":1,"156":5,"157":1,"159":2,"183":1,"191":1,"195":1}}],["24p",{"2":{"151":1}}],["245c",{"2":{"3":1,"156":1}}],["2x",{"0":{"150":1},"2":{"146":2,"147":2,"152":1,"158":1}}],["2ma",{"2":{"97":3}}],["2dbm",{"2":{"56":2,"58":2}}],["200mm",{"2":{"151":1}}],["20ma",{"2":{"97":2,"98":2}}],["20",{"2":{"56":1,"58":1}}],["28",{"2":{"56":1,"58":1,"153":2}}],["22",{"2":{"11":1}}],["230c",{"2":{"3":1}}],["2nd",{"0":{"131":1},"2":{"1":2,"4":1,"131":1,"132":2}}],["2",{"0":{"64":1,"76":1,"77":1,"110":1,"118":1,"138":1,"142":1,"143":1,"172":1},"2":{"1":1,"11":1,"28":3,"97":3,"98":3,"105":1,"109":1,"119":2,"121":2,"127":4,"136":1,"142":2,"151":1}}],["4x",{"2":{"156":3,"158":1}}],["4mm",{"2":{"127":1}}],["4ma",{"2":{"98":1}}],["4v",{"2":{"97":2}}],["44",{"2":{"56":1,"58":1}}],["4ghz",{"2":{"28":2}}],["4",{"0":{"66":1,"112":1,"120":1,"142":1,"184":1},"1":{"185":1,"186":1,"187":1,"188":1},"2":{"1":2,"11":1,"28":1,"56":1,"58":1,"85":1,"94":1,"98":4,"132":3,"142":2}}],["v=qyh",{"2":{"149":1}}],["vs",{"2":{"124":2}}],["vsc",{"0":{"72":1},"2":{"70":1,"84":1}}],["vscode",{"2":{"11":1,"33":1,"52":1,"65":1,"66":1,"78":1}}],["v4",{"0":{"98":1},"2":{"98":2,"116":5,"153":1,"155":2}}],["v",{"2":{"96":1}}],["vversion",{"2":{"82":1}}],["ve",{"2":{"82":2,"85":1}}],["vers",{"0":{"150":1}}],["versions",{"0":{"82":1,"83":1}}],["version",{"0":{"85":1,"152":1},"1":{"86":1},"2":{"66":1,"72":1,"82":1,"167":1,"194":1}}],["versioning",{"2":{"25":1}}],["very",{"2":{"1":1,"132":1,"146":1}}],["virtual",{"2":{"188":1}}],["vive",{"2":{"121":2,"143":1,"147":1}}],["viewer",{"2":{"188":1}}],["view",{"2":{"111":2,"150":1,"191":1}}],["viewing",{"2":{"83":1}}],["via",{"0":{"69":1,"70":1,"72":1,"75":1,"76":1,"79":1},"1":{"80":1,"81":1,"82":1,"83":1},"2":{"82":1,"87":1,"114":1,"116":1}}],["visualized",{"2":{"188":1}}],["visually",{"2":{"89":1,"95":1}}],["visual",{"0":{"61":1,"70":1,"124":1},"1":{"62":1,"63":1},"2":{"61":1,"65":1,"70":1,"77":1,"83":1}}],["visit",{"2":{"39":1}}],["video",{"2":{"38":1,"125":1,"126":1,"161":1,"177":1}}],["vitepress",{"2":{"9":1,"12":2,"14":1,"15":2,"17":1,"18":1,"19":1,"21":1}}],["vrchat",{"0":{"191":1},"1":{"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"191":1,"195":3}}],["vrc",{"2":{"105":1,"161":1,"191":1,"194":1,"195":1,"196":1}}],["vr",{"2":{"33":1,"87":2,"92":1}}],["valve",{"2":{"143":2,"152":1}}],["value",{"2":{"53":2,"55":3,"97":1,"98":1,"196":1}}],["values",{"2":{"28":1,"178":1}}],["variant",{"2":{"37":1}}],["variables",{"2":{"20":1}}],["var",{"2":{"20":2}}],["vue3",{"2":{"15":1}}],["vue",{"2":{"15":2}}],["v1",{"2":{"11":2}}],["v14",{"2":{"11":1}}],["v3",{"0":{"97":1,"133":1,"134":1,"135":1,"156":1},"2":{"1":1,"97":2,"116":1,"132":1,"153":1}}],["voltage",{"2":{"126":1,"158":1}}],["volt",{"2":{"1":1,"132":1}}],["v2s",{"0":{"1":1}}],["v2",{"0":{"0":1,"2":1,"3":1,"4":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"4":1,"11":1}}],["tv",{"2":{"156":1}}],["twisted",{"2":{"128":1}}],["twist",{"0":{"128":1},"2":{"126":1}}],["two",{"2":{"35":1,"44":1,"68":1,"126":4,"141":1,"142":1,"152":1,"191":1,"193":1,"196":1}}],["typical",{"2":{"98":1}}],["typically",{"2":{"97":2,"98":2}}],["typing",{"2":{"69":1}}],["types",{"0":{"36":1,"37":1},"2":{"25":1,"33":1,"136":1}}],["type",{"0":{"126":1,"137":1,"138":1},"2":{"25":1,"35":2,"69":1,"136":1,"151":1,"153":1,"193":1,"194":2}}],["target",{"2":{"96":1}}],["tabs",{"2":{"72":1}}],["tab",{"2":{"70":2,"84":1,"185":1}}],["taken",{"2":{"110":1}}],["take",{"2":{"66":1,"84":1,"92":1,"96":1,"118":1,"127":1}}],["tailwindcss",{"2":{"20":2}}],["tundra",{"2":{"121":1,"143":1,"147":1}}],["turn",{"2":{"82":1}}],["turned",{"2":{"32":1}}],["tutorials",{"2":{"64":1}}],["txpower",{"2":{"58":2}}],["txthttp",{"2":{"53":1}}],["treats",{"2":{"82":1}}],["trouble",{"2":{"78":1,"136":1}}],["troubleshooting",{"0":{"47":1,"86":1},"1":{"48":1}}],["training",{"2":{"89":1}}],["transmittion",{"2":{"56":1}}],["transmission",{"2":{"54":1,"56":1}}],["trackable",{"2":{"189":1}}],["tracking",{"0":{"161":1,"178":1},"1":{"162":1},"2":{"105":1,"116":1,"126":1,"147":1,"161":1,"178":1,"185":1,"187":1,"188":1,"189":1,"191":1,"194":2}}],["tracker",{"0":{"74":1,"84":1,"145":1},"1":{"75":1,"76":1,"146":1,"147":1},"2":{"38":1,"60":1,"65":1,"73":1,"78":2,"83":2,"84":1,"87":1,"152":2}}],["trackers",{"2":{"38":1,"82":2,"83":1,"116":1,"121":3,"141":1,"142":1,"143":1}}],["track",{"2":{"30":1,"42":1}}],["try",{"2":{"37":1,"48":2,"56":1,"78":2,"92":1,"113":1,"136":2,"159":1}}],["trigger",{"2":{"25":1,"191":1,"196":1}}],["true",{"2":{"19":1,"196":1}}],["t",{"0":{"195":1},"2":{"25":1,"56":1,"58":1,"75":1,"82":1,"85":1,"86":1,"89":1,"95":2,"96":1,"156":1,"157":1,"180":1,"188":2,"193":2,"195":1}}],["term",{"2":{"89":1,"95":1}}],["terminal",{"2":{"69":2,"85":1}}],["terminology",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"1":1,"132":1,"173":1}}],["tested",{"2":{"46":1,"84":1,"102":1}}],["testing",{"2":{"39":1,"84":1}}],["tests",{"2":{"25":1}}],["test",{"0":{"113":1},"2":{"25":2,"37":1,"52":1,"96":1,"113":1,"136":1}}],["text",{"2":{"19":4,"20":4,"25":1,"28":1,"84":1,"135":2}}],["team",{"2":{"15":1,"66":1,"86":1}}],["temps",{"2":{"156":1}}],["temperamental",{"2":{"142":1}}],["temp",{"2":{"3":2,"156":1}}],["tip",{"2":{"20":1,"36":1,"139":1}}],["title",{"0":{"20":1},"2":{"20":3,"25":1}}],["tin",{"0":{"128":1},"2":{"2":1,"3":1,"133":1,"134":1}}],["times",{"2":{"101":1,"119":1}}],["timem",{"2":{"71":1}}],["time",{"2":{"1":1,"36":1,"44":1,"96":1,"121":1,"123":1,"132":1,"169":1}}],["threshold",{"0":{"180":1},"2":{"188":5}}],["three",{"2":{"152":1}}],["through",{"2":{"83":1,"156":1}}],["those",{"2":{"82":1,"116":1,"193":1}}],["though",{"2":{"28":1,"32":1,"67":1,"150":1}}],["than",{"2":{"56":1,"89":1,"97":1,"98":1,"121":1,"140":1,"142":1,"146":1}}],["that",{"0":{"108":1},"2":{"4":1,"5":1,"20":1,"22":2,"24":6,"25":10,"28":2,"31":1,"32":1,"33":2,"35":1,"37":2,"42":3,"44":1,"48":2,"50":1,"54":1,"55":2,"56":4,"65":1,"66":1,"67":2,"70":1,"72":1,"75":1,"78":3,"82":2,"83":2,"85":2,"89":3,"92":1,"95":3,"96":2,"103":1,"108":2,"110":1,"111":1,"116":1,"118":1,"121":2,"122":1,"130":1,"133":1,"137":1,"140":1,"141":1,"144":1,"149":1,"150":4,"151":1,"152":3,"159":3,"172":1,"180":1,"181":1,"185":2,"187":1,"188":2,"189":1,"191":1,"193":2,"194":2,"195":2}}],["thunder",{"2":{"32":1,"52":1}}],["think",{"2":{"96":1,"156":1,"159":1}}],["thinker",{"2":{"37":1}}],["thingiverse",{"2":{"109":2,"114":1}}],["thing",{"2":{"25":2,"109":1}}],["things",{"0":{"99":1,"100":1,"119":1},"1":{"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"1":1,"19":2,"36":1,"72":1,"121":1,"132":1,"150":1,"180":1}}],["this",{"0":{"27":1,"38":1,"40":1,"88":1,"100":2,"105":1,"108":1,"116":1,"164":1,"187":1,"190":1},"1":{"39":1,"40":1,"93":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"1":4,"5":1,"9":1,"16":1,"18":1,"19":2,"20":3,"24":2,"25":6,"28":2,"30":3,"31":5,"32":3,"33":3,"35":1,"36":3,"37":7,"42":3,"44":1,"50":2,"54":1,"57":1,"59":1,"60":1,"66":4,"67":1,"71":1,"72":1,"75":1,"76":1,"77":1,"78":4,"82":3,"83":1,"84":2,"85":1,"88":1,"89":2,"95":2,"96":9,"97":4,"98":3,"105":1,"116":1,"117":1,"121":4,"125":1,"126":1,"128":1,"132":4,"133":2,"137":3,"138":1,"139":3,"140":1,"142":1,"143":1,"147":1,"150":1,"152":1,"156":1,"157":1,"164":1,"168":1,"172":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"185":1,"188":4,"191":2,"193":1,"194":1,"195":1,"196":1}}],["thermal",{"2":{"96":1}}],["there",{"2":{"68":1,"70":1,"72":2,"75":1,"82":2,"86":1,"93":1,"111":2,"121":1,"122":1,"136":2,"137":1,"139":2,"141":1,"150":1,"159":1,"194":1}}],["theory",{"2":{"92":1}}],["these",{"2":{"20":1,"22":1,"28":1,"54":1,"66":1,"82":1,"86":1,"96":1,"116":1,"126":1}}],["then",{"2":{"14":1,"19":1,"28":2,"31":1,"36":1,"54":1,"66":1,"70":1,"75":1,"76":1,"82":1,"84":1,"85":1,"88":1,"125":1,"126":1,"127":1,"133":1,"156":1,"159":1,"168":1,"172":1,"185":2}}],["they",{"2":{"1":1,"16":1,"83":1,"97":1,"98":2,"123":1,"132":1,"142":2,"147":1,"149":1,"150":1,"156":5,"193":2,"195":1}}],["themselves",{"2":{"96":1}}],["theme",{"2":{"19":1,"20":1}}],["them",{"0":{"128":1,"184":1},"1":{"185":1,"186":1,"187":1,"188":1},"2":{"1":1,"35":1,"64":1,"70":1,"82":1,"83":1,"112":1,"121":1,"123":1,"126":1,"127":1,"128":1,"132":1,"136":4,"156":4,"157":1,"159":1,"193":2,"194":3,"195":1}}],["their",{"2":{"1":1,"82":2,"132":1,"161":1,"187":1}}],["the",{"0":{"4":1,"9":1,"19":1,"26":1,"27":2,"28":1,"45":1,"48":1,"60":1,"64":1,"66":1,"71":1,"72":1,"73":1,"75":1,"84":1,"85":2,"88":1,"106":2,"111":1,"117":1,"118":1,"123":1,"124":1,"125":1,"128":1,"129":1,"130":1,"131":1,"135":1,"152":1,"156":1,"162":1,"163":1,"164":1,"168":1,"169":1,"170":1,"171":2,"172":1,"184":1,"187":2,"194":1,"195":2},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"27":1,"28":1,"29":2,"30":2,"31":2,"32":2,"33":2,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"72":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":2,"93":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":2,"186":2,"187":2,"188":2,"189":1,"190":1},"2":{"1":9,"2":4,"3":5,"4":13,"9":2,"12":4,"14":1,"15":3,"16":2,"17":5,"18":2,"19":9,"20":16,"21":2,"22":3,"24":4,"25":15,"28":18,"30":6,"31":21,"32":5,"33":8,"35":4,"36":6,"37":14,"38":4,"39":3,"40":1,"42":15,"44":15,"45":6,"46":2,"48":12,"50":3,"52":2,"53":5,"54":24,"55":4,"56":17,"57":10,"58":7,"60":1,"61":1,"64":2,"65":2,"66":13,"67":3,"70":4,"71":1,"72":5,"73":2,"75":10,"76":6,"77":4,"78":18,"80":1,"81":5,"82":12,"83":9,"84":12,"85":10,"86":4,"88":2,"89":7,"92":1,"94":3,"95":5,"96":27,"97":8,"98":8,"101":1,"109":2,"110":3,"111":7,"112":1,"113":1,"114":3,"116":1,"117":1,"118":1,"120":1,"121":18,"122":10,"123":3,"124":1,"125":1,"126":3,"127":8,"128":1,"129":3,"130":6,"131":1,"132":9,"133":9,"134":3,"135":11,"136":6,"137":10,"138":6,"139":3,"140":1,"142":1,"143":1,"144":2,"146":1,"147":4,"149":6,"150":8,"151":5,"152":4,"155":2,"156":7,"157":4,"158":1,"159":5,"161":1,"164":1,"167":3,"168":4,"169":5,"171":4,"172":1,"173":2,"174":1,"175":1,"177":2,"178":2,"181":1,"185":4,"187":2,"188":6,"189":8,"191":4,"193":13,"194":16,"195":6,"196":6}}],["toward",{"2":{"135":1}}],["together",{"0":{"128":1},"2":{"126":1,"127":1,"128":2}}],["total",{"2":{"89":1,"193":1}}],["touch",{"2":{"83":1}}],["top",{"2":{"20":1,"130":1,"173":1}}],["tools",{"0":{"158":1},"1":{"159":1},"2":{"32":1}}],["tool",{"2":{"25":1}}],["too",{"2":{"3":1,"54":1,"133":1,"188":2,"191":1}}],["to",{"0":{"1":1,"19":1,"43":1,"45":1,"48":1,"51":1,"74":1,"85":1,"88":2,"99":1,"100":1,"105":2,"106":1,"108":1,"109":2,"119":1,"122":1,"123":2,"124":1,"126":1,"129":1,"130":1,"132":1,"161":1,"164":1,"170":1,"184":1,"194":1},"1":{"44":1,"45":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"75":1,"76":1,"86":1,"93":2,"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"162":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":2,"186":2,"187":2,"188":2,"189":1,"190":1},"2":{"1":3,"2":2,"3":1,"4":1,"12":1,"14":1,"15":2,"16":3,"17":2,"19":13,"20":3,"21":2,"22":2,"24":8,"25":10,"28":19,"30":4,"31":23,"32":2,"33":8,"35":3,"36":4,"37":3,"38":1,"39":1,"42":4,"44":6,"45":4,"46":1,"48":5,"50":2,"52":2,"53":1,"54":14,"55":1,"56":9,"57":3,"58":2,"60":2,"64":3,"65":2,"66":7,"67":1,"68":1,"69":1,"70":1,"71":2,"72":2,"73":2,"75":4,"76":4,"77":1,"78":5,"80":3,"81":5,"82":13,"83":6,"84":2,"85":5,"86":3,"88":1,"89":9,"92":2,"93":1,"95":6,"96":14,"97":6,"98":5,"103":2,"108":1,"109":3,"110":1,"111":4,"112":2,"114":3,"116":1,"117":1,"118":1,"119":2,"121":7,"122":3,"123":2,"124":1,"125":1,"126":2,"127":2,"128":1,"132":3,"133":5,"135":1,"136":8,"137":1,"138":1,"139":5,"140":1,"142":3,"143":1,"147":2,"149":2,"150":2,"151":1,"152":4,"153":3,"155":2,"156":2,"157":1,"159":3,"164":1,"167":4,"169":2,"171":1,"172":1,"177":1,"178":1,"180":1,"181":4,"182":1,"183":1,"188":3,"189":5,"191":7,"193":10,"194":6,"195":4,"196":5}}],["image",{"2":{"121":1,"139":1}}],["implement",{"2":{"54":1}}],["implemented",{"2":{"54":2}}],["improves",{"2":{"25":1}}],["important",{"2":{"25":1,"37":1,"89":1,"95":1,"104":1,"141":1,"189":1}}],["ignored",{"2":{"103":1}}],["io12",{"2":{"130":1}}],["ionizing",{"2":{"96":1}}],["ioo",{"2":{"75":1}}],["icnirp",{"2":{"89":1}}],["icon",{"2":{"70":1,"84":1,"172":1,"194":1}}],["ideal",{"2":{"111":1}}],["ide",{"0":{"65":1},"2":{"65":1}}],["i",{"0":{"39":1,"81":1},"1":{"82":1,"83":1},"2":{"96":2,"108":1,"111":1,"126":1,"130":1,"133":2,"136":1,"143":1,"152":1,"187":1}}],["ip",{"0":{"84":1},"2":{"30":1,"31":2,"42":6,"82":1,"83":3,"177":1,"185":3}}],["ish",{"2":{"130":1}}],["issues",{"2":{"102":1,"121":2,"130":1,"147":1}}],["issue",{"2":{"86":1,"121":1,"195":1}}],["is",{"0":{"35":1,"38":1,"42":1,"50":1,"80":1,"101":1,"187":1},"1":{"39":1,"40":1},"2":{"1":1,"3":1,"4":3,"9":2,"18":1,"20":2,"22":1,"24":9,"25":10,"28":4,"31":2,"32":4,"33":1,"35":2,"36":7,"37":10,"38":2,"42":3,"44":4,"45":1,"46":2,"48":5,"50":2,"52":1,"53":1,"54":2,"65":1,"66":2,"67":1,"72":1,"75":1,"78":4,"80":1,"82":1,"84":1,"88":2,"89":3,"91":1,"92":3,"94":2,"95":3,"96":13,"97":5,"98":6,"109":2,"111":1,"113":1,"121":7,"124":1,"132":1,"135":2,"136":1,"137":4,"139":1,"140":1,"143":1,"150":1,"152":1,"156":3,"157":1,"159":2,"161":2,"164":1,"166":1,"177":1,"179":1,"180":1,"181":1,"185":1,"188":1,"189":4,"194":1,"196":1}}],["invoke",{"2":{"167":1}}],["inwards",{"2":{"135":1,"137":1}}],["injury",{"2":{"96":1}}],["increase",{"2":{"193":1}}],["incomplete",{"0":{"104":1}}],["incoherent",{"2":{"89":1,"96":1}}],["included",{"2":{"150":1}}],["include",{"0":{"108":1},"2":{"157":1}}],["includes",{"2":{"89":1,"95":1}}],["including",{"2":{"94":1,"152":1}}],["infrared",{"2":{"89":1,"96":1}}],["information",{"2":{"33":1,"90":1}}],["info",{"2":{"28":2,"66":1,"130":1}}],["initial",{"2":{"76":1}}],["initially",{"2":{"73":1}}],["inimdnsname",{"2":{"44":1}}],["ini",{"0":{"28":2},"1":{"29":2,"30":2,"31":2,"32":2,"33":2},"2":{"37":1,"44":2,"83":3}}],["indicating",{"2":{"76":1}}],["indicate",{"2":{"25":2}}],["index",{"2":{"19":1,"143":2,"152":1}}],["inspector",{"2":{"193":3,"194":1}}],["inspiration",{"2":{"111":1}}],["instructions",{"2":{"116":1}}],["instead",{"2":{"42":1,"67":1,"72":1}}],["installer",{"0":{"171":1}}],["installed",{"2":{"46":1,"65":1,"66":1,"72":1,"171":1}}],["installing",{"0":{"167":1},"2":{"168":1}}],["install",{"0":{"61":1,"63":1,"64":1,"65":1,"121":1,"166":1,"168":1,"170":1,"171":1},"1":{"62":1,"63":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1},"2":{"12":1,"61":1,"64":1,"65":1,"66":1,"166":1,"167":3,"168":2}}],["installation",{"0":{"12":1},"2":{"68":1}}],["inside",{"2":{"20":1,"149":1,"194":1}}],["integrity",{"2":{"121":1}}],["interact",{"2":{"191":1}}],["interference",{"2":{"121":1,"142":1}}],["interface",{"2":{"81":1,"151":1}}],["international",{"2":{"96":1}}],["intensity",{"2":{"96":1,"97":1,"98":1}}],["intro",{"2":{"19":1}}],["introduction",{"2":{"19":1}}],["into",{"2":{"18":1,"35":1,"67":1,"69":1,"75":2,"78":1,"83":1,"84":1,"85":1,"96":1,"122":1,"123":1,"137":2,"185":1,"187":1,"194":1}}],["input",{"2":{"4":1,"84":1}}],["in",{"0":{"7":1,"70":1,"125":1,"143":1,"187":1,"195":1},"2":{"1":4,"2":1,"3":1,"4":1,"5":1,"12":1,"15":1,"17":1,"18":2,"20":2,"21":1,"24":5,"28":7,"32":1,"33":1,"36":1,"37":1,"42":1,"44":1,"54":2,"55":1,"56":3,"57":1,"64":1,"66":3,"67":1,"69":1,"70":2,"72":1,"73":1,"75":6,"82":4,"83":3,"84":5,"85":1,"86":2,"88":1,"89":4,"92":1,"95":4,"96":4,"97":1,"98":1,"121":3,"122":2,"125":1,"126":2,"130":3,"132":4,"133":2,"134":1,"135":1,"137":2,"139":2,"140":2,"142":1,"144":1,"147":1,"150":2,"152":1,"156":3,"159":3,"168":1,"169":1,"173":1,"177":1,"185":1,"187":1,"188":2,"191":1,"193":6,"194":4,"196":2}}],["if",{"0":{"152":1},"2":{"1":2,"17":1,"18":1,"19":1,"25":1,"28":5,"30":4,"31":3,"33":1,"35":1,"37":2,"42":4,"44":1,"45":1,"46":2,"48":4,"50":1,"53":1,"54":1,"55":2,"56":1,"66":1,"75":1,"78":4,"82":1,"83":1,"85":3,"86":2,"89":1,"92":2,"95":1,"97":2,"98":1,"103":2,"110":1,"121":2,"132":2,"135":2,"136":4,"137":1,"140":1,"142":1,"147":1,"149":1,"150":1,"151":1,"156":5,"159":4,"172":1,"196":1}}],["items",{"0":{"106":1},"2":{"19":1}}],["itself",{"0":{"68":1},"1":{"69":1,"70":1},"2":{"54":2,"84":1,"191":1,"194":1,"196":1}}],["its",{"2":{"4":2,"193":1}}],["it",{"0":{"35":1,"42":1,"43":1,"50":1,"51":1,"80":1,"81":1,"111":1},"1":{"44":1,"45":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"82":1,"83":1},"2":{"1":1,"2":1,"4":2,"9":1,"19":1,"20":1,"24":1,"25":1,"28":4,"32":1,"33":1,"36":2,"37":3,"38":1,"44":2,"52":1,"61":1,"65":1,"66":3,"67":1,"69":2,"70":3,"72":2,"75":6,"76":1,"77":1,"78":1,"80":1,"82":2,"83":2,"84":1,"85":1,"88":1,"89":3,"92":2,"95":3,"96":3,"112":1,"113":1,"114":1,"116":1,"118":1,"121":5,"122":2,"123":2,"125":2,"127":1,"130":2,"132":1,"133":4,"134":1,"136":1,"137":1,"140":1,"141":1,"149":2,"150":1,"152":2,"159":3,"166":1,"169":1,"172":1,"177":1,"178":1,"181":1,"185":1,"188":1,"189":1,"191":2,"193":4,"194":6,"195":2,"196":1}}],["iron",{"2":{"133":2,"158":1}}],["irradiance",{"2":{"96":2}}],["irreversible",{"2":{"89":1,"95":1}}],["ir",{"0":{"0":1,"1":1,"89":1,"95":1,"103":1,"127":1,"128":1,"132":1,"139":1,"150":1,"154":1},"1":{"1":1,"2":1,"3":1,"4":1,"96":1,"155":1,"156":1},"2":{"1":1,"4":1,"89":4,"95":4,"96":2,"132":1,"149":1,"150":2,"153":1,"156":5,"157":1}}],["g0ldjay",{"2":{"116":1}}],["gluing",{"2":{"138":1}}],["glue",{"2":{"112":1,"130":1,"137":2,"138":1,"139":2,"158":2}}],["glass",{"2":{"1":1,"132":1}}],["greeted",{"2":{"172":1}}],["green",{"2":{"84":1,"135":2}}],["greater",{"2":{"142":1}}],["gray",{"2":{"122":2}}],["grab",{"2":{"75":1,"133":1}}],["grows",{"2":{"96":1}}],["ground",{"2":{"1":1,"4":4,"126":1,"127":2,"130":1,"132":1}}],["good",{"0":{"111":1},"2":{"111":2,"113":1,"136":1,"137":1,"140":1,"142":1,"152":1,"161":1,"188":2}}],["got",{"2":{"67":1}}],["go",{"2":{"66":1,"103":1,"109":1,"139":1,"171":1,"173":1}}],["going",{"2":{"36":1,"38":1,"66":1,"118":1}}],["goes",{"2":{"4":1,"66":1,"86":1,"123":1}}],["g",{"2":{"35":2}}],["gauge",{"2":{"153":3}}],["games",{"2":{"33":1,"87":1}}],["gather",{"0":{"120":1},"2":{"1":1,"132":1}}],["ghz",{"0":{"142":1},"2":{"28":1,"142":2}}],["gh",{"2":{"25":1}}],["gui",{"2":{"33":1,"172":1,"178":1}}],["guidelines",{"2":{"89":1,"96":1}}],["guide",{"0":{"22":1,"115":1,"116":1,"164":1,"190":1},"1":{"23":1,"24":1,"25":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"30":1,"67":1,"72":1,"75":1,"78":1,"81":1,"88":1,"116":1,"124":1,"125":1,"147":1,"159":1}}],["gulp",{"2":{"25":1}}],["gesture",{"2":{"194":1}}],["gerber",{"2":{"156":1}}],["gentle",{"2":{"122":1}}],["generic",{"2":{"37":1,"158":2}}],["generated",{"2":{"195":1}}],["generate",{"2":{"25":1}}],["generally",{"2":{"96":1,"137":2}}],["general",{"0":{"24":1}}],["getting",{"0":{"10":1,"173":1},"1":{"11":1,"12":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"19":3,"36":1,"84":1,"88":1,"96":1,"111":1,"136":1,"155":1}}],["getstoredconfig",{"2":{"54":1}}],["gets",{"2":{"4":1,"96":1}}],["get",{"0":{"114":1},"2":{"1":1,"38":1,"46":1,"52":1,"54":6,"64":1,"78":1,"88":1,"96":2,"108":1,"109":1,"113":1,"125":1,"126":1,"132":1,"156":1,"193":1}}],["gt",{"2":{"20":2,"25":2,"30":1,"53":1,"55":6,"72":1,"82":1,"96":3,"195":2}}],["gives",{"2":{"96":1,"111":1}}],["given",{"2":{"55":1,"56":1,"96":1}}],["give",{"0":{"111":1},"2":{"20":1,"96":1,"117":1,"159":1,"169":1,"194":1}}],["github",{"2":{"12":1,"16":1,"66":2,"110":1,"171":1}}],["git",{"0":{"25":1},"2":{"11":1,"12":1,"24":1,"25":6,"66":4,"85":4}}],["gnd",{"2":{"1":1,"130":1,"132":1}}],["pyinstaller",{"2":{"169":1}}],["py",{"2":{"167":1}}],["python",{"0":{"166":1,"168":1},"2":{"166":1,"167":1}}],["people",{"2":{"157":1}}],["permanently",{"2":{"36":1}}],["performs",{"2":{"121":1}}],["performance",{"2":{"25":1,"143":1}}],["perfect",{"2":{"101":1,"113":1}}],["perf",{"2":{"25":1}}],["per",{"2":{"2":1,"127":1,"133":1}}],["photobiological",{"2":{"89":1}}],["purchase",{"2":{"150":1}}],["purchases",{"2":{"140":1}}],["purposes",{"2":{"36":1}}],["pupil",{"2":{"96":3,"111":1,"180":1,"188":1}}],["pull",{"2":{"85":1}}],["putting",{"2":{"137":1}}],["put",{"2":{"83":1,"89":2,"95":2,"111":1,"130":1,"133":1,"156":1,"177":1,"188":1}}],["pc",{"0":{"74":1},"1":{"75":1,"76":1},"2":{"75":2,"76":1,"78":1,"82":1,"84":1}}],["pcbs",{"0":{"4":1,"132":1,"135":1},"2":{"1":1,"4":2,"127":1,"132":1,"135":1,"156":2}}],["pcb",{"0":{"1":1,"2":1,"3":1,"133":1,"134":1},"2":{"1":3,"2":1,"4":1,"132":3,"133":2}}],["pitch",{"2":{"151":1}}],["picture",{"2":{"135":2}}],["piece",{"2":{"127":1,"133":1}}],["pio",{"2":{"69":1,"72":1,"82":1}}],["pinecil",{"2":{"158":1}}],["pin64",{"2":{"158":1}}],["pins",{"2":{"122":1}}],["ping",{"2":{"54":1,"136":1}}],["pin",{"2":{"1":1,"4":5,"129":1,"130":3,"132":1}}],["patreon",{"2":{"156":1}}],["path",{"2":{"66":2}}],["pay",{"2":{"135":1}}],["pad",{"2":{"133":1}}],["pads",{"2":{"2":1,"3":2,"121":2,"133":2,"134":1}}],["pairs",{"2":{"126":1}}],["painful",{"2":{"96":1}}],["past",{"2":{"82":1}}],["pass",{"2":{"56":1,"58":1,"177":1}}],["passed",{"2":{"55":1}}],["password",{"2":{"28":6,"31":4,"56":2,"57":2}}],["panel",{"2":{"70":1,"193":1}}],["parameter",{"2":{"194":2}}],["parameters",{"0":{"192":1,"193":1,"195":1},"1":{"193":1,"194":1},"2":{"162":1,"193":6,"194":1,"196":2}}],["paramaters",{"0":{"162":1}}],["params",{"0":{"55":1,"59":1},"1":{"56":1,"57":1,"58":1},"2":{"55":4}}],["param",{"2":{"53":2,"55":4,"56":2,"57":1,"58":2}}],["part",{"2":{"38":1,"122":3,"189":1}}],["parts",{"0":{"118":1,"140":1,"144":1,"156":1,"158":1},"1":{"141":1,"142":1,"143":1,"144":1,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":2,"152":2,"153":2,"154":2,"155":2,"156":2,"157":1,"158":1,"159":2},"2":{"35":1,"90":1,"112":1,"136":3,"144":1,"156":1}}],["package",{"2":{"46":1,"75":1}}],["packages",{"2":{"12":1}}],["page",{"0":{"17":1,"19":1,"21":1,"100":1,"108":1,"116":1},"1":{"18":1,"19":1,"20":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"17":4,"18":2,"19":7,"20":3,"21":1,"33":1,"82":1,"88":1,"191":1}}],["pages",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1},"2":{"16":2,"17":1,"18":2,"21":1}}],["pricing",{"2":{"156":1}}],["price",{"2":{"146":1}}],["primary",{"2":{"141":1}}],["print",{"0":{"136":1},"1":{"137":1,"138":1},"2":{"113":1,"136":2}}],["printed",{"0":{"157":1},"2":{"109":1,"136":1}}],["printable",{"2":{"92":1}}],["practice",{"2":{"140":1}}],["proximity",{"2":{"142":1}}],["pros",{"2":{"142":1,"143":1}}],["problems",{"2":{"121":1}}],["provides",{"2":{"116":1}}],["provided",{"2":{"81":1}}],["prohurtz",{"0":{"190":1},"2":{"114":1,"136":1,"147":1}}],["protector",{"2":{"109":3}}],["protection",{"2":{"96":1,"149":1}}],["protocol",{"2":{"42":2,"46":1,"87":1}}],["proceed",{"2":{"76":1}}],["procedure",{"2":{"60":1}}],["produce",{"2":{"76":1}}],["programmers",{"2":{"140":1,"147":2}}],["programmer",{"0":{"75":1,"123":1},"2":{"75":4,"78":1,"123":1,"126":1,"146":2,"147":2}}],["progress",{"0":{"7":1},"2":{"5":1}}],["prompts",{"2":{"171":1}}],["prompt",{"2":{"69":1,"168":1,"169":1}}],["proper",{"2":{"147":1}}],["properly",{"2":{"66":1,"96":1}}],["property",{"2":{"19":1}}],["proir",{"2":{"15":1}}],["projects",{"2":{"66":1}}],["project",{"0":{"14":1,"27":1,"66":1,"88":1,"100":1},"1":{"15":1,"93":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"14":1,"22":2,"25":1,"33":1,"39":1,"50":1,"66":1,"82":1,"88":1,"117":1,"168":1}}],["preferably",{"2":{"126":1}}],["prefaced",{"2":{"20":1}}],["precautions",{"2":{"103":1}}],["pressure",{"2":{"137":1}}],["pressing",{"2":{"76":2,"84":1}}],["press",{"2":{"69":1,"77":1,"78":1,"82":2,"83":1,"84":1,"122":1,"185":1,"187":1,"188":1,"189":2}}],["prevent",{"2":{"54":1}}],["previous",{"2":{"25":1,"194":1}}],["prerequisites",{"0":{"11":1,"46":1}}],["prepare",{"0":{"1":1,"124":1,"132":1},"2":{"60":1}}],["plugged",{"2":{"75":1,"78":1}}],["plug",{"0":{"125":1},"2":{"75":1,"84":1}}],["platform",{"2":{"72":1,"87":1}}],["platforms",{"0":{"196":1},"2":{"72":1}}],["platformio",{"0":{"65":1,"67":1,"68":1,"70":1},"1":{"68":1,"69":2,"70":2,"71":1,"72":1},"2":{"33":1,"37":1,"65":1,"66":2,"67":2,"68":1,"70":2,"72":1,"82":1}}],["planned",{"0":{"8":1},"2":{"5":1}}],["placeholder",{"2":{"28":1}}],["place",{"0":{"111":1},"2":{"2":1,"3":1,"89":2,"95":2,"111":1,"134":1,"137":2,"138":1}}],["please",{"0":{"187":1},"2":{"1":1,"16":2,"19":1,"20":2,"33":2,"39":1,"54":1,"66":3,"89":1,"90":1,"92":1,"93":1,"95":1,"103":1,"118":1,"119":1,"122":1,"132":1,"140":1,"156":1,"159":2,"162":1,"166":1}}],["poetry",{"0":{"167":1},"2":{"167":5,"168":2,"169":1}}],["potentially",{"2":{"159":1}}],["potential",{"2":{"89":1,"95":1}}],["port",{"2":{"57":2,"123":1,"143":1,"152":2,"153":1,"187":2,"196":2}}],["ports",{"2":{"30":1,"78":2,"152":1}}],["position",{"2":{"139":1}}],["positive",{"0":{"128":2,"129":1},"2":{"1":2,"126":1,"132":2}}],["possible",{"2":{"89":1,"95":1,"96":1,"111":1,"152":1}}],["postman",{"2":{"32":1}}],["post",{"2":{"32":1,"54":5}}],["point",{"2":{"28":1,"142":2,"183":1,"191":1}}],["powershell",{"2":{"167":1}}],["powering",{"2":{"126":1}}],["powered",{"2":{"82":1,"97":1}}],["power",{"0":{"126":1},"2":{"1":3,"4":3,"54":1,"56":18,"58":14,"83":1,"89":3,"95":2,"96":1,"125":1,"127":2,"132":3,"142":2,"153":3,"156":2,"185":1}}],["swap",{"2":{"150":1}}],["switched",{"2":{"82":2}}],["switching",{"2":{"36":1}}],["switch",{"2":{"35":1,"37":1}}],["slot",{"2":{"194":1}}],["slowly",{"2":{"137":1,"188":1}}],["slightly",{"2":{"127":1}}],["sliding",{"2":{"137":1}}],["slid",{"2":{"122":1}}],["slider",{"2":{"181":1,"188":2}}],["slide",{"2":{"122":1,"123":1}}],["slimevr",{"2":{"66":2,"86":2}}],["smd",{"2":{"156":2}}],["smaller",{"2":{"156":2}}],["small",{"2":{"122":1,"137":1,"146":1,"147":1,"194":1}}],["smol",{"2":{"1":1,"132":1}}],["sketch",{"2":{"116":2}}],["skills",{"2":{"110":1,"136":1,"159":1}}],["skilled",{"2":{"92":1}}],["skip",{"2":{"28":1,"78":1,"85":1}}],["sr",{"2":{"89":1,"96":2,"97":6,"98":6}}],["src",{"2":{"17":1,"18":1,"19":1,"20":1,"21":1,"25":1}}],["synced",{"2":{"193":2}}],["symptoms",{"2":{"89":1,"95":1}}],["system",{"2":{"4":1,"25":1,"60":1}}],["sdk",{"0":{"71":1,"72":1},"1":{"72":1},"2":{"71":1}}],["s3",{"0":{"76":1},"2":{"37":7,"76":1,"146":2,"152":2}}],["say",{"2":{"189":1}}],["satisfactory",{"2":{"113":1}}],["sa",{"2":{"94":1}}],["safer",{"2":{"156":1}}],["safe",{"2":{"89":1,"95":1}}],["safety",{"0":{"89":1,"95":1,"97":1,"98":1},"1":{"96":1},"2":{"89":5,"95":3,"96":2,"97":1,"98":1}}],["saved",{"2":{"85":1,"193":1}}],["save",{"2":{"54":3,"85":1,"137":1,"185":1,"187":1}}],["same",{"2":{"30":1,"42":1,"44":1,"121":1,"127":1}}],["said",{"2":{"28":1}}],["ssids",{"2":{"28":1}}],["ssid",{"2":{"28":5,"56":2}}],["scene",{"2":{"193":1}}],["scenario",{"2":{"96":1,"97":1,"98":1}}],["schematics",{"2":{"156":1}}],["scanning",{"2":{"57":1}}],["scripts",{"2":{"25":1}}],["scopes",{"2":{"25":2}}],["scope",{"2":{"25":1}}],["spot",{"2":{"189":1}}],["spots",{"2":{"89":1,"95":1,"139":2}}],["speaker",{"2":{"126":1}}],["spend",{"2":{"123":1}}],["spec",{"2":{"169":1}}],["specs",{"2":{"103":1}}],["specified",{"2":{"36":1,"139":1}}],["specific",{"2":{"14":1,"35":1,"116":1}}],["special",{"2":{"28":2,"37":1,"105":1,"147":1}}],["sparkfun",{"2":{"64":1}}],["spaces",{"2":{"28":1}}],["space",{"2":{"25":1,"28":1}}],["super",{"2":{"121":1,"141":1}}],["supply",{"2":{"55":1}}],["support",{"0":{"92":1},"1":{"93":1},"2":{"33":1,"37":1,"81":1,"142":1,"146":2,"162":1}}],["supported",{"2":{"28":2,"37":2,"141":1}}],["supports",{"2":{"20":1,"28":1,"31":1,"32":1,"33":1,"146":1,"147":1}}],["sun",{"2":{"96":1,"97":1,"98":1}}],["suffix",{"2":{"82":1,"83":1}}],["suggest",{"2":{"152":1}}],["suggested",{"2":{"78":1}}],["suggestions",{"2":{"54":1}}],["successfully",{"2":{"78":1}}],["successful",{"2":{"78":1}}],["such",{"2":{"25":1,"28":1,"89":1,"95":1,"143":2,"152":1}}],["sure",{"0":{"117":1},"2":{"28":1,"44":1,"48":2,"66":1,"75":1,"78":3,"84":1,"89":1,"103":1,"120":1,"123":1,"125":1,"136":1,"156":1}}],["submenu",{"2":{"194":1}}],["subdir",{"2":{"19":1}}],["sub",{"0":{"18":1},"2":{"18":1}}],["snaps",{"2":{"137":1}}],["snake",{"2":{"15":1}}],["sng",{"2":{"1":1,"132":1}}],["shatter",{"2":{"149":1}}],["shape",{"2":{"96":1}}],["shield",{"0":{"121":1}}],["shipping",{"2":{"119":1}}],["sheets",{"2":{"89":1}}],["shot",{"2":{"159":1}}],["shove",{"2":{"122":1}}],["shortcut",{"2":{"172":1}}],["short",{"2":{"89":1,"95":1,"127":1,"130":1,"152":1,"156":1}}],["shows",{"2":{"121":1,"139":1,"174":1,"175":1,"176":1}}],["show",{"0":{"164":1},"2":{"60":1,"96":1,"108":1,"193":1}}],["shown",{"2":{"37":1}}],["should",{"0":{"27":1,"39":1},"2":{"15":1,"24":4,"36":2,"57":1,"72":1,"76":1,"78":1,"82":1,"96":1,"121":1,"122":1,"133":1,"156":1,"168":1,"169":2,"171":1,"172":2,"188":2,"194":1}}],["shyarn",{"2":{"12":1}}],["sh",{"2":{"12":1}}],["shcd",{"2":{"12":1}}],["shgit",{"2":{"12":1}}],["stock",{"2":{"150":1}}],["stone",{"2":{"140":1}}],["stored",{"2":{"195":1}}],["store",{"2":{"35":2,"56":1}}],["stls",{"2":{"114":1}}],["steamvr",{"2":{"188":1}}],["steradian",{"2":{"96":1}}],["steps",{"2":{"40":1,"66":1,"75":1,"82":2,"85":2,"86":1,"104":1,"108":1,"125":1,"131":1,"194":1}}],["step",{"0":{"1":1,"2":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":2,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"136":1,"171":1,"172":1,"173":1,"184":1,"189":1},"1":{"137":1,"138":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"185":1,"186":1,"187":1,"188":1},"2":{"85":1,"121":1,"124":1,"130":1,"164":1,"188":1,"189":1}}],["stds",{"2":{"89":1}}],["stick",{"2":{"118":1,"133":1}}],["sticking",{"2":{"75":1}}],["still",{"2":{"32":1,"48":1,"76":1,"96":2,"118":1,"122":1}}],["studio",{"0":{"61":1,"70":1,"124":1},"1":{"62":1,"63":1},"2":{"61":1,"65":1,"70":1,"77":1,"83":1}}],["strain",{"2":{"95":1}}],["straight",{"2":{"81":1,"189":1}}],["strip",{"2":{"126":1,"127":1}}],["strive",{"2":{"89":1,"95":1}}],["string",{"2":{"55":1}}],["stream",{"2":{"84":1,"121":1,"125":1}}],["streaming",{"2":{"38":1,"142":1,"147":2}}],["structure",{"0":{"14":1},"1":{"15":1},"2":{"15":1}}],["styles",{"2":{"20":1}}],["style",{"0":{"20":1,"25":1},"2":{"20":3,"24":1,"25":4}}],["stash",{"2":{"85":2}}],["stands",{"2":{"80":1}}],["standard",{"0":{"53":1},"2":{"25":3,"53":1}}],["standards",{"0":{"15":1,"22":1,"23":1},"1":{"23":1,"24":2,"25":2},"2":{"22":2}}],["states",{"2":{"96":1}}],["state",{"2":{"85":1,"194":1}}],["status",{"2":{"39":1,"54":1,"117":1}}],["static",{"2":{"24":1,"42":1}}],["sta",{"2":{"28":2}}],["starting",{"2":{"36":1,"142":1,"173":1}}],["start",{"0":{"99":1,"100":1},"1":{"100":1,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2},"2":{"12":1,"19":1,"142":1,"182":1,"188":1}}],["started",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"19":3,"88":2,"109":1}}],["separate",{"2":{"146":3,"147":2}}],["search",{"2":{"109":1}}],["selects",{"2":{"188":1}}],["select",{"2":{"72":1,"82":3,"83":1,"151":2,"193":1,"194":1}}],["selecting",{"2":{"66":1}}],["sent",{"2":{"196":1}}],["seniorpringles",{"2":{"116":1}}],["sense",{"2":{"37":2,"142":1,"146":1}}],["sends",{"2":{"78":1}}],["send",{"2":{"32":1,"77":1,"114":2}}],["several",{"2":{"37":1}}],["setcamera",{"2":{"54":1}}],["setdevice",{"0":{"57":1},"2":{"54":1}}],["sets",{"2":{"54":3}}],["settxpower",{"0":{"58":1},"2":{"54":1}}],["setting",{"0":{"60":1,"188":1,"191":1,"192":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"192":1,"193":2,"194":2,"195":1,"196":1},"2":{"28":1,"44":1,"124":1}}],["settings",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1},"2":{"28":1,"54":2,"55":1,"174":1,"175":1,"176":1,"196":1}}],["setups",{"2":{"143":1}}],["setup",{"0":{"141":1},"1":{"142":1,"143":1},"2":{"36":1,"143":1,"144":1,"161":1,"162":1,"171":1,"191":1}}],["set",{"0":{"105":1,"161":1},"1":{"162":1},"2":{"28":5,"31":6,"44":1,"55":1,"57":1,"58":1,"75":1,"76":1,"84":1,"96":1,"124":1,"140":1,"188":1}}],["semi",{"2":{"25":1}}],["semantic",{"2":{"25":1}}],["seems",{"2":{"118":1}}],["seedstudio",{"2":{"37":2,"146":1}}],["see",{"0":{"27":1,"190":1},"2":{"16":1,"36":1,"72":1,"82":1,"89":1,"92":1,"93":1,"122":1,"147":1,"172":1,"188":4,"194":1}}],["secure",{"2":{"136":1}}],["sections",{"2":{"70":1}}],["section",{"2":{"16":1,"44":1,"59":1,"70":1,"72":1,"78":1,"85":1,"136":1,"193":1,"194":3}}],["second",{"2":{"4":1,"38":1,"121":1}}],["serial",{"0":{"143":1},"2":{"83":1,"84":1}}],["series",{"2":{"1":1,"132":1}}],["services",{"2":{"114":1}}],["service",{"2":{"57":4}}],["server",{"2":{"12":1}}],["size",{"2":{"127":1,"146":1,"152":1}}],["silver",{"2":{"126":1}}],["similar",{"2":{"82":1,"114":1}}],["simple",{"2":{"75":1,"108":1,"123":1}}],["simply",{"2":{"69":1,"121":1,"194":1,"195":1}}],["signal",{"2":{"121":1}}],["sign",{"2":{"56":1,"58":1}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"20":2,"24":3}}],["sidebar",{"0":{"19":1},"2":{"19":4,"70":1,"72":1}}],["side",{"0":{"27":1},"2":{"1":2,"2":1,"3":1,"70":1,"72":1,"96":1,"132":2}}],["single",{"2":{"1":1,"132":1}}],["since",{"2":{"1":1,"44":1,"82":1,"132":1,"167":1}}],["sources",{"2":{"89":1}}],["source",{"0":{"156":1,"163":1,"164":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1},"2":{"87":1,"96":5,"164":1}}],["sound",{"2":{"76":1}}],["software",{"0":{"101":1,"184":1},"1":{"185":1,"186":1,"187":1,"188":1},"2":{"78":1,"84":1,"94":1,"189":1}}],["socket",{"2":{"75":1}}],["social",{"2":{"33":1,"87":1}}],["solve",{"2":{"121":3}}],["solution",{"2":{"39":1,"121":1,"159":1}}],["soldered",{"2":{"156":1}}],["solderless",{"2":{"116":2}}],["soldering",{"2":{"3":1,"123":1,"133":1,"143":1,"147":1,"155":1,"158":1}}],["solder",{"0":{"1":1,"2":1,"3":1,"129":1,"130":1,"132":1,"133":1,"134":1},"2":{"1":1,"2":2,"3":2,"116":1,"121":1,"128":1,"129":1,"132":1,"133":4,"134":2,"155":3,"156":1,"158":2}}],["soon",{"2":{"33":1,"59":1,"81":1}}],["so",{"2":{"20":1,"32":1,"35":1,"36":1,"50":1,"75":1,"82":1,"83":1,"85":2,"96":1,"97":1,"98":1,"102":1,"108":1,"136":1,"149":2,"152":1,"159":2,"189":1}}],["sometimes",{"2":{"67":1,"195":1}}],["something",{"0":{"27":1},"2":{"95":1,"156":1,"188":1}}],["some",{"2":{"1":1,"25":1,"30":1,"32":1,"36":1,"37":1,"64":1,"66":1,"67":1,"75":1,"78":1,"86":1,"96":1,"105":1,"108":2,"121":2,"132":1,"136":1,"139":1,"140":1,"147":1,"152":1,"153":1,"157":2,"173":1}}],["s",{"2":{"1":1,"25":2,"37":2,"52":1,"64":1,"67":1,"72":1,"75":1,"96":2,"105":1,"109":1,"111":1,"112":1,"116":1,"117":1,"121":1,"123":2,"130":1,"132":1,"141":1,"149":1,"150":1,"151":2,"152":1,"173":1,"185":1,"187":1,"188":1,"191":1,"193":2,"194":3,"195":2}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.ecff9080.js b/assets/chunks/@localSearchIndexroot.ecff9080.js new file mode 100644 index 0000000..ce765c1 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.ecff9080.js @@ -0,0 +1 @@ +const e=`{"documentCount":199,"nextId":199,"documentIds":{"0":"/archive/fox_ir_v2_build_instructions#fox-ir-v2-buil-dinstructions","1":"/archive/fox_ir_v2_build_instructions#step-15-prepare-to-solder-ir-led-pcb-v2s","2":"/archive/fox_ir_v2_build_instructions#step-17-solder-resistors-on-pcb-v2","3":"/archive/fox_ir_v2_build_instructions#solder-leds-on-pcb-v2","4":"/archive/fox_ir_v2_build_instructions#wire-up-the-pcbs-v2","5":"/dev_roadmap#eyetrackvr-development-roadmap","6":"/dev_roadmap#completed","7":"/dev_roadmap#in-progress","8":"/dev_roadmap#planned","9":"/development/docs/dev_docs#development-documentation-for-the-eyetrackvr-docs-site","10":"/development/docs/dev_docs#getting-started","11":"/development/docs/dev_docs#prerequisites","12":"/development/docs/dev_docs#installation","13":"/development/docs/dev_docs#contributing","14":"/development/docs/dev_docs#project-structure","15":"/development/docs/dev_docs#standards","16":"/development/docs/pages#pages","17":"/development/docs/pages#adding-a-page","18":"/development/docs/pages#sub-directories","19":"/development/docs/pages#adding-a-page-to-the-sidebar","20":"/development/docs/pages#title-style","21":"/development/docs/pages#editing-a-page","22":"/development/docs/standards#standards-guide","23":"/development/docs/standards#code-standards","24":"/development/docs/standards#general","25":"/development/docs/standards#git-commit-style","26":"/firmware_guide/configure_firmware#configuring-the-firmware","27":"/firmware_guide/configure_firmware#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","28":"/firmware_guide/configure_firmware#open-the-ini-user-config-ini-file","29":"/firmware_guide/configure_firmware#additional-configuration","30":"/firmware_guide/configure_firmware#mdns","31":"/firmware_guide/configure_firmware#ota","32":"/firmware_guide/configure_firmware#rest-api","33":"/firmware_guide/configure_firmware#environments","34":"/firmware_guide/environments#firmware-environments","35":"/firmware_guide/environments#what-is-it","36":"/firmware_guide/environments#build-types","37":"/firmware_guide/environments#board-types","38":"/firmware_guide/firmware#what-is-this","39":"/firmware_guide/firmware#what-should-i-download-and-where","40":"/firmware_guide/flashing_tool#firmware-flashing-tool","41":"/firmware_guide/flashing_tool#what-is-this","42":"/firmware_guide/flashing_tool#environments","43":"/firmware_guide/mdns#mdns","44":"/firmware_guide/mdns#what-is-it","45":"/firmware_guide/mdns#how-to-use-it","46":"/firmware_guide/mdns#enable-mdns","47":"/firmware_guide/mdns#connect-to-the-device","48":"/firmware_guide/mdns#prerequisites-bonjour","49":"/firmware_guide/mdns#troubleshooting","50":"/firmware_guide/mdns#can-not-connect-to-the-device","51":"/firmware_guide/rest_api#rest-api","52":"/firmware_guide/rest_api#what-is-it","53":"/firmware_guide/rest_api#how-to-use-it","54":"/firmware_guide/rest_api#rest-api-client","55":"/firmware_guide/rest_api#standard","56":"/firmware_guide/rest_api#endpoints","57":"/firmware_guide/rest_api#params","58":"/firmware_guide/rest_api#wifi","59":"/firmware_guide/rest_api#setdevice","60":"/firmware_guide/rest_api#settxpower","61":"/firmware_guide/rest_api#camera-params","62":"/firmware_guide/setup_vscode#setting-up-the-environment","63":"/firmware_guide/setup_vscode#_1-install-visual-studio-code","64":"/firmware_guide/setup_vscode#download","65":"/firmware_guide/setup_vscode#install","66":"/firmware_guide/setup_vscode#_2-install-the-drivers","67":"/firmware_guide/setup_vscode#_3-install-platformio-ide","68":"/firmware_guide/setup_vscode#_4-clone-the-firmware-project","69":"/firmware_guide/update_platformio#updating-platformio","70":"/firmware_guide/update_platformio#updating-platformio-itself","71":"/firmware_guide/update_platformio#via-cli","72":"/firmware_guide/update_platformio#via-platformio-in-visual-studio-code","73":"/firmware_guide/update_platformio#upgrading-the-sdk","74":"/firmware_guide/update_platformio#upgrading-the-sdk-via-vsc","75":"/firmware_guide/upload_and_update_firmware#building-and-uploading-the-firmware-manually","76":"/firmware_guide/upload_and_update_firmware#_1-connect-your-tracker-to-your-pc","77":"/firmware_guide/upload_and_update_firmware#option-1-connect-esp32-cam-via-the-programmer","78":"/firmware_guide/upload_and_update_firmware#option-2-connect-esp32-s3-via-usb-c-directly","79":"/firmware_guide/upload_and_update_firmware#_2-build-your-firmware","80":"/firmware_guide/upload_and_update_firmware#_3-upload-your-firmware","81":"/firmware_guide/upload_and_update_firmware#uploading-via-ota","82":"/firmware_guide/upload_and_update_firmware#what-is-it","83":"/firmware_guide/upload_and_update_firmware#how-do-i-use-it","84":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-1-1-0-and-up","85":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-of-1-0-0-and-under","86":"/firmware_guide/upload_and_update_firmware#finding-the-ip-address-of-your-tracker","87":"/firmware_guide/upload_and_update_firmware#updating-the-firmware-to-the-newest-version","88":"/firmware_guide/upload_and_update_firmware#troubleshooting","89":"/getting_started/intro#eyetrackvr","90":"/getting_started/intro#welcome-to-the-eyetrackvr-documentation-website-here-you-will-find-all-avalable-documentation-regauding-building-development-and-other-resources-related-to-this-project","91":"/getting_started/intro#about-ir-emitter-safety","92":"/getting_started/intro#hardware","93":"/getting_started/intro#firmware","94":"/getting_started/intro#headset-support","95":"/getting_started/intro#contact","96":"/getting_started/intro#licenses","97":"/getting_started/led_safety#about-ir-emitter-safety","98":"/getting_started/led_safety#what-we-care-about","99":"/getting_started/led_safety#v3-hardware-safety-outline-and-exposure-numbers","100":"/getting_started/led_safety#v4-hardware-safety-outline-and-exposure-numbers","101":"/getting_started/things_to_know#things-to-know-before-you-start","102":"/getting_started/things_to_know#this-page-will-be-an-overview-of-things-to-know-and-understand-before-you-start-this-project","103":"/getting_started/things_to_know#software-is-not-final","104":"/getting_started/things_to_know#firmware-may-have-user-difficulties","105":"/getting_started/things_to_know#ir-emitters-are-dangerous","106":"/getting_started/things_to_know#documentation-may-be-incomplete","107":"/getting_started/things_to_know#you-will-need-to-set-up-your-avatar-to-use-this","108":"/getting_started/things_to_know#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","109":"/how_to_build/creating_your_own_mount#creating-your-own-mount","110":"/how_to_build/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","111":"/how_to_build/creating_your_own_mount#step-1-find-a-way-to-mount-to-your-headsets-lens","112":"/how_to_build/creating_your_own_mount#step-2-find-a-camera-mount","113":"/how_to_build/creating_your_own_mount#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","114":"/how_to_build/creating_your_own_mount#step-4-mount-your-leds","115":"/how_to_build/creating_your_own_mount#step-5-test-everything","116":"/how_to_build/creating_your_own_mount#step-6-get-your-mounts-listed","117":"/how_to_build/full_build#build-guide","118":"/how_to_build/full_build#this-page-will-contain-a-step-by-step-assembly-guide","119":"/how_to_build/full_build#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","120":"/how_to_build/full_build#step-2-order-all-the-parts-listed-on-our-parts-list","121":"/how_to_build/full_build#step-3-wait-for-things-to-arrive","122":"/how_to_build/full_build#step-4-gather-up-all-of-your-hardware","123":"/how_to_build/full_build#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","124":"/how_to_build/full_build#step-6-attach-cameras-to-esps","125":"/how_to_build/full_build#step-7-connect-esp-to-the-programmer-to-flash","126":"/how_to_build/full_build#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","127":"/how_to_build/full_build#step-9-plug-in-your-esp-and-flash-the-firmware","128":"/how_to_build/full_build#step-10-connect-your-power-wires-to-a-usb-type-a-board","129":"/how_to_build/full_build#step-11-cut-wires-for-ir-leds","130":"/how_to_build/full_build#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","131":"/how_to_build/full_build#step-13-solder-the-positive-wire-to-esp","132":"/how_to_build/full_build#step-14-solder-the-negative-wire-to-esp","133":"/how_to_build/full_build#step-15-wire-up-the-2nd-esp","134":"/how_to_build/full_build#step-16-prepare-to-solder-ir-led-pcbs","135":"/how_to_build/full_build#step-18-solder-resistors-on-pcb-v3","136":"/how_to_build/full_build#solder-leds-on-pcb-v3","137":"/how_to_build/full_build#wire-up-the-pcbs-v3","138":"/how_to_build/full_build#step-19-3d-print-mounts","139":"/how_to_build/full_build#type-1","140":"/how_to_build/full_build#type-2","141":"/how_to_build/full_build#ir-led-mounting","142":"/how_to_build/parts_list#parts-list","143":"/how_to_build/parts_list#esp-setup-options","144":"/how_to_build/parts_list#option-1-wireless-over-wifi-2-4-ghz","145":"/how_to_build/parts_list#option-2-wired-over-usb-serial-in-beta","146":"/how_to_build/parts_list#required-parts","147":"/how_to_build/parts_list#tracker-boards","148":"/how_to_build/parts_list#recommended","149":"/how_to_build/parts_list#a-cheaper-wireless-only-alternative","150":"/how_to_build/parts_list#cameras","151":"/how_to_build/parts_list#camera-modules","152":"/how_to_build/parts_list#_2x-ov2640-160°-fov-ir-night-vers-75mm-850nm","153":"/how_to_build/parts_list#optional-ribbon-extensions","154":"/how_to_build/parts_list#usb-hubs-for-if-you-are-building-the-wired-version","155":"/how_to_build/parts_list#wires-and-adapters","156":"/how_to_build/parts_list#ir-emitters","157":"/how_to_build/parts_list#recommended-1","158":"/how_to_build/parts_list#alternatively-you-can-source-the-parts-for-v3-yourself","159":"/how_to_build/parts_list#_3d-printed-mounts","160":"/how_to_build/parts_list#misc-parts-tools","161":"/how_to_build/parts_list#other-headsets","162":"/misc/faq#frequently-asked-questions","163":"/misc/vrc_avatar_setup#how-to-set-up-your-avatar-for-eye-tracking","164":"/misc/vrc_avatar_setup#we-currently-use-the-following-paramaters","165":"/software_guide/build_software#build-the-app-from-source","166":"/software_guide/build_software#this-guide-will-show-how-to-build-the-app-from-source","167":"/software_guide/build_software#requirements","168":"/software_guide/build_software#install-python","169":"/software_guide/build_software#installing-poetry","170":"/software_guide/build_software#install-the-required-python-modules","171":"/software_guide/build_software#build-the-app","172":"/software_guide/eyetrackvr_app_guide#how-to-install-run-and-adjust-the-eyetrackvr-app","173":"/software_guide/eyetrackvr_app_guide#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","174":"/software_guide/eyetrackvr_app_guide#step-2-run-the-eyetrackvr-app","175":"/software_guide/eyetrackvr_app_guide#step-3-getting-familiar-with-settings-and-terminology","176":"/software_guide/eyetrackvr_app_guide#right-eye","177":"/software_guide/eyetrackvr_app_guide#left-eye","178":"/software_guide/eyetrackvr_app_guide#both-eyes","179":"/software_guide/eyetrackvr_app_guide#camera-address","180":"/software_guide/eyetrackvr_app_guide#tracking-mode","181":"/software_guide/eyetrackvr_app_guide#cropping-mode","182":"/software_guide/eyetrackvr_app_guide#threshold","183":"/software_guide/eyetrackvr_app_guide#rotation","184":"/software_guide/eyetrackvr_app_guide#restart-calibrationn","185":"/software_guide/eyetrackvr_app_guide#recenter-eye","186":"/software_guide/eyetrackvr_app_guide#step-4-adding-your-cameras-to-the-software-and-configuring-them","187":"/software_guide/eyetrackvr_app_guide#wireless-configuration","188":"/software_guide/eyetrackvr_app_guide#wired-configuration-experimental","189":"/software_guide/eyetrackvr_app_guide#note-this-is-a-beta-app-feature-only-please-use-the-latest-open-beta-in-the-discord","190":"/software_guide/eyetrackvr_app_guide#setting-up-roi","191":"/software_guide/eyetrackvr_app_guide#step-5-calibrating-your-eyes","192":"/software_guide/eyetrackvr_app_guide#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","193":"/software_guide/osc_setup#setting-up-recalibration-and-recentering-from-vrchat","194":"/software_guide/osc_setup#setting-up-your-parameters","195":"/software_guide/osc_setup#adding-parameters","196":"/software_guide/osc_setup#adding-buttons-to-the-menu","197":"/software_guide/osc_setup#reseting-the-osc-config-in-case-the-parameters-don-t-work","198":"/software_guide/osc_setup#other-platforms"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[9,5,86],"2":[7,5,28],"3":[5,5,31],"4":[5,5,45],"5":[3,1,15],"6":[1,3,1],"7":[2,3,1],"8":[1,3,1],"9":[7,1,13],"10":[2,7,1],"11":[1,9,19],"12":[1,9,32],"13":[1,7,1],"14":[2,8,15],"15":[1,10,41],"16":[1,1,33],"17":[3,1,34],"18":[2,4,37],"19":[6,4,63],"20":[2,4,96],"21":[3,1,18],"22":[2,1,19],"23":[2,2,1],"24":[1,3,43],"25":[3,3,160],"26":[3,1,1],"27":[14,3,1],"28":[6,3,122],"29":[2,8,1],"30":[1,10,51],"31":[1,10,67],"32":[2,10,68],"33":[1,10,44],"34":[2,1,1],"35":[4,2,55],"36":[2,2,81],"37":[2,2,113],"38":[4,1,41],"39":[7,4,87],"40":[3,1,1],"41":[4,3,68],"42":[1,3,44],"43":[1,1,1],"44":[4,1,45],"45":[4,1,1],"46":[2,5,70],"47":[4,5,22],"48":[2,1,33],"49":[1,1,1],"50":[6,2,22],"51":[2,1,1],"52":[4,2,41],"53":[4,2,1],"54":[3,6,39],"55":[1,6,36],"56":[1,6,118],"57":[1,6,54],"58":[2,7,106],"59":[2,7,40],"60":[2,7,57],"61":[2,6,12],"62":[4,1,15],"63":[5,4,10],"64":[1,9,1],"65":[1,9,1],"66":[4,4,29],"67":[4,4,28],"68":[5,4,110],"69":[2,1,46],"70":[3,2,10],"71":[2,4,29],"72":[6,4,53],"73":[3,2,13],"74":[5,5,65],"75":[6,1,27],"76":[6,6,1],"77":[8,12,69],"78":[9,12,52],"79":[4,6,22],"80":[4,6,105],"81":[3,6,1],"82":[4,9,21],"83":[6,9,52],"84":[8,15,134],"85":[9,15,125],"86":[7,6,69],"87":[6,1,83],"88":[1,6,40],"89":[1,1,16],"90":[22,2,27],"91":[4,1,167],"92":[1,1,13],"93":[1,1,11],"94":[2,1,54],"95":[1,25,16],"96":[1,1,19],"97":[4,1,131],"98":[5,5,209],"99":[8,1,105],"100":[8,1,97],"101":[6,1,1],"102":[17,6,1],"103":[4,23,29],"104":[5,23,13],"105":[4,23,40],"106":[4,23,6],"107":[10,23,29],"108":[10,23,1],"109":[4,1,1],"110":[25,4,29],"111":[10,4,43],"112":[6,4,32],"113":[13,4,48],"114":[5,4,28],"115":[4,4,24],"116":[6,4,25],"117":[2,1,1],"118":[9,2,53],"119":[8,2,18],"120":[9,2,25],"121":[7,2,20],"122":[8,2,9],"123":[13,2,124],"124":[6,2,69],"125":[8,2,35],"126":[12,2,18],"127":[10,2,35],"128":[12,2,67],"129":[7,2,59],"130":[14,2,15],"131":[8,2,12],"132":[8,2,48],"133":[7,2,9],"134":[8,2,87],"135":[7,2,65],"136":[5,2,18],"137":[5,2,28],"138":[5,2,84],"139":[2,7,59],"140":[2,7,17],"141":[3,2,49],"142":[2,1,48],"143":[4,2,32],"144":[8,6,81],"145":[9,6,58],"146":[2,2,12],"147":[3,4,1],"148":[1,7,45],"149":[6,7,77],"150":[1,4,1],"151":[3,5,51],"152":[10,5,69],"153":[4,5,56],"154":[10,4,79],"155":[3,4,38],"156":[2,4,1],"157":[2,6,22],"158":[10,6,136],"159":[3,2,41],"160":[3,2,33],"161":[2,5,69],"162":[3,1,1],"163":[10,1,22],"164":[6,10,17],"165":[5,1,1],"166":[11,5,17],"167":[1,5,1],"168":[2,5,15],"169":[2,5,45],"170":[5,5,25],"171":[3,5,30],"172":[10,1,1],"173":[9,10,19],"174":[6,10,33],"175":[8,10,17],"176":[2,16,9],"177":[2,16,9],"178":[2,16,7],"179":[2,16,30],"180":[2,16,12],"181":[2,16,10],"182":[1,16,15],"183":[1,16,23],"184":[2,16,16],"185":[2,16,13],"186":[11,10,1],"187":[2,17,49],"188":[4,17,1],"189":[16,21,32],"190":[3,17,94],"191":[5,10,66],"192":[11,10,1],"193":[8,1,57],"194":[4,8,1],"195":[2,9,84],"196":[5,9,116],"197":[10,8,52],"198":[2,8,49]},"averageFieldLength":[4.8090452261306496,5.809045226130656,39.055276381909536],"storedFields":{"0":{"title":"Fox IR V2 Buil dInstructions","titles":[]},"1":{"title":"Step 15: Prepare to solder IR LED PCB V2s","titles":["Fox IR V2 Buil dInstructions"]},"2":{"title":"Step 17: Solder resistors on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"3":{"title":"Solder LEDs on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"4":{"title":"Wire up the PCBs V2","titles":["Fox IR V2 Buil dInstructions"]},"5":{"title":"EyeTrackVR Development Roadmap","titles":[]},"6":{"title":"Completed","titles":["EyeTrackVR Development Roadmap"]},"7":{"title":"In Progress","titles":["EyeTrackVR Development Roadmap"]},"8":{"title":"Planned","titles":["EyeTrackVR Development Roadmap"]},"9":{"title":"Development Documentation for the EyeTrackVR Docs Site","titles":[]},"10":{"title":"Getting Started","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"11":{"title":"Prerequisites","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"12":{"title":"Installation","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"13":{"title":"Contributing","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"14":{"title":"Project Structure","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing"]},"15":{"title":"Standards","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing","Project Structure"]},"16":{"title":"Pages","titles":[]},"17":{"title":"Adding a Page","titles":["Pages"]},"18":{"title":"Sub-directories","titles":["Pages","Adding a Page"]},"19":{"title":"Adding a Page to the Sidebar","titles":["Pages","Adding a Page"]},"20":{"title":"Title Style","titles":["Pages","Adding a Page"]},"21":{"title":"Editing a Page","titles":["Pages"]},"22":{"title":"Standards Guide","titles":[]},"23":{"title":"Code Standards","titles":["Standards Guide"]},"24":{"title":"General","titles":["Standards Guide","Code Standards"]},"25":{"title":"Git Commit Style","titles":["Standards Guide","Code Standards"]},"26":{"title":"Configuring the firmware","titles":[]},"27":{"title":"Once you have opened the project, you should see something on the left side like this","titles":["Configuring the firmware"]},"28":{"title":"Open the ini/user_config.ini file","titles":["Configuring the firmware"]},"29":{"title":"Additional configuration","titles":["Configuring the firmware","Open the ini/user_config.ini file"]},"30":{"title":"mDNS","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"31":{"title":"OTA","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"32":{"title":"REST API","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"33":{"title":"Environments","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"34":{"title":"Firmware Environments","titles":[]},"35":{"title":"What is it?","titles":["Firmware Environments"]},"36":{"title":"Build Types","titles":["Firmware Environments"]},"37":{"title":"Board Types","titles":["Firmware Environments"]},"38":{"title":"What is this?","titles":[]},"39":{"title":"What should I download and where?","titles":["What is this?"]},"40":{"title":"Firmware Flashing Tool","titles":[]},"41":{"title":"What is this?","titles":["Firmware Flashing Tool"]},"42":{"title":"Environments","titles":["Firmware Flashing Tool"]},"43":{"title":"MDNS","titles":[]},"44":{"title":"What is it?","titles":["MDNS"]},"45":{"title":"How to use it","titles":["MDNS"]},"46":{"title":"Enable mDNS","titles":["MDNS","How to use it"]},"47":{"title":"Connect to the device","titles":["MDNS","How to use it"]},"48":{"title":"Prerequisites Bonjour","titles":["MDNS"]},"49":{"title":"Troubleshooting","titles":["MDNS"]},"50":{"title":"Can not connect to the device","titles":["MDNS","Troubleshooting"]},"51":{"title":"REST API","titles":[]},"52":{"title":"What is it?","titles":["REST API"]},"53":{"title":"How to use it","titles":["REST API"]},"54":{"title":"REST API Client","titles":["REST API","How to use it"]},"55":{"title":"Standard","titles":["REST API","How to use it"]},"56":{"title":"Endpoints","titles":["REST API","How to use it"]},"57":{"title":"Params","titles":["REST API","How to use it"]},"58":{"title":"/wifi","titles":["REST API","How to use it","Params"]},"59":{"title":"/setDevice","titles":["REST API","How to use it","Params"]},"60":{"title":"/setTxPower","titles":["REST API","How to use it","Params"]},"61":{"title":"Camera Params","titles":["REST API","How to use it"]},"62":{"title":"Setting up the environment","titles":[]},"63":{"title":"1. Install Visual Studio Code","titles":["Setting up the environment"]},"64":{"title":"Download","titles":["Setting up the environment","1. Install Visual Studio Code"]},"65":{"title":"Install","titles":["Setting up the environment","1. Install Visual Studio Code"]},"66":{"title":"2. Install the drivers","titles":["Setting up the environment"]},"67":{"title":"3. Install PlatformIO IDE","titles":["Setting up the environment"]},"68":{"title":"4. Clone the firmware project","titles":["Setting up the environment"]},"69":{"title":"Updating Platformio","titles":[]},"70":{"title":"Updating PlatformIO itself","titles":["Updating Platformio"]},"71":{"title":"Via CLI","titles":["Updating Platformio","Updating PlatformIO itself"]},"72":{"title":"Via PlatformIO in Visual Studio Code","titles":["Updating Platformio","Updating PlatformIO itself"]},"73":{"title":"Upgrading the SDK","titles":["Updating Platformio"]},"74":{"title":"Upgrading the SDK via VSC","titles":["Updating Platformio","Upgrading the SDK"]},"75":{"title":"Building and uploading the firmware manually","titles":[]},"76":{"title":"1. Connect your tracker to your PC","titles":["Building and uploading the firmware manually"]},"77":{"title":"Option 1: Connect ESP32-CAM via the programmer","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"78":{"title":"Option 2: Connect ESP32-S3 via USB-C directly","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"79":{"title":"2. Build your firmware","titles":["Building and uploading the firmware manually"]},"80":{"title":"3. Upload your firmware","titles":["Building and uploading the firmware manually"]},"81":{"title":"Uploading via OTA","titles":["Building and uploading the firmware manually"]},"82":{"title":"What is it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"83":{"title":"How do I use it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"84":{"title":"For firmware versions 1.1.0 and up:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"85":{"title":"For firmware versions of 1.0.0 and under:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"86":{"title":"Finding the IP address of your tracker","titles":["Building and uploading the firmware manually"]},"87":{"title":"Updating the firmware to the newest version","titles":[]},"88":{"title":"Troubleshooting","titles":["Updating the firmware to the newest version"]},"89":{"title":"EyeTrackVR","titles":[]},"90":{"title":"Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.","titles":["EyeTrackVR",null]},"91":{"title":"About IR Emitter Safety","titles":["EyeTrackVR"]},"92":{"title":"Hardware","titles":["EyeTrackVR"]},"93":{"title":"Firmware","titles":["EyeTrackVR"]},"94":{"title":"Headset support","titles":["EyeTrackVR"]},"95":{"title":"Contact","titles":["EyeTrackVR","Headset support","Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project."]},"96":{"title":"Licenses","titles":[]},"97":{"title":"About IR Emitter Safety","titles":[null]},"98":{"title":"What we care about:","titles":[null,"About IR Emitter Safety"]},"99":{"title":"V3 Hardware Safety Outline and Exposure Numbers:","titles":[]},"100":{"title":"V4 Hardware Safety Outline and Exposure Numbers:","titles":[]},"101":{"title":"Things To Know Before You Start","titles":[]},"102":{"title":"This page will be an overview of things to know and understand before you start this project","titles":["Things To Know Before You Start"]},"103":{"title":"Software is not final","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"104":{"title":"Firmware may have user difficulties","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"105":{"title":"IR emitters are dangerous","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"106":{"title":"Documentation may be incomplete","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"107":{"title":"You will need to set up your avatar to use this","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"108":{"title":"Once you have acknowledged the items above, move on to the","titles":["Things To Know Before You Start","This page will be an overview of things to know and understand before you start this project"]},"109":{"title":"Creating Your Own Mount","titles":[]},"110":{"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","titles":["Creating Your Own Mount"]},"111":{"title":"Step 1: Find a way to mount to your headsets lens","titles":["Creating Your Own Mount"]},"112":{"title":"Step 2: Find a camera mount","titles":["Creating Your Own Mount"]},"113":{"title":"Step 3: Place the camera mount where it will give a good camera angle","titles":["Creating Your Own Mount"]},"114":{"title":"Step 4: Mount your LEDs","titles":["Creating Your Own Mount"]},"115":{"title":"Step 5: Test everything","titles":["Creating Your Own Mount"]},"116":{"title":"Step 6: Get your mounts listed","titles":["Creating Your Own Mount"]},"117":{"title":"Build Guide","titles":[]},"118":{"title":"This page will contain a step-by-step assembly guide","titles":["Build Guide"]},"119":{"title":"Step 1: Make sure your have read the","titles":["Build Guide"]},"120":{"title":"Step 2: Order all the parts listed on our","titles":["Build Guide"]},"121":{"title":"Step 3: Wait for things to arrive","titles":["Build Guide"]},"122":{"title":"Step 4: Gather up all of your hardware","titles":["Build Guide"]},"123":{"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","titles":["Build Guide"]},"124":{"title":"Step 6: Attach cameras to ESPs","titles":["Build Guide"]},"125":{"title":"Step 7: Connect ESP to the programmer to flash","titles":["Build Guide"]},"126":{"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","titles":["Build Guide"]},"127":{"title":"Step 9: Plug in your ESP and flash the firmware","titles":["Build Guide"]},"128":{"title":"Step 10: Connect your power wires to a USB Type-A board","titles":["Build Guide"]},"129":{"title":"Step 11: Cut wires for IR LEDs","titles":["Build Guide"]},"130":{"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","titles":["Build Guide"]},"131":{"title":"Step 13: Solder the positive wire to ESP","titles":["Build Guide"]},"132":{"title":"Step 14: Solder the negative wire to ESP","titles":["Build Guide"]},"133":{"title":"Step 15: Wire up the 2nd ESP","titles":["Build Guide"]},"134":{"title":"Step 16: Prepare to solder IR LED PCBs","titles":["Build Guide"]},"135":{"title":"Step 18: Solder resistors on PCB V3","titles":["Build Guide"]},"136":{"title":"Solder LEDs on PCB V3","titles":["Build Guide"]},"137":{"title":"Wire up the PCBs V3","titles":["Build Guide"]},"138":{"title":"Step 19: 3D print mounts","titles":["Build Guide"]},"139":{"title":"Type 1","titles":["Build Guide","Step 19: 3D print mounts"]},"140":{"title":"Type 2","titles":["Build Guide","Step 19: 3D print mounts"]},"141":{"title":"IR LED mounting","titles":["Build Guide"]},"142":{"title":"Parts List","titles":[]},"143":{"title":"ESP setup options:","titles":["Parts List"]},"144":{"title":"Option 1: Wireless over WiFi 2.4 GHz","titles":["Parts List","ESP setup options:"]},"145":{"title":"Option 2: Wired over USB Serial (in beta)","titles":["Parts List","ESP setup options:"]},"146":{"title":"Required parts","titles":["Parts List"]},"147":{"title":"Tracker boards:","titles":["Parts List","Required parts"]},"148":{"title":"Recommended","titles":["Parts List","Required parts","Tracker boards:"]},"149":{"title":"A cheaper, wireless only alternative:","titles":["Parts List","Required parts","Tracker boards:"]},"150":{"title":"Cameras","titles":["Parts List","Required parts"]},"151":{"title":"Camera modules:","titles":["Parts List","Required parts","Cameras"]},"152":{"title":"2x OV2640 160° FOV IR / Night vers 75mm (850nm)","titles":["Parts List","Required parts","Cameras"]},"153":{"title":"Optional Ribbon extensions:","titles":["Parts List","Required parts","Cameras"]},"154":{"title":"USB Hubs - for if you are building the wired version","titles":["Parts List","Required parts"]},"155":{"title":"Wires and adapters","titles":["Parts List","Required parts"]},"156":{"title":"IR emitters","titles":["Parts List","Required parts"]},"157":{"title":"Recommended:","titles":["Parts List","Required parts","IR emitters"]},"158":{"title":"Alternatively you can source the parts for V3 yourself:","titles":["Parts List","Required parts","IR emitters"]},"159":{"title":"3D Printed Mounts","titles":["Parts List"]},"160":{"title":"Misc parts/tools","titles":["Parts List"]},"161":{"title":"Other Headsets","titles":["Parts List","Misc parts/tools"]},"162":{"title":"Frequently Asked Questions","titles":[]},"163":{"title":"How to set up your avatar for eye tracking:","titles":[]},"164":{"title":"We currently use the following paramaters","titles":["How to set up your avatar for eye tracking:",null]},"165":{"title":"Build the app from source","titles":[]},"166":{"title":"This guide will show how to build the app from source","titles":["Build the app from source"]},"167":{"title":"Requirements","titles":["Build the app from source"]},"168":{"title":"Install Python","titles":["Build the app from source"]},"169":{"title":"Installing Poetry","titles":["Build the app from source"]},"170":{"title":"Install the required Python modules","titles":["Build the app from source"]},"171":{"title":"Build the app","titles":["Build the app from source"]},"172":{"title":"How to install, run and adjust the EyeTrackVR app.","titles":[]},"173":{"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app.",null]},"174":{"title":"Step 2: Run the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app."]},"175":{"title":"Step 3: Getting familiar with settings and terminology","titles":["How to install, run and adjust the EyeTrackVR app."]},"176":{"title":"Right eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"177":{"title":"Left eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"178":{"title":"Both eyes","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"179":{"title":"Camera Address","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"180":{"title":"Tracking Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"181":{"title":"Cropping Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"182":{"title":"Threshold","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"183":{"title":"Rotation","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"184":{"title":"Restart Calibrationn","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"185":{"title":"Recenter Eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"186":{"title":"Step 4: Adding your cameras to the software and configuring them","titles":["How to install, run and adjust the EyeTrackVR app."]},"187":{"title":"Wireless configuration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"188":{"title":"Wired configuration (experimental)","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"189":{"title":"Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them","Wired configuration (experimental)"]},"190":{"title":"Setting up ROI","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"191":{"title":"Step 5: Calibrating your eyes","titles":["How to install, run and adjust the EyeTrackVR app."]},"192":{"title":"See anything outdated on this guide? Let me know! Prohurtz#0001","titles":["How to install, run and adjust the EyeTrackVR app."]},"193":{"title":"Setting up recalibration and recentering from VRChat.","titles":[]},"194":{"title":"Setting up your parameters","titles":["Setting up recalibration and recentering from VRChat."]},"195":{"title":"Adding parameters","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"196":{"title":"Adding buttons to the menu","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"197":{"title":"Reseting the OSC config in case the parameters don't work","titles":["Setting up recalibration and recentering from VRChat."]},"198":{"title":"Other platforms","titles":["Setting up recalibration and recentering from VRChat."]}},"dirtCount":0,"index":[["|",{"2":{"169":1}}],["+",{"2":{"160":1}}],["★",{"2":{"159":1}}],["9001",{"2":{"198":1}}],["9",{"0":{"127":1}}],["qdot",{"2":{"112":1}}],["quality",{"2":{"144":1,"154":1}}],["quite",{"2":{"98":1}}],["quick",{"2":{"72":2,"74":1}}],["quest",{"2":{"111":1,"153":1}}],["questions",{"0":{"162":1},"2":{"88":1,"95":1}}],["question",{"2":{"88":1}}],["query",{"2":{"57":1}}],["quot",{"2":{"19":14,"20":2,"46":2,"85":4,"98":14,"99":2,"100":2,"111":2,"113":2,"195":4,"196":6}}],["~350ohm",{"2":{"134":1}}],["~2",{"2":{"100":1}}],["~700ohm",{"2":{"1":2,"134":1}}],["≈",{"2":{"99":1}}],["λ",{"2":{"98":1}}],["µm",{"2":{"91":1,"98":1}}],["job",{"2":{"113":1}}],["joint",{"2":{"132":1}}],["join",{"2":{"95":1}}],["just",{"2":{"84":1,"91":1,"97":1,"111":1,"114":1,"116":1,"149":1}}],["json",{"2":{"56":1}}],["js",{"2":{"11":1,"19":2}}],["0+",{"2":{"154":1}}],["0001",{"0":{"192":1},"2":{"116":1,"138":1}}],["00314",{"2":{"99":2}}],["0",{"0":{"84":1,"85":2},"2":{"84":1,"91":1,"96":1,"98":1,"99":6,"100":4,"107":1,"123":1,"153":1,"168":1,"169":1}}],["zip",{"2":{"68":1}}],["8mm",{"2":{"160":1}}],["850nm",{"0":{"152":1}}],["8",{"0":{"126":1},"2":{"58":3,"60":3,"99":4}}],["81",{"2":{"55":2,"57":1,"84":1}}],["6",{"0":{"116":1,"124":1},"2":{"99":1,"100":4}}],["60",{"2":{"58":1,"60":1}}],["68",{"2":{"58":1,"60":1}}],["75mm",{"0":{"152":1}}],["70",{"2":{"145":1}}],["700",{"2":{"99":2}}],["7",{"0":{"125":1},"2":{"169":1}}],["7dbm",{"2":{"58":2,"60":2}}],["74",{"2":{"58":1,"60":1}}],["76",{"2":{"58":1,"60":1}}],["780nm",{"2":{"98":1}}],["78",{"2":{"58":1,"60":1}}],["357",{"2":{"158":1}}],["350ohm",{"2":{"158":1}}],["3mm",{"2":{"128":1}}],["3653631",{"2":{"111":1}}],["3μm",{"2":{"98":1}}],["3d",{"0":{"138":1,"159":1},"1":{"139":1,"140":1},"2":{"94":1,"111":1,"138":1}}],["38",{"2":{"91":1,"98":1}}],["3232",{"2":{"85":1}}],["32",{"2":{"74":1,"148":1}}],["348",{"2":{"158":1}}],["34",{"2":{"58":1,"60":1,"155":1,"158":1}}],["3",{"0":{"67":1,"80":1,"113":1,"121":1,"175":1},"1":{"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"58":2,"91":1,"98":1,"99":3,"129":1,"149":1,"154":1,"168":1}}],["30",{"2":{"11":1}}],["=",{"2":{"46":1,"55":2,"57":2,"58":13,"60":13,"85":4,"99":4,"100":3}}],["xiaos",{"2":{"148":1}}],["xiaosenses3",{"2":{"36":2,"37":2}}],["xiao",{"2":{"148":1}}],["xaio",{"2":{"37":2}}],["kit",{"2":{"157":2}}],["kits",{"2":{"157":1}}],["kind",{"2":{"138":1}}],["keep",{"2":{"20":2,"30":1,"44":1,"86":1,"130":1,"152":1}}],["knowledge",{"2":{"107":1}}],["known",{"2":{"98":1}}],["know",{"0":{"101":1,"102":1,"192":1},"1":{"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"19":2,"39":1,"41":1,"44":1,"91":1,"97":1,"161":2}}],["m⁻²",{"2":{"98":1}}],["mw",{"2":{"91":1,"98":5,"99":6,"100":6}}],["mb",{"2":{"77":1,"80":1}}],["mit",{"2":{"96":1}}],["minimum",{"2":{"99":1,"100":1}}],["mind",{"2":{"86":1,"146":1,"152":1}}],["minute",{"2":{"85":1}}],["minus",{"2":{"58":1,"60":1}}],["might",{"2":{"80":1}}],["micro",{"2":{"77":1}}],["misc",{"0":{"160":1},"1":{"161":1}}],["miscelleneous",{"2":{"72":1}}],["mishap",{"2":{"158":1}}],["missing",{"2":{"25":2,"36":1,"106":1}}],["mute",{"2":{"153":2}}],["much",{"2":{"130":1,"135":1,"145":1,"148":1}}],["multiple",{"2":{"33":2,"35":1,"42":2,"98":1,"138":1}}],["must",{"2":{"20":1,"58":1,"60":1,"75":1,"85":1,"169":1}}],["mock",{"2":{"129":1}}],["months",{"2":{"121":1}}],["monitoring",{"2":{"85":1}}],["monitor",{"2":{"41":1,"85":1,"86":2}}],["mounted",{"2":{"145":1,"153":1}}],["mounting",{"0":{"141":1},"2":{"139":1}}],["mount",{"0":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1},"2":{"94":1,"110":1,"112":2,"114":1,"115":2,"116":1,"138":1,"139":3,"140":2,"141":2,"153":1,"159":2,"161":5}}],["mounts",{"0":{"110":1,"116":1,"138":1,"159":1},"1":{"139":1,"140":1},"2":{"94":2,"110":1,"113":1,"138":2,"153":1,"159":2,"161":1}}],["moment",{"2":{"69":1}}],["moving",{"2":{"68":1,"98":1,"190":1,"191":1}}],["movement",{"2":{"100":1}}],["moves",{"2":{"98":1}}],["move",{"0":{"108":1},"2":{"14":1,"85":1,"98":2,"123":1,"126":1,"190":1}}],["mobile",{"2":{"52":1}}],["more",{"2":{"32":1,"33":1,"37":1,"42":1,"52":1,"58":1,"68":1,"84":1,"91":1,"98":1,"120":1,"142":1,"144":2,"145":1,"196":1}}],["mostly",{"2":{"118":1}}],["most",{"2":{"28":1,"37":1,"90":1,"159":1}}],["mod",{"2":{"153":1}}],["modules",{"0":{"151":1,"170":1},"2":{"148":1,"149":1,"170":1}}],["module",{"2":{"144":1}}],["modeling",{"2":{"161":1}}],["mode",{"0":{"180":1,"181":1},"2":{"28":9,"37":6,"58":1,"78":1,"123":1,"180":1,"184":1,"190":2,"191":1}}],["modify",{"2":{"25":1}}],["menu",{"0":{"196":1},"2":{"196":3}}],["mentioned",{"2":{"195":1,"196":1,"198":1}}],["mechanism",{"2":{"193":1}}],["me",{"0":{"192":1},"2":{"116":2,"138":1}}],["measures",{"2":{"91":1,"97":1}}],["means",{"2":{"31":1,"32":1,"33":1,"42":1,"44":1,"69":1,"91":1,"97":1,"158":1,"161":1}}],["meaning",{"2":{"25":1,"195":1}}],["mess",{"2":{"128":1,"141":1}}],["messing",{"2":{"91":1,"97":1}}],["messages",{"2":{"193":1,"198":1}}],["message",{"2":{"87":1}}],["member",{"2":{"94":1}}],["members",{"2":{"15":1}}],["memory",{"2":{"56":1,"58":2,"195":1}}],["method",{"2":{"56":3,"80":1,"139":2,"140":1,"183":1}}],["mdns",{"0":{"30":1,"43":1,"46":1},"1":{"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"30":3,"31":2,"44":2,"46":1,"48":1,"56":1,"59":2,"84":3,"85":2}}],["md",{"2":{"17":1,"18":1,"19":1,"20":1}}],["my",{"2":{"17":2,"18":4,"19":4,"20":2,"98":1,"99":1,"100":1,"128":1,"135":2}}],["male",{"2":{"155":1}}],["making",{"2":{"138":1,"143":1,"161":1}}],["makes",{"2":{"56":1,"130":1}}],["make",{"0":{"119":1},"2":{"15":2,"28":1,"46":1,"50":2,"68":1,"77":1,"80":3,"86":1,"91":2,"94":1,"97":1,"105":1,"122":1,"123":1,"125":1,"127":1,"129":1,"138":1,"144":1,"161":1,"193":1,"196":1}}],["margins",{"2":{"98":1}}],["mark",{"2":{"129":1}}],["marker",{"2":{"129":1}}],["marked",{"2":{"56":1}}],["markdown",{"2":{"15":1,"16":3,"17":1,"21":1}}],["marks",{"2":{"1":2,"134":2}}],["match",{"2":{"105":1}}],["matches",{"2":{"85":1}}],["math",{"2":{"98":1,"99":1,"100":1}}],["ma",{"2":{"98":1,"100":1}}],["manager",{"2":{"189":1}}],["manage",{"2":{"144":1,"169":1}}],["many",{"2":{"85":1}}],["manual",{"2":{"83":1}}],["manually",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1},"2":{"30":1,"83":1,"127":1,"152":2}}],["macos",{"2":{"48":1}}],["mac",{"2":{"48":1}}],["map",{"2":{"39":1}}],["mainly",{"2":{"66":1,"190":1}}],["main",{"2":{"38":1,"68":1}}],["maintain",{"2":{"24":2,"25":1}}],["may",{"0":{"104":1,"106":1,"110":1},"2":{"36":1,"37":1,"69":2,"78":1,"94":1,"103":1,"104":1,"106":1,"120":1,"138":1,"139":1,"148":1,"149":1,"151":1,"153":1,"154":2}}],["made",{"2":{"25":1,"93":1,"94":1,"138":1}}],["major",{"2":{"15":1}}],["max",{"2":{"3":1,"98":1,"99":1,"100":1}}],["magnifying",{"2":{"1":1,"134":1}}],["yet",{"2":{"79":1,"94":1,"103":1,"161":1}}],["yaml",{"2":{"25":1}}],["yarn",{"2":{"11":1,"12":2,"25":1}}],["yml",{"2":{"25":1}}],["youtube",{"2":{"151":1}}],["you",{"0":{"27":2,"90":1,"101":1,"102":1,"107":1,"108":1,"154":1,"158":1},"1":{"95":1,"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"1":2,"2":1,"17":2,"18":2,"19":5,"20":7,"21":1,"28":15,"30":7,"31":16,"32":2,"33":2,"35":2,"37":3,"39":4,"41":2,"42":2,"44":5,"46":7,"47":2,"48":4,"50":1,"52":1,"54":1,"55":1,"56":1,"57":2,"58":6,"60":2,"66":1,"67":1,"68":5,"69":1,"71":1,"72":1,"73":1,"74":1,"75":2,"77":2,"78":2,"80":7,"83":4,"84":4,"85":4,"86":2,"87":4,"88":2,"91":6,"94":1,"95":1,"97":5,"98":5,"105":2,"110":2,"112":3,"113":1,"114":3,"115":2,"116":1,"119":1,"122":1,"123":6,"124":1,"125":2,"127":1,"129":1,"132":1,"134":2,"135":1,"138":2,"139":1,"141":1,"143":1,"144":1,"149":2,"151":1,"152":2,"153":1,"154":3,"157":1,"158":10,"159":1,"161":4,"166":1,"168":1,"169":1,"171":1,"174":2,"175":1,"179":1,"181":1,"183":1,"184":1,"185":1,"190":2,"191":2,"193":1,"195":1,"196":7}}],["yourself",{"0":{"158":1},"2":{"14":1,"91":1,"97":1,"138":1}}],["your",{"0":{"76":2,"79":1,"80":1,"86":1,"107":1,"109":1,"110":1,"111":1,"114":1,"116":1,"119":1,"122":1,"127":1,"128":1,"163":1,"186":1,"191":1,"194":1},"1":{"77":2,"78":2,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"164":1,"187":1,"188":1,"189":1,"190":1,"195":1,"196":1},"2":{"1":1,"12":1,"16":1,"28":8,"30":1,"31":1,"37":1,"38":1,"39":1,"41":1,"54":1,"62":2,"70":1,"71":1,"72":1,"75":3,"77":4,"78":2,"80":6,"82":3,"83":4,"84":7,"85":3,"86":2,"87":6,"88":1,"91":2,"94":1,"97":2,"98":6,"105":2,"107":1,"111":2,"112":1,"114":1,"123":1,"124":1,"125":1,"127":2,"129":1,"134":1,"135":1,"138":1,"141":1,"142":1,"143":2,"145":1,"151":1,"154":1,"157":1,"161":1,"164":1,"174":1,"179":1,"181":1,"182":1,"183":1,"184":1,"185":1,"187":4,"189":1,"190":8,"191":5,"193":2,"195":4,"196":3,"197":1}}],["ribbon",{"0":{"153":1},"2":{"124":1}}],["rift",{"2":{"111":1}}],["risk",{"2":{"91":1,"97":1,"142":1,"144":1,"158":1}}],["righteyelidexpandedsqueeze",{"2":{"164":1}}],["righteyex",{"2":{"164":1}}],["right",{"0":{"176":1},"2":{"58":1,"60":1,"176":1,"187":2}}],["rated",{"2":{"158":1}}],["radio",{"2":{"144":2}}],["radiance",{"2":{"98":1}}],["radiation",{"2":{"91":2,"98":5}}],["randomnerdtutorials",{"2":{"80":1}}],["ram",{"2":{"56":1}}],["rubbing",{"2":{"141":1}}],["running",{"2":{"149":1}}],["rundown",{"0":{"110":1}}],["run",{"0":{"172":1,"174":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"68":1,"69":1,"169":1,"170":1,"171":2,"174":1}}],["rule",{"2":{"25":1}}],["rules",{"2":{"24":1}}],["roi",{"0":{"190":1},"2":{"190":2}}],["rotation",{"0":{"183":1},"2":{"190":2}}],["rough",{"2":{"118":1}}],["route",{"2":{"105":1,"129":1}}],["router",{"2":{"28":1,"50":1,"144":1}}],["round",{"2":{"99":1}}],["road",{"2":{"39":1}}],["roadmap",{"0":{"5":1},"1":{"6":1,"7":1,"8":1}}],["remake",{"2":{"197":1}}],["remote",{"2":{"158":1}}],["removal",{"2":{"151":1}}],["remove",{"2":{"123":1,"141":1,"151":1,"152":2}}],["removed",{"2":{"59":1,"151":1}}],["removing",{"2":{"123":1}}],["regenerate",{"2":{"197":1}}],["regulator",{"2":{"160":1}}],["regular",{"2":{"158":1}}],["regauring",{"2":{"92":1}}],["regauding",{"0":{"90":1},"1":{"95":1}}],["reasonable",{"2":{"144":1}}],["ready",{"2":{"171":1}}],["read",{"0":{"119":1}}],["reading",{"2":{"28":1}}],["real",{"2":{"98":1}}],["really",{"2":{"98":1,"143":1}}],["reduces",{"2":{"142":1}}],["reduce",{"2":{"91":1,"97":1}}],["retyping",{"2":{"87":1}}],["retype",{"2":{"87":2}}],["retrieve",{"2":{"85":1}}],["returns",{"2":{"56":2}}],["re",{"2":{"80":1,"149":1}}],["refuse",{"2":{"69":1}}],["refer",{"2":{"58":1,"68":1}}],["reference",{"2":{"33":1,"42":1}}],["refactor",{"2":{"25":1}}],["requiring",{"2":{"41":1}}],["requirements",{"0":{"167":1}}],["requirement",{"2":{"154":1}}],["requires",{"2":{"139":1,"144":2,"145":1,"149":2,"154":1,"157":2}}],["required",{"0":{"146":1,"170":1},"1":{"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"20":1,"28":1,"32":1,"48":1,"57":1,"123":1,"145":1,"146":1,"149":1,"154":1,"155":1,"166":1,"169":1,"170":1}}],["require",{"2":{"19":1,"37":1,"56":1,"107":2,"148":1,"149":1,"152":1,"153":2,"154":1}}],["requests",{"2":{"32":1,"52":1,"54":1}}],["repeat",{"2":{"84":1,"85":1,"115":1,"132":1,"133":1,"135":1,"190":1,"191":1,"196":1}}],["replace",{"2":{"28":1}}],["repository",{"2":{"39":1,"41":1,"68":1}}],["repo",{"2":{"12":1,"87":1,"92":1}}],["reverts",{"2":{"25":1}}],["revert",{"2":{"25":1}}],["reliable",{"2":{"103":1}}],["relies",{"2":{"39":1}}],["releasing",{"2":{"78":1}}],["released",{"2":{"98":1}}],["release",{"2":{"25":3,"35":1,"36":4,"77":1,"173":1}}],["related",{"0":{"90":1},"1":{"95":1},"2":{"1":1,"134":1}}],["resolve",{"2":{"197":1}}],["resource",{"2":{"163":1}}],["resources",{"0":{"90":1},"1":{"95":1}}],["resizing",{"2":{"138":1}}],["resistance",{"2":{"99":1}}],["resistor",{"2":{"1":3,"2":4,"3":2,"4":3,"123":2,"134":3,"135":4}}],["resistors",{"0":{"2":1,"135":1},"2":{"1":2,"134":1,"135":1,"158":2}}],["results",{"2":{"128":1}}],["result",{"2":{"91":2,"97":2,"123":1,"152":1}}],["reseting",{"0":{"197":1}}],["resetting",{"2":{"80":1}}],["reset",{"2":{"78":1,"87":2}}],["resetconfig",{"2":{"56":1}}],["respected",{"2":{"159":1}}],["respectfully",{"2":{"28":1}}],["responsibility",{"2":{"91":1,"97":1}}],["responsibilities",{"2":{"91":1,"97":1}}],["responsible",{"2":{"38":1,"105":1}}],["restartcamera",{"2":{"56":1}}],["restarts",{"2":{"56":2}}],["restartdevice",{"2":{"56":1}}],["restart",{"0":{"184":1},"2":{"50":2,"56":1,"85":1,"86":1,"187":1,"189":1,"191":1}}],["rest",{"0":{"32":1,"51":1,"54":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1},"2":{"20":1,"32":6,"52":2,"54":2,"55":1,"56":1,"57":1,"161":1}}],["recalibrate",{"2":{"193":1,"195":1,"196":2,"198":1}}],["recalibration",{"0":{"193":1},"1":{"194":1,"195":1,"196":1,"197":1,"198":1}}],["rectangle",{"2":{"190":1}}],["recentering",{"0":{"193":1},"1":{"194":1,"195":1,"196":1,"197":1,"198":1}}],["recenter",{"0":{"185":1},"2":{"185":1,"191":2,"193":1,"195":1,"196":2,"198":2}}],["receive",{"2":{"198":1}}],["receives",{"2":{"4":1}}],["receiving",{"2":{"98":1}}],["recommendation",{"2":{"152":1}}],["recommend",{"2":{"36":1,"54":1,"113":1,"157":1}}],["recommended",{"0":{"148":1,"157":1},"2":{"1":1,"3":1,"28":2,"31":1,"91":1,"94":1,"97":1,"98":1,"134":1,"138":1,"139":1,"145":1,"158":4,"159":1,"160":1}}],["www",{"2":{"111":1,"151":1}}],["w",{"2":{"98":2}}],["won",{"2":{"195":1,"197":1}}],["worse",{"2":{"123":1,"138":1}}],["worst",{"2":{"98":1,"99":3,"100":3}}],["worth",{"2":{"98":1,"118":1,"152":1,"154":1}}],["world",{"2":{"98":1}}],["works",{"2":{"114":1,"141":1,"159":1}}],["working",{"2":{"36":2,"37":2,"38":1,"39":1,"41":1,"61":1,"83":2,"85":1,"90":1,"110":1}}],["work",{"0":{"197":1},"2":{"30":1,"37":2,"80":1,"110":1,"125":1,"128":1,"138":2,"151":1,"158":1,"183":1}}],["would",{"2":{"39":1,"56":1,"85":1,"99":1,"100":1,"158":1}}],["wroom",{"2":{"148":1}}],["wrooms3usb",{"2":{"37":1}}],["wrooms3qiousb",{"2":{"37":1}}],["wrooms3qio",{"2":{"37":1}}],["wrooms3",{"2":{"37":1}}],["wrong",{"2":{"87":1,"105":1}}],["writes",{"2":{"56":2}}],["write",{"2":{"56":2}}],["written",{"2":{"15":1,"24":4,"56":1}}],["walkthrough",{"2":{"118":1}}],["warm",{"2":{"91":1,"97":1}}],["warmth",{"2":{"91":1,"97":1,"98":1}}],["warning",{"2":{"37":1,"128":1,"137":1}}],["watch",{"2":{"86":1,"151":1}}],["wait",{"0":{"121":1},"2":{"71":1,"72":1,"74":1,"84":2,"85":1,"94":1,"191":1}}],["was",{"2":{"32":1,"139":1,"174":1}}],["ways",{"2":{"70":1}}],["way",{"0":{"111":1},"2":{"24":3,"35":1,"52":1,"77":1,"82":1,"111":1,"112":1,"135":1,"190":1,"191":1}}],["want",{"2":{"19":1,"35":1,"36":1,"39":1,"44":1,"46":1,"52":1,"68":1,"90":1,"91":1,"113":1,"183":1,"196":1}}],["why",{"2":{"125":1,"158":1}}],["who",{"2":{"118":1}}],["whether",{"2":{"58":1}}],["wherever",{"2":{"154":1}}],["where",{"0":{"39":1,"113":1},"2":{"66":1,"68":1,"83":1,"84":1,"128":1,"132":1,"139":1,"179":1,"180":1,"181":1,"183":1,"184":1}}],["when",{"2":{"20":2,"28":1,"36":1,"59":1,"68":1,"69":2,"91":1,"97":1,"98":2,"113":1,"123":1,"139":1}}],["whatever",{"2":{"46":1,"185":1}}],["what",{"0":{"35":1,"38":1,"39":1,"41":1,"44":1,"52":1,"82":1,"98":1},"1":{"39":1},"2":{"36":1,"91":2,"97":2,"114":1,"119":1,"141":1,"149":1,"158":1,"159":1,"187":1}}],["while",{"2":{"28":1,"77":1,"78":1,"86":1,"88":1,"91":2,"97":2,"98":1,"135":1,"151":1,"193":1}}],["white",{"2":{"25":1}}],["which",{"2":{"4":1,"56":1,"98":2,"99":1,"100":1,"103":1,"107":1,"123":1,"128":1,"138":1,"154":1,"158":1}}],["weight",{"2":{"144":1}}],["weird",{"2":{"69":1}}],["week",{"2":{"132":1}}],["weeks",{"2":{"121":1}}],["weaker",{"2":{"98":1}}],["wear",{"2":{"56":1,"151":1}}],["were",{"2":{"91":1,"97":1,"99":1,"100":1,"152":1}}],["welcome",{"0":{"90":1},"1":{"95":1}}],["well",{"2":{"39":1,"98":2,"99":2,"100":2,"110":1,"148":1,"154":1,"158":1}}],["went",{"2":{"87":1}}],["webrequest",{"2":{"169":1}}],["web",{"2":{"83":1}}],["website",{"0":{"90":1},"1":{"95":1},"2":{"16":1,"111":1}}],["we",{"0":{"98":1,"164":1},"2":{"20":1,"24":2,"25":5,"33":1,"35":1,"36":3,"37":2,"38":1,"39":1,"41":1,"42":1,"52":2,"54":1,"56":1,"58":1,"61":1,"68":1,"83":2,"84":1,"85":1,"88":1,"91":3,"94":1,"95":1,"97":3,"98":7,"99":8,"100":7,"105":1,"112":1,"120":1,"157":1,"164":1,"169":1,"190":3,"191":1,"196":1}}],["wider",{"2":{"144":1}}],["widely",{"2":{"104":1}}],["wip",{"2":{"118":1}}],["wiki",{"2":{"96":1,"163":1}}],["window",{"2":{"68":1,"74":1}}],["windows",{"2":{"30":1,"48":3,"84":1,"169":1}}],["wifi",{"0":{"58":1,"144":1},"2":{"28":4,"46":1,"56":7,"58":15,"60":13,"75":1,"83":1,"144":2}}],["wi",{"2":{"28":1,"84":2,"87":1}}],["wish",{"2":{"20":1,"30":1,"31":5,"58":1,"85":1}}],["willing",{"2":{"161":1}}],["will",{"0":{"90":1,"102":1,"107":1,"110":1,"113":1,"118":1,"166":1},"1":{"95":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"5":1,"16":1,"17":3,"18":1,"19":3,"20":2,"21":1,"25":1,"28":7,"30":2,"31":7,"33":1,"37":2,"39":1,"42":1,"44":1,"46":1,"56":3,"57":1,"58":1,"59":1,"62":1,"67":1,"68":2,"69":2,"72":2,"74":1,"78":1,"83":1,"85":2,"88":1,"98":1,"99":4,"100":2,"103":1,"105":2,"107":1,"110":1,"115":1,"119":1,"123":2,"124":1,"128":1,"129":1,"132":1,"138":1,"141":1,"151":2,"152":1,"153":1,"158":2,"175":1,"181":1,"184":1,"185":1,"190":2,"195":1,"196":3,"197":1}}],["wiring",{"2":{"4":1,"118":1}}],["wires",{"0":{"128":1,"129":1,"130":1,"155":1},"2":{"128":1,"132":1,"157":2}}],["wired",{"0":{"145":1,"154":1,"188":1},"1":{"189":1},"2":{"37":3,"38":1,"118":1,"143":1,"144":2,"145":2,"148":2,"179":1}}],["wireless",{"0":{"144":1,"149":1,"187":1},"2":{"37":3,"38":1,"118":1,"143":1,"145":1,"148":2,"149":1}}],["wire",{"0":{"4":1,"130":1,"131":1,"132":1,"133":1,"137":1},"2":{"128":3,"129":5,"131":1,"155":3,"158":1}}],["within",{"2":{"99":1,"100":1,"193":1}}],["withing",{"2":{"98":1}}],["without",{"2":{"15":1,"31":2,"41":1,"82":1,"84":2,"132":1,"149":1,"191":1,"193":1}}],["with",{"0":{"123":1,"175":1},"1":{"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"3":1,"4":1,"14":1,"20":2,"25":2,"28":2,"31":1,"35":1,"36":1,"37":3,"52":1,"54":1,"56":1,"58":1,"68":1,"69":1,"77":1,"80":2,"84":1,"91":2,"94":1,"97":2,"99":1,"100":1,"105":1,"120":2,"123":2,"132":2,"133":1,"141":1,"144":1,"145":3,"146":1,"149":1,"151":1,"152":3,"155":1,"159":1,"171":1,"174":1,"187":1,"190":1,"193":1}}],["uuid",{"2":{"197":1}}],["uri",{"2":{"169":1}}],["url",{"2":{"17":2,"18":1,"57":3}}],["u",{"2":{"121":1}}],["udp",{"2":{"89":1}}],["unfocused",{"2":{"158":1}}],["unfortunately",{"2":{"123":1}}],["unusable",{"2":{"123":1}}],["unit",{"2":{"158":1}}],["unity",{"2":{"107":1,"195":1}}],["unique",{"2":{"58":1}}],["unless",{"2":{"91":1,"97":1}}],["unlikely",{"2":{"37":1,"115":1}}],["until",{"2":{"74":2,"115":1,"139":1,"190":1}}],["under",{"0":{"85":1},"2":{"46":1,"96":2,"171":1,"197":1}}],["understand",{"0":{"102":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"22":1,"24":2,"25":1,"97":1}}],["uplaod",{"2":{"85":1}}],["uploaded",{"2":{"80":1}}],["upload",{"0":{"80":1},"2":{"67":1,"80":3,"83":1,"84":1,"85":3,"87":1,"116":1,"196":1}}],["uploading",{"0":{"75":1,"81":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":2,"83":2,"84":2,"85":2,"86":1},"2":{"62":1,"69":1,"75":1,"80":1,"84":1,"87":1,"127":1}}],["upate",{"2":{"83":1}}],["upgrading",{"0":{"73":1,"74":1},"1":{"74":1}}],["upgrade",{"2":{"71":1,"72":1,"73":1}}],["updating",{"0":{"69":1,"70":1,"87":1},"1":{"70":1,"71":2,"72":2,"73":1,"74":1,"88":1},"2":{"31":1}}],["updated",{"2":{"87":1,"196":1}}],["update",{"2":{"31":8,"69":1,"70":1,"71":1,"72":1,"74":1,"75":1,"82":1,"84":1,"87":2}}],["updates",{"2":{"31":2,"74":1,"95":1}}],["up",{"0":{"4":1,"62":1,"84":1,"107":1,"122":1,"133":1,"137":1,"163":1,"190":1,"193":1,"194":1},"1":{"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"164":1,"194":1,"195":2,"196":2,"197":1,"198":1},"2":{"35":1,"58":1,"74":1,"77":1,"80":1,"84":1,"86":1,"99":1,"104":1,"114":1,"124":1,"126":2,"128":1,"129":1,"135":1,"138":1,"144":1,"145":1,"161":1,"190":1,"191":1}}],["usually",{"2":{"69":1}}],["us",{"2":{"36":1,"39":1,"41":1,"48":1,"56":2,"98":2,"161":2}}],["usb",{"0":{"78":1,"128":1,"130":1,"145":1,"154":1},"2":{"28":1,"37":1,"77":1,"78":1,"80":2,"125":1,"145":2,"154":10,"155":1}}],["using",{"2":{"1":1,"9":1,"20":2,"28":3,"30":2,"31":1,"32":2,"33":1,"39":1,"41":1,"42":1,"44":3,"47":1,"48":2,"52":1,"54":1,"55":1,"57":1,"58":1,"60":1,"72":1,"80":2,"83":1,"84":2,"87":4,"91":2,"97":1,"98":1,"99":1,"118":1,"134":1,"144":1,"158":1,"168":1,"169":1}}],["usebasicparsing",{"2":{"169":1}}],["useability",{"2":{"103":1}}],["uses",{"2":{"56":1,"107":1,"139":1,"140":1,"144":1,"149":1}}],["users",{"2":{"32":1,"90":1,"145":1,"197":1}}],["user",{"0":{"28":1,"104":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"46":1,"84":1,"85":1,"91":1,"97":1,"132":1,"144":1,"159":1,"197":2}}],["useful",{"2":{"18":1,"35":1,"36":1,"44":2,"52":1}}],["use",{"0":{"45":1,"53":1,"83":1,"107":1,"164":1,"189":1},"1":{"46":1,"47":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"84":1,"85":1},"2":{"1":1,"16":2,"20":3,"24":1,"25":3,"31":4,"35":1,"36":1,"37":1,"39":1,"46":1,"47":1,"48":1,"54":1,"58":1,"75":1,"83":2,"85":1,"86":1,"91":3,"97":3,"99":1,"100":1,"123":1,"134":1,"135":1,"137":2,"141":1,"143":1,"149":1,"153":1,"158":1,"183":1,"190":1,"193":1,"196":1}}],["used",{"2":{"1":1,"22":2,"25":2,"32":4,"36":1,"54":1,"59":1,"128":1,"134":1,"179":1,"182":1}}],["cvr",{"2":{"193":1}}],["center",{"2":{"191":2}}],["certain",{"2":{"91":1,"97":1,"123":1,"153":1}}],["crop",{"2":{"181":1}}],["cropping",{"0":{"181":1},"2":{"190":1}}],["creep",{"2":{"104":1}}],["creating",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1}}],["creative",{"2":{"96":1}}],["created",{"2":{"112":1,"163":1,"196":1}}],["create",{"0":{"110":1},"2":{"17":2,"18":2,"94":1,"112":1,"174":1,"196":1}}],["credit",{"2":{"68":1,"88":1,"118":1}}],["credentials",{"2":{"28":1,"87":3}}],["cm⁻²",{"2":{"98":1}}],["cm2",{"2":{"98":3,"99":3,"100":3}}],["cm^2",{"2":{"98":1}}],["cc",{"2":{"96":1}}],["cycled",{"2":{"85":1}}],["c",{"0":{"78":1},"2":{"68":1,"87":1,"154":5,"197":1}}],["cd",{"2":{"68":1,"87":1}}],["cpptypedef",{"2":{"58":1,"60":1}}],["cuts",{"2":{"129":1}}],["cut",{"0":{"129":1},"2":{"128":1,"129":2,"182":1}}],["cura",{"2":{"80":1}}],["current",{"2":{"56":2,"68":1,"84":1,"85":1,"87":1,"120":1}}],["currently",{"0":{"164":1},"2":{"37":2,"38":1,"39":1,"41":1,"56":1,"61":1,"83":1,"119":1,"164":1,"168":1}}],["customizations",{"2":{"25":2}}],["custom",{"2":{"19":1,"35":1,"85":1}}],["cheaper",{"0":{"149":1},"2":{"144":1,"149":1}}],["checked",{"2":{"174":1}}],["checking",{"2":{"91":1,"97":1}}],["checkmark",{"2":{"84":1}}],["check",{"2":{"28":1,"39":1,"80":1,"88":1,"90":1,"92":1,"126":1,"158":2,"161":1}}],["china",{"2":{"121":1}}],["chip",{"2":{"38":1}}],["ch340",{"2":{"66":2}}],["chose",{"2":{"98":1}}],["choice",{"2":{"54":1}}],["choose",{"2":{"28":1}}],["chore",{"2":{"25":1}}],["charging",{"2":{"80":1}}],["character",{"2":{"28":1}}],["characters",{"2":{"28":1}}],["chance",{"2":{"139":1}}],["channel",{"2":{"58":2,"88":1}}],["changing",{"2":{"37":1,"57":1}}],["changed",{"2":{"87":1,"198":1}}],["changelog",{"2":{"25":1}}],["change",{"2":{"20":1,"25":8,"28":2,"33":1,"37":1,"42":1,"44":1,"46":3,"68":1,"84":1,"85":2,"120":1}}],["changes",{"2":{"15":2,"25":5,"44":1,"56":4,"87":3,"142":1,"180":1,"197":1}}],["circled",{"2":{"124":1}}],["ci",{"2":{"25":2}}],["css",{"2":{"20":2}}],["cluttered",{"2":{"196":1}}],["clearer",{"2":{"152":1}}],["clears",{"2":{"56":1}}],["clicking",{"2":{"74":1,"195":1}}],["click",{"2":{"72":3,"74":3,"84":1,"85":1,"174":1,"195":3,"196":2}}],["cli",{"0":{"71":1}}],["client",{"0":{"54":1},"2":{"32":2,"54":2,"86":1}}],["cloning",{"2":{"68":1,"170":1}}],["cloned",{"2":{"68":1,"84":1,"87":1}}],["clone",{"0":{"68":1},"2":{"12":2,"68":5}}],["closer",{"2":{"98":1}}],["close",{"2":{"68":1,"86":1,"99":1,"113":1,"187":1}}],["class=",{"2":{"20":1}}],["class",{"2":{"20":1}}],["classes",{"2":{"20":4}}],["capable",{"2":{"144":1}}],["calibrated",{"2":{"191":1}}],["calibrate",{"2":{"191":1}}],["calibrating",{"0":{"191":1}}],["calibration",{"2":{"184":1,"191":1,"198":1}}],["calibrationn",{"0":{"184":1}}],["calculating",{"2":{"98":1}}],["call",{"2":{"56":2}}],["called",{"2":{"17":1,"18":2,"19":1,"39":1,"72":1,"74":1,"93":1}}],["cataractogenesis",{"2":{"98":1}}],["categories",{"2":{"18":1,"143":1}}],["care",{"0":{"98":1},"2":{"98":2}}],["careful",{"2":{"3":1}}],["cables",{"2":{"80":1,"144":1,"152":1,"154":2}}],["cable",{"2":{"75":1,"77":1,"80":5,"124":1,"153":2}}],["causing",{"2":{"142":1}}],["caused",{"2":{"80":1,"105":1}}],["cause",{"2":{"56":1,"80":1,"105":1}}],["caution",{"2":{"39":1,"91":1,"97":1}}],["cams",{"2":{"149":1,"161":1}}],["came",{"2":{"77":1}}],["cameras",{"0":{"124":1,"150":1,"186":1},"1":{"151":1,"152":1,"153":1,"187":1,"188":1,"189":1,"190":1},"2":{"124":1,"142":1,"149":1,"151":2,"152":3,"179":1,"187":1}}],["camera",{"0":{"61":1,"110":1,"112":1,"113":2,"151":1,"179":1},"2":{"56":2,"86":2,"91":1,"97":1,"112":1,"113":1,"124":3,"125":1,"129":1,"138":1,"139":5,"140":3,"153":2,"159":1,"161":1,"179":1,"187":2,"189":1,"190":2}}],["cam",{"0":{"77":1},"2":{"37":2,"77":2,"123":1,"144":1,"160":1,"179":1}}],["can",{"0":{"50":1,"158":1},"2":{"18":1,"20":4,"28":2,"30":2,"31":3,"32":5,"35":1,"37":1,"39":1,"44":2,"46":3,"47":1,"48":2,"50":1,"52":1,"54":2,"55":1,"56":1,"71":1,"72":1,"75":1,"77":1,"80":2,"83":1,"85":1,"86":1,"87":1,"91":2,"97":2,"98":2,"99":1,"100":1,"103":1,"105":1,"112":1,"114":1,"116":1,"123":5,"132":1,"138":1,"144":1,"145":2,"151":1,"152":2,"158":2,"161":3,"179":1,"187":1,"193":1,"196":1,"198":1}}],["cases",{"2":{"77":1,"123":2,"141":1,"142":1}}],["case",{"0":{"197":1},"2":{"15":1,"28":1,"77":2,"98":2,"99":2,"100":2,"123":1,"128":1,"143":1,"183":1}}],["copy",{"2":{"187":1}}],["copper",{"2":{"128":1}}],["costly",{"2":{"145":1}}],["count",{"2":{"195":1}}],["could",{"2":{"91":1,"97":1}}],["couple",{"2":{"36":1,"72":1,"74":1,"84":1,"85":1,"87":1}}],["corners",{"2":{"113":1}}],["cornea",{"2":{"98":2}}],["core",{"2":{"72":1}}],["corresponds",{"2":{"58":1}}],["correctly",{"2":{"28":1,"128":1}}],["correcting",{"2":{"25":1}}],["correct",{"2":{"3":1,"28":1,"33":1,"42":1,"50":2,"69":1,"91":1,"97":1,"158":1}}],["codes",{"2":{"158":1}}],["code",{"0":{"23":1,"63":1,"72":1,"126":1},"1":{"24":1,"25":1,"64":1,"65":1},"2":{"24":4,"25":3,"63":1,"67":1,"69":1,"72":1,"79":1,"85":1,"126":2}}],["colors",{"2":{"128":1}}],["colons",{"2":{"25":1}}],["colour",{"2":{"20":3}}],["collapsible",{"2":{"19":1}}],["cohesive",{"2":{"20":1}}],["cover",{"2":{"16":1,"123":1,"135":1,"155":1}}],["com4",{"2":{"189":1}}],["comes",{"2":{"123":1,"132":1}}],["come",{"2":{"69":1,"151":1,"152":1}}],["coming",{"2":{"61":1,"83":1,"124":1}}],["commission",{"2":{"98":1}}],["commits",{"2":{"25":6}}],["commit",{"0":{"25":1},"2":{"24":1,"25":6}}],["commons",{"2":{"96":1}}],["community",{"0":{"110":1},"2":{"94":1,"161":1}}],["communicate",{"2":{"52":1,"54":1,"197":1}}],["communication",{"2":{"28":1}}],["command",{"2":{"55":2,"57":1,"68":2,"71":2,"169":1,"170":2,"171":2}}],["compact",{"2":{"154":1}}],["compatible",{"2":{"94":1,"161":1}}],["completely",{"2":{"123":2}}],["completed",{"0":{"6":1},"2":{"5":1,"78":1}}],["complain",{"2":{"69":1}}],["computer",{"2":{"28":2,"30":1,"52":1,"82":1}}],["componentes",{"2":{"15":1}}],["components",{"2":{"15":1}}],["com",{"2":{"12":1,"66":1,"68":2,"80":1,"111":1,"151":1,"189":2}}],["conflicts",{"2":{"145":1}}],["configs",{"2":{"35":1}}],["config",{"0":{"28":1,"197":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"35":2,"46":2,"56":3,"58":1,"85":2,"87":2,"195":2,"197":1}}],["configure",{"0":{"126":1},"2":{"41":1,"149":1}}],["configured",{"2":{"33":1,"42":1}}],["configuring",{"0":{"26":1,"186":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"187":1,"188":1,"189":1,"190":1},"2":{"39":1,"41":1}}],["configuration",{"0":{"29":1,"187":1,"188":1},"1":{"30":1,"31":1,"32":1,"33":1,"189":1},"2":{"25":1,"197":1}}],["convenient",{"2":{"196":1}}],["conventional",{"2":{"25":3}}],["convert",{"2":{"99":2,"100":1}}],["cone",{"2":{"98":1}}],["congratulations",{"2":{"80":1}}],["connectors",{"2":{"153":1,"154":1}}],["connector",{"2":{"124":3,"153":1}}],["connections",{"2":{"123":3}}],["connection",{"2":{"78":1,"130":1}}],["connecting",{"2":{"77":1,"129":1}}],["connected",{"2":{"30":1,"50":3,"75":1,"84":2,"123":1,"124":1}}],["connect",{"0":{"47":1,"50":1,"76":1,"77":1,"78":1,"125":1,"128":1},"1":{"77":1,"78":1},"2":{"28":3,"30":1,"31":1,"44":2,"46":1,"47":2,"50":1,"55":1,"67":1,"77":1,"78":1,"82":1,"84":1,"86":1,"154":1}}],["cons",{"2":{"144":1,"145":1}}],["consider",{"2":{"143":1,"154":1}}],["consistent",{"2":{"20":1,"22":1}}],["consultation",{"2":{"15":1}}],["consult",{"2":{"1":1,"134":1}}],["continuing",{"2":{"190":1}}],["continue",{"2":{"168":1}}],["contents",{"2":{"197":1}}],["content",{"2":{"169":1,"195":1}}],["contact",{"0":{"95":1},"2":{"56":1}}],["contains",{"2":{"196":1}}],["contain",{"0":{"118":1},"2":{"5":1}}],["contributor",{"2":{"163":1}}],["contributing",{"0":{"13":1},"1":{"14":1,"15":1}}],["control",{"2":{"32":1,"52":2,"55":2,"57":1,"196":1}}],["fwvdbdc",{"2":{"151":1}}],["fps",{"2":{"145":1}}],["fbt",{"2":{"144":1,"145":1}}],["f",{"2":{"121":1}}],["familiar",{"0":{"175":1},"1":{"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1}}],["familiarize",{"2":{"14":1}}],["face",{"2":{"154":2,"163":1}}],["facial",{"2":{"153":1}}],["facing",{"2":{"124":1,"137":2}}],["fact",{"2":{"120":1}}],["far",{"2":{"98":1,"100":1}}],["failure",{"2":{"91":1,"97":1}}],["faq",{"2":{"88":1}}],["ftdi",{"2":{"77":1,"80":1}}],["function",{"2":{"103":1}}],["functionality",{"2":{"32":1,"198":1}}],["further",{"2":{"91":1,"97":1,"98":1,"99":1,"100":1}}],["future",{"2":{"56":1,"75":1}}],["fully",{"2":{"32":1,"38":1,"48":1,"103":1,"142":1,"191":1}}],["full",{"2":{"4":1,"32":1,"33":1,"42":1,"90":1,"149":2}}],["fetch",{"2":{"169":1}}],["feed",{"2":{"176":1,"177":1,"178":1,"190":2}}],["feedback",{"2":{"159":1}}],["feeling",{"2":{"91":1,"97":1}}],["feel",{"2":{"91":1,"97":1,"98":1}}],["featured",{"2":{"32":1}}],["feature",{"0":{"189":1},"2":{"25":3,"30":1,"32":2,"57":1,"84":1}}],["features",{"2":{"5":1,"41":1,"91":1,"97":1,"103":1}}],["feat",{"2":{"25":1}}],["few",{"2":{"24":1}}],["frequently",{"0":{"162":1}}],["free",{"2":{"54":1,"123":1}}],["freenove",{"2":{"37":4,"148":1}}],["frunk",{"2":{"153":1}}],["framerates",{"2":{"145":1}}],["framework",{"2":{"24":1}}],["friend",{"2":{"141":1}}],["friendly",{"2":{"84":1,"196":1}}],["front",{"2":{"84":1,"98":1}}],["from",{"0":{"165":1,"166":1,"193":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"4":1,"37":1,"38":1,"48":2,"52":2,"56":1,"66":1,"68":4,"73":1,"80":2,"83":1,"84":1,"87":2,"88":1,"98":4,"100":1,"112":1,"121":2,"123":1,"125":1,"128":1,"137":1,"141":1,"155":1,"158":4,"166":1,"175":1,"190":1,"193":2}}],["float",{"2":{"164":1}}],["flashing",{"0":{"40":1},"1":{"41":1,"42":1},"2":{"39":2,"41":1}}],["flash",{"0":{"125":1,"126":1,"127":1},"2":{"37":2,"39":1,"41":2,"56":5,"66":1,"85":1,"125":1,"127":1,"149":1}}],["flashed",{"2":{"36":1,"83":1,"127":1}}],["flavour",{"2":{"16":1}}],["flip",{"2":{"2":1,"124":1,"135":1,"136":1}}],["figure",{"2":{"189":1}}],["fields",{"2":{"196":1}}],["field",{"2":{"187":1,"189":1,"195":1}}],["filters",{"2":{"152":1}}],["filter",{"2":{"151":4,"152":1}}],["files",{"2":{"16":1,"25":2,"68":1,"84":2,"87":1,"158":1,"159":1,"197":2}}],["file",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"15":1,"17":3,"18":1,"19":3,"20":1,"21":1,"46":2,"59":1,"84":1,"85":2,"173":1,"179":1,"195":2,"196":1}}],["fit",{"2":{"138":2,"161":1}}],["finger",{"2":{"187":1}}],["fingernails",{"2":{"124":1}}],["fine",{"2":{"124":1}}],["final",{"0":{"103":1},"2":{"118":1,"123":1}}],["finally",{"2":{"78":1}}],["finnish",{"2":{"72":1}}],["finish",{"2":{"71":1,"84":1}}],["finding",{"0":{"86":1}}],["find",{"0":{"90":1,"111":1,"112":1},"1":{"95":1},"2":{"20":2,"84":1,"88":1,"111":1,"129":1,"138":1,"141":1,"158":1,"175":1,"187":1,"189":1,"195":2}}],["fi",{"2":{"28":1,"84":2,"87":1}}],["firmly",{"2":{"80":1}}],["firmware",{"0":{"26":1,"34":1,"40":1,"68":1,"75":1,"79":1,"80":1,"84":1,"85":1,"87":1,"93":1,"104":1,"126":1,"127":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"41":1,"42":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1},"2":{"28":1,"31":6,"32":1,"33":2,"35":4,"36":1,"38":1,"39":2,"41":5,"42":2,"46":2,"59":1,"62":1,"66":1,"67":1,"68":2,"69":1,"75":2,"79":1,"80":5,"82":1,"83":3,"84":1,"85":1,"87":2,"93":1,"104":1,"127":1,"149":1}}],["firstly",{"2":{"196":1}}],["first",{"2":{"4":1,"36":1,"37":1,"75":1,"77":1,"83":1,"115":1,"123":1,"169":1}}],["fixes",{"2":{"25":1}}],["fix",{"2":{"25":2,"197":1}}],["footprint",{"2":{"158":1}}],["footer",{"2":{"25":1}}],["fov",{"0":{"152":1},"2":{"152":1}}],["focused",{"2":{"91":1,"158":1}}],["found",{"2":{"39":1,"85":1,"93":1}}],["font",{"2":{"20":2}}],["follows",{"2":{"25":2,"55":1}}],["followed",{"2":{"24":1,"47":1}}],["following",{"0":{"164":1},"2":{"19":1,"20":1,"25":2,"30":2,"55":1,"56":1,"57":2,"58":2,"60":2,"80":1,"87":1,"88":1,"122":1,"137":2,"169":1}}],["follow",{"2":{"15":1,"25":1,"39":1,"58":1,"60":1,"74":1,"80":1,"83":1,"87":1,"173":1}}],["folder",{"2":{"12":1,"15":2,"17":1,"18":4,"19":1,"21":1,"68":1,"170":1,"171":1}}],["force",{"2":{"124":2}}],["form",{"2":{"110":1,"160":1,"196":1}}],["format",{"2":{"30":1,"57":1,"58":1,"60":1}}],["formatting",{"2":{"25":1}}],["formatted",{"2":{"16":1}}],["forward",{"2":{"68":1,"191":1}}],["for",{"0":{"9":1,"84":1,"85":1,"110":1,"121":1,"129":1,"154":1,"158":1,"163":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"164":1},"2":{"9":1,"15":1,"16":2,"17":1,"18":2,"19":1,"20":1,"22":1,"24":2,"25":2,"28":4,"31":1,"32":2,"33":2,"35":2,"36":4,"37":14,"38":2,"39":2,"41":2,"42":2,"46":1,"47":1,"48":2,"52":1,"54":1,"55":1,"56":1,"57":1,"58":3,"59":6,"60":1,"62":1,"67":1,"68":1,"71":1,"72":1,"74":1,"77":1,"80":1,"82":1,"84":5,"85":2,"86":3,"87":1,"89":1,"90":1,"91":1,"92":1,"94":1,"95":1,"97":1,"98":4,"99":3,"100":3,"105":1,"110":1,"111":4,"113":1,"114":2,"121":1,"123":1,"128":2,"129":5,"135":1,"138":1,"141":2,"144":1,"145":1,"146":1,"149":5,"153":2,"154":3,"158":3,"159":4,"160":3,"161":2,"179":1,"183":1,"184":1,"187":1,"190":1,"191":3,"195":1,"196":2}}],["fox",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["etvr",{"2":{"193":1,"195":2,"198":2}}],["etc",{"2":{"25":1,"91":1,"97":1,"190":1,"191":1}}],["effect",{"2":{"91":1}}],["effects",{"2":{"91":1,"97":1,"98":1}}],["empty",{"2":{"196":1}}],["emitters",{"0":{"105":1,"156":1},"1":{"157":1,"158":1},"2":{"91":4,"97":3,"155":1,"158":4,"159":1,"161":1}}],["emitter",{"0":{"91":1,"97":1},"1":{"98":1},"2":{"158":2}}],["embedded",{"2":{"74":1}}],["error",{"2":{"69":1}}],["every",{"2":{"94":1}}],["everything",{"0":{"115":1},"2":{"36":3,"87":1,"121":1,"190":1}}],["event",{"2":{"158":1}}],["even",{"2":{"44":1,"57":1,"69":1,"99":1,"100":1,"158":1}}],["equation",{"2":{"38":1}}],["e",{"2":{"35":2,"145":1,"189":1}}],["espcam32",{"2":{"149":1}}],["espressif",{"2":{"74":1}}],["espaithinker",{"2":{"35":1}}],["esp32wrover",{"2":{"37":2}}],["esp32m5stack",{"2":{"37":2}}],["esp32aithinker",{"2":{"37":3,"85":2}}],["esp32cams",{"2":{"37":1}}],["esp32cam",{"2":{"35":1,"37":3}}],["esp32",{"0":{"77":1,"78":1},"2":{"31":2,"37":8,"38":1,"46":1,"47":2,"55":2,"77":2,"78":1,"144":1,"148":1,"149":1,"152":1,"154":2,"160":1}}],["esp",{"0":{"123":1,"125":1,"127":1,"131":1,"132":1,"133":1,"143":1},"1":{"144":1,"145":1},"2":{"28":7,"31":4,"33":2,"37":3,"42":2,"52":1,"54":1,"56":1,"58":1,"59":1,"68":1,"79":1,"80":1,"84":1,"86":2,"123":3,"124":1,"125":2,"127":1,"133":1,"144":1,"148":1,"149":1,"160":1}}],["esps",{"0":{"124":1},"2":{"4":1,"28":2,"30":3,"31":1,"32":2,"33":1,"41":3,"42":1,"56":1,"83":3,"85":2,"142":1,"149":1,"154":1,"155":2,"187":1,"189":1}}],["either",{"2":{"28":2,"69":1,"111":1,"114":1,"123":1,"134":1,"196":1}}],["easier",{"2":{"130":1,"144":1}}],["easiest",{"2":{"111":1}}],["easily",{"2":{"35":1,"52":1,"71":1,"141":1}}],["easy",{"2":{"22":1,"24":5,"25":3,"77":1,"123":1}}],["each",{"2":{"3":1,"28":1,"33":1,"35":1,"42":1,"46":1,"138":2,"153":1,"191":1}}],["elements",{"2":{"20":1}}],["enough",{"2":{"135":1,"197":1}}],["encountered",{"2":{"88":1}}],["enum",{"2":{"58":2,"60":2}}],["env",{"2":{"84":1,"85":1}}],["envs",{"2":{"37":1}}],["enviroment",{"2":{"37":1}}],["enviroments",{"2":{"33":1}}],["environnement",{"2":{"36":1}}],["environment",{"0":{"62":1},"1":{"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"33":2,"35":1,"36":5,"37":10,"42":2,"83":1,"84":4,"85":3}}],["environments",{"0":{"33":1,"34":1,"42":1},"1":{"35":1,"36":1,"37":1},"2":{"28":1,"33":1,"35":2,"42":2,"85":1}}],["enter",{"2":{"71":1,"87":1,"179":1,"187":1,"189":1}}],["entering",{"2":{"68":1}}],["entered",{"2":{"28":1}}],["entire",{"2":{"20":1}}],["enableota",{"2":{"31":1,"85":1}}],["enabled",{"2":{"30":1,"32":1,"46":1}}],["enable",{"0":{"46":1},"2":{"30":2,"31":1,"58":1}}],["enableadhoc",{"2":{"28":2}}],["enabling",{"2":{"28":1}}],["english",{"2":{"24":2}}],["ensures",{"2":{"158":1}}],["ensure",{"2":{"22":1,"24":2,"25":2,"98":1,"99":1,"100":1,"138":1,"154":2}}],["endpoints",{"0":{"56":1},"2":{"56":3}}],["endpoint",{"2":{"55":2,"56":3,"57":1}}],["end",{"2":{"2":1,"135":1,"136":2}}],["e67e22",{"2":{"20":2}}],["exe",{"2":{"173":1}}],["exercise",{"2":{"91":1,"97":1}}],["extremes",{"2":{"113":1,"184":1,"191":1}}],["external",{"0":{"123":1},"2":{"25":1,"123":2,"144":1,"149":1}}],["extend",{"2":{"24":2,"25":1}}],["extensions",{"0":{"153":1},"2":{"153":2}}],["extension",{"2":{"19":1,"54":1,"67":1,"152":1,"153":1}}],["excessive",{"2":{"97":1}}],["expand",{"2":{"195":1,"196":1}}],["expressions",{"2":{"195":1,"196":1}}],["explains",{"2":{"193":1}}],["experimental",{"0":{"188":1},"1":{"189":1},"2":{"152":1}}],["experiment",{"2":{"114":1}}],["experience",{"2":{"91":1,"97":1,"103":1}}],["expect",{"2":{"103":1,"119":1}}],["exposures",{"2":{"98":1}}],["exposure",{"0":{"99":1,"100":1},"2":{"91":1,"98":3,"99":2,"100":2}}],["exposed",{"2":{"91":1,"97":1,"98":2,"128":1,"129":1}}],["exactly",{"2":{"91":2,"97":2,"105":1,"158":1}}],["example",{"2":{"17":1,"18":1,"19":1,"20":1,"25":3,"31":1,"47":1,"55":1,"84":1,"85":1,"87":1,"111":1,"123":1,"132":1,"135":1,"190":4}}],["examples",{"2":{"16":1,"36":1}}],["exists",{"2":{"77":1}}],["existing",{"0":{"110":1},"2":{"25":1,"56":1}}],["ex",{"2":{"68":1,"153":1}}],["editing",{"0":{"21":1}}],["edit",{"2":{"16":1,"21":2,"118":1,"138":1}}],["eyetrackapp",{"2":{"170":1,"171":3}}],["eyetrackvr",{"0":{"5":1,"9":1,"89":1,"90":1,"172":1,"173":2,"174":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":2,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"9":1,"12":2,"17":1,"18":1,"22":1,"59":1,"68":2,"80":1,"91":1,"97":1,"168":1,"169":1}}],["eyesy",{"2":{"164":1}}],["eyestrain",{"2":{"98":1}}],["eyes",{"0":{"178":1,"191":1},"2":{"91":3,"97":3,"98":1,"105":1,"178":1,"191":2,"196":1}}],["eye",{"0":{"163":1,"176":1,"177":1,"185":1},"1":{"164":1},"2":{"2":1,"37":2,"89":1,"97":1,"98":3,"100":1,"107":1,"113":1,"118":1,"129":2,"135":1,"151":1,"152":1,"176":1,"177":1,"181":1,"183":1,"184":1,"185":1,"187":2,"190":2,"191":7}}],["1x",{"2":{"154":1,"155":3,"158":1,"160":2}}],["160°",{"0":{"152":1}}],["16",{"0":{"134":1}}],["13",{"0":{"131":1}}],["13dbm",{"2":{"58":2,"60":2}}],["1206",{"2":{"158":1}}],["120°",{"2":{"152":1}}],["12",{"0":{"130":1},"2":{"132":1,"133":1}}],["12345678",{"2":{"85":1}}],["1234567891011121314",{"2":{"58":1,"60":1}}],["123456789note",{"2":{"19":1}}],["12345",{"2":{"25":1,"85":1}}],["12345the",{"2":{"25":1}}],["11",{"0":{"129":1},"2":{"168":1}}],["11dbm",{"2":{"58":2,"60":2}}],["1cm2",{"2":{"99":2,"100":2}}],["1cm",{"2":{"99":3,"100":3}}],["1dbm",{"2":{"58":2,"60":2}}],["18",{"0":{"135":1},"2":{"58":2,"60":2}}],["19dbm",{"2":{"58":2,"60":2}}],["19",{"0":{"138":1},"1":{"139":1,"140":1},"2":{"58":2,"60":2}}],["14mm",{"2":{"160":1}}],["14",{"0":{"132":1},"2":{"58":1,"133":1}}],["1by",{"2":{"46":1}}],["1this",{"2":{"20":1}}],["1000",{"2":{"98":1}}],["100",{"2":{"98":1,"103":1}}],["10",{"0":{"128":1},"2":{"11":1,"98":2}}],["17dbm",{"2":{"58":2,"60":2}}],["17",{"0":{"2":1}}],["1",{"0":{"63":1,"76":1,"77":1,"84":2,"85":1,"111":1,"119":1,"139":1,"144":1,"173":1},"1":{"64":1,"65":1,"77":1,"78":1},"2":{"1":1,"2":1,"11":1,"12":4,"20":1,"28":2,"31":1,"55":1,"58":1,"84":2,"85":2,"87":1,"98":1,"99":4,"100":1,"111":1,"134":1,"135":1,"169":1}}],["1st",{"2":{"1":1,"134":1}}],["15dbm",{"2":{"58":2,"60":2}}],["15",{"0":{"1":1,"133":1},"2":{"11":1}}],["n",{"2":{"121":1}}],["night",{"0":{"152":1}}],["nir",{"2":{"91":1}}],["nice",{"2":{"20":1}}],["numbers",{"0":{"99":1,"100":1},"2":{"189":1}}],["number",{"2":{"58":1,"60":1,"98":1,"99":1,"100":1,"179":1,"189":1}}],["npm",{"2":{"25":1}}],["native",{"2":{"107":1}}],["navigating",{"2":{"68":1}}],["navigate",{"2":{"12":1,"84":1}}],["namely",{"2":{"142":1}}],["named",{"2":{"84":1,"195":1}}],["name",{"2":{"17":1,"28":2,"30":1,"31":1,"44":3,"46":5,"47":2,"50":2,"55":2,"57":1,"58":1,"59":2,"84":3,"85":2,"196":2}}],["names",{"2":{"15":1}}],["naming",{"2":{"15":1}}],["none",{"2":{"110":1,"138":1,"196":1}}],["non",{"2":{"91":1,"98":1}}],["now",{"2":{"36":1,"80":1,"86":1,"99":2,"100":2,"112":1,"124":1,"135":1,"171":1,"190":4,"191":1,"195":1,"196":3}}],["no",{"2":{"25":1,"91":1,"139":1,"141":1,"142":1,"145":1,"157":1,"161":1}}],["normal",{"2":{"99":1}}],["normalized",{"2":{"98":1}}],["normalize",{"2":{"98":2}}],["nor",{"2":{"25":1,"195":1}}],["node",{"2":{"11":1}}],["noting",{"2":{"118":1,"152":1,"154":1}}],["nothing",{"2":{"31":1}}],["noted",{"2":{"123":1}}],["note",{"0":{"189":1},"2":{"28":1,"37":1,"39":1,"41":1,"56":3,"58":2,"60":1,"68":1,"86":1,"107":1,"120":1,"124":2,"125":1,"135":1,"142":1,"152":1,"193":1,"198":1}}],["not",{"0":{"50":1,"103":1,"110":1},"2":{"1":2,"3":1,"4":1,"15":2,"19":2,"25":2,"28":5,"30":1,"31":2,"32":3,"36":2,"37":3,"39":1,"44":3,"46":4,"50":2,"56":1,"57":3,"58":1,"68":2,"79":1,"80":1,"85":1,"91":5,"94":2,"97":6,"98":6,"100":1,"103":2,"104":1,"105":1,"107":1,"110":1,"123":5,"124":1,"128":1,"134":2,"148":3,"151":1,"152":1,"153":1,"158":5,"161":2,"166":2,"195":1,"198":1}}],["neos",{"2":{"193":1}}],["near",{"2":{"129":1,"141":1,"153":1}}],["nearly",{"2":{"113":1}}],["nevertheless",{"2":{"118":1}}],["next",{"2":{"74":1,"84":1,"85":1,"126":1,"127":1,"135":1,"159":1,"191":1}}],["networkname",{"2":{"58":1}}],["networks",{"2":{"58":1}}],["network",{"2":{"28":1,"30":1,"31":1,"39":1,"41":1,"50":2,"56":4,"58":6,"59":1,"85":1}}],["neither",{"2":{"25":1}}],["newest",{"0":{"87":1},"1":{"88":1},"2":{"87":1}}],["new",{"2":{"17":1,"25":4,"32":1,"39":1,"46":1,"52":1,"56":3,"68":1,"78":1,"83":1}}],["needs",{"2":{"98":1,"144":1,"198":1}}],["need",{"0":{"107":1},"2":{"2":1,"17":1,"19":3,"21":1,"28":6,"31":5,"33":1,"36":1,"37":1,"39":1,"42":1,"46":2,"47":1,"66":1,"73":1,"83":1,"85":1,"87":1,"98":1,"99":1,"100":1,"112":1,"123":2,"129":1,"135":1,"148":1,"149":1,"153":1,"154":1,"159":1,"166":1,"191":1,"193":1,"195":3,"196":1,"198":1}}],["needed",{"2":{"1":1,"25":1,"68":1,"134":1,"139":1,"142":1}}],["negative",{"0":{"132":1},"2":{"1":2,"128":1,"132":1,"134":2}}],["black",{"2":{"124":2}}],["bit",{"2":{"140":1,"144":1}}],["biggest",{"2":{"113":1}}],["bigger",{"2":{"98":1}}],["bizarre",{"2":{"69":1}}],["binary",{"2":{"59":1}}],["binaries",{"2":{"41":1}}],["bare",{"2":{"155":1}}],["bard",{"2":{"74":1}}],["backing",{"2":{"190":1}}],["back",{"2":{"124":1,"190":1,"196":1}}],["bag",{"0":{"123":1},"2":{"123":2}}],["band",{"2":{"28":3,"91":1,"98":1}}],["based",{"2":{"99":1,"100":1,"159":1}}],["bashfeat",{"2":{"25":1}}],["bash",{"2":{"25":1,"68":1}}],["basic",{"0":{"110":1},"2":{"4":1,"32":1,"54":1,"107":1,"112":1,"119":1,"161":2,"175":1}}],["bounces",{"2":{"196":1}}],["bool",{"2":{"195":3,"198":1}}],["boot",{"2":{"78":3}}],["bodily",{"2":{"91":1,"97":1}}],["body",{"2":{"25":1,"149":1}}],["bottom",{"2":{"79":1,"129":1,"140":1,"153":1}}],["both",{"0":{"178":1},"2":{"28":2,"46":1,"123":1,"154":1,"155":1,"159":2,"178":1,"187":1,"191":1,"195":2}}],["bonjour",{"0":{"48":1},"2":{"48":4}}],["board",{"0":{"37":1,"128":1},"2":{"35":1,"37":3,"77":1,"78":1,"80":1,"85":1,"123":1,"128":1,"149":4}}],["boards",{"0":{"147":1},"1":{"148":1,"149":1},"2":{"1":1,"37":5,"39":1,"114":1,"123":1,"134":1,"144":1,"151":1,"152":1,"153":1,"154":1,"157":1,"159":1}}],["breakout",{"2":{"155":1}}],["break",{"2":{"139":1,"151":1}}],["breaking",{"2":{"25":7,"139":1}}],["bridging",{"2":{"123":1}}],["bridge",{"2":{"123":3}}],["brighter",{"2":{"98":1}}],["brightness",{"2":{"91":1,"97":1}}],["branch",{"2":{"68":1}}],["broader",{"2":{"98":1}}],["broad",{"2":{"91":1,"98":1}}],["broadcast",{"2":{"58":1}}],["broken",{"2":{"35":1}}],["broccoli",{"2":{"25":1}}],["browser",{"2":{"12":1,"32":1,"54":1,"84":1,"86":1,"127":1,"187":2,"195":1}}],["bypass",{"2":{"91":1,"97":1}}],["by",{"0":{"118":1},"2":{"24":1,"30":1,"32":4,"37":1,"39":1,"41":1,"46":1,"47":1,"58":1,"59":1,"68":2,"71":1,"78":1,"80":1,"84":1,"85":1,"86":1,"93":1,"96":1,"98":4,"135":1,"163":1,"187":1,"190":1,"191":1,"196":1}}],["bunch",{"2":{"196":1}}],["burn",{"2":{"158":1}}],["buying",{"2":{"158":1}}],["buy",{"2":{"105":1,"142":1,"158":2}}],["bugs",{"2":{"103":1}}],["bug",{"2":{"25":2,"57":1}}],["buttons",{"0":{"196":1},"2":{"85":1,"196":2}}],["button",{"2":{"74":1,"77":3,"78":3,"79":1,"80":1,"84":2,"85":2,"86":1,"187":1,"189":1,"190":1,"191":3,"195":1,"196":2}}],["but",{"2":{"20":1,"28":2,"37":1,"44":1,"79":1,"83":1,"84":1,"124":1,"132":2,"151":1,"152":1}}],["builds",{"2":{"79":1}}],["building",{"0":{"75":1,"90":1,"154":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"95":1},"2":{"69":1,"83":1,"127":1}}],["build",{"0":{"36":1,"79":1,"117":1,"165":1,"166":1,"171":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"25":2,"35":1,"36":1,"67":1,"69":1,"79":1,"84":3,"90":1,"149":1,"166":1,"169":1,"171":2,"196":1}}],["builtin",{"2":{"55":2,"57":1}}],["built",{"2":{"9":1,"20":1,"41":2,"80":1}}],["buil",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["because",{"2":{"190":1}}],["been",{"2":{"80":1,"94":1,"104":1,"124":1,"142":1,"169":1}}],["begin",{"2":{"78":1}}],["being",{"2":{"56":1,"91":1,"97":1,"98":1,"158":1,"190":2,"195":1}}],["better",{"2":{"138":1,"145":1}}],["beta",{"0":{"145":1,"189":2},"2":{"39":1,"41":1,"107":1}}],["between",{"2":{"35":1,"158":1}}],["best",{"2":{"28":1,"114":1,"123":2,"141":1,"159":1,"183":1,"191":1}}],["before",{"0":{"101":1,"102":1},"1":{"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"19":1,"68":1,"125":2,"143":1,"168":1}}],["below",{"2":{"14":1,"80":1,"99":1,"100":1,"123":2,"124":1,"132":1,"137":2,"138":1}}],["be",{"0":{"102":1,"106":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"1":1,"3":1,"15":1,"17":2,"18":1,"20":1,"24":5,"31":1,"32":4,"33":1,"36":4,"42":1,"44":1,"46":3,"54":1,"56":1,"57":1,"58":1,"59":2,"68":3,"72":1,"75":1,"78":1,"80":2,"83":1,"85":3,"88":1,"91":1,"97":1,"98":1,"99":2,"100":2,"105":1,"106":1,"116":1,"123":3,"124":3,"132":1,"134":1,"135":1,"138":1,"139":1,"144":1,"145":2,"148":1,"151":1,"158":2,"161":2,"171":2,"173":1,"174":1,"179":1,"183":1,"187":1,"193":1,"195":3,"196":1,"198":2}}],["ov2640",{"0":{"152":1},"2":{"152":1}}],["overview",{"0":{"102":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"119":1}}],["overwritten",{"2":{"58":1}}],["over",{"0":{"144":1,"145":1},"2":{"38":1,"56":1,"75":1,"80":1,"82":1,"83":1,"98":1,"175":1,"187":1,"190":1}}],["occur",{"2":{"103":1}}],["octal",{"2":{"37":2}}],["ohm",{"2":{"99":1,"123":1,"158":2}}],["ohms",{"2":{"99":1}}],["osc",{"0":{"197":1},"2":{"89":1,"193":2,"197":1,"198":1}}],["oldest",{"2":{"58":1}}],["otaserverport",{"2":{"85":1}}],["otaserverip",{"2":{"31":2,"85":1}}],["otapassword",{"2":{"31":2,"85":1}}],["ota",{"0":{"31":1,"81":1},"1":{"82":1,"83":1,"84":1,"85":1},"2":{"31":2,"39":1,"41":1,"56":1,"59":6,"75":1,"80":2,"82":1,"83":3,"84":3,"85":5}}],["others",{"2":{"141":1}}],["other",{"0":{"90":1,"161":1,"198":1},"1":{"95":1},"2":{"2":1,"16":1,"25":1,"28":2,"80":2,"113":1,"129":1,"135":2,"136":1,"144":1,"191":1,"196":1}}],["opinion",{"2":{"98":1}}],["optimal",{"2":{"129":1,"141":2,"144":1}}],["optical",{"2":{"91":1,"98":1}}],["option",{"0":{"77":1,"78":1,"144":1,"145":1},"2":{"123":2,"152":1,"174":1}}],["options",{"0":{"143":1},"1":{"144":1,"145":1},"2":{"36":1,"143":1}}],["optionaland",{"2":{"25":1}}],["optional",{"0":{"153":1},"2":{"25":3,"160":1}}],["opt",{"2":{"75":1}}],["operation",{"2":{"32":1}}],["openiristrackerl",{"2":{"85":1}}],["openiristracker",{"2":{"46":2,"59":1,"84":2}}],["openiris",{"2":{"39":2,"68":3,"87":2,"93":1}}],["opening",{"2":{"39":1,"41":1,"68":1,"187":1}}],["opened",{"0":{"27":1},"2":{"196":1}}],["open",{"0":{"28":1,"189":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"12":1,"41":1,"56":1,"67":1,"68":6,"71":1,"72":3,"74":3,"84":3,"85":1,"86":1,"87":1,"89":1,"124":1,"169":1,"170":1,"171":1,"187":1}}],["owning",{"2":{"107":1}}],["own",{"0":{"109":1,"110":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1},"2":{"25":1,"39":1,"105":1,"107":1,"112":1,"157":1,"161":2}}],["objects",{"2":{"124":1}}],["object",{"2":{"19":2,"56":1,"98":1}}],["our",{"0":{"120":1},"2":{"14":1,"20":1,"24":1,"25":7,"32":1,"39":2,"52":1,"92":1,"93":1,"94":1,"95":1,"104":1,"126":1,"127":1,"132":1,"145":1,"161":1,"183":1,"190":2}}],["outdated",{"0":{"192":1}}],["outline",{"0":{"99":1,"100":1}}],["outside",{"2":{"98":1,"99":1,"131":1}}],["outputs",{"2":{"180":1}}],["output",{"2":{"41":1,"80":1,"85":1,"86":1}}],["out",{"2":{"1":3,"56":1,"90":1,"92":1,"124":1,"126":1,"134":3,"158":2,"161":1,"181":1,"182":1,"189":1}}],["often",{"2":{"56":1}}],["official",{"2":{"157":1}}],["offers",{"2":{"144":1}}],["off",{"2":{"32":1,"190":1,"196":1}}],["of",{"0":{"85":1,"86":1,"102":1,"122":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"1":2,"2":1,"3":3,"4":3,"5":1,"15":1,"16":1,"17":1,"20":4,"25":4,"28":4,"30":1,"31":3,"33":1,"36":2,"38":1,"39":1,"42":1,"44":8,"46":5,"47":2,"50":2,"54":1,"55":1,"56":4,"58":4,"59":1,"60":1,"61":1,"68":1,"72":2,"74":1,"77":2,"78":1,"79":1,"80":1,"84":2,"85":4,"86":2,"87":1,"91":5,"94":1,"97":1,"98":9,"99":7,"100":6,"110":1,"113":2,"118":4,"119":1,"120":1,"123":3,"124":4,"128":2,"129":3,"131":1,"132":1,"134":2,"135":1,"137":1,"138":4,"139":3,"140":3,"142":1,"143":1,"144":1,"151":1,"152":1,"153":1,"154":1,"158":1,"160":1,"161":1,"169":1,"170":1,"179":1,"190":6,"193":3,"195":3,"196":4,"197":1,"198":1}}],["once",{"0":{"27":1,"108":1},"2":{"36":1,"67":1,"74":1,"75":1,"77":1,"78":1,"80":1,"83":2,"84":1,"91":1,"97":1,"124":1,"126":1,"129":1,"130":1,"171":1,"191":2,"196":2}}],["only",{"0":{"149":1,"189":1},"2":{"1":1,"2":1,"24":2,"25":2,"28":2,"30":1,"32":1,"36":1,"37":1,"48":2,"58":1,"68":1,"83":1,"86":1,"99":1,"100":1,"105":1,"124":1,"134":1,"135":2,"149":2,"154":1,"164":1,"176":1,"177":1,"190":1,"198":1}}],["ones",{"2":{"80":1,"105":2,"129":3,"152":1,"158":3}}],["one",{"2":{"1":1,"2":1,"4":2,"28":1,"33":1,"42":1,"56":1,"71":1,"72":1,"80":1,"84":2,"85":1,"86":1,"94":1,"134":1,"135":1,"136":1,"138":1,"149":1,"154":2,"155":1,"191":1,"196":2}}],["on",{"0":{"2":1,"3":1,"27":1,"108":1,"110":1,"120":1,"135":1,"136":1,"192":1},"2":{"1":4,"3":1,"4":1,"14":1,"16":1,"20":1,"30":1,"31":1,"36":1,"37":1,"38":2,"39":3,"41":2,"46":1,"58":1,"59":1,"61":1,"72":4,"74":5,"77":1,"78":1,"83":2,"84":3,"85":1,"86":1,"91":3,"94":1,"97":1,"98":2,"99":2,"100":2,"112":1,"114":1,"115":1,"118":1,"123":1,"126":2,"127":1,"131":1,"132":1,"134":4,"135":2,"137":1,"139":1,"140":1,"142":1,"145":2,"149":1,"152":1,"154":1,"155":2,"159":2,"161":1,"174":1,"190":2,"195":5,"196":3,"198":1}}],["org",{"2":{"169":1}}],["organizing",{"2":{"18":1}}],["orientate",{"2":{"136":1}}],["orientation",{"2":{"3":1,"123":1}}],["order",{"0":{"120":1},"2":{"59":1,"66":1,"149":1}}],["orange",{"2":{"20":1}}],["or",{"0":{"123":1},"2":{"1":1,"11":4,"15":1,"16":1,"25":4,"28":1,"32":1,"37":1,"44":1,"52":1,"56":1,"58":1,"68":1,"69":1,"74":1,"80":1,"84":2,"85":4,"91":3,"94":1,"97":4,"98":2,"103":1,"105":2,"110":1,"111":1,"113":1,"114":1,"116":2,"118":1,"123":1,"124":1,"129":2,"134":1,"138":2,"144":1,"145":2,"148":1,"149":2,"155":3,"158":3,"160":1,"161":1,"179":1,"196":2}}],["5mm",{"2":{"153":1}}],["5mw",{"2":{"99":1,"100":1}}],["52",{"2":{"58":1,"60":1}}],["5dbm",{"2":{"58":8,"60":8}}],["5ghz",{"2":{"28":1}}],["56mm",{"2":{"128":1}}],["56",{"2":{"11":1}}],["5",{"0":{"115":1,"123":1,"191":1},"2":{"1":1,"91":1,"99":2,"100":2,"134":1}}],["5v",{"2":{"1":2,"4":1,"99":2,"128":1,"131":1,"134":2}}],["due",{"2":{"144":1}}],["during",{"2":{"85":1}}],["draw",{"2":{"99":1,"190":1}}],["dry",{"2":{"91":1,"97":1}}],["drivers",{"0":{"66":1},"2":{"66":3,"80":1}}],["dbm",{"2":{"58":1}}],["dab",{"2":{"139":1}}],["damaged",{"2":{"105":1}}],["damage",{"2":{"91":1,"97":1,"105":1}}],["dark",{"2":{"91":1,"97":1,"182":1}}],["danger",{"2":{"91":1,"97":1,"143":1,"151":1,"158":1}}],["dangerous",{"0":{"105":1},"2":{"91":1,"97":1}}],["date",{"2":{"80":1}}],["data",{"2":{"38":1,"80":1,"91":1}}],["datasheet",{"2":{"1":1,"99":1,"100":1,"134":1}}],["dashboard",{"2":{"74":1}}],["daily",{"2":{"36":1}}],["dns",{"2":{"31":1}}],["decision",{"2":{"143":1}}],["decide",{"2":{"36":1,"151":1}}],["dead",{"2":{"142":1,"152":1}}],["definitely",{"2":{"98":1}}],["default",{"2":{"36":1,"37":4,"46":2,"57":1,"84":2,"87":1,"152":1}}],["defaults",{"2":{"28":1}}],["defauly",{"2":{"32":1}}],["deleting",{"2":{"197":1}}],["deletes",{"2":{"56":1}}],["delete",{"2":{"56":3,"197":1}}],["delay",{"2":{"142":1}}],["delayed",{"2":{"98":1}}],["delivers",{"2":{"128":1}}],["denotes",{"2":{"87":1,"128":1}}],["demonstration",{"2":{"86":1}}],["depending",{"2":{"139":1,"154":1,"196":1}}],["dependencies",{"2":{"25":1,"169":2}}],["depricated",{"2":{"59":1}}],["debugging",{"2":{"36":1,"41":1}}],["debug",{"2":{"35":1,"36":7}}],["details",{"2":{"91":1}}],["detail",{"2":{"25":1}}],["descriptor",{"2":{"195":1}}],["description",{"2":{"25":1,"56":1,"58":1,"59":1,"60":1}}],["described",{"2":{"39":1}}],["desktop",{"2":{"38":1,"174":2,"190":3}}],["designed",{"2":{"161":1}}],["designated",{"2":{"141":1}}],["design",{"2":{"24":1,"112":1,"161":1}}],["devices",{"2":{"35":1,"46":2,"52":2,"54":1,"56":1,"59":2,"80":1,"144":1}}],["device",{"0":{"47":1,"50":1},"2":{"35":2,"44":9,"46":5,"47":4,"50":7,"52":2,"55":3,"56":2,"57":1,"78":1,"82":1,"85":1,"189":1}}],["developed",{"2":{"32":1,"52":1,"103":1}}],["developments",{"2":{"120":1}}],["development",{"0":{"5":1,"9":1,"90":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"95":1},"2":{"32":1,"39":1,"90":1}}],["dev",{"2":{"12":2,"17":1,"18":1}}],["doa",{"2":{"142":1,"152":1}}],["doubt",{"2":{"91":1,"97":1}}],["double",{"2":{"28":1,"174":1}}],["doing",{"2":{"91":1,"97":1,"151":2,"158":1}}],["dot",{"2":{"84":1,"137":2}}],["down",{"2":{"78":2,"124":2,"127":1,"138":1}}],["downloaded",{"2":{"68":1}}],["download",{"0":{"39":1,"64":1,"173":1},"2":{"39":2,"41":1,"48":1,"63":1,"68":1,"87":1,"173":1}}],["dont",{"2":{"91":1}}],["done",{"2":{"71":1,"72":1,"74":1,"75":1,"84":2,"91":1,"97":1,"171":1,"187":1,"191":1,"193":1,"196":1}}],["don",{"0":{"197":1},"2":{"25":1,"84":1,"87":1,"88":1,"91":1,"97":2,"98":1,"159":1,"190":1,"195":1}}],["do",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"15":2,"19":2,"25":1,"28":1,"30":1,"31":1,"39":2,"44":2,"46":3,"57":1,"68":2,"73":1,"85":2,"91":6,"97":6,"98":2,"103":1,"111":1,"113":1,"123":1,"124":1,"127":1,"135":1,"151":1,"152":1,"153":1,"158":2,"166":1,"193":1,"195":2}}],["documented",{"2":{"32":1,"138":1}}],["documentation",{"0":{"9":1,"90":2,"106":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"95":2},"2":{"9":1,"14":2,"15":1,"20":1,"24":4,"25":1,"61":1,"68":1,"96":1,"169":1}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"15":1,"16":1,"17":2,"18":2,"19":1,"21":1,"25":1,"88":1,"116":1,"118":1}}],["does",{"2":{"4":1,"19":1,"36":1,"37":1,"44":1,"79":1,"80":1,"87":1,"107":1,"110":1,"123":2,"148":3}}],["digikey",{"2":{"158":3}}],["dim",{"2":{"128":1}}],["difficulties",{"0":{"104":1}}],["difference",{"2":{"158":1}}],["different",{"2":{"1":1,"28":2,"33":2,"35":1,"37":1,"42":2,"46":1,"91":2,"97":3,"128":1,"129":1,"134":1,"138":1}}],["differs",{"2":{"141":1}}],["differnt",{"2":{"91":1}}],["direction",{"2":{"137":1}}],["directly",{"0":{"78":1},"2":{"78":1,"98":2,"193":1,"196":2}}],["directory",{"2":{"68":2,"84":1,"87":1,"197":1}}],["directories",{"0":{"18":1},"2":{"18":1,"84":1}}],["discount",{"2":{"158":1}}],["discord",{"0":{"189":1},"2":{"88":1,"95":1,"116":1,"118":1,"132":1,"161":2,"163":1}}],["dist",{"2":{"171":1}}],["distance",{"2":{"98":3,"99":2,"100":2}}],["distinct",{"2":{"35":1}}],["disabled",{"2":{"46":1}}],["diagram",{"2":{"4":2,"137":2}}],["dinstructions",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["hmd",{"2":{"159":1}}],["hubs",{"0":{"154":1}}],["hub",{"2":{"145":1,"154":2}}],["hit",{"2":{"191":1}}],["his",{"2":{"112":1}}],["hinder",{"2":{"103":1}}],["hidden",{"2":{"84":1}}],["highligh",{"2":{"195":1}}],["highlighted",{"2":{"86":1,"195":1}}],["highly",{"2":{"128":1,"158":1}}],["higher",{"2":{"11":4,"99":1,"100":1,"145":1,"148":1,"155":1}}],["high",{"2":{"3":1,"98":1,"190":1}}],["hence",{"2":{"158":1}}],["heatsinks",{"2":{"160":1}}],["heats",{"2":{"144":1}}],["head",{"2":{"138":1,"190":1}}],["headsets",{"0":{"111":1,"161":1},"2":{"145":1,"153":1}}],["headset",{"0":{"94":1,"110":1},"1":{"95":1},"2":{"94":2,"110":1,"111":2,"113":2,"138":1,"144":1,"145":1,"153":1,"161":3,"190":2}}],["help",{"2":{"56":1,"88":1,"123":3}}],["here",{"0":{"90":1},"1":{"95":1},"2":{"1":1,"20":1,"22":1,"32":1,"39":2,"48":2,"66":1,"68":2,"84":1,"85":1,"88":1,"93":1,"110":1,"111":2,"112":1,"116":1,"128":1,"134":1,"138":1,"146":1,"151":1,"158":5,"161":3,"163":1,"173":1,"193":1,"196":1}}],["happens",{"2":{"139":1}}],["happy",{"2":{"88":1}}],["handled",{"2":{"105":1}}],["handy",{"2":{"69":1,"132":1}}],["harm",{"2":{"91":2,"97":2}}],["hardware",{"0":{"92":1,"99":1,"100":1,"122":1},"2":{"92":2,"98":1,"99":1,"100":1,"112":1,"120":2,"142":2}}],["hard",{"2":{"87":1,"98":1}}],["had",{"2":{"87":1}}],["having",{"2":{"31":1,"82":1,"84":1,"135":1,"138":1,"149":1}}],["haven",{"2":{"190":1}}],["have",{"0":{"27":1,"104":1,"108":1,"110":1,"119":1},"2":{"1":1,"2":1,"4":1,"24":1,"25":1,"28":3,"30":1,"33":1,"35":1,"36":1,"37":1,"39":1,"41":1,"42":1,"44":1,"46":1,"68":2,"75":1,"78":1,"80":2,"83":2,"84":2,"85":1,"86":1,"87":1,"94":1,"98":1,"99":1,"100":1,"110":2,"112":2,"115":1,"122":1,"123":5,"125":1,"134":1,"135":1,"138":2,"141":1,"151":1,"152":1,"161":2,"169":1,"191":1,"195":1,"196":2}}],["has",{"2":{"28":2,"36":2,"56":1,"57":1,"80":1,"85":1,"104":1,"124":1,"127":2,"132":1,"142":1,"154":2,"193":1}}],["h1",{"2":{"20":2}}],["htc",{"2":{"154":1}}],["http",{"2":{"30":1,"31":2,"47":1,"52":1,"55":1,"57":1,"84":3}}],["https",{"2":{"12":1,"17":1,"18":1,"66":1,"68":2,"111":1,"151":1,"169":1}}],["html",{"2":{"20":2}}],["hole",{"2":{"158":1}}],["holding",{"2":{"78":2,"114":1,"135":1,"187":1}}],["hold",{"2":{"2":1,"77":1,"91":1,"97":1,"135":1,"136":1}}],["hot",{"2":{"139":1,"141":2,"160":1}}],["hope",{"2":{"95":1}}],["hogging",{"2":{"80":1}}],["home",{"2":{"74":1}}],["hostname",{"2":{"59":2,"85":1}}],["however",{"2":{"31":1,"32":1,"46":1,"90":1,"94":1,"123":1,"144":1}}],["how",{"0":{"45":1,"53":1,"83":1,"110":1,"163":1,"166":1,"172":1},"1":{"46":1,"47":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"84":1,"85":1,"164":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"16":3,"36":1,"39":1,"62":1,"66":1,"77":1,"127":1,"138":1,"149":1,"151":1,"193":2}}],["lcsc",{"2":{"158":4}}],["luck",{"2":{"115":1}}],["ll",{"2":{"66":1,"73":1,"84":1,"87":1,"149":1,"159":1,"195":1,"196":1}}],["large",{"2":{"149":1}}],["larger",{"2":{"148":1}}],["lay",{"2":{"131":1}}],["labeled",{"2":{"77":1}}],["labels",{"2":{"1":2,"134":2}}],["latency",{"2":{"145":1}}],["later",{"2":{"68":1}}],["latest",{"0":{"189":1},"2":{"63":1,"68":1,"145":1,"173":1}}],["lt",{"2":{"20":2,"25":2,"30":1,"55":1,"57":6,"74":1,"84":1,"98":2,"197":2}}],["limit",{"2":{"98":1,"99":1,"100":1}}],["limited",{"2":{"98":1,"100":1,"198":1}}],["limits",{"2":{"91":1,"98":1}}],["license",{"2":{"96":2}}],["licenses",{"0":{"96":1}}],["library",{"2":{"91":1}}],["lightweight",{"2":{"154":1}}],["lightly",{"2":{"135":1}}],["light",{"2":{"91":2,"97":1,"98":3}}],["little",{"2":{"72":1,"138":1}}],["lives",{"2":{"38":1}}],["likely",{"2":{"98":1,"128":1,"139":1}}],["like",{"0":{"27":1},"2":{"20":2,"32":1,"37":1,"56":1,"74":1,"80":1,"84":2,"85":1,"86":1,"98":1,"111":1,"120":1,"123":1,"135":1,"137":2,"153":2,"158":1,"174":1,"182":1,"190":1,"196":2,"198":1}}],["line",{"2":{"19":1,"25":1}}],["linked",{"2":{"80":1,"105":1}}],["link",{"2":{"19":4,"158":1}}],["listening",{"2":{"197":1}}],["listens",{"2":{"193":1,"198":1}}],["listed",{"0":{"116":1,"120":1},"2":{"22":1,"85":1,"94":1,"161":2}}],["lists",{"2":{"99":1,"100":1}}],["list",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1},"2":{"5":1,"25":2,"85":1,"92":1,"94":2,"138":2}}],["low",{"2":{"144":1,"158":1,"190":1}}],["lower",{"2":{"113":1,"128":1,"145":1,"155":1,"158":1}}],["lowercase",{"2":{"15":1}}],["loss",{"2":{"142":1}}],["longer",{"2":{"129":2}}],["long",{"2":{"121":1}}],["lorow",{"2":{"93":1}}],["location",{"2":{"113":1}}],["locate",{"2":{"74":1,"84":1,"85":1,"124":1}}],["located",{"2":{"46":1,"158":1}}],["locallow",{"2":{"197":1}}],["local",{"2":{"30":1,"31":2,"46":1,"47":2,"55":2,"57":1,"84":2,"85":1}}],["logging",{"2":{"36":1}}],["lot",{"2":{"36":2}}],["looking",{"2":{"98":2,"113":2,"185":1}}],["looks",{"2":{"80":1,"174":1}}],["look",{"2":{"16":1,"59":2,"94":1,"98":2,"124":1,"143":1,"158":1,"184":1,"191":4}}],["length",{"2":{"128":1,"129":1}}],["lengthy",{"2":{"98":1}}],["lenses",{"2":{"152":1}}],["lens",{"0":{"111":1},"2":{"91":1,"98":1,"111":3,"113":1}}],["least",{"2":{"83":1,"122":1}}],["learned",{"2":{"132":1}}],["learn",{"2":{"66":1}}],["leave",{"2":{"28":2,"196":1}}],["levels",{"2":{"98":1}}],["level",{"2":{"60":1,"91":1,"97":1,"183":1}}],["let",{"0":{"192":1},"2":{"39":1,"41":1,"161":2,"175":1,"196":1,"197":1}}],["letting",{"2":{"36":1}}],["letters",{"2":{"15":1}}],["less",{"2":{"36":1,"99":1,"100":2,"144":2,"145":1,"157":1,"196":1}}],["lefteyelidexpandedsqueeze",{"2":{"164":1}}],["lefteyex",{"2":{"164":1}}],["left",{"0":{"27":1,"177":1},"2":{"177":1,"190":1,"191":1}}],["leds",{"0":{"3":1,"114":1,"129":1,"136":1},"2":{"1":2,"98":2,"99":1,"100":1,"128":1,"134":2,"137":1,"141":2,"155":1}}],["led",{"0":{"1":1,"130":1,"134":1,"141":1},"2":{"1":3,"91":1,"98":2,"99":2,"100":2,"114":1,"118":1,"129":1,"134":3,"136":2,"157":1}}],["auto",{"2":{"197":1}}],["automatically",{"2":{"25":1}}],["awg",{"2":{"155":3,"158":1}}],["away",{"2":{"98":3,"125":1,"137":1}}],["again",{"2":{"141":1}}],["average",{"2":{"99":1,"100":1}}],["avoid",{"2":{"98":1}}],["avatars",{"2":{"197":2}}],["avatar",{"0":{"107":1,"163":1},"1":{"164":1},"2":{"107":2,"163":1,"193":1,"195":2,"196":1,"198":2}}],["avalable",{"0":{"90":1},"1":{"95":1}}],["available",{"2":{"36":1,"85":1,"158":1}}],["ammount",{"2":{"124":1}}],["amount",{"2":{"98":1,"124":1}}],["amps",{"2":{"99":1}}],["amp",{"2":{"55":1,"57":1}}],["amazon",{"2":{"37":1,"148":1,"149":2,"152":1,"155":3,"160":3}}],["aid",{"2":{"123":1}}],["air",{"2":{"82":1,"135":1}}],["ai",{"2":{"37":1}}],["adresses",{"2":{"198":1}}],["adoption",{"2":{"144":1}}],["adjust",{"0":{"172":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"78":1,"115":1,"164":1,"183":1,"190":2}}],["adapters",{"0":{"155":1},"2":{"154":1}}],["adapted",{"2":{"68":1,"88":1}}],["adaptation",{"2":{"68":1}}],["adhoc",{"2":{"58":1}}],["advanced",{"2":{"32":1,"145":1}}],["address",{"0":{"86":1,"179":1},"2":{"31":2,"44":6,"86":1,"179":1,"187":4,"189":1}}],["addresses",{"2":{"30":1,"198":1}}],["additionally",{"2":{"80":1}}],["additional",{"0":{"29":1},"1":{"30":1,"31":1,"32":1,"33":1},"2":{"148":1}}],["adding",{"0":{"17":1,"19":1,"186":1,"195":1,"196":1},"1":{"18":1,"19":1,"20":1,"187":1,"188":1,"189":1,"190":1},"2":{"25":1,"37":1,"38":1,"39":1,"41":1}}],["added",{"2":{"25":1,"116":1,"161":2}}],["adds",{"2":{"25":1,"56":1}}],["add",{"2":{"16":1,"17":1,"19":7,"20":1,"25":1,"46":1,"56":1,"58":1,"114":1,"130":1,"135":1,"138":1,"195":3,"196":5}}],["above",{"0":{"108":1},"2":{"74":1,"80":1,"158":1,"161":2,"195":1,"196":1}}],["about",{"0":{"91":1,"97":1,"98":1},"1":{"98":1},"2":{"25":1,"28":1,"68":1,"98":3,"128":1}}],["able",{"2":{"31":1,"46":1,"83":1,"139":1,"196":1}}],["api",{"0":{"32":1,"51":1,"54":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1},"2":{"32":6,"52":2,"54":2,"55":1,"56":1,"57":1}}],["ap",{"2":{"28":17,"58":1}}],["appdata",{"2":{"197":1}}],["appropriate",{"2":{"154":1}}],["approach",{"2":{"84":1}}],["apply",{"2":{"87":2,"131":1,"135":1,"139":1,"140":1}}],["application",{"2":{"190":1}}],["applications",{"2":{"85":1}}],["applicable",{"2":{"28":1,"118":1}}],["app",{"0":{"165":1,"166":1,"171":1,"172":1,"173":1,"174":1,"189":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"32":1,"38":1,"52":1,"83":2,"86":1,"107":1,"166":1,"169":2,"171":3,"173":1,"175":1,"187":1,"189":1,"193":2,"198":2}}],["appears",{"2":{"20":1}}],["acquire",{"2":{"154":1}}],["actual",{"2":{"196":1}}],["actually",{"2":{"125":1}}],["action",{"2":{"196":2}}],["actions",{"2":{"25":2}}],["actively",{"2":{"91":1,"97":1,"100":1}}],["active",{"2":{"90":1,"123":1}}],["achieve",{"2":{"113":1}}],["acknowledged",{"0":{"108":1}}],["accordingly",{"2":{"164":1}}],["account",{"2":{"98":1,"99":1,"100":1}}],["acceptable",{"2":{"158":1}}],["access",{"2":{"28":1,"39":1,"72":2,"74":1,"144":1}}],["accent",{"2":{"20":2}}],["affordable",{"2":{"89":1}}],["affect",{"2":{"25":2}}],["after",{"2":{"1":1,"4":1,"56":1,"75":1,"91":1,"97":1,"98":1,"127":1,"134":1,"170":1}}],["antistatic",{"0":{"123":1},"2":{"123":2}}],["antenna",{"0":{"123":1},"2":{"123":5,"148":1,"149":1}}],["antennas",{"0":{"123":1},"2":{"123":1,"144":1,"148":1,"149":2}}],["angle",{"0":{"113":1}}],["an002",{"2":{"91":1}}],["answer",{"2":{"88":1}}],["another",{"2":{"37":1,"129":1,"160":1,"161":1,"163":1}}],["an",{"0":{"102":1,"123":1},"1":{"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"25":1,"37":1,"39":1,"41":1,"44":1,"56":1,"67":1,"68":1,"77":1,"80":1,"84":1,"88":2,"91":1,"97":1,"123":6,"138":1,"148":1,"151":1,"152":1,"163":1,"174":1,"190":3,"196":1}}],["anywhere",{"2":{"121":1}}],["anything",{"0":{"192":1},"2":{"87":1}}],["anyone",{"2":{"31":1,"197":1}}],["any",{"0":{"110":1},"2":{"20":1,"32":1,"39":1,"41":1,"54":1,"56":3,"68":1,"84":1,"91":2,"95":1,"97":2,"110":1,"161":1}}],["and",{"0":{"39":1,"75":1,"84":1,"85":1,"90":1,"99":1,"100":1,"102":1,"126":1,"127":1,"130":2,"155":1,"172":1,"173":1,"175":1,"186":1,"193":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"95":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"173":1,"174":1,"175":1,"176":2,"177":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":1,"187":2,"188":2,"189":2,"190":2,"191":1,"192":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"1":1,"2":1,"4":1,"5":1,"15":1,"16":1,"20":1,"22":1,"24":1,"25":3,"28":9,"30":2,"32":2,"36":3,"37":3,"38":2,"39":1,"41":3,"46":1,"48":1,"54":1,"56":5,"59":2,"63":1,"67":2,"68":2,"69":4,"71":1,"72":2,"74":3,"77":1,"78":2,"80":2,"82":1,"84":6,"85":2,"86":2,"87":2,"89":2,"90":1,"91":2,"92":1,"94":1,"95":1,"97":1,"98":10,"99":4,"100":4,"103":2,"105":1,"107":1,"111":1,"114":1,"115":1,"119":1,"123":5,"124":1,"125":1,"127":2,"128":4,"129":4,"131":1,"134":1,"135":4,"136":2,"138":1,"142":1,"143":2,"144":4,"145":2,"148":2,"149":2,"152":1,"153":1,"154":2,"158":3,"159":1,"160":1,"161":2,"163":1,"169":1,"170":1,"173":2,"176":1,"177":1,"178":1,"187":4,"189":2,"190":1,"191":3,"193":2,"195":2,"196":5,"197":1,"198":2}}],["alcohol",{"2":{"141":1}}],["alter",{"2":{"158":1}}],["alternative",{"0":{"149":1},"2":{"152":1,"158":1}}],["alternatively",{"0":{"158":1},"2":{"112":1,"148":1,"179":1}}],["although",{"2":{"120":1}}],["alone",{"2":{"98":1}}],["already",{"2":{"48":1}}],["alibaba",{"2":{"37":1}}],["aliexpress",{"2":{"37":2,"149":4,"152":1,"153":2,"155":4,"158":1,"160":3}}],["always",{"2":{"28":1,"44":1}}],["also",{"2":{"18":1,"20":1,"24":1,"25":1,"31":1,"32":1,"36":1,"44":1,"48":1,"56":1,"72":1,"73":1,"98":1,"118":1,"149":1,"158":1,"196":1}}],["allowed",{"2":{"58":1}}],["allows",{"2":{"41":1,"44":1,"193":1}}],["allow",{"2":{"28":1,"30":1,"31":1,"58":1,"67":1,"121":1,"124":1}}],["all",{"0":{"90":1,"120":1,"122":1},"1":{"95":1},"2":{"15":2,"20":1,"24":4,"46":1,"56":1,"57":1,"66":1,"78":1,"85":1,"91":1,"96":2,"97":1,"98":2,"99":1,"100":1,"103":1,"113":1,"123":2,"138":1,"139":1,"142":1,"143":1,"170":1,"184":1,"190":1,"191":2,"193":1}}],["attention",{"2":{"137":1}}],["attempt",{"2":{"78":1}}],["attaching",{"2":{"123":1,"149":1}}],["attached",{"2":{"123":1}}],["attach",{"0":{"124":1},"2":{"112":1}}],["attribute",{"2":{"20":1}}],["at",{"2":{"3":1,"16":1,"20":1,"46":1,"79":1,"83":1,"91":1,"94":1,"97":1,"98":3,"99":1,"100":1,"103":1,"113":2,"122":1,"123":1,"124":1,"129":2,"142":1,"143":1,"153":1,"158":2,"185":1,"191":1}}],["a",{"0":{"17":1,"19":1,"21":1,"110":2,"111":1,"112":1,"113":1,"118":1,"128":2,"149":1,"189":1},"1":{"18":1,"19":1,"20":1},"2":{"2":1,"3":2,"4":1,"5":1,"17":3,"18":2,"19":3,"20":2,"21":1,"24":5,"25":14,"28":4,"31":2,"32":3,"33":2,"35":3,"36":5,"37":1,"41":2,"42":2,"44":5,"52":5,"54":1,"56":7,"57":4,"68":2,"71":1,"72":2,"74":4,"77":2,"78":2,"80":1,"82":1,"83":1,"84":4,"85":6,"86":1,"87":2,"91":1,"94":3,"97":1,"98":5,"99":2,"100":2,"107":1,"110":2,"111":4,"112":2,"113":3,"115":2,"118":2,"119":1,"123":2,"124":2,"127":1,"128":1,"129":2,"132":2,"135":2,"138":3,"139":3,"140":1,"142":2,"143":1,"144":3,"148":2,"149":2,"152":2,"153":5,"154":4,"155":2,"158":3,"159":3,"161":5,"163":1,"166":1,"170":1,"171":1,"174":1,"179":1,"184":1,"187":1,"190":6,"193":1,"196":4,"198":1}}],["assign",{"2":{"196":1}}],["assigned",{"2":{"195":1}}],["asset",{"2":{"195":2}}],["assembbly",{"2":{"118":1}}],["assembled",{"2":{"125":1}}],["assemblly",{"2":{"118":1}}],["assembly",{"0":{"118":1},"2":{"118":1,"155":1}}],["associated",{"2":{"195":1}}],["assume",{"2":{"99":2,"100":2}}],["assuming",{"2":{"98":1}}],["asked",{"0":{"162":1}}],["ask",{"2":{"88":1}}],["as",{"2":{"1":3,"25":3,"28":2,"30":1,"31":1,"39":2,"54":1,"57":1,"68":1,"77":3,"84":1,"85":2,"91":4,"97":4,"98":5,"113":2,"124":1,"132":1,"134":3,"139":1,"144":1,"145":2,"148":1,"154":5,"158":2,"196":3}}],["arrival",{"2":{"142":1,"152":1}}],["arrive",{"0":{"121":1},"2":{"121":1}}],["artifacts",{"2":{"128":1}}],["around",{"2":{"85":1,"91":1,"97":1,"98":1,"129":1,"136":1,"139":1,"141":1,"191":1}}],["arduinosdk",{"2":{"69":1}}],["argument",{"2":{"37":1}}],["ar",{"2":{"1":1,"4":1,"134":1}}],["area",{"2":{"98":2}}],["aren",{"2":{"77":1,"158":1,"182":1}}],["are",{"0":{"105":1,"154":1},"2":{"1":4,"5":1,"15":1,"16":1,"20":1,"22":3,"25":3,"28":6,"30":2,"31":2,"33":1,"35":1,"37":1,"38":1,"39":1,"41":1,"42":1,"44":1,"48":2,"56":1,"57":3,"58":1,"61":1,"70":1,"80":2,"83":1,"91":3,"94":1,"97":3,"99":2,"100":3,"103":1,"105":1,"118":3,"120":1,"121":1,"123":1,"124":2,"128":1,"134":4,"138":3,"141":2,"142":1,"143":1,"144":2,"146":1,"149":1,"152":1,"153":1,"158":5,"159":1,"161":2,"185":1,"193":1,"197":1}}],["24p",{"2":{"153":1}}],["245c",{"2":{"3":1,"158":1}}],["2x",{"0":{"152":1},"2":{"148":2,"149":2,"154":1,"160":1}}],["2ma",{"2":{"99":3}}],["2dbm",{"2":{"58":2,"60":2}}],["200mm",{"2":{"153":1}}],["20ma",{"2":{"99":2,"100":2}}],["20",{"2":{"58":1,"60":1}}],["28",{"2":{"58":1,"60":1,"155":2}}],["22",{"2":{"11":1}}],["230c",{"2":{"3":1}}],["2nd",{"0":{"133":1},"2":{"1":2,"4":1,"133":1,"134":2}}],["2",{"0":{"66":1,"78":1,"79":1,"112":1,"120":1,"140":1,"144":1,"145":1,"174":1},"2":{"1":1,"11":1,"28":3,"38":1,"99":3,"100":3,"107":1,"111":1,"121":2,"123":2,"129":4,"138":1,"144":2,"153":1}}],["4x",{"2":{"158":3,"160":1}}],["4mm",{"2":{"129":1}}],["4ma",{"2":{"100":1}}],["4v",{"2":{"99":2}}],["44",{"2":{"58":1,"60":1}}],["4ghz",{"2":{"28":2,"38":1}}],["4",{"0":{"68":1,"114":1,"122":1,"144":1,"186":1},"1":{"187":1,"188":1,"189":1,"190":1},"2":{"1":2,"11":1,"28":1,"58":1,"60":1,"87":1,"96":1,"100":4,"134":3,"144":2}}],["v=qyh",{"2":{"151":1}}],["vs",{"2":{"126":2}}],["vsc",{"0":{"74":1},"2":{"72":1,"86":1}}],["vscode",{"2":{"11":1,"39":1,"41":1,"54":1,"67":1,"68":1,"80":1}}],["v4",{"0":{"100":1},"2":{"100":2,"118":5,"155":1,"157":2}}],["v",{"2":{"98":1}}],["vrchat",{"0":{"193":1},"1":{"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"193":1,"197":3}}],["vrc",{"2":{"107":1,"163":1,"193":1,"196":1,"197":1,"198":1}}],["vr",{"2":{"89":2,"94":1}}],["vversion",{"2":{"84":1}}],["ve",{"2":{"84":2,"87":1}}],["vers",{"0":{"152":1}}],["versions",{"0":{"84":1,"85":1}}],["version",{"0":{"87":1,"154":1},"1":{"88":1},"2":{"68":1,"74":1,"84":1,"169":1,"196":1}}],["versioning",{"2":{"25":1}}],["very",{"2":{"1":1,"134":1,"148":1}}],["virtual",{"2":{"190":1}}],["vive",{"2":{"123":2,"145":1,"149":1}}],["via",{"0":{"71":1,"72":1,"74":1,"77":1,"78":1,"81":1},"1":{"82":1,"83":1,"84":1,"85":1},"2":{"84":1,"89":1,"116":1,"118":1}}],["visualized",{"2":{"190":1}}],["visually",{"2":{"91":1,"97":1}}],["visual",{"0":{"63":1,"72":1,"126":1},"1":{"64":1,"65":1},"2":{"63":1,"67":1,"72":1,"79":1,"85":1}}],["visit",{"2":{"39":1}}],["viewer",{"2":{"190":1}}],["viewing",{"2":{"85":1}}],["view",{"2":{"41":1,"113":2,"152":1,"193":1}}],["video",{"2":{"38":1,"127":1,"128":1,"163":1,"179":1}}],["vitepress",{"2":{"9":1,"12":2,"14":1,"15":2,"17":1,"18":1,"19":1,"21":1}}],["valve",{"2":{"145":2,"154":1}}],["value",{"2":{"55":2,"57":3,"99":1,"100":1,"198":1}}],["values",{"2":{"28":1,"180":1}}],["variant",{"2":{"37":1}}],["variables",{"2":{"20":1}}],["var",{"2":{"20":2}}],["vue3",{"2":{"15":1}}],["vue",{"2":{"15":2}}],["v1",{"2":{"11":2}}],["v14",{"2":{"11":1}}],["v3",{"0":{"99":1,"135":1,"136":1,"137":1,"158":1},"2":{"1":1,"99":2,"118":1,"134":1,"155":1}}],["voltage",{"2":{"128":1,"160":1}}],["volt",{"2":{"1":1,"134":1}}],["v2s",{"0":{"1":1}}],["v2",{"0":{"0":1,"2":1,"3":1,"4":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"4":1,"11":1}}],["tv",{"2":{"158":1}}],["twisted",{"2":{"130":1}}],["twist",{"0":{"130":1},"2":{"128":1}}],["two",{"2":{"35":1,"46":1,"70":1,"128":4,"143":1,"144":1,"154":1,"193":1,"195":1,"198":1}}],["typical",{"2":{"100":1}}],["typically",{"2":{"99":2,"100":2}}],["typing",{"2":{"71":1}}],["types",{"0":{"36":1,"37":1},"2":{"25":1,"33":1,"42":1,"138":1}}],["type",{"0":{"128":1,"139":1,"140":1},"2":{"25":1,"35":2,"71":1,"138":1,"153":1,"155":1,"195":1,"196":2}}],["tundra",{"2":{"123":1,"145":1,"149":1}}],["turn",{"2":{"84":1}}],["turned",{"2":{"32":1}}],["tutorials",{"2":{"66":1}}],["txpower",{"2":{"60":2}}],["txthttp",{"2":{"55":1}}],["target",{"2":{"98":1}}],["tabs",{"2":{"74":1}}],["tab",{"2":{"72":2,"86":1,"187":1}}],["taken",{"2":{"112":1}}],["take",{"2":{"68":1,"86":1,"94":1,"98":1,"120":1,"129":1}}],["tauri",{"2":{"41":1}}],["tailwindcss",{"2":{"20":2}}],["treats",{"2":{"84":1}}],["trouble",{"2":{"80":1,"138":1}}],["troubleshooting",{"0":{"49":1,"88":1},"1":{"50":1}}],["training",{"2":{"91":1}}],["transmittion",{"2":{"58":1}}],["transmission",{"2":{"56":1,"58":1}}],["trackable",{"2":{"191":1}}],["tracking",{"0":{"163":1,"180":1},"1":{"164":1},"2":{"107":1,"118":1,"128":1,"149":1,"163":1,"180":1,"187":1,"189":1,"190":1,"191":1,"193":1,"196":2}}],["tracker",{"0":{"76":1,"86":1,"147":1},"1":{"77":1,"78":1,"148":1,"149":1},"2":{"38":1,"62":1,"67":1,"75":1,"80":2,"85":2,"86":1,"89":1,"154":2}}],["trackers",{"2":{"38":1,"84":2,"85":1,"118":1,"123":3,"143":1,"144":1,"145":1}}],["track",{"2":{"30":1,"44":1}}],["try",{"2":{"37":1,"50":2,"58":1,"80":2,"94":1,"115":1,"138":2,"161":1}}],["trigger",{"2":{"25":1,"193":1,"198":1}}],["true",{"2":{"19":1,"198":1}}],["t",{"0":{"197":1},"2":{"25":1,"58":1,"60":1,"77":1,"84":1,"87":1,"88":1,"91":1,"97":2,"98":1,"158":1,"159":1,"182":1,"190":2,"195":2,"197":1}}],["term",{"2":{"91":1,"97":1}}],["terminal",{"2":{"71":2,"87":1}}],["terminology",{"0":{"175":1},"1":{"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"1":1,"134":1,"175":1}}],["testing",{"2":{"86":1}}],["tested",{"2":{"48":1,"86":1,"104":1}}],["tests",{"2":{"25":1}}],["test",{"0":{"115":1},"2":{"25":2,"37":1,"54":1,"98":1,"115":1,"138":1}}],["text",{"2":{"19":4,"20":4,"25":1,"28":1,"86":1,"137":2}}],["team",{"2":{"15":1,"68":1,"88":1}}],["temps",{"2":{"158":1}}],["temperamental",{"2":{"144":1}}],["temp",{"2":{"3":2,"158":1}}],["tip",{"2":{"20":1,"36":1,"141":1}}],["title",{"0":{"20":1},"2":{"20":3,"25":1}}],["tin",{"0":{"130":1},"2":{"2":1,"3":1,"135":1,"136":1}}],["times",{"2":{"103":1,"121":1}}],["timem",{"2":{"73":1}}],["time",{"2":{"1":1,"36":1,"46":1,"98":1,"123":1,"125":1,"134":1,"171":1}}],["threshold",{"0":{"182":1},"2":{"190":5}}],["three",{"2":{"154":1}}],["through",{"2":{"85":1,"158":1}}],["those",{"2":{"84":1,"118":1,"195":1}}],["though",{"2":{"28":1,"32":1,"69":1,"152":1}}],["than",{"2":{"58":1,"91":1,"99":1,"100":1,"123":1,"142":1,"144":1,"148":1}}],["that",{"0":{"110":1},"2":{"4":1,"5":1,"20":1,"22":2,"24":6,"25":10,"28":2,"31":1,"32":1,"33":1,"35":1,"37":2,"41":1,"42":1,"44":3,"46":1,"50":2,"52":1,"56":1,"57":2,"58":4,"67":1,"68":1,"69":2,"72":1,"74":1,"77":1,"80":3,"84":2,"85":2,"87":2,"91":3,"94":1,"97":3,"98":2,"105":1,"110":2,"112":1,"113":1,"118":1,"120":1,"123":2,"124":1,"132":1,"135":1,"139":1,"142":1,"143":1,"146":1,"151":1,"152":4,"153":1,"154":3,"161":3,"174":1,"182":1,"183":1,"187":2,"189":1,"190":2,"191":1,"193":1,"195":2,"196":2,"197":2}}],["thunder",{"2":{"32":1,"54":1}}],["think",{"2":{"98":1,"158":1,"161":1}}],["thinker",{"2":{"37":1}}],["thingiverse",{"2":{"111":2,"116":1}}],["thing",{"2":{"25":2,"111":1}}],["things",{"0":{"101":1,"102":1,"121":1},"1":{"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"1":1,"19":2,"36":1,"74":1,"123":1,"134":1,"152":1,"182":1}}],["this",{"0":{"27":1,"38":1,"41":1,"90":1,"102":2,"107":1,"110":1,"118":1,"166":1,"189":1,"192":1},"1":{"39":1,"95":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"1":4,"5":1,"9":1,"16":1,"18":1,"19":2,"20":3,"24":2,"25":6,"28":2,"30":3,"31":5,"32":3,"33":1,"35":1,"36":3,"37":7,"39":3,"41":1,"42":1,"44":3,"46":1,"52":2,"56":1,"59":1,"61":1,"62":1,"68":4,"69":1,"73":1,"74":1,"77":1,"78":1,"79":1,"80":4,"84":3,"85":1,"86":2,"87":1,"90":1,"91":2,"97":2,"98":9,"99":4,"100":3,"107":1,"118":1,"119":1,"123":4,"127":1,"128":1,"130":1,"134":4,"135":2,"139":3,"140":1,"141":3,"142":1,"144":1,"145":1,"149":1,"152":1,"154":1,"158":1,"159":1,"166":1,"170":1,"174":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"187":1,"190":4,"193":2,"195":1,"196":1,"197":1,"198":1}}],["thermal",{"2":{"98":1}}],["there",{"2":{"70":1,"72":1,"74":2,"77":1,"84":2,"88":1,"95":1,"113":2,"123":1,"124":1,"138":2,"139":1,"141":2,"143":1,"152":1,"161":1,"196":1}}],["theory",{"2":{"94":1}}],["these",{"2":{"20":1,"22":1,"28":1,"56":1,"68":1,"84":1,"88":1,"98":1,"118":1,"128":1}}],["then",{"2":{"14":1,"19":1,"28":2,"31":1,"36":1,"56":1,"68":1,"72":1,"77":1,"78":1,"84":1,"86":1,"87":1,"90":1,"127":1,"128":1,"129":1,"135":1,"158":1,"161":1,"170":1,"174":1,"187":2}}],["they",{"2":{"1":1,"16":1,"85":1,"99":1,"100":2,"125":1,"134":1,"144":2,"149":1,"151":1,"152":1,"158":5,"195":2,"197":1}}],["themselves",{"2":{"98":1}}],["theme",{"2":{"19":1,"20":1}}],["them",{"0":{"130":1,"186":1},"1":{"187":1,"188":1,"189":1,"190":1},"2":{"1":1,"35":1,"66":1,"72":1,"84":1,"85":1,"114":1,"123":1,"125":1,"128":1,"129":1,"130":1,"134":1,"138":4,"158":4,"159":1,"161":1,"195":2,"196":3,"197":1}}],["their",{"2":{"1":1,"84":2,"134":1,"163":1,"189":1}}],["the",{"0":{"4":1,"9":1,"19":1,"26":1,"27":2,"28":1,"47":1,"50":1,"62":1,"66":1,"68":1,"73":1,"74":1,"75":1,"77":1,"86":1,"87":2,"90":1,"108":2,"113":1,"119":1,"120":1,"125":1,"126":1,"127":1,"130":1,"131":1,"132":1,"133":1,"137":1,"154":1,"158":1,"164":1,"165":1,"166":1,"170":1,"171":1,"172":1,"173":2,"174":1,"186":1,"189":2,"196":1,"197":2},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"27":1,"28":1,"29":2,"30":2,"31":2,"32":2,"33":2,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"74":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":2,"95":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":2,"188":2,"189":2,"190":2,"191":1,"192":1},"2":{"1":9,"2":4,"3":5,"4":13,"9":2,"12":4,"14":1,"15":3,"16":2,"17":5,"18":2,"19":9,"20":16,"21":2,"22":3,"24":4,"25":15,"28":18,"30":6,"31":21,"32":5,"33":4,"35":4,"36":6,"37":14,"38":5,"39":7,"41":4,"42":4,"44":15,"46":15,"47":6,"48":2,"50":12,"52":3,"54":2,"55":5,"56":24,"57":4,"58":17,"59":10,"60":7,"62":1,"63":1,"66":2,"67":2,"68":13,"69":3,"72":4,"73":1,"74":5,"75":2,"77":10,"78":6,"79":4,"80":18,"82":1,"83":5,"84":12,"85":9,"86":12,"87":10,"88":4,"90":2,"91":7,"94":1,"96":3,"97":5,"98":27,"99":8,"100":8,"103":1,"111":2,"112":3,"113":7,"114":1,"115":1,"116":3,"118":1,"119":1,"120":1,"122":1,"123":18,"124":10,"125":3,"126":1,"127":1,"128":3,"129":8,"130":1,"131":3,"132":6,"133":1,"134":9,"135":9,"136":3,"137":11,"138":6,"139":10,"140":6,"141":3,"142":1,"144":1,"145":1,"146":2,"148":1,"149":4,"151":6,"152":8,"153":5,"154":4,"157":2,"158":7,"159":4,"160":1,"161":5,"163":1,"166":1,"169":3,"170":4,"171":5,"173":4,"174":1,"175":2,"176":1,"177":1,"179":2,"180":2,"183":1,"187":4,"189":2,"190":6,"191":8,"193":4,"195":13,"196":16,"197":6,"198":6}}],["toward",{"2":{"137":1}}],["together",{"0":{"130":1},"2":{"128":1,"129":1,"130":2}}],["total",{"2":{"91":1,"195":1}}],["touch",{"2":{"85":1}}],["top",{"2":{"20":1,"132":1,"175":1}}],["tools",{"0":{"160":1},"1":{"161":1},"2":{"32":1}}],["tool",{"0":{"40":1},"1":{"41":1,"42":1},"2":{"25":1,"39":4,"41":3}}],["too",{"2":{"3":1,"56":1,"135":1,"190":2,"193":1}}],["to",{"0":{"1":1,"19":1,"45":1,"47":1,"50":1,"53":1,"76":1,"87":1,"90":2,"101":1,"102":1,"107":2,"108":1,"110":1,"111":2,"121":1,"124":1,"125":2,"126":1,"128":1,"131":1,"132":1,"134":1,"163":1,"166":1,"172":1,"186":1,"196":1},"1":{"46":1,"47":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"77":1,"78":1,"88":1,"95":2,"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"164":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":2,"188":2,"189":2,"190":2,"191":1,"192":1},"2":{"1":3,"2":2,"3":1,"4":1,"12":1,"14":1,"15":2,"16":3,"17":2,"19":13,"20":3,"21":2,"22":2,"24":8,"25":10,"28":19,"30":4,"31":23,"32":2,"33":3,"35":3,"36":4,"37":3,"38":2,"39":3,"41":4,"42":3,"44":4,"46":6,"47":4,"48":1,"50":5,"52":2,"54":2,"55":1,"56":14,"57":1,"58":9,"59":3,"60":2,"62":2,"66":3,"67":2,"68":7,"69":1,"70":1,"71":1,"72":1,"73":2,"74":2,"75":2,"77":4,"78":4,"79":1,"80":5,"82":3,"83":5,"84":13,"85":6,"86":2,"87":5,"88":3,"90":1,"91":9,"94":2,"95":1,"97":6,"98":14,"99":6,"100":5,"105":2,"110":1,"111":3,"112":1,"113":4,"114":2,"116":3,"118":1,"119":1,"120":1,"121":2,"123":7,"124":3,"125":2,"126":1,"127":1,"128":2,"129":2,"130":1,"134":3,"135":5,"137":1,"138":8,"139":1,"140":1,"141":5,"142":1,"144":3,"145":1,"149":2,"151":2,"152":2,"153":1,"154":4,"155":3,"157":2,"158":2,"159":1,"161":3,"166":1,"169":4,"171":2,"173":1,"174":1,"179":1,"180":1,"182":1,"183":4,"184":1,"185":1,"190":3,"191":5,"193":7,"195":10,"196":6,"197":4,"198":5}}],["image",{"2":{"123":1,"141":1}}],["implement",{"2":{"56":1}}],["implemented",{"2":{"56":2}}],["improves",{"2":{"25":1}}],["important",{"2":{"25":1,"37":1,"91":1,"97":1,"106":1,"143":1,"191":1}}],["ignored",{"2":{"105":1}}],["io12",{"2":{"132":1}}],["ionizing",{"2":{"98":1}}],["ioo",{"2":{"77":1}}],["icnirp",{"2":{"91":1}}],["icon",{"2":{"72":1,"86":1,"174":1,"196":1}}],["ideal",{"2":{"113":1}}],["ide",{"0":{"67":1},"2":{"67":1}}],["i",{"0":{"39":1,"83":1},"1":{"84":1,"85":1},"2":{"39":2,"98":2,"110":1,"113":1,"128":1,"132":1,"135":2,"138":1,"145":1,"154":1,"189":1}}],["ip",{"0":{"86":1},"2":{"30":1,"31":2,"44":6,"84":1,"85":3,"179":1,"187":3}}],["ish",{"2":{"132":1}}],["issue",{"2":{"39":1,"41":1,"88":1,"123":1,"197":1}}],["issues",{"2":{"39":1,"41":1,"104":1,"123":2,"132":1,"149":1}}],["is",{"0":{"35":1,"38":1,"41":1,"44":1,"52":1,"82":1,"103":1,"189":1},"1":{"39":1},"2":{"1":1,"3":1,"4":3,"9":2,"18":1,"20":2,"22":1,"24":9,"25":10,"28":4,"31":2,"32":4,"33":1,"35":2,"36":7,"37":10,"38":2,"39":1,"41":3,"42":1,"44":3,"46":4,"47":1,"48":2,"50":5,"52":2,"54":1,"55":1,"56":2,"67":1,"68":2,"69":1,"74":1,"77":1,"80":4,"82":1,"84":1,"86":1,"90":2,"91":3,"93":1,"94":3,"96":2,"97":3,"98":13,"99":5,"100":6,"111":2,"113":1,"115":1,"123":7,"126":1,"134":1,"137":2,"138":1,"139":4,"141":1,"142":1,"145":1,"152":1,"154":1,"158":3,"159":1,"161":2,"163":2,"166":1,"168":1,"179":1,"181":1,"182":1,"183":1,"187":1,"190":1,"191":4,"196":1,"198":1}}],["invoke",{"2":{"169":1}}],["inwards",{"2":{"137":1,"139":1}}],["injury",{"2":{"98":1}}],["increase",{"2":{"195":1}}],["incomplete",{"0":{"106":1}}],["incoherent",{"2":{"91":1,"98":1}}],["including",{"2":{"96":1,"154":1}}],["included",{"2":{"152":1}}],["includes",{"2":{"91":1,"97":1}}],["include",{"0":{"110":1},"2":{"41":1,"159":1}}],["infrared",{"2":{"91":1,"98":1}}],["information",{"2":{"33":1,"42":1,"92":1}}],["info",{"2":{"28":2,"68":1,"132":1}}],["initial",{"2":{"78":1}}],["initially",{"2":{"75":1}}],["inimdnsname",{"2":{"46":1}}],["ini",{"0":{"28":2},"1":{"29":2,"30":2,"31":2,"32":2,"33":2},"2":{"37":1,"46":2,"85":3}}],["indicating",{"2":{"78":1}}],["indicate",{"2":{"25":2}}],["index",{"2":{"19":1,"145":2,"154":1}}],["inspector",{"2":{"195":3,"196":1}}],["inspiration",{"2":{"113":1}}],["instructions",{"2":{"118":1}}],["instead",{"2":{"44":1,"69":1,"74":1}}],["installer",{"0":{"173":1}}],["installed",{"2":{"48":1,"67":1,"68":1,"74":1,"173":1}}],["installing",{"0":{"169":1},"2":{"170":1}}],["install",{"0":{"63":1,"65":1,"66":1,"67":1,"123":1,"168":1,"170":1,"172":1,"173":1},"1":{"64":1,"65":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1},"2":{"12":1,"63":1,"66":1,"67":1,"68":1,"168":1,"169":3,"170":2}}],["installation",{"0":{"12":1},"2":{"70":1}}],["inside",{"2":{"20":1,"151":1,"196":1}}],["integrity",{"2":{"123":1}}],["interact",{"2":{"193":1}}],["interference",{"2":{"123":1,"144":1}}],["interface",{"2":{"83":1,"153":1}}],["international",{"2":{"98":1}}],["intensity",{"2":{"98":1,"99":1,"100":1}}],["intro",{"2":{"19":1}}],["introduction",{"2":{"19":1}}],["into",{"2":{"18":1,"35":1,"69":1,"71":1,"77":2,"80":1,"85":1,"86":1,"87":1,"98":1,"124":1,"125":1,"139":2,"187":1,"189":1,"196":1}}],["input",{"2":{"4":1,"86":1}}],["in",{"0":{"7":1,"72":1,"127":1,"145":1,"189":1,"197":1},"2":{"1":4,"2":1,"3":1,"4":1,"5":1,"12":1,"15":1,"17":1,"18":2,"20":2,"21":1,"24":5,"28":7,"32":1,"33":1,"36":1,"37":1,"39":1,"41":1,"42":1,"44":1,"46":1,"56":2,"57":1,"58":3,"59":1,"66":1,"68":3,"69":1,"71":1,"72":2,"74":1,"75":1,"77":6,"84":4,"85":3,"86":5,"87":1,"88":2,"90":1,"91":4,"94":1,"97":4,"98":4,"99":1,"100":1,"123":3,"124":2,"127":1,"128":2,"132":3,"134":4,"135":2,"136":1,"137":1,"139":2,"141":2,"142":2,"144":1,"146":1,"149":1,"152":2,"154":1,"158":3,"161":3,"170":1,"171":1,"175":1,"179":1,"187":1,"189":1,"190":2,"193":1,"195":6,"196":4,"198":2}}],["if",{"0":{"154":1},"2":{"1":2,"17":1,"18":1,"19":1,"25":1,"28":5,"30":4,"31":3,"33":1,"35":1,"37":2,"39":1,"41":1,"42":1,"44":4,"46":1,"47":1,"48":2,"50":4,"52":1,"55":1,"56":1,"57":2,"58":1,"68":1,"77":1,"80":4,"84":1,"85":1,"87":3,"88":2,"91":1,"94":2,"97":1,"99":2,"100":1,"105":2,"112":1,"123":2,"134":2,"137":2,"138":4,"139":1,"142":1,"144":1,"149":1,"151":1,"152":1,"153":1,"158":5,"161":4,"174":1,"198":1}}],["items",{"0":{"108":1},"2":{"19":1}}],["itself",{"0":{"70":1},"1":{"71":1,"72":1},"2":{"56":2,"86":1,"193":1,"196":1,"198":1}}],["its",{"2":{"4":2,"195":1}}],["it",{"0":{"35":1,"44":1,"45":1,"52":1,"53":1,"82":1,"83":1,"113":1},"1":{"46":1,"47":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"84":1,"85":1},"2":{"1":1,"2":1,"4":2,"9":1,"19":1,"20":1,"24":1,"25":1,"28":4,"32":1,"36":2,"37":3,"38":1,"39":1,"41":1,"46":2,"54":1,"63":1,"67":1,"68":3,"69":1,"71":2,"72":3,"74":2,"77":6,"78":1,"79":1,"80":1,"82":1,"84":2,"85":2,"86":1,"87":1,"90":1,"91":3,"94":2,"97":3,"98":3,"114":1,"115":1,"116":1,"118":1,"120":1,"123":5,"124":2,"125":2,"127":2,"129":1,"132":2,"134":1,"135":4,"136":1,"138":1,"139":1,"142":1,"143":1,"151":2,"152":1,"154":2,"161":3,"168":1,"171":1,"174":1,"179":1,"180":1,"183":1,"187":1,"190":1,"191":1,"193":2,"195":4,"196":6,"197":2,"198":1}}],["iron",{"2":{"135":2,"160":1}}],["irradiance",{"2":{"98":2}}],["irreversible",{"2":{"91":1,"97":1}}],["ir",{"0":{"0":1,"1":1,"91":1,"97":1,"105":1,"129":1,"130":1,"134":1,"141":1,"152":1,"156":1},"1":{"1":1,"2":1,"3":1,"4":1,"98":1,"157":1,"158":1},"2":{"1":1,"4":1,"91":4,"97":4,"98":2,"134":1,"151":1,"152":2,"155":1,"158":5,"159":1}}],["g0ldjay",{"2":{"118":1}}],["gluing",{"2":{"140":1}}],["glue",{"2":{"114":1,"132":1,"139":2,"140":1,"141":2,"160":2}}],["glass",{"2":{"1":1,"134":1}}],["gauge",{"2":{"155":3}}],["games",{"2":{"89":1}}],["gather",{"0":{"122":1},"2":{"1":1,"134":1}}],["greeted",{"2":{"174":1}}],["green",{"2":{"86":1,"137":2}}],["greater",{"2":{"144":1}}],["gray",{"2":{"124":2}}],["grab",{"2":{"77":1,"135":1}}],["grows",{"2":{"98":1}}],["ground",{"2":{"1":1,"4":4,"128":1,"129":2,"132":1,"134":1}}],["good",{"0":{"113":1},"2":{"113":2,"115":1,"138":1,"139":1,"142":1,"144":1,"154":1,"163":1,"190":2}}],["got",{"2":{"69":1}}],["go",{"2":{"68":1,"105":1,"111":1,"141":1,"173":1,"175":1}}],["going",{"2":{"36":1,"38":1,"68":1,"120":1}}],["goes",{"2":{"4":1,"68":1,"88":1,"125":1}}],["g",{"2":{"35":2}}],["ghz",{"0":{"144":1},"2":{"28":1,"144":2}}],["gh",{"2":{"25":1}}],["gui",{"2":{"41":1,"174":1,"180":1}}],["guidelines",{"2":{"91":1,"98":1}}],["guide",{"0":{"22":1,"117":1,"118":1,"166":1,"192":1},"1":{"23":1,"24":1,"25":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1},"2":{"30":1,"69":1,"74":1,"77":1,"80":1,"83":1,"90":1,"118":1,"126":1,"127":1,"149":1,"161":1}}],["gulp",{"2":{"25":1}}],["gesture",{"2":{"196":1}}],["gerber",{"2":{"158":1}}],["gentle",{"2":{"124":1}}],["generic",{"2":{"37":1,"160":2}}],["generated",{"2":{"197":1}}],["generate",{"2":{"25":1}}],["generally",{"2":{"98":1,"139":2}}],["general",{"0":{"24":1}}],["getting",{"0":{"10":1,"175":1},"1":{"11":1,"12":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"19":3,"36":1,"86":1,"90":1,"98":1,"113":1,"138":1,"157":1}}],["getstoredconfig",{"2":{"56":1}}],["gets",{"2":{"4":1,"98":1}}],["get",{"0":{"116":1},"2":{"1":1,"38":1,"48":1,"54":1,"56":6,"66":1,"80":1,"90":1,"98":2,"110":1,"111":1,"115":1,"127":1,"128":1,"134":1,"158":1,"195":1}}],["gt",{"2":{"20":2,"25":2,"30":1,"55":1,"57":6,"74":1,"84":1,"98":3,"197":2}}],["gives",{"2":{"98":1,"113":1}}],["given",{"2":{"57":1,"58":1,"98":1}}],["give",{"0":{"113":1},"2":{"20":1,"98":1,"119":1,"161":1,"171":1,"196":1}}],["github",{"2":{"12":1,"16":1,"68":2,"112":1,"173":1}}],["git",{"0":{"25":1},"2":{"11":1,"12":1,"24":1,"25":6,"68":4,"87":4}}],["gnd",{"2":{"1":1,"132":1,"134":1}}],["pyinstaller",{"2":{"171":1}}],["py",{"2":{"169":1}}],["python",{"0":{"168":1,"170":1},"2":{"168":1,"169":1}}],["people",{"2":{"159":1}}],["permanently",{"2":{"36":1}}],["performs",{"2":{"123":1}}],["performance",{"2":{"25":1,"145":1}}],["perfect",{"2":{"103":1,"115":1}}],["perf",{"2":{"25":1}}],["per",{"2":{"2":1,"129":1,"135":1}}],["photobiological",{"2":{"91":1}}],["purchase",{"2":{"152":1}}],["purchases",{"2":{"142":1}}],["purposes",{"2":{"36":1}}],["pupil",{"2":{"98":3,"113":1,"182":1,"190":1}}],["pull",{"2":{"87":1}}],["putting",{"2":{"139":1}}],["put",{"2":{"85":1,"91":2,"97":2,"113":1,"132":1,"135":1,"158":1,"179":1,"190":1}}],["pc",{"0":{"76":1},"1":{"77":1,"78":1},"2":{"77":2,"78":1,"80":1,"84":1,"86":1}}],["pcbs",{"0":{"4":1,"134":1,"137":1},"2":{"1":1,"4":2,"129":1,"134":1,"137":1,"158":2}}],["pcb",{"0":{"1":1,"2":1,"3":1,"135":1,"136":1},"2":{"1":3,"2":1,"4":1,"134":3,"135":2}}],["pitch",{"2":{"153":1}}],["picture",{"2":{"137":2}}],["piece",{"2":{"129":1,"135":1}}],["pio",{"2":{"71":1,"74":1,"84":1}}],["pinecil",{"2":{"160":1}}],["pin64",{"2":{"160":1}}],["pins",{"2":{"124":1}}],["ping",{"2":{"56":1,"138":1}}],["pin",{"2":{"1":1,"4":5,"131":1,"132":3,"134":1}}],["patreon",{"2":{"158":1}}],["path",{"2":{"68":2}}],["pay",{"2":{"137":1}}],["pad",{"2":{"135":1}}],["pads",{"2":{"2":1,"3":2,"123":2,"135":2,"136":1}}],["pairs",{"2":{"128":1}}],["painful",{"2":{"98":1}}],["past",{"2":{"84":1}}],["pass",{"2":{"58":1,"60":1,"179":1}}],["passed",{"2":{"57":1}}],["password",{"2":{"28":6,"31":4,"58":2,"59":2}}],["panel",{"2":{"72":1,"195":1}}],["parameter",{"2":{"196":2}}],["parameters",{"0":{"194":1,"195":1,"197":1},"1":{"195":1,"196":1},"2":{"164":1,"195":6,"196":1,"198":2}}],["paramaters",{"0":{"164":1}}],["params",{"0":{"57":1,"61":1},"1":{"58":1,"59":1,"60":1},"2":{"57":4}}],["param",{"2":{"55":2,"57":4,"58":2,"59":1,"60":2}}],["part",{"2":{"38":1,"124":3,"191":1}}],["parts",{"0":{"120":1,"142":1,"146":1,"158":1,"160":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":2,"148":2,"149":2,"150":2,"151":2,"152":2,"153":2,"154":2,"155":2,"156":2,"157":2,"158":2,"159":1,"160":1,"161":2},"2":{"35":1,"92":1,"114":1,"138":3,"146":1,"158":1}}],["package",{"2":{"48":1,"77":1}}],["packages",{"2":{"12":1}}],["page",{"0":{"17":1,"19":1,"21":1,"102":1,"110":1,"118":1},"1":{"18":1,"19":1,"20":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"17":4,"18":2,"19":7,"20":3,"21":1,"33":1,"42":1,"84":1,"90":1,"193":1}}],["pages",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1},"2":{"16":2,"17":1,"18":2,"21":1}}],["pricing",{"2":{"158":1}}],["price",{"2":{"148":1}}],["primary",{"2":{"143":1}}],["print",{"0":{"138":1},"1":{"139":1,"140":1},"2":{"115":1,"138":2}}],["printed",{"0":{"159":1},"2":{"111":1,"138":1}}],["printable",{"2":{"94":1}}],["practice",{"2":{"142":1}}],["proximity",{"2":{"144":1}}],["pros",{"2":{"144":1,"145":1}}],["problems",{"2":{"123":1}}],["provides",{"2":{"118":1}}],["provided",{"2":{"83":1}}],["prohurtz",{"0":{"192":1},"2":{"116":1,"138":1,"149":1}}],["protector",{"2":{"111":3}}],["protection",{"2":{"98":1,"151":1}}],["protocol",{"2":{"44":2,"48":1,"89":1}}],["proceed",{"2":{"78":1}}],["procedure",{"2":{"62":1}}],["produce",{"2":{"78":1}}],["programmers",{"2":{"142":1,"149":2}}],["programmer",{"0":{"77":1,"125":1},"2":{"77":4,"80":1,"125":1,"128":1,"148":2,"149":2}}],["progress",{"0":{"7":1},"2":{"5":1}}],["prompts",{"2":{"173":1}}],["prompt",{"2":{"71":1,"170":1,"171":1}}],["proper",{"2":{"149":1}}],["properly",{"2":{"68":1,"98":1}}],["property",{"2":{"19":1}}],["proir",{"2":{"15":1}}],["projects",{"2":{"68":1}}],["project",{"0":{"14":1,"27":1,"68":1,"90":1,"102":1},"1":{"15":1,"95":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"14":1,"22":2,"25":1,"39":1,"52":1,"68":1,"84":1,"90":1,"119":1,"170":1}}],["preferably",{"2":{"128":1}}],["prefaced",{"2":{"20":1}}],["precautions",{"2":{"105":1}}],["pressure",{"2":{"139":1}}],["pressing",{"2":{"78":2,"86":1}}],["press",{"2":{"71":1,"79":1,"80":1,"84":2,"85":1,"86":1,"124":1,"187":1,"189":1,"190":1,"191":2}}],["prevent",{"2":{"56":1}}],["previous",{"2":{"25":1,"196":1}}],["pre",{"2":{"41":1}}],["prerequisites",{"0":{"11":1,"48":1}}],["prepare",{"0":{"1":1,"126":1,"134":1},"2":{"62":1}}],["plugged",{"2":{"77":1,"80":1}}],["plug",{"0":{"127":1},"2":{"77":1,"86":1}}],["platform",{"2":{"74":1,"89":1}}],["platforms",{"0":{"198":1},"2":{"74":1}}],["platformio",{"0":{"67":1,"69":1,"70":1,"72":1},"1":{"70":1,"71":2,"72":2,"73":1,"74":1},"2":{"37":1,"67":1,"68":2,"69":2,"70":1,"72":2,"74":1,"84":1}}],["planned",{"0":{"8":1},"2":{"5":1}}],["placeholder",{"2":{"28":1}}],["place",{"0":{"113":1},"2":{"2":1,"3":1,"91":2,"97":2,"113":1,"136":1,"139":2,"140":1}}],["please",{"0":{"189":1},"2":{"1":1,"16":2,"19":1,"20":2,"33":1,"39":2,"41":1,"42":1,"56":1,"68":3,"91":1,"92":1,"94":1,"95":1,"97":1,"105":1,"120":1,"121":1,"124":1,"134":1,"142":1,"158":1,"161":2,"164":1,"168":1}}],["poetry",{"0":{"169":1},"2":{"169":5,"170":2,"171":1}}],["potentially",{"2":{"161":1}}],["potential",{"2":{"91":1,"97":1}}],["port",{"2":{"59":2,"125":1,"145":1,"154":2,"155":1,"189":2,"198":2}}],["ports",{"2":{"30":1,"80":2,"154":1}}],["position",{"2":{"141":1}}],["positive",{"0":{"130":2,"131":1},"2":{"1":2,"128":1,"134":2}}],["possible",{"2":{"91":1,"97":1,"98":1,"113":1,"154":1}}],["postman",{"2":{"32":1}}],["post",{"2":{"32":1,"56":5}}],["point",{"2":{"28":1,"144":2,"185":1,"193":1}}],["powershell",{"2":{"169":1}}],["powering",{"2":{"128":1}}],["powered",{"2":{"84":1,"99":1}}],["power",{"0":{"128":1},"2":{"1":3,"4":3,"56":1,"58":18,"60":14,"85":1,"91":3,"97":2,"98":1,"127":1,"129":2,"134":3,"144":2,"155":3,"158":2,"187":1}}],["swap",{"2":{"152":1}}],["switched",{"2":{"84":2}}],["switching",{"2":{"36":1}}],["switch",{"2":{"35":1,"37":1}}],["slot",{"2":{"196":1}}],["slowly",{"2":{"139":1,"190":1}}],["slightly",{"2":{"129":1}}],["sliding",{"2":{"139":1}}],["slid",{"2":{"124":1}}],["slider",{"2":{"183":1,"190":2}}],["slide",{"2":{"124":1,"125":1}}],["slimevr",{"2":{"68":2,"88":2}}],["smd",{"2":{"158":2}}],["smaller",{"2":{"158":2}}],["small",{"2":{"124":1,"139":1,"148":1,"149":1,"196":1}}],["smol",{"2":{"1":1,"134":1}}],["sketch",{"2":{"118":2}}],["skills",{"2":{"112":1,"138":1,"161":1}}],["skilled",{"2":{"94":1}}],["skip",{"2":{"28":1,"80":1,"87":1}}],["sr",{"2":{"91":1,"98":2,"99":6,"100":6}}],["src",{"2":{"17":1,"18":1,"19":1,"20":1,"21":1,"25":1}}],["synced",{"2":{"195":2}}],["symptoms",{"2":{"91":1,"97":1}}],["system",{"2":{"4":1,"25":1,"62":1}}],["sdk",{"0":{"73":1,"74":1},"1":{"74":1},"2":{"73":1}}],["s3",{"0":{"78":1},"2":{"37":7,"78":1,"148":2,"154":2}}],["say",{"2":{"191":1}}],["satisfactory",{"2":{"115":1}}],["sa",{"2":{"96":1}}],["safer",{"2":{"158":1}}],["safe",{"2":{"91":1,"97":1}}],["safety",{"0":{"91":1,"97":1,"99":1,"100":1},"1":{"98":1},"2":{"91":5,"97":3,"98":2,"99":1,"100":1}}],["saved",{"2":{"87":1,"195":1}}],["save",{"2":{"56":3,"87":1,"139":1,"187":1,"189":1}}],["same",{"2":{"30":1,"44":1,"46":1,"123":1,"129":1}}],["said",{"2":{"28":1}}],["ssids",{"2":{"28":1}}],["ssid",{"2":{"28":5,"58":2}}],["scene",{"2":{"195":1}}],["scenario",{"2":{"98":1,"99":1,"100":1}}],["schematics",{"2":{"158":1}}],["scanning",{"2":{"59":1}}],["scripts",{"2":{"25":1}}],["scopes",{"2":{"25":2}}],["scope",{"2":{"25":1}}],["spot",{"2":{"191":1}}],["spots",{"2":{"91":1,"97":1,"141":2}}],["speaker",{"2":{"128":1}}],["spend",{"2":{"125":1}}],["spec",{"2":{"171":1}}],["specs",{"2":{"105":1}}],["specified",{"2":{"36":1,"141":1}}],["specific",{"2":{"14":1,"35":1,"118":1}}],["special",{"2":{"28":2,"37":1,"107":1,"149":1}}],["sparkfun",{"2":{"66":1}}],["spaces",{"2":{"28":1}}],["space",{"2":{"25":1,"28":1}}],["super",{"2":{"123":1,"143":1}}],["supply",{"2":{"57":1}}],["support",{"0":{"94":1},"1":{"95":1},"2":{"33":1,"37":1,"38":2,"39":1,"41":1,"42":1,"83":1,"144":1,"148":2,"164":1}}],["supported",{"2":{"28":2,"37":2,"143":1}}],["supports",{"2":{"20":1,"28":1,"31":1,"32":1,"33":1,"42":1,"148":1,"149":1}}],["sun",{"2":{"98":1,"99":1,"100":1}}],["suffix",{"2":{"84":1,"85":1}}],["suggest",{"2":{"154":1}}],["suggested",{"2":{"80":1}}],["suggestions",{"2":{"56":1}}],["successfully",{"2":{"80":1}}],["successful",{"2":{"80":1}}],["such",{"2":{"25":1,"28":1,"91":1,"97":1,"145":2,"154":1}}],["sure",{"0":{"119":1},"2":{"28":1,"46":1,"50":2,"68":1,"77":1,"80":3,"86":1,"91":1,"105":1,"122":1,"125":1,"127":1,"138":1,"158":1}}],["submenu",{"2":{"196":1}}],["subdir",{"2":{"19":1}}],["sub",{"0":{"18":1},"2":{"18":1}}],["snaps",{"2":{"139":1}}],["snake",{"2":{"15":1}}],["sng",{"2":{"1":1,"134":1}}],["shatter",{"2":{"151":1}}],["shape",{"2":{"98":1}}],["shield",{"0":{"123":1}}],["shipping",{"2":{"121":1}}],["sheets",{"2":{"91":1}}],["shot",{"2":{"161":1}}],["shove",{"2":{"124":1}}],["shortcut",{"2":{"174":1}}],["short",{"2":{"91":1,"97":1,"129":1,"132":1,"154":1,"158":1}}],["shows",{"2":{"123":1,"141":1,"176":1,"177":1,"178":1}}],["show",{"0":{"166":1},"2":{"62":1,"98":1,"110":1,"195":1}}],["shown",{"2":{"37":1}}],["should",{"0":{"27":1,"39":1},"2":{"15":1,"24":4,"36":2,"59":1,"74":1,"78":1,"80":1,"84":1,"98":1,"123":1,"124":1,"135":1,"158":1,"170":1,"171":2,"173":1,"174":2,"190":2,"196":1}}],["shyarn",{"2":{"12":1}}],["sh",{"2":{"12":1}}],["shcd",{"2":{"12":1}}],["shgit",{"2":{"12":1}}],["stock",{"2":{"152":1}}],["stone",{"2":{"142":1}}],["stored",{"2":{"197":1}}],["store",{"2":{"35":2,"58":1}}],["stls",{"2":{"116":1}}],["steamvr",{"2":{"190":1}}],["steradian",{"2":{"98":1}}],["steps",{"2":{"39":1,"68":1,"77":1,"84":2,"87":2,"88":1,"106":1,"110":1,"127":1,"133":1,"196":1}}],["step",{"0":{"1":1,"2":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":2,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"138":1,"173":1,"174":1,"175":1,"186":1,"191":1},"1":{"139":1,"140":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"187":1,"188":1,"189":1,"190":1},"2":{"87":1,"123":1,"126":1,"132":1,"166":1,"190":1,"191":1}}],["stds",{"2":{"91":1}}],["stick",{"2":{"120":1,"135":1}}],["sticking",{"2":{"77":1}}],["still",{"2":{"32":1,"50":1,"78":1,"98":2,"120":1,"124":1}}],["studio",{"0":{"63":1,"72":1,"126":1},"1":{"64":1,"65":1},"2":{"63":1,"67":1,"72":1,"79":1,"85":1}}],["strain",{"2":{"97":1}}],["straight",{"2":{"83":1,"191":1}}],["strip",{"2":{"128":1,"129":1}}],["strive",{"2":{"91":1,"97":1}}],["string",{"2":{"57":1}}],["stream",{"2":{"86":1,"123":1,"127":1}}],["streaming",{"2":{"38":3,"144":1,"149":2}}],["structure",{"0":{"14":1},"1":{"15":1},"2":{"15":1}}],["styles",{"2":{"20":1}}],["style",{"0":{"20":1,"25":1},"2":{"20":3,"24":1,"25":4}}],["stash",{"2":{"87":2}}],["stands",{"2":{"82":1}}],["standard",{"0":{"55":1},"2":{"25":3,"55":1}}],["standards",{"0":{"15":1,"22":1,"23":1},"1":{"23":1,"24":2,"25":2},"2":{"22":2}}],["states",{"2":{"98":1}}],["state",{"2":{"87":1,"196":1}}],["status",{"2":{"39":1,"56":1,"119":1}}],["static",{"2":{"24":1,"44":1}}],["sta",{"2":{"28":2}}],["starting",{"2":{"36":1,"144":1,"175":1}}],["start",{"0":{"101":1,"102":1},"1":{"102":1,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2},"2":{"12":1,"19":1,"144":1,"184":1,"190":1}}],["started",{"0":{"10":1},"1":{"11":1,"12":1},"2":{"19":3,"90":2,"111":1}}],["separate",{"2":{"148":3,"149":2}}],["separately",{"2":{"39":1}}],["search",{"2":{"111":1}}],["selects",{"2":{"190":1}}],["select",{"2":{"74":1,"84":3,"85":1,"153":2,"195":1,"196":1}}],["selecting",{"2":{"68":1}}],["sent",{"2":{"198":1}}],["seniorpringles",{"2":{"118":1}}],["sense",{"2":{"37":2,"144":1,"148":1}}],["sends",{"2":{"80":1}}],["send",{"2":{"32":1,"79":1,"116":2}}],["several",{"2":{"37":1}}],["setcamera",{"2":{"56":1}}],["setdevice",{"0":{"59":1},"2":{"56":1}}],["sets",{"2":{"56":3}}],["settxpower",{"0":{"60":1},"2":{"56":1}}],["setting",{"0":{"62":1,"190":1,"193":1,"194":1},"1":{"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"194":1,"195":2,"196":2,"197":1,"198":1},"2":{"28":1,"46":1,"126":1}}],["settings",{"0":{"175":1},"1":{"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"28":1,"39":1,"41":2,"56":2,"57":1,"176":1,"177":1,"178":1,"198":1}}],["setups",{"2":{"145":1}}],["setup",{"0":{"143":1},"1":{"144":1,"145":1},"2":{"36":1,"145":1,"146":1,"163":1,"164":1,"173":1,"193":1}}],["set",{"0":{"107":1,"163":1},"1":{"164":1},"2":{"28":5,"31":6,"46":1,"57":1,"59":1,"60":1,"77":1,"78":1,"86":1,"98":1,"126":1,"142":1,"190":1}}],["semi",{"2":{"25":1}}],["semantic",{"2":{"25":1}}],["seems",{"2":{"120":1}}],["seedstudio",{"2":{"37":2,"148":1}}],["see",{"0":{"27":1,"192":1},"2":{"16":1,"36":1,"74":1,"84":1,"91":1,"94":1,"95":1,"124":1,"149":1,"174":1,"190":4,"196":1}}],["secure",{"2":{"138":1}}],["sections",{"2":{"72":1}}],["section",{"2":{"16":1,"46":1,"61":1,"72":1,"74":1,"80":1,"87":1,"138":1,"195":1,"196":3}}],["second",{"2":{"4":1,"38":1,"123":1}}],["services",{"2":{"116":1}}],["service",{"2":{"59":4}}],["server",{"2":{"12":1}}],["serial",{"0":{"145":1},"2":{"41":1,"85":1,"86":1}}],["series",{"2":{"1":1,"134":1}}],["size",{"2":{"129":1,"148":1,"154":1}}],["silver",{"2":{"128":1}}],["similar",{"2":{"84":1,"116":1}}],["simple",{"2":{"77":1,"110":1,"125":1}}],["simply",{"2":{"71":1,"123":1,"196":1,"197":1}}],["signal",{"2":{"123":1}}],["sign",{"2":{"58":1,"60":1}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"20":2,"24":3}}],["sidebar",{"0":{"19":1},"2":{"19":4,"72":1,"74":1}}],["side",{"0":{"27":1},"2":{"1":2,"2":1,"3":1,"72":1,"74":1,"98":1,"134":2}}],["single",{"2":{"1":1,"134":1}}],["since",{"2":{"1":1,"46":1,"84":1,"134":1,"169":1}}],["social",{"2":{"89":1}}],["socket",{"2":{"77":1}}],["sources",{"2":{"91":1}}],["source",{"0":{"158":1,"165":1,"166":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"89":1,"98":5,"166":1}}],["sound",{"2":{"78":1}}],["software",{"0":{"103":1,"186":1},"1":{"187":1,"188":1,"189":1,"190":1},"2":{"80":1,"86":1,"96":1,"191":1}}],["soon",{"2":{"61":1,"83":1}}],["solve",{"2":{"123":3}}],["solidjs",{"2":{"41":1}}],["solution",{"2":{"39":1,"123":1,"161":1}}],["soldered",{"2":{"158":1}}],["solderless",{"2":{"118":2}}],["soldering",{"2":{"3":1,"125":1,"135":1,"145":1,"149":1,"157":1,"160":1}}],["solder",{"0":{"1":1,"2":1,"3":1,"131":1,"132":1,"134":1,"135":1,"136":1},"2":{"1":1,"2":2,"3":2,"118":1,"123":1,"130":1,"131":1,"134":1,"135":4,"136":2,"157":3,"158":1,"160":2}}],["so",{"2":{"20":1,"32":1,"35":1,"36":1,"52":1,"77":1,"84":1,"85":1,"87":2,"98":1,"99":1,"100":1,"104":1,"110":1,"138":1,"151":2,"154":1,"161":2,"191":1}}],["sometimes",{"2":{"69":1,"197":1}}],["something",{"0":{"27":1},"2":{"97":1,"158":1,"190":1}}],["some",{"2":{"1":1,"25":1,"30":1,"32":1,"36":1,"37":1,"66":1,"68":1,"69":1,"77":1,"80":1,"88":1,"98":1,"107":1,"110":2,"123":2,"134":1,"138":1,"141":1,"142":1,"149":1,"154":1,"155":1,"159":2,"175":1}}],["s",{"2":{"1":1,"25":2,"37":2,"54":1,"66":1,"69":1,"74":1,"77":1,"98":2,"107":1,"111":1,"113":1,"114":1,"118":1,"119":1,"123":1,"125":2,"132":1,"134":1,"143":1,"151":1,"152":1,"153":2,"154":1,"175":1,"187":1,"189":1,"190":1,"193":1,"195":2,"196":3,"197":2}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/Accordion.990634ba.js b/assets/chunks/Accordion.a0a88ff3.js similarity index 93% rename from assets/chunks/Accordion.990634ba.js rename to assets/chunks/Accordion.a0a88ff3.js index a65f236..36ed80d 100644 --- a/assets/chunks/Accordion.990634ba.js +++ b/assets/chunks/Accordion.a0a88ff3.js @@ -1 +1 @@ -import{_ as l,o as t,c as r,k as o,r as i,n as c,a1 as d,a2 as p}from"./framework.1f7cb35e.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 w(e,n,k,v,s,a){return t(),r("div",null,[o("button",{onClick:n[0]||(n[0]=g=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":s.isOpen,"aria-controls":`collapse${e._uid}`},[i(e.$slots,"title"),(t(),r("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}`},[i(e.$slots,"content")],8,m),[[p,s.isOpen]])])}const x=l(u,[["render",w]]);export{x as A}; +import{_ as l,o as t,c as r,k as o,r as i,n as c,a1 as d,a2 as p}from"./framework.e4c952c1.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 w(e,n,k,v,s,a){return t(),r("div",null,[o("button",{onClick:n[0]||(n[0]=g=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":s.isOpen,"aria-controls":`collapse${e._uid}`},[i(e.$slots,"title"),(t(),r("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}`},[i(e.$slots,"content")],8,m),[[p,s.isOpen]])])}const x=l(u,[["render",w]]);export{x as A}; diff --git a/assets/chunks/CheckBoxList.26e03ba7.js b/assets/chunks/CheckBoxList.9fb033ec.js similarity index 92% rename from assets/chunks/CheckBoxList.26e03ba7.js rename to assets/chunks/CheckBoxList.9fb033ec.js index 526cf18..dd1a0bd 100644 --- a/assets/chunks/CheckBoxList.26e03ba7.js +++ b/assets/chunks/CheckBoxList.9fb033ec.js @@ -1 +1 @@ -import{o as e,c as t,k as o,F as _,D as a,t as n}from"./framework.1f7cb35e.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},F={__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{F as _}; +import{o as e,c as t,k as o,F as _,D as a,t as n}from"./framework.e4c952c1.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},F={__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{F as _}; diff --git a/assets/chunks/VPLocalSearchBox.03f5fd54.js b/assets/chunks/VPLocalSearchBox.03f5fd54.js deleted file mode 100644 index 0c1ebe0..0000000 --- a/assets/chunks/VPLocalSearchBox.03f5fd54.js +++ /dev/null @@ -1,7 +0,0 @@ -import{V as vt,h as ne,x as ze,ah as kt,ai as Nt,d as Tt,E as me,aj as Xe,g as Te,ak as It,al as Dt,y as _t,am as Ot,j as Ie,O as fe,S as be,an as Rt,ao as Mt,W as Lt,s as Pt,ap as zt,o as Z,b as Bt,k as S,$ as Vt,l as W,a1 as $t,aq as Wt,ar as jt,c as ee,n as et,e as we,D as tt,F as rt,a as he,t as de,as as Kt,p as Jt,m as Ut,at,au as Ht,a6 as Gt,ac as qt,_ as Qt}from"./framework.1f7cb35e.js";import{u as Yt,d as Zt}from"./theme.3f27bc77.js";const Xt={root:()=>vt(()=>import("./@localSearchIndexroot.b0007708.js"),[])};/*! -* tabbable 6.2.0 -* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE -*/var pt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ee=pt.join(","),yt=typeof Element>"u",oe=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Se=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ae=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},er=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ae(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ee));return t&&oe.call(e,Ee)&&n.unshift(e),n=n.filter(r),n},mt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ae(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var d=oe.call(i,Ee);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ae(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var y=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},bt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||er(e))&&!bt(e)?0:e.tabIndex},tr=function(e,t){var r=ie(e);return r<0&&t&&!bt(e)?0:r},rr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},ar=function(e){return wt(e)&&e.type==="hidden"},nr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ir=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(oe.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Se(e);if(u&&!u.shadowRoot&&n(u)===!0)return nt(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(lr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return nt(e);return!1},fr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},dr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=tr(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(rr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},vr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=mt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:hr}):r=gt(e,t.includeContainer,Be.bind(null,t)),dr(r)},pr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=mt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ce.bind(null,t)),r},se=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,Ee)===!1?!1:Be(t,e)},yr=pt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,yr)===!1?!1:Ce(t,e)};/*! -* focus-trap 7.5.3 -* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE -*/function it(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function ot(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},wr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},xr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Fr=function(e){return ye(e)&&!e.shiftKey},Er=function(e){return ye(e)&&e.shiftKey},ut=function(e){return setTimeout(e,0)},lt=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},ve=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),T=1;T=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||d("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=vr(c,a.tabbableOptions),p=pr(c,a.tabbableOptions),w=f.length>0?f[0]:void 0,T=f.length>0?f[f.length-1]:void 0,O=p.find(function(b){return se(b)}),P=p.slice().reverse().find(function(b){return se(b)}),g=!!f.find(function(b){return ie(b)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:g,firstTabbableNode:w,lastTabbableNode:T,firstDomTabbableNode:O,lastDomTabbableNode:P,nextTabbableNode:function(z){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,K=f.indexOf(z);return K<0?G?p.slice(p.indexOf(z)+1).find(function(J){return se(J)}):p.slice(0,p.indexOf(z)).reverse().find(function(J){return se(J)}):f[K+(G?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function F(c){if(c!==!1&&c!==r.activeElement){if(!c||!c.focus){F(h());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,wr(c)&&c.select()}},m=function(c){var f=d("setReturnFocus",c);return f||(f===!1?!1:c)},E=function(c){var f=c.target,p=c.event,w=c.isBackward,T=w===void 0?!1:w;f=f||xe(p),v();var O=null;if(i.tabbableGroups.length>0){var P=l(f,p),g=P>=0?i.containerGroups[P]:void 0;if(P<0)T?O=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:O=i.tabbableGroups[0].firstTabbableNode;else if(T){var b=lt(i.tabbableGroups,function(U){var H=U.firstTabbableNode;return f===H});if(b<0&&(g.container===f||De(f,a.tabbableOptions)&&!se(f,a.tabbableOptions)&&!g.nextTabbableNode(f,!1))&&(b=P),b>=0){var z=b===0?i.tabbableGroups.length-1:b-1,G=i.tabbableGroups[z];O=ie(f)>=0?G.lastTabbableNode:G.lastDomTabbableNode}else ye(p)||(O=g.nextTabbableNode(f,!1))}else{var K=lt(i.tabbableGroups,function(U){var H=U.lastTabbableNode;return f===H});if(K<0&&(g.container===f||De(f,a.tabbableOptions)&&!se(f,a.tabbableOptions)&&!g.nextTabbableNode(f))&&(K=P),K>=0){var J=K===i.tabbableGroups.length-1?0:K+1,B=i.tabbableGroups[J];O=ie(f)>=0?B.firstTabbableNode:B.firstDomTabbableNode}else ye(p)||(O=g.nextTabbableNode(f))}}else O=d("fallbackFocus");return O},x=function(c){var f=xe(c);if(!(l(f,c)>=0)){if(ve(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}ve(a.allowOutsideClick,c)||c.preventDefault()}},C=function(c){var f=xe(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var w,T=!0;if(i.mostRecentlyFocusedNode)if(ie(i.mostRecentlyFocusedNode)>0){var O=l(i.mostRecentlyFocusedNode),P=i.containerGroups[O].tabbableNodes;if(P.length>0){var g=P.findIndex(function(b){return b===i.mostRecentlyFocusedNode});g>=0&&(a.isKeyForward(i.recentNavEvent)?g+1=0&&(w=P[g-1],T=!1))}}else i.containerGroups.some(function(b){return b.tabbableNodes.some(function(z){return ie(z)>0})})||(T=!1);else T=!1;T&&(w=E({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),y(w||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},k=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=E({event:c,isBackward:f});p&&(ye(c)&&c.preventDefault(),y(p))},A=function(c){if(xr(c)&&ve(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&k(c,a.isKeyBackward(c))},M=function(c){var f=xe(c);l(f,c)>=0||ve(a.clickOutsideDeactivates,c)||ve(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},L=function(){if(i.active)return st.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?ut(function(){y(h())}):y(h()),r.addEventListener("focusin",C,!0),r.addEventListener("mousedown",x,{capture:!0,passive:!1}),r.addEventListener("touchstart",x,{capture:!0,passive:!1}),r.addEventListener("click",M,{capture:!0,passive:!1}),r.addEventListener("keydown",A,{capture:!0,passive:!1}),s},D=function(){if(i.active)return r.removeEventListener("focusin",C,!0),r.removeEventListener("mousedown",x,!0),r.removeEventListener("touchstart",x,!0),r.removeEventListener("click",M,!0),r.removeEventListener("keydown",A,!0),s},N=function(c){var f=c.some(function(p){var w=Array.from(p.removedNodes);return w.some(function(T){return T===i.mostRecentlyFocusedNode})});f&&y(h())},I=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(N):void 0,R=function(){I&&(I.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){I.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),w=u(c,"checkCanFocusTrap");w||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var T=function(){w&&v(),L(),R(),p==null||p()};return w?(w(i.containers.concat()).then(T,T),this):(T(),this)},deactivate:function(c){if(!i.active)return this;var f=ot({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,D(),i.active=!1,i.paused=!1,R(),st.deactivateTrap(n,s);var p=u(f,"onDeactivate"),w=u(f,"onPostDeactivate"),T=u(f,"checkCanReturnFocus"),O=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){ut(function(){O&&y(m(i.nodeFocusedBeforeActivation)),w==null||w()})};return O&&T?(T(m(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),D(),R(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),L(),R(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),R(),this}},s.updateContainerElements(e),s};function Cr(o,e={}){let t;const{immediate:r,...n}=e,a=ne(!1),i=ne(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},d=()=>{t&&(t.unpause(),i.value=!1)};return ze(()=>kt(o),h=>{h&&(t=Ar(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Nt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:d}}class le{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{le.matches(l,this.exclude)?u():this.onIframeReady(l,d=>{t(l)&&(s++,r(d)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new le(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,d,h=()=>({prevNode:d,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let kr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new le(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return le.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,d),e.value=h+v,e.nodes.forEach((y,m)=>{m>=s&&(e.nodes[m].start>0&&m!==s&&(e.nodes[m].start-=d),e.nodes[m].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let d=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,d,v=>t(v,s,a.value.substring(l,d),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let d=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,y)=>this.opt.filter(y,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=le.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Nr(o){const e=new kr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var V=function(){return V=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function $(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Dr="ENTRIES",xt="KEYS",Ft="VALUES",j="",_e=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ue(this._path),t=e.node,r=e.keys;if(ue(r)===j)return{done:!1,value:this.result()};var n=t.get(ue(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ue(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ue(t)}).filter(function(e){return e!==j}).join("")},o.prototype.value=function(){return ue(this._path).node.get(j)},o.prototype.result=function(){switch(this._type){case Ft:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ue=function(o){return o[o.length-1]},_r=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}Et(o.get(y),e,t,r,n,E,i,s+y)}}}catch(p){u={error:p}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Oe=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=$(ke(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=$(je(i),2),u=s[0],l=s[1];try{for(var d=_(u.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==j&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(m){t={error:m}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Or(this._tree,e)},o.prototype.entries=function(){return new _e(this,Dr)},o.prototype.forEach=function(e){var t,r;try{for(var n=_(this),a=n.next();!a.done;a=n.next()){var i=$(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return _r(this._tree,e,t)},o.prototype.get=function(e){var t=Ve(this._tree,e);return t!==void 0?t.get(j):void 0},o.prototype.has=function(e){var t=Ve(this._tree,e);return t!==void 0&&t.has(j)},o.prototype.keys=function(){return new _e(this,xt)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(j,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(j,t(r.get(j))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e),n=r.get(j);return n===void 0&&r.set(j,n=t()),n},o.prototype.values=function(){return new _e(this,Ft)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=$(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ke=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=_(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==j&&e.startsWith(s))return t.push([o,s]),ke(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),ke(void 0,"",t)},Ve=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=_(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==j&&e.startsWith(i))return Ve(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Re=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Oe,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=We,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Tr(this,void 0,void 0,function(){var r,n,a,i,s,u,l,d,h,v,y,m,E,x,C,k,A,M,L,D,N,I,R,F,c;return Ir(this,function(f){switch(f.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||$e.batchSize,a=e.batchWait||$e.batchWait,i=1,f.label=1;case 1:f.trys.push([1,7,8,9]),s=_(this._index),u=s.next(),f.label=2;case 2:if(u.done)return[3,6];l=$(u.value,2),d=l[0],h=l[1];try{for(v=(I=void 0,_(h)),y=v.next();!y.done;y=v.next()){m=$(y.value,2),E=m[0],x=m[1];try{for(C=(F=void 0,_(x)),k=C.next();!k.done;k=C.next())A=$(k.value,1),M=A[0],!this._documentIds.has(M)&&(x.size<=1?h.delete(E):x.delete(M))}catch(p){F={error:p}}finally{try{k&&!k.done&&(c=C.return)&&c.call(C)}finally{if(F)throw F.error}}}}catch(p){I={error:p}}finally{try{y&&!y.done&&(R=v.return)&&R.call(v)}finally{if(I)throw I.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(p){return setTimeout(p,a)})];case 3:f.sent(),f.label=4;case 4:i+=1,f.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return L=f.sent(),D={error:L},[3,9];case 8:try{u&&!u.done&&(N=s.return)&&N.call(s)}finally{if(D)throw D.error}return[7];case 9:this._dirtCount-=r,f.label=10;case 10:return[4,null];case 11:return f.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Pe.minDirtCount,r=r||Pe.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=_(a),u=s.next();!u.done;u=s.next()){var l=$(u.value,2),d=l[0],h=l[1],v=h.score,y=h.terms,m=h.match,E=y.length,x={id:this._documentIds.get(d),score:v*E,terms:Object.keys(m),match:m};Object.assign(x,this._storedFields.get(d)),(t.filter==null||t.filter(x))&&i.push(x)}}catch(C){r={error:C}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return i.sort(ht),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=V(V({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=_(this.search(e,t)),l=u.next();!l.done;l=u.next()){var d=l.value,h=d.score,v=d.terms,y=v.join(" "),m=s.get(y);m!=null?(m.score+=h,m.count+=1):s.set(y,{score:h,terms:v,count:1})}}catch(L){r={error:L}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var E=[];try{for(var x=_(s),C=x.next();!C.done;C=x.next()){var k=$(C.value,2),m=k[0],A=k[1],h=A.score,v=A.terms,M=A.count;E.push({suggestion:m,terms:v,score:h/M})}}catch(L){a={error:L}}finally{try{C&&!C.done&&(i=x.return)&&i.call(x)}finally{if(a)throw a.error}}return E.sort(ht),E},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Le.hasOwnProperty(e))return Me(Le,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,y=e.fieldIds,m=e.fieldLength,E=e.averageFieldLength,x=e.storedFields,C=e.dirtCount,k=e.serializationVersion;if(k!==1&&k!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var A=new o(t);A._documentCount=d,A._nextId=h,A._documentIds=Fe(v),A._idToShortId=new Map,A._fieldIds=y,A._fieldLength=Fe(m),A._avgFieldLength=E,A._storedFields=Fe(x),A._dirtCount=C||0,A._index=new Oe;try{for(var M=_(A._documentIds),L=M.next();!L.done;L=M.next()){var D=$(L.value,2),N=D[0],I=D[1];A._idToShortId.set(I,N)}}catch(b){r={error:b}}finally{try{L&&!L.done&&(n=M.return)&&n.call(M)}finally{if(r)throw r.error}}try{for(var R=_(l),F=R.next();!F.done;F=R.next()){var c=$(F.value,2),f=c[0],p=c[1],w=new Map;try{for(var T=(s=void 0,_(Object.keys(p))),O=T.next();!O.done;O=T.next()){var P=O.value,g=p[P];k===1&&(g=g.ds),w.set(parseInt(P,10),Fe(g))}}catch(b){s={error:b}}finally{try{O&&!O.done&&(u=T.return)&&u.call(T)}finally{if(s)throw s.error}}A._index.set(f,w)}}catch(b){a={error:b}}finally{try{F&&!F.done&&(i=R.return)&&i.call(R)}finally{if(a)throw a.error}}return A},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var n=V(V(V({},t),e),{queries:void 0}),a=e.queries.map(function(x){return r.executeQuery(x,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,d=V(V({tokenize:s,processTerm:u},l),t),h=d.tokenize,v=d.processTerm,y=h(e).flatMap(function(x){return v(x)}).filter(function(x){return!!x}),m=y.map(Br(d)),E=m.map(function(x){return r.executeQuerySpec(x,d)});return this.combineResults(E,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=V(V({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(P,g){var b;return V(V({},P),(b={},b[g]=Me(s.boost,g)||1,b))},{}),l=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,y=V(V({},ct.weights),d),m=y.fuzzy,E=y.prefix,x=this._index.get(e.term),C=this.termResults(e.term,e.term,1,x,u,l,v),k,A;if(e.prefix&&(k=this._index.atPrefix(e.term)),e.fuzzy){var M=e.fuzzy===!0?.2:e.fuzzy,L=M<1?Math.min(h,Math.round(e.term.length*M)):M;L&&(A=this._index.fuzzyGet(e.term,L))}if(k)try{for(var D=_(k),N=D.next();!N.done;N=D.next()){var I=$(N.value,2),R=I[0],F=I[1],c=R.length-e.term.length;if(c){A==null||A.delete(R);var f=E*R.length/(R.length+.3*c);this.termResults(e.term,R,f,F,u,l,v,C)}}}catch(P){r={error:P}}finally{try{N&&!N.done&&(n=D.return)&&n.call(D)}finally{if(r)throw r.error}}if(A)try{for(var p=_(A.keys()),w=p.next();!w.done;w=p.next()){var R=w.value,T=$(A.get(R),2),O=T[0],c=T[1];if(c){var f=m*R.length/(R.length+c);this.termResults(e.term,R,f,O,u,l,v,C)}}}catch(P){a={error:P}}finally{try{w&&!w.done&&(i=p.return)&&i.call(p)}finally{if(a)throw a.error}}return C},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Ke),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Lr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=_(this._index),s=i.next();!s.done;s=i.next()){var u=$(s.value,2),l=u[0],d=u[1],h={};try{for(var v=(r=void 0,_(d)),y=v.next();!y.done;y=v.next()){var m=$(y.value,2),E=m[0],x=m[1];h[E]=Object.fromEntries(x)}}catch(C){r={error:C}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(C){e={error:C}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,d,h,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var m=_(Object.keys(a)),E=m.next();!E.done;E=m.next()){var x=E.value,C=a[x],k=this._fieldIds[x],A=n.get(k);if(A!=null){var M=A.size,L=this._avgFieldLength[k];try{for(var D=(h=void 0,_(A.keys())),N=D.next();!N.done;N=D.next()){var I=N.value;if(!this._documentIds.has(I)){this.removeTerm(k,I,t),M-=1;continue}var R=i?i(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(R){var F=A.get(I),c=this._fieldLength.get(I)[k],f=zr(F,M,this._documentCount,c,L,s),p=r*C*R*f,w=u.get(I);if(w){w.score+=p,$r(w.terms,e);var T=Me(w.match,t);T?T.push(x):w.match[t]=[x]}else u.set(I,{score:p,terms:[e],match:(y={},y[t]=[x],y)})}}}catch(O){h={error:O}}finally{try{N&&!N.done&&(v=D.return)&&v.call(D)}finally{if(h)throw h.error}}}}}catch(O){l={error:O}}finally{try{E&&!E.done&&(d=m.return)&&d.call(m)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,dt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,dt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=_(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Jt("data-v-9cd6a060"),o=o(),Ut(),o),jr=["aria-owns"],Kr={class:"shell"},Jr=["title"],Ur=Q(()=>S("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("circle",{cx:"11",cy:"11",r:"8"}),S("path",{d:"m21 21l-4.35-4.35"})])],-1)),Hr=[Ur],Gr={class:"search-actions before"},qr=["title"],Qr=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),Yr=[Qr],Zr=["placeholder"],Xr={class:"search-actions"},ea=["title"],ta=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),ra=[ta],aa=["disabled","title"],na=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),ia=[na],oa=["id","role","aria-labelledby"],sa=["aria-selected"],ua=["href","aria-label","onMouseenter","onFocusin"],la={class:"titles"},ca=Q(()=>S("span",{class:"title-icon"},"#",-1)),fa=["innerHTML"],ha=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),da={class:"title main"},va=["innerHTML"],pa={key:0,class:"excerpt-wrapper"},ya={key:0,class:"excerpt",inert:""},ga=["innerHTML"],ma=Q(()=>S("div",{class:"excerpt-gradient-bottom"},null,-1)),ba=Q(()=>S("div",{class:"excerpt-gradient-top"},null,-1)),wa={key:0,class:"no-results"},xa={class:"search-keyboard-shortcuts"},Fa=["aria-label"],Ea=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),Sa=[Ea],Aa=["aria-label"],Ca=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),ka=[Ca],Na=["aria-label"],Ta=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("path",{d:"m9 10l-5 5l5 5"}),S("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Ia=[Ta],Da=["aria-label"],_a=Tt({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var T,O,P;const t=me(),r=me(),n=me(Xt),a=Yt(),{activate:i}=Cr(t,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:s,theme:u}=a,l=Xe(async()=>{var g,b,z,G,K,J,B,U,H;return at(Mr.loadJSON((z=await((b=(g=n.value)[s.value])==null?void 0:b.call(g)))==null?void 0:z.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((G=u.value.search)==null?void 0:G.provider)==="local"&&((J=(K=u.value.search.options)==null?void 0:K.miniSearch)==null?void 0:J.searchOptions)},...((B=u.value.search)==null?void 0:B.provider)==="local"&&((H=(U=u.value.search.options)==null?void 0:U.miniSearch)==null?void 0:H.options)}))}),h=Te(()=>{var g,b;return((g=u.value.search)==null?void 0:g.provider)==="local"&&((b=u.value.search.options)==null?void 0:b.disableQueryPersistence)===!0}).value?ne(""):It("vitepress:local-search-filter",""),v=Dt("vitepress:local-search-detailed-list",((T=u.value.search)==null?void 0:T.provider)==="local"&&((O=u.value.search.options)==null?void 0:O.detailedView)===!0),y=Te(()=>{var g,b,z;return((g=u.value.search)==null?void 0:g.provider)==="local"&&(((b=u.value.search.options)==null?void 0:b.disableDetailedView)===!0||((z=u.value.search.options)==null?void 0:z.detailedView)===!1)});_t(()=>{y.value&&(v.value=!1)});const m=me([]),E=ne(!1);ze(h,()=>{E.value=!1});const x=Xe(async()=>{if(r.value)return at(new Nr(r.value))},null);Ot(()=>[l.value,h.value,v.value],async([g,b,z],G,K)=>{var Je,Ue,He,Ge;let J=!1;if(K(()=>{J=!0}),!g)return;m.value=g.search(b).slice(0,16),E.value=!0;const B=z?await Promise.all(m.value.map(q=>C(q.id))):[];if(J)return;const U=new Map;for(const{id:q,mod:te}of B){const re=q.slice(0,q.indexOf("#"));let X=U.get(re);if(X)continue;X=new Map,U.set(re,X);const Y=te.default??te;if(Y!=null&&Y.render||Y!=null&&Y.setup){const ae=Ht(Y);ae.config.warnHandler=()=>{},ae.provide(Gt,a),Object.defineProperties(ae.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}});const qe=document.createElement("div");ae.mount(qe),qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ce=>{var Ze;const ge=(Ze=ce.querySelector("a"))==null?void 0:Ze.getAttribute("href"),Qe=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Qe)return;let Ye="";for(;(ce=ce.nextElementSibling)&&!/^h[1-6]$/i.test(ce.tagName);)Ye+=ce.outerHTML;X.set(Qe,Ye)}),ae.unmount()}if(J)return}const H=new Set;if(m.value=m.value.map(q=>{const[te,re]=q.id.split("#"),X=U.get(te),Y=(X==null?void 0:X.get(re))??"";for(const ae in q.match)H.add(ae);return{...q,text:Y}}),await fe(),J)return;await new Promise(q=>{var te;(te=x.value)==null||te.unmark({done:()=>{var re;(re=x.value)==null||re.markRegExp(w(H),{done:q})}})});const Ne=((Je=t.value)==null?void 0:Je.querySelectorAll(".result .excerpt"))??[];for(const q of Ne)(Ue=q.querySelector('mark[data-markjs="true"]'))==null||Ue.scrollIntoView({block:"center"});(Ge=(He=r.value)==null?void 0:He.firstElementChild)==null||Ge.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function C(g){const b=qt(g.slice(0,g.indexOf("#")));try{if(!b)throw new Error(`Cannot find file for id: ${g}`);return{id:g,mod:await vt(()=>import(b),[])}}catch(z){return console.error(z),{id:g,mod:{}}}}const k=ne(),A=Te(()=>{var g;return((g=h.value)==null?void 0:g.length)<=0});function M(g=!0){var b,z;(b=k.value)==null||b.focus(),g&&((z=k.value)==null||z.select())}Ie(()=>{M()});function L(g){g.pointerType==="mouse"&&M()}const D=ne(-1),N=ne(!1);ze(m,g=>{D.value=g.length?0:-1,I()});function I(){fe(()=>{const g=document.querySelector(".result.selected");g&&g.scrollIntoView({block:"nearest"})})}be("ArrowUp",g=>{g.preventDefault(),D.value--,D.value<0&&(D.value=m.value.length-1),N.value=!0,I()}),be("ArrowDown",g=>{g.preventDefault(),D.value++,D.value>=m.value.length&&(D.value=0),N.value=!0,I()});const R=Rt();be("Enter",g=>{if(g.target instanceof HTMLButtonElement&&g.target.type!=="submit")return;const b=m.value[D.value];if(g.target instanceof HTMLInputElement&&!b){g.preventDefault();return}b&&(R.go(b.id),e("close"))}),be("Escape",()=>{e("close")});const F={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},c=Zt((P=u.value.search)==null?void 0:P.options,F);Ie(()=>{window.history.pushState(null,"",null)}),Mt("popstate",g=>{g.preventDefault(),e("close")});const f=Lt(Pt?document.body:null);Ie(()=>{fe(()=>{f.value=!0,fe().then(()=>i())})}),zt(()=>{f.value=!1});function p(){h.value="",fe().then(()=>M(!1))}function w(g){return new RegExp([...g].sort((b,z)=>z.length-b.length).map(b=>`(${b.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(g,b)=>{var z,G,K,J;return Z(),Bt(Kt,{to:"body"},[S("div",{ref_key:"el",ref:t,role:"button","aria-owns":(z=m.value)!=null&&z.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:b[0]||(b[0]=B=>g.$emit("close"))}),S("div",Kr,[S("form",{class:"search-bar",onPointerup:b[4]||(b[4]=B=>L(B)),onSubmit:b[5]||(b[5]=Vt(()=>{},["prevent"]))},[S("label",{title:g.placeholder,id:"localsearch-label",for:"localsearch-input"},Hr,8,Jr),S("div",Gr,[S("button",{class:"back-button",title:W(c)("modal.backButtonTitle"),onClick:b[1]||(b[1]=B=>g.$emit("close"))},Yr,8,qr)]),$t(S("input",{ref_key:"searchInput",ref:k,"onUpdate:modelValue":b[2]||(b[2]=B=>jt(h)?h.value=B:null),placeholder:g.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Zr),[[Wt,W(h)]]),S("div",Xr,[y.value?we("",!0):(Z(),ee("button",{key:0,class:et(["toggle-layout-button",{"detailed-list":W(v)}]),type:"button",title:W(c)("modal.displayDetails"),onClick:b[3]||(b[3]=B=>D.value>-1&&(v.value=!W(v)))},ra,10,ea)),S("button",{class:"clear-button",type:"reset",disabled:A.value,title:W(c)("modal.resetButtonTitle"),onClick:p},ia,8,aa)])],32),S("ul",{ref_key:"resultsEl",ref:r,id:(G=m.value)!=null&&G.length?"localsearch-list":void 0,role:(K=m.value)!=null&&K.length?"listbox":void 0,"aria-labelledby":(J=m.value)!=null&&J.length?"localsearch-label":void 0,class:"results",onMousemove:b[7]||(b[7]=B=>N.value=!1)},[(Z(!0),ee(rt,null,tt(m.value,(B,U)=>(Z(),ee("li",{key:B.id,role:"option","aria-selected":D.value===U?"true":"false"},[S("a",{href:B.id,class:et(["result",{selected:D.value===U}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:H=>!N.value&&(D.value=U),onFocusin:H=>D.value=U,onClick:b[6]||(b[6]=H=>g.$emit("close"))},[S("div",null,[S("div",la,[ca,(Z(!0),ee(rt,null,tt(B.titles,(H,Ne)=>(Z(),ee("span",{key:Ne,class:"title"},[S("span",{class:"text",innerHTML:H},null,8,fa),ha]))),128)),S("span",da,[S("span",{class:"text",innerHTML:B.title},null,8,va)])]),W(v)?(Z(),ee("div",pa,[B.text?(Z(),ee("div",ya,[S("div",{class:"vp-doc",innerHTML:B.text},null,8,ga)])):we("",!0),ma,ba])):we("",!0)])],42,ua)],8,sa))),128)),W(h)&&!m.value.length&&E.value?(Z(),ee("li",wa,[he(de(W(c)("modal.noResultsText"))+' "',1),S("strong",null,de(W(h)),1),he('" ')])):we("",!0)],40,oa),S("div",xa,[S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.navigateUpKeyAriaLabel")},Sa,8,Fa),S("kbd",{"aria-label":W(c)("modal.footer.navigateDownKeyAriaLabel")},ka,8,Aa),he(" "+de(W(c)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.selectKeyAriaLabel")},Ia,8,Na),he(" "+de(W(c)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.closeKeyAriaLabel")},"esc",8,Da),he(" "+de(W(c)("modal.footer.closeText")),1)])])])],8,jr)])}}});const Pa=Qt(_a,[["__scopeId","data-v-9cd6a060"]]);export{Pa as default}; diff --git a/assets/chunks/VPLocalSearchBox.9f9b3188.js b/assets/chunks/VPLocalSearchBox.9f9b3188.js new file mode 100644 index 0000000..f69124f --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.9f9b3188.js @@ -0,0 +1,7 @@ +import{V as pt,h as ie,x as Be,ah as Nt,ai as Tt,d as It,E as be,aj as et,g as Ie,ak as Dt,al as _t,y as Ot,am as Rt,j as De,O as de,S as we,an as Mt,ao as Lt,W as Pt,s as zt,ap as Bt,o as X,b as Vt,k as S,$ as $t,l as j,a1 as Wt,aq as jt,ar as Kt,c as te,n as tt,e as xe,D as rt,F as at,a as he,t as ve,as as Jt,p as Ut,m as Ht,at as nt,au as Gt,a6 as qt,ac as Qt,_ as Yt}from"./framework.e4c952c1.js";import{u as Zt,d as Xt}from"./theme.bd876814.js";const er={root:()=>pt(()=>import("./@localSearchIndexroot.ecff9080.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var yt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Se=yt.join(","),mt=typeof Element>"u",se=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ae=!mt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ce=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},tr=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ce(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Se));return t&&se.call(e,Se)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ce(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var d=se.call(i,Se);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ce(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var m=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||tr(e))&&!wt(e)?0:e.tabIndex},rr=function(e,t){var r=oe(e);return r<0&&t&&!wt(e)?0:r},ar=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},nr=function(e){return xt(e)&&e.type==="hidden"},ir=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},or=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ae(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(cr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},dr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},vr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=rr(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(ar).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},pr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:hr}):r=gt(e,t.includeContainer,Ve.bind(null,t)),vr(r)},yr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:ke.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,ke.bind(null,t)),r},ue=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Se)===!1?!1:Ve(t,e)},mr=yt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,mr)===!1?!1:ke(t,e)};/*! +* focus-trap 7.5.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function ot(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function st(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},xr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Fr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},me=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Er=function(e){return me(e)&&!e.shiftKey},Sr=function(e){return me(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},ct=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},pe=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),N=1;N=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||d("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=pr(c,a.tabbableOptions),p=yr(c,a.tabbableOptions),T=f.length>0?f[0]:void 0,N=f.length>0?f[f.length-1]:void 0,M=p.find(function(w){return ue(w)}),P=p.slice().reverse().find(function(w){return ue(w)}),y=!!f.find(function(w){return oe(w)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:y,firstTabbableNode:T,lastTabbableNode:N,firstDomTabbableNode:M,lastDomTabbableNode:P,nextTabbableNode:function(B){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,J=f.indexOf(B);return J<0?q?p.slice(p.indexOf(B)+1).find(function(U){return ue(U)}):p.slice(0,p.indexOf(B)).reverse().find(function(U){return ue(U)}):f[J+(q?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},m=function F(c){var f=c.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?F(f.shadowRoot):f},g=function F(c){if(c!==!1&&c!==m(document)){if(!c||!c.focus){F(h());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,xr(c)&&c.select()}},b=function(c){var f=d("setReturnFocus",c);return f||(f===!1?!1:c)},x=function(c){var f=c.target,p=c.event,T=c.isBackward,N=T===void 0?!1:T;f=f||Fe(p),v();var M=null;if(i.tabbableGroups.length>0){var P=l(f,p),y=P>=0?i.containerGroups[P]:void 0;if(P<0)N?M=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:M=i.tabbableGroups[0].firstTabbableNode;else if(N){var w=ct(i.tabbableGroups,function(H){var G=H.firstTabbableNode;return f===G});if(w<0&&(y.container===f||_e(f,a.tabbableOptions)&&!ue(f,a.tabbableOptions)&&!y.nextTabbableNode(f,!1))&&(w=P),w>=0){var B=w===0?i.tabbableGroups.length-1:w-1,q=i.tabbableGroups[B];M=oe(f)>=0?q.lastTabbableNode:q.lastDomTabbableNode}else me(p)||(M=y.nextTabbableNode(f,!1))}else{var J=ct(i.tabbableGroups,function(H){var G=H.lastTabbableNode;return f===G});if(J<0&&(y.container===f||_e(f,a.tabbableOptions)&&!ue(f,a.tabbableOptions)&&!y.nextTabbableNode(f))&&(J=P),J>=0){var U=J===i.tabbableGroups.length-1?0:J+1,V=i.tabbableGroups[U];M=oe(f)>=0?V.firstTabbableNode:V.firstDomTabbableNode}else me(p)||(M=y.nextTabbableNode(f))}}else M=d("fallbackFocus");return M},C=function(c){var f=Fe(c);if(!(l(f,c)>=0)){if(pe(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}pe(a.allowOutsideClick,c)||c.preventDefault()}},k=function(c){var f=Fe(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var T,N=!0;if(i.mostRecentlyFocusedNode)if(oe(i.mostRecentlyFocusedNode)>0){var M=l(i.mostRecentlyFocusedNode),P=i.containerGroups[M].tabbableNodes;if(P.length>0){var y=P.findIndex(function(w){return w===i.mostRecentlyFocusedNode});y>=0&&(a.isKeyForward(i.recentNavEvent)?y+1=0&&(T=P[y-1],N=!1))}}else i.containerGroups.some(function(w){return w.tabbableNodes.some(function(B){return oe(B)>0})})||(N=!1);else N=!1;N&&(T=x({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),g(T||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},A=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=x({event:c,isBackward:f});p&&(me(c)&&c.preventDefault(),g(p))},L=function(c){if(Fr(c)&&pe(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&A(c,a.isKeyBackward(c))},O=function(c){var f=Fe(c);l(f,c)>=0||pe(a.clickOutsideDeactivates,c)||pe(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},z=function(){if(i.active)return ut.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?lt(function(){g(h())}):g(h()),r.addEventListener("focusin",k,!0),r.addEventListener("mousedown",C,{capture:!0,passive:!1}),r.addEventListener("touchstart",C,{capture:!0,passive:!1}),r.addEventListener("click",O,{capture:!0,passive:!1}),r.addEventListener("keydown",L,{capture:!0,passive:!1}),s},E=function(){if(i.active)return r.removeEventListener("focusin",k,!0),r.removeEventListener("mousedown",C,!0),r.removeEventListener("touchstart",C,!0),r.removeEventListener("click",O,!0),r.removeEventListener("keydown",L,!0),s},I=function(c){var f=c.some(function(p){var T=Array.from(p.removedNodes);return T.some(function(N){return N===i.mostRecentlyFocusedNode})});f&&g(h())},_=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(I):void 0,R=function(){_&&(_.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){_.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),T=u(c,"checkCanFocusTrap");T||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var N=function(){T&&v(),z(),R(),p==null||p()};return T?(T(i.containers.concat()).then(N,N),this):(N(),this)},deactivate:function(c){if(!i.active)return this;var f=st({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,E(),i.active=!1,i.paused=!1,R(),ut.deactivateTrap(n,s);var p=u(f,"onDeactivate"),T=u(f,"onPostDeactivate"),N=u(f,"checkCanReturnFocus"),M=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){lt(function(){M&&g(b(i.nodeFocusedBeforeActivation)),T==null||T()})};return M&&N?(N(b(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),E(),R(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),z(),R(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),R(),this}},s.updateContainerElements(e),s};function kr(o,e={}){let t;const{immediate:r,...n}=e,a=ie(!1),i=ie(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},d=()=>{t&&(t.unpause(),i.value=!1)};return Be(()=>Nt(o),h=>{h&&(t=Cr(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Tt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:d}}class ce{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{ce.matches(l,this.exclude)?u():this.onIframeReady(l,d=>{t(l)&&(s++,r(d)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,d,h=()=>({prevNode:d,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,m=>u.push(m),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Nr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,d),e.value=h+v,e.nodes.forEach((m,g)=>{g>=s&&(e.nodes[g].start>0&&g!==s&&(e.nodes[g].start-=d),e.nodes[g].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let d=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,d,v=>t(v,s,a.value.substring(l,d),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let d=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,m)=>this.opt.filter(m,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=ce.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Tr(o){const e=new Nr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var $=function(){return $=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var _r="ENTRIES",Ft="KEYS",Et="VALUES",K="",Oe=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=le(this._path),t=e.node,r=e.keys;if(le(r)===K)return{done:!1,value:this.result()};var n=t.get(le(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return le(t)}).filter(function(e){return e!==K}).join("")},o.prototype.value=function(){return le(this._path).node.get(K)},o.prototype.result=function(){switch(this._type){case Et:return this.value();case Ft:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),le=function(o){return o[o.length-1]},Or=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}St(o.get(m),e,t,r,n,b,i,s+m)}}}catch(f){u={error:f}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Re=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=W(Ne(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=W(Ke(i),2),u=s[0],l=s[1];try{for(var d=D(u.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==K&&v.startsWith(l)){var m=new Map;return m.set(v.slice(l.length),u.get(v)),new o(m,e)}}}catch(g){t={error:g}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Rr(this._tree,e)},o.prototype.entries=function(){return new Oe(this,_r)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=W(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Or(this._tree,e,t)},o.prototype.get=function(e){var t=$e(this._tree,e);return t!==void 0?t.get(K):void 0},o.prototype.has=function(e){var t=$e(this._tree,e);return t!==void 0&&t.has(K)},o.prototype.keys=function(){return new Oe(this,Ft)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Me(this._tree,e);return r.set(K,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Me(this._tree,e);return r.set(K,t(r.get(K))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Me(this._tree,e),n=r.get(K);return n===void 0&&r.set(K,n=t()),n},o.prototype.values=function(){return new Oe(this,Et)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=W(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),Ne=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==K&&e.startsWith(s))return t.push([o,s]),Ne(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),Ne(void 0,"",t)},$e=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==K&&e.startsWith(i))return $e(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Me=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Re,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=je,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Ir(this,void 0,void 0,function(){var r,n,a,i,s,u,l,d,h,v,m,g,b,x,C,k,A,L,O,z,E,I,_,R,F;return Dr(this,function(c){switch(c.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||We.batchSize,a=e.batchWait||We.batchWait,i=1,c.label=1;case 1:c.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),c.label=2;case 2:if(u.done)return[3,6];l=W(u.value,2),d=l[0],h=l[1];try{for(v=(I=void 0,D(h)),m=v.next();!m.done;m=v.next()){g=W(m.value,2),b=g[0],x=g[1];try{for(C=(R=void 0,D(x)),k=C.next();!k.done;k=C.next())A=W(k.value,1),L=A[0],!this._documentIds.has(L)&&(x.size<=1?h.delete(b):x.delete(L))}catch(f){R={error:f}}finally{try{k&&!k.done&&(F=C.return)&&F.call(C)}finally{if(R)throw R.error}}}}catch(f){I={error:f}}finally{try{m&&!m.done&&(_=v.return)&&_.call(v)}finally{if(I)throw I.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(f){return setTimeout(f,a)})];case 3:c.sent(),c.label=4;case 4:i+=1,c.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return O=c.sent(),z={error:O},[3,9];case 8:try{u&&!u.done&&(E=s.return)&&E.call(s)}finally{if(z)throw z.error}return[7];case 9:this._dirtCount-=r,c.label=10;case 10:return[4,null];case 11:return c.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ze.minDirtCount,r=r||ze.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=W(u.value,2),d=l[0],h=l[1],v=h.score,m=h.terms,g=h.match,b=m.length,x={id:this._documentIds.get(d),score:v*b,terms:Object.keys(g),match:g};Object.assign(x,this._storedFields.get(d)),(t.filter==null||t.filter(x))&&i.push(x)}}catch(C){r={error:C}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return i.sort(ht),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=$($({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var d=l.value,h=d.score,v=d.terms,m=v.join(" "),g=s.get(m);g!=null?(g.score+=h,g.count+=1):s.set(m,{score:h,terms:v,count:1})}}catch(O){r={error:O}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var b=[];try{for(var x=D(s),C=x.next();!C.done;C=x.next()){var k=W(C.value,2),g=k[0],A=k[1],h=A.score,v=A.terms,L=A.count;b.push({suggestion:g,terms:v,score:h/L})}}catch(O){a={error:O}}finally{try{C&&!C.done&&(i=x.return)&&i.call(x)}finally{if(a)throw a.error}}return b.sort(ht),b},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Pe.hasOwnProperty(e))return Le(Pe,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,m=e.fieldIds,g=e.fieldLength,b=e.averageFieldLength,x=e.storedFields,C=e.dirtCount,k=e.serializationVersion;if(k!==1&&k!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var A=new o(t);A._documentCount=d,A._nextId=h,A._documentIds=Ee(v),A._idToShortId=new Map,A._fieldIds=m,A._fieldLength=Ee(g),A._avgFieldLength=b,A._storedFields=Ee(x),A._dirtCount=C||0,A._index=new Re;try{for(var L=D(A._documentIds),O=L.next();!O.done;O=L.next()){var z=W(O.value,2),E=z[0],I=z[1];A._idToShortId.set(I,E)}}catch(y){r={error:y}}finally{try{O&&!O.done&&(n=L.return)&&n.call(L)}finally{if(r)throw r.error}}try{for(var _=D(l),R=_.next();!R.done;R=_.next()){var F=W(R.value,2),c=F[0],f=F[1],p=new Map;try{for(var T=(s=void 0,D(Object.keys(f))),N=T.next();!N.done;N=T.next()){var M=N.value,P=f[M];k===1&&(P=P.ds),p.set(parseInt(M,10),Ee(P))}}catch(y){s={error:y}}finally{try{N&&!N.done&&(u=T.return)&&u.call(T)}finally{if(s)throw s.error}}A._index.set(c,p)}}catch(y){a={error:y}}finally{try{R&&!R.done&&(i=_.return)&&i.call(_)}finally{if(a)throw a.error}}return A},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var n=$($($({},t),e),{queries:void 0}),a=e.queries.map(function(x){return r.executeQuery(x,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,d=$($({tokenize:s,processTerm:u},l),t),h=d.tokenize,v=d.processTerm,m=h(e).flatMap(function(x){return v(x)}).filter(function(x){return!!x}),g=m.map(Vr(d)),b=g.map(function(x){return r.executeQuerySpec(x,d)});return this.combineResults(b,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=$($({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(M,P){var y;return $($({},M),(y={},y[P]=Le(s.boost,P)||1,y))},{}),l=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,m=$($({},ft.weights),d),g=m.fuzzy,b=m.prefix,x=this._index.get(e.term),C=this.termResults(e.term,e.term,1,x,u,l,v),k,A;if(e.prefix&&(k=this._index.atPrefix(e.term)),e.fuzzy){var L=e.fuzzy===!0?.2:e.fuzzy,O=L<1?Math.min(h,Math.round(e.term.length*L)):L;O&&(A=this._index.fuzzyGet(e.term,O))}if(k)try{for(var z=D(k),E=z.next();!E.done;E=z.next()){var I=W(E.value,2),_=I[0],R=I[1],F=_.length-e.term.length;if(F){A==null||A.delete(_);var c=b*_.length/(_.length+.3*F);this.termResults(e.term,_,c,R,u,l,v,C)}}}catch(M){r={error:M}}finally{try{E&&!E.done&&(n=z.return)&&n.call(z)}finally{if(r)throw r.error}}if(A)try{for(var f=D(A.keys()),p=f.next();!p.done;p=f.next()){var _=p.value,T=W(A.get(_),2),N=T[0],F=T[1];if(F){var c=g*_.length/(_.length+F);this.termResults(e.term,_,c,N,u,l,v,C)}}}catch(M){a={error:M}}finally{try{p&&!p.done&&(i=f.return)&&i.call(f)}finally{if(a)throw a.error}}return C},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Je),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Pr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=W(s.value,2),l=u[0],d=u[1],h={};try{for(var v=(r=void 0,D(d)),m=v.next();!m.done;m=v.next()){var g=W(m.value,2),b=g[0],x=g[1];h[b]=Object.fromEntries(x)}}catch(C){r={error:C}}finally{try{m&&!m.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(C){e={error:C}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,d,h,v,m;if(u===void 0&&(u=new Map),n==null)return u;try{for(var g=D(Object.keys(a)),b=g.next();!b.done;b=g.next()){var x=b.value,C=a[x],k=this._fieldIds[x],A=n.get(k);if(A!=null){var L=A.size,O=this._avgFieldLength[k];try{for(var z=(h=void 0,D(A.keys())),E=z.next();!E.done;E=z.next()){var I=E.value;if(!this._documentIds.has(I)){this.removeTerm(k,I,t),L-=1;continue}var _=i?i(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(_){var R=A.get(I),F=this._fieldLength.get(I)[k],c=Br(R,L,this._documentCount,F,O,s),f=r*C*_*c,p=u.get(I);if(p){p.score+=f,Wr(p.terms,e);var T=Le(p.match,t);T?T.push(x):p.match[t]=[x]}else u.set(I,{score:f,terms:[e],match:(m={},m[t]=[x],m)})}}}catch(N){h={error:N}}finally{try{E&&!E.done&&(v=z.return)&&v.call(z)}finally{if(h)throw h.error}}}}}catch(N){l={error:N}}finally{try{b&&!b.done&&(d=g.return)&&d.call(g)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,vt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,vt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Ut("data-v-9cd6a060"),o=o(),Ht(),o),Kr=["aria-owns"],Jr={class:"shell"},Ur=["title"],Hr=Y(()=>S("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("circle",{cx:"11",cy:"11",r:"8"}),S("path",{d:"m21 21l-4.35-4.35"})])],-1)),Gr=[Hr],qr={class:"search-actions before"},Qr=["title"],Yr=Y(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),Zr=[Yr],Xr=["placeholder"],ea={class:"search-actions"},ta=["title"],ra=Y(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),aa=[ra],na=["disabled","title"],ia=Y(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),oa=[ia],sa=["id","role","aria-labelledby"],ua=["aria-selected"],la=["href","aria-label","onMouseenter","onFocusin"],ca={class:"titles"},fa=Y(()=>S("span",{class:"title-icon"},"#",-1)),da=["innerHTML"],ha=Y(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),va={class:"title main"},pa=["innerHTML"],ya={key:0,class:"excerpt-wrapper"},ma={key:0,class:"excerpt",inert:""},ga=["innerHTML"],ba=Y(()=>S("div",{class:"excerpt-gradient-bottom"},null,-1)),wa=Y(()=>S("div",{class:"excerpt-gradient-top"},null,-1)),xa={key:0,class:"no-results"},Fa={class:"search-keyboard-shortcuts"},Ea=["aria-label"],Sa=Y(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),Aa=[Sa],Ca=["aria-label"],ka=Y(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),Na=[ka],Ta=["aria-label"],Ia=Y(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("path",{d:"m9 10l-5 5l5 5"}),S("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Da=[Ia],_a=["aria-label"],Oa=It({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var N,M,P;const t=e,r=be(),n=be(),a=be(er),i=Zt(),{activate:s}=kr(r,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:u,theme:l}=i,d=et(async()=>{var y,w,B,q,J,U,V,H,G;return nt(Lr.loadJSON((B=await((w=(y=a.value)[u.value])==null?void 0:w.call(y)))==null?void 0:B.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((q=l.value.search)==null?void 0:q.provider)==="local"&&((U=(J=l.value.search.options)==null?void 0:J.miniSearch)==null?void 0:U.searchOptions)},...((V=l.value.search)==null?void 0:V.provider)==="local"&&((G=(H=l.value.search.options)==null?void 0:H.miniSearch)==null?void 0:G.options)}))}),v=Ie(()=>{var y,w;return((y=l.value.search)==null?void 0:y.provider)==="local"&&((w=l.value.search.options)==null?void 0:w.disableQueryPersistence)===!0}).value?ie(""):Dt("vitepress:local-search-filter",""),m=_t("vitepress:local-search-detailed-list",((N=l.value.search)==null?void 0:N.provider)==="local"&&((M=l.value.search.options)==null?void 0:M.detailedView)===!0),g=Ie(()=>{var y,w,B;return((y=l.value.search)==null?void 0:y.provider)==="local"&&(((w=l.value.search.options)==null?void 0:w.disableDetailedView)===!0||((B=l.value.search.options)==null?void 0:B.detailedView)===!1)});Ot(()=>{g.value&&(m.value=!1)});const b=be([]),x=ie(!1);Be(v,()=>{x.value=!1});const C=et(async()=>{if(n.value)return nt(new Tr(n.value))},null);Rt(()=>[d.value,v.value,m.value],async([y,w,B],q,J)=>{var Ue,He,Ge,qe;let U=!1;if(J(()=>{U=!0}),!y)return;b.value=y.search(w).slice(0,16),x.value=!0;const V=B?await Promise.all(b.value.map(Q=>k(Q.id))):[];if(U)return;const H=new Map;for(const{id:Q,mod:re}of V){const ae=Q.slice(0,Q.indexOf("#"));let ee=H.get(ae);if(ee)continue;ee=new Map,H.set(ae,ee);const Z=re.default??re;if(Z!=null&&Z.render||Z!=null&&Z.setup){const ne=Gt(Z);ne.config.warnHandler=()=>{},ne.provide(qt,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Qe=document.createElement("div");ne.mount(Qe),Qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var Xe;const ge=(Xe=fe.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Ye)return;let Ze="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)Ze+=fe.outerHTML;ee.set(Ye,Ze)}),ne.unmount()}if(U)return}const G=new Set;if(b.value=b.value.map(Q=>{const[re,ae]=Q.id.split("#"),ee=H.get(re),Z=(ee==null?void 0:ee.get(ae))??"";for(const ne in Q.match)G.add(ne);return{...Q,text:Z}}),await de(),U)return;await new Promise(Q=>{var re;(re=C.value)==null||re.unmark({done:()=>{var ae;(ae=C.value)==null||ae.markRegExp(T(G),{done:Q})}})});const Te=((Ue=r.value)==null?void 0:Ue.querySelectorAll(".result .excerpt"))??[];for(const Q of Te)(He=Q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function k(y){const w=Qt(y.slice(0,y.indexOf("#")));try{if(!w)throw new Error(`Cannot find file for id: ${y}`);return{id:y,mod:await pt(()=>import(w),[])}}catch(B){return console.error(B),{id:y,mod:{}}}}const A=ie(),L=Ie(()=>{var y;return((y=v.value)==null?void 0:y.length)<=0});function O(y=!0){var w,B;(w=A.value)==null||w.focus(),y&&((B=A.value)==null||B.select())}De(()=>{O()});function z(y){y.pointerType==="mouse"&&O()}const E=ie(-1),I=ie(!1);Be(b,y=>{E.value=y.length?0:-1,_()});function _(){de(()=>{const y=document.querySelector(".result.selected");y&&y.scrollIntoView({block:"nearest"})})}we("ArrowUp",y=>{y.preventDefault(),E.value--,E.value<0&&(E.value=b.value.length-1),I.value=!0,_()}),we("ArrowDown",y=>{y.preventDefault(),E.value++,E.value>=b.value.length&&(E.value=0),I.value=!0,_()});const R=Mt();we("Enter",y=>{if(y.target instanceof HTMLButtonElement&&y.target.type!=="submit")return;const w=b.value[E.value];if(y.target instanceof HTMLInputElement&&!w){y.preventDefault();return}w&&(R.go(w.id),t("close"))}),we("Escape",()=>{t("close")});const F={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},c=Xt((P=l.value.search)==null?void 0:P.options,F);De(()=>{window.history.pushState(null,"",null)}),Lt("popstate",y=>{y.preventDefault(),t("close")});const f=Pt(zt?document.body:null);De(()=>{de(()=>{f.value=!0,de().then(()=>s())})}),Bt(()=>{f.value=!1});function p(){v.value="",de().then(()=>O(!1))}function T(y){return new RegExp([...y].sort((w,B)=>B.length-w.length).map(w=>`(${w.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(y,w)=>{var B,q,J,U;return X(),Vt(Jt,{to:"body"},[S("div",{ref_key:"el",ref:r,role:"button","aria-owns":(B=b.value)!=null&&B.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:w[0]||(w[0]=V=>y.$emit("close"))}),S("div",Jr,[S("form",{class:"search-bar",onPointerup:w[4]||(w[4]=V=>z(V)),onSubmit:w[5]||(w[5]=$t(()=>{},["prevent"]))},[S("label",{title:y.placeholder,id:"localsearch-label",for:"localsearch-input"},Gr,8,Ur),S("div",qr,[S("button",{class:"back-button",title:j(c)("modal.backButtonTitle"),onClick:w[1]||(w[1]=V=>y.$emit("close"))},Zr,8,Qr)]),Wt(S("input",{ref_key:"searchInput",ref:A,"onUpdate:modelValue":w[2]||(w[2]=V=>Kt(v)?v.value=V:null),placeholder:y.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Xr),[[jt,j(v)]]),S("div",ea,[g.value?xe("",!0):(X(),te("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":j(m)}]),type:"button",title:j(c)("modal.displayDetails"),onClick:w[3]||(w[3]=V=>E.value>-1&&(m.value=!j(m)))},aa,10,ta)),S("button",{class:"clear-button",type:"reset",disabled:L.value,title:j(c)("modal.resetButtonTitle"),onClick:p},oa,8,na)])],32),S("ul",{ref_key:"resultsEl",ref:n,id:(q=b.value)!=null&&q.length?"localsearch-list":void 0,role:(J=b.value)!=null&&J.length?"listbox":void 0,"aria-labelledby":(U=b.value)!=null&&U.length?"localsearch-label":void 0,class:"results",onMousemove:w[7]||(w[7]=V=>I.value=!1)},[(X(!0),te(at,null,rt(b.value,(V,H)=>(X(),te("li",{key:V.id,role:"option","aria-selected":E.value===H?"true":"false"},[S("a",{href:V.id,class:tt(["result",{selected:E.value===H}]),"aria-label":[...V.titles,V.title].join(" > "),onMouseenter:G=>!I.value&&(E.value=H),onFocusin:G=>E.value=H,onClick:w[6]||(w[6]=G=>y.$emit("close"))},[S("div",null,[S("div",ca,[fa,(X(!0),te(at,null,rt(V.titles,(G,Te)=>(X(),te("span",{key:Te,class:"title"},[S("span",{class:"text",innerHTML:G},null,8,da),ha]))),128)),S("span",va,[S("span",{class:"text",innerHTML:V.title},null,8,pa)])]),j(m)?(X(),te("div",ya,[V.text?(X(),te("div",ma,[S("div",{class:"vp-doc",innerHTML:V.text},null,8,ga)])):xe("",!0),ba,wa])):xe("",!0)])],42,la)],8,ua))),128)),j(v)&&!b.value.length&&x.value?(X(),te("li",xa,[he(ve(j(c)("modal.noResultsText"))+' "',1),S("strong",null,ve(j(v)),1),he('" ')])):xe("",!0)],40,sa),S("div",Fa,[S("span",null,[S("kbd",{"aria-label":j(c)("modal.footer.navigateUpKeyAriaLabel")},Aa,8,Ea),S("kbd",{"aria-label":j(c)("modal.footer.navigateDownKeyAriaLabel")},Na,8,Ca),he(" "+ve(j(c)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":j(c)("modal.footer.selectKeyAriaLabel")},Da,8,Ta),he(" "+ve(j(c)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":j(c)("modal.footer.closeKeyAriaLabel")},"esc",8,_a),he(" "+ve(j(c)("modal.footer.closeText")),1)])])])],8,Kr)])}}});const za=Yt(Oa,[["__scopeId","data-v-9cd6a060"]]);export{za as default}; diff --git a/assets/chunks/framework.1f7cb35e.js b/assets/chunks/framework.1f7cb35e.js deleted file mode 100644 index 0901b62..0000000 --- a/assets/chunks/framework.1f7cb35e.js +++ /dev/null @@ -1,2 +0,0 @@ -function dr(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const te={},pt=[],Pe=()=>{},ci=()=>!1,ai=/^on[^a-z]/,qt=e=>ai.test(e),hr=e=>e.startsWith("onUpdate:"),ie=Object.assign,pr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ui=Object.prototype.hasOwnProperty,Y=(e,t)=>ui.call(e,t),U=Array.isArray,gt=e=>En(e)==="[object Map]",Us=e=>En(e)==="[object Set]",K=e=>typeof e=="function",re=e=>typeof e=="string",gr=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",ks=e=>ee(e)&&K(e.then)&&K(e.catch),Ks=Object.prototype.toString,En=e=>Ks.call(e),fi=e=>En(e).slice(8,-1),Ws=e=>En(e)==="[object Object]",mr=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ft=dr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),xn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},di=/-(\w)/g,Ne=xn(e=>e.replace(di,(t,n)=>n?n.toUpperCase():"")),hi=/\B([A-Z])/g,at=xn(e=>e.replace(hi,"-$1").toLowerCase()),Tn=xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),un=xn(e=>e?`on${Tn(e)}`:""),jt=(e,t)=>!Object.is(e,t),fn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Xn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},pi=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let Vr;const Qn=()=>Vr||(Vr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function _r(e){if(U(e)){const t={};for(let n=0;n{if(n){const r=n.split(mi);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function yr(e){let t="";if(re(e))t=e;else if(U(e))for(let n=0;nre(e)?e:e==null?"":U(e)||ee(e)&&(e.toString===Ks||!K(e.toString))?JSON.stringify(e,qs,2):String(e),qs=(e,t)=>t&&t.__v_isRef?qs(e,t.value):gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:Us(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!U(t)&&!Ws(t)?String(t):t;let be;class wi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Ys=e=>(e.w&Je)>0,Js=e=>(e.n&Je)>0,xi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":U(e)?mr(n)&&l.push(i.get("length")):(l.push(i.get(it)),gt(e)&&l.push(i.get(Gn)));break;case"delete":U(e)||(l.push(i.get(it)),gt(e)&&l.push(i.get(Gn)));break;case"set":gt(e)&&l.push(i.get(it));break}if(l.length===1)l[0]&&er(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);er(br(c))}}function er(e,t){const n=U(e)?e:[...e];for(const r of n)r.computed&&zr(r);for(const r of n)r.computed||zr(r)}function zr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Ai(e,t){var n;return(n=gn.get(e))==null?void 0:n.get(t)}const Si=dr("__proto__,__v_isRef,__isVue"),Zs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(gr)),Oi=wr(),Pi=wr(!1,!0),Ri=wr(!0),Yr=Mi();function Mi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){xt();const r=J(this)[t].apply(this,n);return Tt(),r}}),e}function Fi(e){const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}function wr(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_isShallow")return t;if(s==="__v_raw"&&o===(e?t?Yi:ro:t?no:to).get(r))return r;const i=U(r);if(!e){if(i&&Y(Yr,s))return Reflect.get(Yr,s,o);if(s==="hasOwnProperty")return Fi}const l=Reflect.get(r,s,o);return(gr(s)?Zs.has(s):Si(s))||(e||me(r,"get",s),t)?l:ce(l)?i&&mr(s)?l:l.value:ee(l)?e?On(l):Sn(l):l}}const Ii=Gs(),Li=Gs(!0);function Gs(e=!1){return function(n,r,s,o){let i=n[r];if(vt(i)&&ce(i)&&!ce(s))return!1;if(!e&&(!mn(s)&&!vt(s)&&(i=J(i),s=J(s)),!U(n)&&ce(i)&&!ce(s)))return i.value=s,!0;const l=U(n)&&mr(r)?Number(r)e,An=e=>Reflect.getPrototypeOf(e);function Qt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(t!==o&&me(s,"get",t),me(s,"get",o));const{has:i}=An(s),l=r?Cr:n?Tr:Bt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Zt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(e!==s&&me(r,"has",e),me(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Gt(e,t=!1){return e=e.__v_raw,!t&&me(J(e),"iterate",it),Reflect.get(e,"size",e)}function Jr(e){e=J(e);const t=J(this);return An(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function Xr(e,t){t=J(t);const n=J(this),{has:r,get:s}=An(n);let o=r.call(n,e);o||(e=J(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?jt(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function Qr(e){const t=J(this),{has:n,get:r}=An(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function Zr(){const e=J(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function en(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?Cr:e?Tr:Bt;return!e&&me(l,"iterate",it),i.forEach((a,f)=>r.call(s,c(a),c(f),o))}}function tn(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=gt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),f=n?Cr:t?Tr:Bt;return!t&&me(o,"iterate",c?Gn:it),{next(){const{value:h,done:g}=a.next();return g?{value:h,done:g}:{value:l?[f(h[0]),f(h[1])]:f(h),done:g}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:this}}function Bi(){const e={get(o){return Qt(this,o)},get size(){return Gt(this)},has:Zt,add:Jr,set:Xr,delete:Qr,clear:Zr,forEach:en(!1,!1)},t={get(o){return Qt(this,o,!1,!0)},get size(){return Gt(this)},has:Zt,add:Jr,set:Xr,delete:Qr,clear:Zr,forEach:en(!1,!0)},n={get(o){return Qt(this,o,!0)},get size(){return Gt(this,!0)},has(o){return Zt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!1)},r={get(o){return Qt(this,o,!0,!0)},get size(){return Gt(this,!0)},has(o){return Zt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=tn(o,!1,!1),n[o]=tn(o,!0,!1),t[o]=tn(o,!1,!0),r[o]=tn(o,!0,!0)}),[e,n,t,r]}const[Ui,ki,Ki,Wi]=Bi();function Er(e,t){const n=t?e?Wi:Ki:e?ki:Ui;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Y(n,s)&&s in r?n:r,s,o)}const Vi={get:Er(!1,!1)},qi={get:Er(!1,!0)},zi={get:Er(!0,!1)},to=new WeakMap,no=new WeakMap,ro=new WeakMap,Yi=new WeakMap;function Ji(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Xi(e){return e.__v_skip||!Object.isExtensible(e)?0:Ji(fi(e))}function Sn(e){return vt(e)?e:xr(e,!1,eo,Vi,to)}function Qi(e){return xr(e,!1,ji,qi,no)}function On(e){return xr(e,!0,Di,zi,ro)}function xr(e,t,n,r,s){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=Xi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function mt(e){return vt(e)?mt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function mn(e){return!!(e&&e.__v_isShallow)}function so(e){return mt(e)||vt(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function It(e){return pn(e,"__v_skip",!0),e}const Bt=e=>ee(e)?Sn(e):e,Tr=e=>ee(e)?On(e):e;function Ar(e){qe&&Se&&(e=J(e),Qs(e.dep||(e.dep=br())))}function Sr(e,t){e=J(e);const n=e.dep;n&&er(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ae(e){return oo(e,!1)}function Or(e){return oo(e,!0)}function oo(e,t){return ce(e)?e:new Zi(e,t)}class Zi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Bt(t)}get value(){return Ar(this),this._value}set value(t){const n=this.__v_isShallow||mn(t)||vt(t);t=n?t:J(t),jt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Bt(t),Sr(this))}}function io(e){return ce(e)?e.value:e}const Gi={get:(e,t,n)=>io(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ce(s)&&!ce(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function lo(e){return mt(e)?e:new Proxy(e,Gi)}class el{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Ar(this),()=>Sr(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function tl(e){return new el(e)}class nl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ai(J(this._object),this._key)}}class rl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function sl(e,t,n){return ce(e)?e:K(e)?new rl(e):ee(e)&&arguments.length>1?ol(e,t,n):ae(e)}function ol(e,t,n){const r=e[t];return ce(r)?r:new nl(e,t,n)}class il{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new vr(t,()=>{this._dirty||(this._dirty=!0,Sr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return Ar(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function ll(e,t,n=!1){let r,s;const o=K(e);return o?(r=e,s=Pe):(r=e.get,s=e.set),new il(r,s,o||!s,n)}function ze(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){zt(o,t,n)}return s}function xe(e,t,n,r){if(K(e)){const o=ze(e,t,n,r);return o&&ks(o)&&o.catch(i=>{zt(i,t,n)}),o}const s=[];for(let o=0;o>>1;kt(de[r])Ie&&de.splice(t,1)}function fl(e){U(e)?_t.push(...e):(!He||!He.includes(e,e.allowRecurse?nt+1:nt))&&_t.push(e),ao()}function Gr(e,t=Ut?Ie+1:0){for(;tkt(n)-kt(r)),nt=0;nte.id==null?1/0:e.id,dl=(e,t)=>{const n=kt(e)-kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function uo(e){tr=!1,Ut=!0,de.sort(dl);const t=Pe;try{for(Ie=0;Iere(w)?w.trim():w)),h&&(s=n.map(Xn))}let l,c=r[l=un(t)]||r[l=un(Ne(t))];!c&&o&&(c=r[l=un(at(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function fo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!K(e)){const c=a=>{const f=fo(a,t,!0);f&&(l=!0,ie(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&r.set(e,null),null):(U(o)?o.forEach(c=>i[c]=null):ie(i,o),ee(e)&&r.set(e,i),i)}function Mn(e,t){return!e||!qt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,at(t))||Y(e,t))}let fe=null,Fn=null;function yn(e){const t=fe;return fe=e,Fn=e&&e.type.__scopeId||null,t}function $a(e){Fn=e}function Ha(){Fn=null}function pl(e,t=fe,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&ds(-1);const o=yn(t);let i;try{i=e(...s)}finally{yn(o),r._d&&ds(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Un(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:g,setupState:w,ctx:E,inheritAttrs:S}=e;let $,m;const y=yn(e);try{if(n.shapeFlag&4){const A=s||r;$=Ae(f.call(A,A,h,o,w,g,E)),m=c}else{const A=t;$=Ae(A.length>1?A(o,{attrs:c,slots:l,emit:a}):A(o,null)),m=t.props?c:gl(c)}}catch(A){Ht.length=0,zt(A,e,1),$=se(ve)}let N=$;if(m&&S!==!1){const A=Object.keys(m),{shapeFlag:B}=N;A.length&&B&7&&(i&&A.some(hr)&&(m=ml(m,i)),N=Xe(N,m))}return n.dirs&&(N=Xe(N),N.dirs=N.dirs?N.dirs.concat(n.dirs):n.dirs),n.transition&&(N.transition=n.transition),$=N,yn(y),$}const gl=e=>{let t;for(const n in e)(n==="class"||n==="style"||qt(n))&&((t||(t={}))[n]=e[n]);return t},ml=(e,t)=>{const n={};for(const r in e)(!hr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function _l(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?es(r,i,a):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function ho(e,t){t&&t.pendingBranch?U(e)?t.effects.push(...e):t.effects.push(e):fl(e)}function Rr(e,t){return In(e,null,t)}function Da(e,t){return In(e,null,{flush:"post"})}const nn={};function Ye(e,t,n){return In(e,t,n)}function In(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=te){var l;const c=zs()===((l=le)==null?void 0:l.scope)?le:null;let a,f=!1,h=!1;if(ce(e)?(a=()=>e.value,f=mn(e)):mt(e)?(a=()=>e,r=!0):U(e)?(h=!0,f=e.some(A=>mt(A)||mn(A)),a=()=>e.map(A=>{if(ce(A))return A.value;if(mt(A))return ot(A);if(K(A))return ze(A,c,2)})):K(e)?t?a=()=>ze(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return g&&g(),xe(e,c,3,[w])}:a=Pe,t&&r){const A=a;a=()=>ot(A())}let g,w=A=>{g=y.onStop=()=>{ze(A,c,4)}},E;if(Et)if(w=Pe,t?n&&xe(t,c,3,[a(),h?[]:void 0,w]):a(),s==="sync"){const A=gc();E=A.__watcherHandles||(A.__watcherHandles=[])}else return Pe;let S=h?new Array(e.length).fill(nn):nn;const $=()=>{if(y.active)if(t){const A=y.run();(r||f||(h?A.some((B,W)=>jt(B,S[W])):jt(A,S)))&&(g&&g(),xe(t,c,3,[A,S===nn?void 0:h&&S[0]===nn?[]:S,w]),S=A)}else y.run()};$.allowRecurse=!!t;let m;s==="sync"?m=$:s==="post"?m=()=>pe($,c&&c.suspense):($.pre=!0,c&&($.id=c.uid),m=()=>Rn($));const y=new vr(a,m);t?n?$():S=y.run():s==="post"?pe(y.run.bind(y),c&&c.suspense):y.run();const N=()=>{y.stop(),c&&c.scope&&pr(c.scope.effects,y)};return E&&E.push(N),N}function vl(e,t,n){const r=this.proxy,s=re(e)?e.includes(".")?po(r,e):()=>r[e]:e.bind(r,r);let o;K(t)?o=t:(o=t.handler,n=t);const i=le;Ct(this);const l=In(s,o.bind(r),n);return i?Ct(i):lt(),l}function po(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{ot(n,t)});else if(Ws(e))for(const n in e)ot(e[n],t);return e}function ja(e,t){const n=fe;if(n===null)return e;const r=Dn(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),bo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],go={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},Cl={name:"BaseTransition",props:go,setup(e,{slots:t}){const n=Hn(),r=wl();let s;return()=>{const o=t.default&&_o(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const S of o)if(S.type!==ve){i=S;break}}const l=J(e),{mode:c}=l;if(r.isLeaving)return kn(i);const a=ts(i);if(!a)return kn(i);const f=nr(a,l,r,n);rr(a,f);const h=n.subTree,g=h&&ts(h);let w=!1;const{getTransitionKey:E}=a.type;if(E){const S=E();s===void 0?s=S:S!==s&&(s=S,w=!0)}if(g&&g.type!==ve&&(!rt(a,g)||w)){const S=nr(g,l,r,n);if(rr(g,S),c==="out-in")return r.isLeaving=!0,S.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},kn(i);c==="in-out"&&a.type!==ve&&(S.delayLeave=($,m,y)=>{const N=mo(r,g);N[String(g.key)]=g,$._leaveCb=()=>{m(),$._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=y})}return i}}},El=Cl;function mo(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function nr(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:g,onAfterLeave:w,onLeaveCancelled:E,onBeforeAppear:S,onAppear:$,onAfterAppear:m,onAppearCancelled:y}=t,N=String(e.key),A=mo(n,e),B=(_,R)=>{_&&xe(_,r,9,R)},W=(_,R)=>{const I=R[1];B(_,R),U(_)?_.every(V=>V.length<=1)&&I():_.length<=1&&I()},j={mode:o,persisted:i,beforeEnter(_){let R=l;if(!n.isMounted)if(s)R=S||l;else return;_._leaveCb&&_._leaveCb(!0);const I=A[N];I&&rt(e,I)&&I.el._leaveCb&&I.el._leaveCb(),B(R,[_])},enter(_){let R=c,I=a,V=f;if(!n.isMounted)if(s)R=$||c,I=m||a,V=y||f;else return;let M=!1;const q=_._enterCb=L=>{M||(M=!0,L?B(V,[_]):B(I,[_]),j.delayedLeave&&j.delayedLeave(),_._enterCb=void 0)};R?W(R,[_,q]):q()},leave(_,R){const I=String(e.key);if(_._enterCb&&_._enterCb(!0),n.isUnmounting)return R();B(h,[_]);let V=!1;const M=_._leaveCb=q=>{V||(V=!0,R(),q?B(E,[_]):B(w,[_]),_._leaveCb=void 0,A[I]===e&&delete A[I])};A[I]=e,g?W(g,[_,M]):M()},clone(_){return nr(_,t,n,r)}};return j}function kn(e){if(Yt(e))return e=Xe(e),e.children=null,e}function ts(e){return Yt(e)?e.children?e.children[0]:void 0:e}function rr(e,t){e.shapeFlag&6&&e.component?rr(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 _o(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oie({name:e.name},t,{setup:e}))():e}const yt=e=>!!e.type.__asyncLoader;function Ba(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,g()),g=()=>{let w;return c||(w=c=t().catch(E=>{if(E=E instanceof Error?E:new Error(String(E)),l)return new Promise((S,$)=>{l(E,()=>S(h()),()=>$(E),f+1)});throw E}).then(E=>w!==c&&c?c:(E&&(E.__esModule||E[Symbol.toStringTag]==="Module")&&(E=E.default),a=E,E)))};return Mr({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return a},setup(){const w=le;if(a)return()=>Kn(a,w);const E=y=>{c=null,zt(y,w,13,!r)};if(i&&w.suspense||Et)return g().then(y=>()=>Kn(y,w)).catch(y=>(E(y),()=>r?se(r,{error:y}):null));const S=ae(!1),$=ae(),m=ae(!!s);return s&&setTimeout(()=>{m.value=!1},s),o!=null&&setTimeout(()=>{if(!S.value&&!$.value){const y=new Error(`Async component timed out after ${o}ms.`);E(y),$.value=y}},o),g().then(()=>{S.value=!0,w.parent&&Yt(w.parent.vnode)&&Rn(w.parent.update)}).catch(y=>{E(y),$.value=y}),()=>{if(S.value&&a)return Kn(a,w);if($.value&&r)return se(r,{error:$.value});if(n&&!m.value)return se(n)}}})}function Kn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=se(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const Yt=e=>e.type.__isKeepAlive;function xl(e,t){yo(e,"a",t)}function Tl(e,t){yo(e,"da",t)}function yo(e,t,n=le){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Ln(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Yt(s.parent.vnode)&&Al(r,t,n,s),s=s.parent}}function Al(e,t,n,r){const s=Ln(t,e,r,!0);Nn(()=>{pr(r[t],s)},n)}function Ln(e,t,n=le,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;xt(),Ct(n);const l=xe(t,n,e,i);return lt(),Tt(),l});return r?s.unshift(o):s.push(o),o}}const Be=e=>(t,n=le)=>(!Et||e==="sp")&&Ln(e,(...r)=>t(...r),n),Sl=Be("bm"),At=Be("m"),Ol=Be("bu"),Pl=Be("u"),bo=Be("bum"),Nn=Be("um"),Rl=Be("sp"),Ml=Be("rtg"),Fl=Be("rtc");function Il(e,t=le){Ln("ec",e,t)}const Fr="components";function Ua(e,t){return wo(Fr,e,!0,t)||e}const vo=Symbol.for("v-ndc");function ka(e){return re(e)?wo(Fr,e,!1)||e:e||vo}function wo(e,t,n=!0,r=!1){const s=fe||le;if(s){const o=s.type;if(e===Fr){const l=dc(o,!1);if(l&&(l===t||l===Ne(t)||l===Tn(Ne(t))))return o}const i=ns(s[e]||o[e],t)||ns(s.appContext[e],t);return!i&&r?o:i}}function ns(e,t){return e&&(e[t]||e[Ne(t)]||e[Tn(Ne(t))])}function Ka(e,t,n,r){let s;const o=n&&n[r];if(U(e)||re(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lCn(t)?!(t.type===ve||t.type===ge&&!Co(t.children)):!0)?e:null}function Va(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:un(r)]=e[r];return n}const sr=e=>e?Do(e)?Dn(e)||e.proxy:sr(e.parent):null,Lt=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>sr(e.parent),$root:e=>sr(e.root),$emit:e=>e.emit,$options:e=>Ir(e),$forceUpdate:e=>e.f||(e.f=()=>Rn(e.update)),$nextTick:e=>e.n||(e.n=Pn.bind(e.proxy)),$watch:e=>vl.bind(e)}),Wn=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),Ll={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const w=i[t];if(w!==void 0)switch(w){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Wn(r,t))return i[t]=1,r[t];if(s!==te&&Y(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&Y(a,t))return i[t]=3,o[t];if(n!==te&&Y(n,t))return i[t]=4,n[t];or&&(i[t]=0)}}const f=Lt[t];let h,g;if(f)return t==="$attrs"&&me(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&Y(n,t))return i[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Wn(s,t)?(s[t]=n,!0):r!==te&&Y(r,t)?(r[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&Y(e,i)||Wn(t,i)||(l=o[0])&&Y(l,i)||Y(r,i)||Y(Lt,i)||Y(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function qa(){return Nl().slots}function Nl(){const e=Hn();return e.setupContext||(e.setupContext=Bo(e))}function rs(e){return U(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let or=!0;function $l(e){const t=Ir(e),n=e.proxy,r=e.ctx;or=!1,t.beforeCreate&&ss(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:g,beforeUpdate:w,updated:E,activated:S,deactivated:$,beforeDestroy:m,beforeUnmount:y,destroyed:N,unmounted:A,render:B,renderTracked:W,renderTriggered:j,errorCaptured:_,serverPrefetch:R,expose:I,inheritAttrs:V,components:M,directives:q,filters:L}=t;if(a&&Hl(a,r,null),i)for(const ne in i){const Z=i[ne];K(Z)&&(r[ne]=Z.bind(n))}if(s){const ne=s.call(n,n);ee(ne)&&(e.data=Sn(ne))}if(or=!0,o)for(const ne in o){const Z=o[ne],Qe=K(Z)?Z.bind(n,n):K(Z.get)?Z.get.bind(n,n):Pe,Jt=!K(Z)&&K(Z.set)?Z.set.bind(n):Pe,Ze=ue({get:Qe,set:Jt});Object.defineProperty(r,ne,{enumerable:!0,configurable:!0,get:()=>Ze.value,set:Re=>Ze.value=Re})}if(l)for(const ne in l)Eo(l[ne],r,n,ne);if(c){const ne=K(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Z=>{Kl(Z,ne[Z])})}f&&ss(f,e,"c");function X(ne,Z){U(Z)?Z.forEach(Qe=>ne(Qe.bind(n))):Z&&ne(Z.bind(n))}if(X(Sl,h),X(At,g),X(Ol,w),X(Pl,E),X(xl,S),X(Tl,$),X(Il,_),X(Fl,W),X(Ml,j),X(bo,y),X(Nn,A),X(Rl,R),U(I))if(I.length){const ne=e.exposed||(e.exposed={});I.forEach(Z=>{Object.defineProperty(ne,Z,{get:()=>n[Z],set:Qe=>n[Z]=Qe})})}else e.exposed||(e.exposed={});B&&e.render===Pe&&(e.render=B),V!=null&&(e.inheritAttrs=V),M&&(e.components=M),q&&(e.directives=q)}function Hl(e,t,n=Pe){U(e)&&(e=ir(e));for(const r in e){const s=e[r];let o;ee(s)?"default"in s?o=bt(s.from||r,s.default,!0):o=bt(s.from||r):o=bt(s),ce(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function ss(e,t,n){xe(U(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Eo(e,t,n,r){const s=r.includes(".")?po(n,r):()=>n[r];if(re(e)){const o=t[e];K(o)&&Ye(s,o)}else if(K(e))Ye(s,e.bind(n));else if(ee(e))if(U(e))e.forEach(o=>Eo(o,t,n,r));else{const o=K(e.handler)?e.handler.bind(n):t[e.handler];K(o)&&Ye(s,o,e)}}function Ir(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>bn(c,a,i,!0)),bn(c,t,i)),ee(t)&&o.set(t,c),c}function bn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&bn(e,o,n,!0),s&&s.forEach(i=>bn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Dl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Dl={data:os,props:is,emits:is,methods:Mt,computed:Mt,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:Mt,directives:Mt,watch:Bl,provide:os,inject:jl};function os(e,t){return t?e?function(){return ie(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function jl(e,t){return Mt(ir(e),ir(t))}function ir(e){if(U(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}function Wl(e,t,n,r=!1){const s={},o={};pn(o,$n,1),e.propsDefaults=Object.create(null),To(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:Qi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Vl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,w]=Ao(h,t,!0);ie(i,g),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return ee(e)&&r.set(e,pt),pt;if(U(o))for(let f=0;f-1,w[1]=S<0||E-1||Y(w,"default"))&&l.push(h)}}}const a=[i,l];return ee(e)&&r.set(e,a),a}function ls(e){return e[0]!=="$"}function cs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function as(e,t){return cs(e)===cs(t)}function us(e,t){return U(t)?t.findIndex(n=>as(n,e)):K(t)&&as(t,e)?0:-1}const So=e=>e[0]==="_"||e==="$stable",Lr=e=>U(e)?e.map(Ae):[Ae(e)],ql=(e,t,n)=>{if(t._n)return t;const r=pl((...s)=>Lr(t(...s)),n);return r._c=!1,r},Oo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(So(s))continue;const o=e[s];if(K(o))t[s]=ql(s,o,r);else if(o!=null){const i=Lr(o);t[s]=()=>i}}},Po=(e,t)=>{const n=Lr(t);e.slots.default=()=>n},zl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),pn(t,"_",n)):Oo(t,e.slots={})}else e.slots={},t&&Po(e,t);pn(e.slots,$n,1)},Yl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ie(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Oo(t,s)),i=t}else t&&(Po(e,t),i={default:1});if(o)for(const l in s)!So(l)&&!(l in i)&&delete s[l]};function wn(e,t,n,r,s=!1){if(U(e)){e.forEach((g,w)=>wn(g,t&&(U(t)?t[w]:t),n,r,s));return}if(yt(r)&&!s)return;const o=r.shapeFlag&4?Dn(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,f=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(re(a)?(f[a]=null,Y(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),K(c))ze(c,l,12,[i,f]);else{const g=re(c),w=ce(c);if(g||w){const E=()=>{if(e.f){const S=g?Y(h,c)?h[c]:f[c]:c.value;s?U(S)&&pr(S,o):U(S)?S.includes(o)||S.push(o):g?(f[c]=[o],Y(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else g?(f[c]=i,Y(h,c)&&(h[c]=i)):w&&(c.value=i,e.k&&(f[e.k]=i))};i?(E.id=-1,pe(E,n)):E()}}}let ke=!1;const rn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",sn=e=>e.nodeType===8;function Jl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,f=(m,y)=>{if(!y.hasChildNodes()){n(null,m,y),_n(),y._vnode=m;return}ke=!1,h(y.firstChild,m,null,null,null),_n(),y._vnode=m,ke&&console.error("Hydration completed but contains mismatches.")},h=(m,y,N,A,B,W=!1)=>{const j=sn(m)&&m.data==="[",_=()=>S(m,y,N,A,B,j),{type:R,ref:I,shapeFlag:V,patchFlag:M}=y;let q=m.nodeType;y.el=m,M===-2&&(W=!1,y.dynamicChildren=null);let L=null;switch(R){case wt:q!==3?y.children===""?(c(y.el=s(""),i(m),m),L=m):L=_():(m.data!==y.children&&(ke=!0,m.data=y.children),L=o(m));break;case ve:q!==8||j?L=_():L=o(m);break;case $t:if(j&&(m=o(m),q=m.nodeType),q===1||q===3){L=m;const _e=!y.children.length;for(let X=0;X{W=W||!!y.dynamicChildren;const{type:j,props:_,patchFlag:R,shapeFlag:I,dirs:V}=y,M=j==="input"&&V||j==="option";if(M||R!==-1){if(V&&Fe(y,null,N,"created"),_)if(M||!W||R&48)for(const L in _)(M&&L.endsWith("value")||qt(L)&&!Ft(L))&&r(m,L,null,_[L],!1,void 0,N);else _.onClick&&r(m,"onClick",null,_.onClick,!1,void 0,N);let q;if((q=_&&_.onVnodeBeforeMount)&&Ce(q,N,y),V&&Fe(y,null,N,"beforeMount"),((q=_&&_.onVnodeMounted)||V)&&ho(()=>{q&&Ce(q,N,y),V&&Fe(y,null,N,"mounted")},A),I&16&&!(_&&(_.innerHTML||_.textContent))){let L=w(m.firstChild,y,m,N,A,B,W);for(;L;){ke=!0;const _e=L;L=L.nextSibling,l(_e)}}else I&8&&m.textContent!==y.children&&(ke=!0,m.textContent=y.children)}return m.nextSibling},w=(m,y,N,A,B,W,j)=>{j=j||!!y.dynamicChildren;const _=y.children,R=_.length;for(let I=0;I{const{slotScopeIds:j}=y;j&&(B=B?B.concat(j):j);const _=i(m),R=w(o(m),y,_,N,A,B,W);return R&&sn(R)&&R.data==="]"?o(y.anchor=R):(ke=!0,c(y.anchor=a("]"),_,R),R)},S=(m,y,N,A,B,W)=>{if(ke=!0,y.el=null,W){const R=$(m);for(;;){const I=o(m);if(I&&I!==R)l(I);else break}}const j=o(m),_=i(m);return l(m),n(null,y,_,j,N,A,rn(_),B),j},$=m=>{let y=0;for(;m;)if(m=o(m),m&&sn(m)&&(m.data==="["&&y++,m.data==="]")){if(y===0)return o(m);y--}return m};return[f,h]}const pe=ho;function Xl(e){return Ro(e)}function Ql(e){return Ro(e,Jl)}function Ro(e,t){const n=Qn();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:g,setScopeId:w=Pe,insertStaticContent:E}=e,S=(u,d,p,v=null,b=null,T=null,P=!1,x=null,O=!!d.dynamicChildren)=>{if(u===d)return;u&&!rt(u,d)&&(v=Xt(u),Re(u,b,T,!0),u=null),d.patchFlag===-2&&(O=!1,d.dynamicChildren=null);const{type:C,ref:H,shapeFlag:F}=d;switch(C){case wt:$(u,d,p,v);break;case ve:m(u,d,p,v);break;case $t:u==null&&y(d,p,v,P);break;case ge:M(u,d,p,v,b,T,P,x,O);break;default:F&1?B(u,d,p,v,b,T,P,x,O):F&6?q(u,d,p,v,b,T,P,x,O):(F&64||F&128)&&C.process(u,d,p,v,b,T,P,x,O,ut)}H!=null&&b&&wn(H,u&&u.ref,T,d||u,!d)},$=(u,d,p,v)=>{if(u==null)r(d.el=l(d.children),p,v);else{const b=d.el=u.el;d.children!==u.children&&a(b,d.children)}},m=(u,d,p,v)=>{u==null?r(d.el=c(d.children||""),p,v):d.el=u.el},y=(u,d,p,v)=>{[u.el,u.anchor]=E(u.children,d,p,v,u.el,u.anchor)},N=({el:u,anchor:d},p,v)=>{let b;for(;u&&u!==d;)b=g(u),r(u,p,v),u=b;r(d,p,v)},A=({el:u,anchor:d})=>{let p;for(;u&&u!==d;)p=g(u),s(u),u=p;s(d)},B=(u,d,p,v,b,T,P,x,O)=>{P=P||d.type==="svg",u==null?W(d,p,v,b,T,P,x,O):R(u,d,b,T,P,x,O)},W=(u,d,p,v,b,T,P,x)=>{let O,C;const{type:H,props:F,shapeFlag:D,transition:k,dirs:z}=u;if(O=u.el=i(u.type,T,F&&F.is,F),D&8?f(O,u.children):D&16&&_(u.children,O,null,v,b,T&&H!=="foreignObject",P,x),z&&Fe(u,null,v,"created"),j(O,u,u.scopeId,P,v),F){for(const Q in F)Q!=="value"&&!Ft(Q)&&o(O,Q,null,F[Q],T,u.children,v,b,$e);"value"in F&&o(O,"value",null,F.value),(C=F.onVnodeBeforeMount)&&Ce(C,v,u)}z&&Fe(u,null,v,"beforeMount");const G=(!b||b&&!b.pendingBranch)&&k&&!k.persisted;G&&k.beforeEnter(O),r(O,d,p),((C=F&&F.onVnodeMounted)||G||z)&&pe(()=>{C&&Ce(C,v,u),G&&k.enter(O),z&&Fe(u,null,v,"mounted")},b)},j=(u,d,p,v,b)=>{if(p&&w(u,p),v)for(let T=0;T{for(let C=O;C{const x=d.el=u.el;let{patchFlag:O,dynamicChildren:C,dirs:H}=d;O|=u.patchFlag&16;const F=u.props||te,D=d.props||te;let k;p&&Ge(p,!1),(k=D.onVnodeBeforeUpdate)&&Ce(k,p,d,u),H&&Fe(d,u,p,"beforeUpdate"),p&&Ge(p,!0);const z=b&&d.type!=="foreignObject";if(C?I(u.dynamicChildren,C,x,p,v,z,T):P||Z(u,d,x,null,p,v,z,T,!1),O>0){if(O&16)V(x,d,F,D,p,v,b);else if(O&2&&F.class!==D.class&&o(x,"class",null,D.class,b),O&4&&o(x,"style",F.style,D.style,b),O&8){const G=d.dynamicProps;for(let Q=0;Q{k&&Ce(k,p,d,u),H&&Fe(d,u,p,"updated")},v)},I=(u,d,p,v,b,T,P)=>{for(let x=0;x{if(p!==v){if(p!==te)for(const x in p)!Ft(x)&&!(x in v)&&o(u,x,p[x],null,P,d.children,b,T,$e);for(const x in v){if(Ft(x))continue;const O=v[x],C=p[x];O!==C&&x!=="value"&&o(u,x,C,O,P,d.children,b,T,$e)}"value"in v&&o(u,"value",p.value,v.value)}},M=(u,d,p,v,b,T,P,x,O)=>{const C=d.el=u?u.el:l(""),H=d.anchor=u?u.anchor:l("");let{patchFlag:F,dynamicChildren:D,slotScopeIds:k}=d;k&&(x=x?x.concat(k):k),u==null?(r(C,p,v),r(H,p,v),_(d.children,p,H,b,T,P,x,O)):F>0&&F&64&&D&&u.dynamicChildren?(I(u.dynamicChildren,D,p,b,T,P,x),(d.key!=null||b&&d===b.subTree)&&Nr(u,d,!0)):Z(u,d,p,H,b,T,P,x,O)},q=(u,d,p,v,b,T,P,x,O)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?b.ctx.activate(d,p,v,P,O):L(d,p,v,b,T,P,O):_e(u,d,O)},L=(u,d,p,v,b,T,P)=>{const x=u.component=cc(u,v,b);if(Yt(u)&&(x.ctx.renderer=ut),ac(x),x.asyncDep){if(b&&b.registerDep(x,X),!u.el){const O=x.subTree=se(ve);m(null,O,d,p)}return}X(x,u,d,p,b,T,P)},_e=(u,d,p)=>{const v=d.component=u.component;if(_l(u,d,p))if(v.asyncDep&&!v.asyncResolved){ne(v,d,p);return}else v.next=d,ul(v.update),v.update();else d.el=u.el,v.vnode=d},X=(u,d,p,v,b,T,P)=>{const x=()=>{if(u.isMounted){let{next:H,bu:F,u:D,parent:k,vnode:z}=u,G=H,Q;Ge(u,!1),H?(H.el=z.el,ne(u,H,P)):H=z,F&&fn(F),(Q=H.props&&H.props.onVnodeBeforeUpdate)&&Ce(Q,k,H,z),Ge(u,!0);const oe=Un(u),Te=u.subTree;u.subTree=oe,S(Te,oe,h(Te.el),Xt(Te),u,b,T),H.el=oe.el,G===null&&yl(u,oe.el),D&&pe(D,b),(Q=H.props&&H.props.onVnodeUpdated)&&pe(()=>Ce(Q,k,H,z),b)}else{let H;const{el:F,props:D}=d,{bm:k,m:z,parent:G}=u,Q=yt(d);if(Ge(u,!1),k&&fn(k),!Q&&(H=D&&D.onVnodeBeforeMount)&&Ce(H,G,d),Ge(u,!0),F&&Bn){const oe=()=>{u.subTree=Un(u),Bn(F,u.subTree,u,b,null)};Q?d.type.__asyncLoader().then(()=>!u.isUnmounted&&oe()):oe()}else{const oe=u.subTree=Un(u);S(null,oe,p,v,u,b,T),d.el=oe.el}if(z&&pe(z,b),!Q&&(H=D&&D.onVnodeMounted)){const oe=d;pe(()=>Ce(H,G,oe),b)}(d.shapeFlag&256||G&&yt(G.vnode)&&G.vnode.shapeFlag&256)&&u.a&&pe(u.a,b),u.isMounted=!0,d=p=v=null}},O=u.effect=new vr(x,()=>Rn(C),u.scope),C=u.update=()=>O.run();C.id=u.uid,Ge(u,!0),C()},ne=(u,d,p)=>{d.component=u;const v=u.vnode.props;u.vnode=d,u.next=null,Vl(u,d.props,v,p),Yl(u,d.children,p),xt(),Gr(),Tt()},Z=(u,d,p,v,b,T,P,x,O=!1)=>{const C=u&&u.children,H=u?u.shapeFlag:0,F=d.children,{patchFlag:D,shapeFlag:k}=d;if(D>0){if(D&128){Jt(C,F,p,v,b,T,P,x,O);return}else if(D&256){Qe(C,F,p,v,b,T,P,x,O);return}}k&8?(H&16&&$e(C,b,T),F!==C&&f(p,F)):H&16?k&16?Jt(C,F,p,v,b,T,P,x,O):$e(C,b,T,!0):(H&8&&f(p,""),k&16&&_(F,p,v,b,T,P,x,O))},Qe=(u,d,p,v,b,T,P,x,O)=>{u=u||pt,d=d||pt;const C=u.length,H=d.length,F=Math.min(C,H);let D;for(D=0;DH?$e(u,b,T,!0,!1,F):_(d,p,v,b,T,P,x,O,F)},Jt=(u,d,p,v,b,T,P,x,O)=>{let C=0;const H=d.length;let F=u.length-1,D=H-1;for(;C<=F&&C<=D;){const k=u[C],z=d[C]=O?Ve(d[C]):Ae(d[C]);if(rt(k,z))S(k,z,p,null,b,T,P,x,O);else break;C++}for(;C<=F&&C<=D;){const k=u[F],z=d[D]=O?Ve(d[D]):Ae(d[D]);if(rt(k,z))S(k,z,p,null,b,T,P,x,O);else break;F--,D--}if(C>F){if(C<=D){const k=D+1,z=kD)for(;C<=F;)Re(u[C],b,T,!0),C++;else{const k=C,z=C,G=new Map;for(C=z;C<=D;C++){const ye=d[C]=O?Ve(d[C]):Ae(d[C]);ye.key!=null&&G.set(ye.key,C)}let Q,oe=0;const Te=D-z+1;let ft=!1,kr=0;const St=new Array(Te);for(C=0;C=Te){Re(ye,b,T,!0);continue}let Me;if(ye.key!=null)Me=G.get(ye.key);else for(Q=z;Q<=D;Q++)if(St[Q-z]===0&&rt(ye,d[Q])){Me=Q;break}Me===void 0?Re(ye,b,T,!0):(St[Me-z]=C+1,Me>=kr?kr=Me:ft=!0,S(ye,d[Me],p,null,b,T,P,x,O),oe++)}const Kr=ft?Zl(St):pt;for(Q=Kr.length-1,C=Te-1;C>=0;C--){const ye=z+C,Me=d[ye],Wr=ye+1{const{el:T,type:P,transition:x,children:O,shapeFlag:C}=u;if(C&6){Ze(u.component.subTree,d,p,v);return}if(C&128){u.suspense.move(d,p,v);return}if(C&64){P.move(u,d,p,ut);return}if(P===ge){r(T,d,p);for(let F=0;Fx.enter(T),b);else{const{leave:F,delayLeave:D,afterLeave:k}=x,z=()=>r(T,d,p),G=()=>{F(T,()=>{z(),k&&k()})};D?D(T,z,G):G()}else r(T,d,p)},Re=(u,d,p,v=!1,b=!1)=>{const{type:T,props:P,ref:x,children:O,dynamicChildren:C,shapeFlag:H,patchFlag:F,dirs:D}=u;if(x!=null&&wn(x,null,p,u,!0),H&256){d.ctx.deactivate(u);return}const k=H&1&&D,z=!yt(u);let G;if(z&&(G=P&&P.onVnodeBeforeUnmount)&&Ce(G,d,u),H&6)li(u.component,p,v);else{if(H&128){u.suspense.unmount(p,v);return}k&&Fe(u,null,d,"beforeUnmount"),H&64?u.type.remove(u,d,p,b,ut,v):C&&(T!==ge||F>0&&F&64)?$e(C,d,p,!1,!0):(T===ge&&F&384||!b&&H&16)&&$e(O,d,p),v&&Br(u)}(z&&(G=P&&P.onVnodeUnmounted)||k)&&pe(()=>{G&&Ce(G,d,u),k&&Fe(u,null,d,"unmounted")},p)},Br=u=>{const{type:d,el:p,anchor:v,transition:b}=u;if(d===ge){ii(p,v);return}if(d===$t){A(u);return}const T=()=>{s(p),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:P,delayLeave:x}=b,O=()=>P(p,T);x?x(u.el,T,O):O()}else T()},ii=(u,d)=>{let p;for(;u!==d;)p=g(u),s(u),u=p;s(d)},li=(u,d,p)=>{const{bum:v,scope:b,update:T,subTree:P,um:x}=u;v&&fn(v),b.stop(),T&&(T.active=!1,Re(P,u,d,p)),x&&pe(x,d),pe(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},$e=(u,d,p,v=!1,b=!1,T=0)=>{for(let P=T;Pu.shapeFlag&6?Xt(u.component.subTree):u.shapeFlag&128?u.suspense.next():g(u.anchor||u.el),Ur=(u,d,p)=>{u==null?d._vnode&&Re(d._vnode,null,null,!0):S(d._vnode||null,u,d,null,null,null,p),Gr(),_n(),d._vnode=u},ut={p:S,um:Re,m:Ze,r:Br,mt:L,mc:_,pc:Z,pbc:I,n:Xt,o:e};let jn,Bn;return t&&([jn,Bn]=t(ut)),{render:Ur,hydrate:jn,createApp:kl(Ur,jn)}}function Ge({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Nr(e,t,n=!1){const r=e.children,s=t.children;if(U(r)&&U(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Gl=e=>e.__isTeleport,Nt=e=>e&&(e.disabled||e.disabled===""),fs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,cr=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},ec={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:f,pc:h,pbc:g,o:{insert:w,querySelector:E,createText:S,createComment:$}}=a,m=Nt(t.props);let{shapeFlag:y,children:N,dynamicChildren:A}=t;if(e==null){const B=t.el=S(""),W=t.anchor=S("");w(B,n,r),w(W,n,r);const j=t.target=cr(t.props,E),_=t.targetAnchor=S("");j&&(w(_,j),i=i||fs(j));const R=(I,V)=>{y&16&&f(N,I,V,s,o,i,l,c)};m?R(n,W):j&&R(j,_)}else{t.el=e.el;const B=t.anchor=e.anchor,W=t.target=e.target,j=t.targetAnchor=e.targetAnchor,_=Nt(e.props),R=_?n:W,I=_?B:j;if(i=i||fs(W),A?(g(e.dynamicChildren,A,R,s,o,i,l),Nr(e,t,!0)):c||h(e,t,R,I,s,o,i,l,!1),m)_||on(t,n,B,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const V=t.target=cr(t.props,E);V&&on(t,V,null,a,0)}else _&&on(t,W,j,a,1)}Mo(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:g}=e;if(h&&o(f),(i||!Nt(g))&&(o(a),l&16))for(let w=0;w0?Oe||pt:null,nc(),Kt>0&&Oe&&Oe.push(e),e}function Ya(e,t,n,r,s,o){return Io($o(e,t,n,r,s,o,!0))}function Lo(e,t,n,r,s){return Io(se(e,t,n,r,s,!0))}function Cn(e){return e?e.__v_isVNode===!0:!1}function rt(e,t){return e.type===t.type&&e.key===t.key}const $n="__vInternal",No=({key:e})=>e??null,dn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||ce(e)||K(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function $o(e,t=null,n=null,r=0,s=null,o=e===ge?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&No(t),ref:t&&dn(t),scopeId:Fn,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:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return l?($r(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Kt>0&&!i&&Oe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Oe.push(c),c}const se=rc;function rc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===vo)&&(e=ve),Cn(e)){const l=Xe(e,t,!0);return n&&$r(l,n),Kt>0&&!o&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(hc(e)&&(e=e.__vccOpts),t){t=sc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=yr(l)),ee(c)&&(so(c)&&!U(c)&&(c=ie({},c)),t.style=_r(c))}const i=re(e)?1:bl(e)?128:Gl(e)?64:ee(e)?4:K(e)?2:0;return $o(e,t,n,r,s,i,o,!0)}function sc(e){return e?so(e)||$n in e?ie({},e):e:null}function Xe(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?oc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&No(l),ref:t&&t.ref?n&&s?U(s)?s.concat(dn(t)):[s,dn(t)]:dn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xe(e.ssContent),ssFallback:e.ssFallback&&Xe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ho(e=" ",t=0){return se(wt,null,e,t)}function Ja(e,t){const n=se($t,null,e);return n.staticCount=t,n}function Xa(e="",t=!1){return t?(Fo(),Lo(ve,null,e)):se(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?se(ve):U(e)?se(ge,null,e.slice()):typeof e=="object"?Ve(e):se(wt,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xe(e)}function $r(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(U(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),$r(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!($n in t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),r&64?(n=16,t=[Ho(t)]):n=8);e.children=t,e.shapeFlag|=n}function oc(...e){const t={};for(let n=0;nle||fe;let Hr,dt,hs="__VUE_INSTANCE_SETTERS__";(dt=Qn()[hs])||(dt=Qn()[hs]=[]),dt.push(e=>le=e),Hr=e=>{dt.length>1?dt.forEach(t=>t(e)):dt[0](e)};const Ct=e=>{Hr(e),e.scope.on()},lt=()=>{le&&le.scope.off(),Hr(null)};function Do(e){return e.vnode.shapeFlag&4}let Et=!1;function ac(e,t=!1){Et=t;const{props:n,children:r}=e.vnode,s=Do(e);Wl(e,n,s,t),zl(e,r);const o=s?uc(e,t):void 0;return Et=!1,o}function uc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=It(new Proxy(e.ctx,Ll));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Bo(e):null;Ct(e),xt();const o=ze(r,e,0,[e.props,s]);if(Tt(),lt(),ks(o)){if(o.then(lt,lt),t)return o.then(i=>{ps(e,i,t)}).catch(i=>{zt(i,e,0)});e.asyncDep=o}else ps(e,o,t)}else jo(e,t)}function ps(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=lo(t)),jo(e,n)}let gs;function jo(e,t,n){const r=e.type;if(!e.render){if(!t&&gs&&!r.render){const s=r.template||Ir(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=ie(ie({isCustomElement:o,delimiters:l},i),c);r.render=gs(s,a)}}e.render=r.render||Pe}Ct(e),xt(),$l(e),Tt(),lt()}function fc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return me(e,"get","$attrs"),t[n]}}))}function Bo(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return fc(e)},slots:e.slots,emit:e.emit,expose:t}}function Dn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(lo(It(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Lt)return Lt[n](e)},has(t,n){return n in t||n in Lt}}))}function dc(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function hc(e){return K(e)&&"__vccOpts"in e}const ue=(e,t)=>ll(e,t,Et);function ar(e,t,n){const r=arguments.length;return r===2?ee(t)&&!U(t)?Cn(t)?se(e,null,[t]):se(e,t):se(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Cn(n)&&(n=[n]),se(e,t,n))}const pc=Symbol.for("v-scx"),gc=()=>bt(pc),mc="3.3.4",_c="http://www.w3.org/2000/svg",st=typeof document<"u"?document:null,ms=st&&st.createElement("template"),yc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?st.createElementNS(_c,e):st.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>st.createTextNode(e),createComment:e=>st.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>st.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{ms.innerHTML=r?`${e}`:e;const l=ms.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function bc(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function vc(e,t,n){const r=e.style,s=re(n);if(n&&!s){if(t&&!re(t))for(const o in t)n[o]==null&&ur(r,o,"");for(const o in n)ur(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const _s=/\s*!important$/;function ur(e,t,n){if(U(n))n.forEach(r=>ur(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=wc(e,t);_s.test(n)?e.setProperty(at(r),n.replace(_s,""),"important"):e[r]=n}}const ys=["Webkit","Moz","ms"],Vn={};function wc(e,t){const n=Vn[t];if(n)return n;let r=Ne(t);if(r!=="filter"&&r in e)return Vn[t]=r;r=Tn(r);for(let s=0;sqn||(Sc.then(()=>qn=0),qn=Date.now());function Pc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Rc(r,n.value),t,5,[r])};return n.value=e,n.attached=Oc(),n}function Rc(e,t){if(U(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const ws=/^on[a-z]/,Mc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?bc(e,r,s):t==="style"?vc(e,n,r):qt(t)?hr(t)||Tc(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Fc(e,t,r,s))?Ec(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Cc(e,t,r,s))};function Fc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&ws.test(t)&&K(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ws.test(t)&&re(n)?!1:t in e}const Ke="transition",Ot="animation",Uo=(e,{slots:t})=>ar(El,Ic(e),t);Uo.displayName="Transition";const ko={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};Uo.props=ie({},go,ko);const et=(e,t=[])=>{U(e)?e.forEach(n=>n(...t)):e&&e(...t)},Cs=e=>e?U(e)?e.some(t=>t.length>1):e.length>1:!1;function Ic(e){const t={};for(const M in e)M in ko||(t[M]=e[M]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,E=Lc(s),S=E&&E[0],$=E&&E[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:N,onLeave:A,onLeaveCancelled:B,onBeforeAppear:W=m,onAppear:j=y,onAppearCancelled:_=N}=t,R=(M,q,L)=>{tt(M,q?f:l),tt(M,q?a:i),L&&L()},I=(M,q)=>{M._isLeaving=!1,tt(M,h),tt(M,w),tt(M,g),q&&q()},V=M=>(q,L)=>{const _e=M?j:y,X=()=>R(q,M,L);et(_e,[q,X]),Es(()=>{tt(q,M?c:o),We(q,M?f:l),Cs(_e)||xs(q,r,S,X)})};return ie(t,{onBeforeEnter(M){et(m,[M]),We(M,o),We(M,i)},onBeforeAppear(M){et(W,[M]),We(M,c),We(M,a)},onEnter:V(!1),onAppear:V(!0),onLeave(M,q){M._isLeaving=!0;const L=()=>I(M,q);We(M,h),Hc(),We(M,g),Es(()=>{M._isLeaving&&(tt(M,h),We(M,w),Cs(A)||xs(M,r,$,L))}),et(A,[M,L])},onEnterCancelled(M){R(M,!1),et(N,[M])},onAppearCancelled(M){R(M,!0),et(_,[M])},onLeaveCancelled(M){I(M),et(B,[M])}})}function Lc(e){if(e==null)return null;if(ee(e))return[zn(e.enter),zn(e.leave)];{const t=zn(e);return[t,t]}}function zn(e){return pi(e)}function We(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function tt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Es(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Nc=0;function xs(e,t,n,r){const s=e._endId=++Nc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=$c(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,g),o()},g=w=>{w.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[E]||"").split(", "),s=r(`${Ke}Delay`),o=r(`${Ke}Duration`),i=Ts(s,o),l=r(`${Ot}Delay`),c=r(`${Ot}Duration`),a=Ts(l,c);let f=null,h=0,g=0;t===Ke?i>0&&(f=Ke,h=i,g=o.length):t===Ot?a>0&&(f=Ot,h=a,g=c.length):(h=Math.max(i,a),f=h>0?i>a?Ke:Ot:null,g=f?f===Ke?o.length:c.length:0);const w=f===Ke&&/\b(transform|all)(,|$)/.test(r(`${Ke}Property`).toString());return{type:f,timeout:h,propCount:g,hasTransform:w}}function Ts(e,t){for(;e.lengthAs(n)+As(e[r])))}function As(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Hc(){return document.body.offsetHeight}const Ss=e=>{const t=e.props["onUpdate:modelValue"]||!1;return U(t)?n=>fn(t,n):t};function Dc(e){e.target.composing=!0}function Os(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qa={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e._assign=Ss(s);const o=r||s.props&&s.props.type==="number";ht(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=Xn(l)),e._assign(l)}),n&&ht(e,"change",()=>{e.value=e.value.trim()}),t||(ht(e,"compositionstart",Dc),ht(e,"compositionend",Os),ht(e,"change",Os))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e._assign=Ss(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&Xn(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},jc=["ctrl","shift","alt","meta"],Bc={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)=>jc.some(n=>e[`${n}Key`]&&!t.includes(n))},Za=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=at(n.key);if(t.some(s=>s===r||Uc[s]===r))return e(n)},eu={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Pt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Pt(e,!0),r.enter(e)):r.leave(e,()=>{Pt(e,!1)}):Pt(e,t))},beforeUnmount(e,{value:t}){Pt(e,t)}};function Pt(e,t){e.style.display=t?e._vod:"none"}const Ko=ie({patchProp:Mc},yc);let Dt,Ps=!1;function kc(){return Dt||(Dt=Xl(Ko))}function Kc(){return Dt=Ps?Dt:Ql(Ko),Ps=!0,Dt}const tu=(...e)=>{const t=kc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Wo(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},nu=(...e)=>{const t=Kc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Wo(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Wo(e){return re(e)?document.querySelector(e):e}const ru=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Wc=window.__VP_SITE_DATA__;function Dr(e){return zs()?(Ei(e),!0):!1}function Le(e){return typeof e=="function"?e():io(e)}const Vo=typeof window<"u"&&typeof document<"u",Vc=Object.prototype.toString,qc=e=>Vc.call(e)==="[object Object]",Wt=()=>{},Rs=zc();function zc(){var e;return Vo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Yc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const qo=e=>e();function Jc(e,t={}){let n,r,s=Wt;const o=l=>{clearTimeout(l),s(),s=Wt};return l=>{const c=Le(e),a=Le(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function Xc(e=qo){const t=ae(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:On(t),pause:n,resume:r,eventFilter:s}}function zo(...e){if(e.length!==1)return sl(...e);const t=e[0];return typeof t=="function"?On(tl(()=>({get:t,set:Wt}))):ae(t)}function Yo(e,t,n={}){const{eventFilter:r=qo,...s}=n;return Ye(e,Yc(r,t),s)}function Qc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Xc(r);return{stop:Yo(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Zc(e,t=!0){Hn()?At(e):t?e():Pn(e)}function su(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return Yo(e,t,{...o,eventFilter:Jc(r,{maxWait:s})})}function ou(e,t,n){let r;ce(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Wt}=r,c=ae(!s),a=i?Or(t):ae(t);let f=0;return Rr(async h=>{if(!c.value)return;f++;const g=f;let w=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const E=await e(S=>{h(()=>{o&&(o.value=!1),w||S()})});g===f&&(a.value=E)}catch(E){l(E)}finally{o&&g===f&&(o.value=!1),w=!0}}),s?ue(()=>(c.value=!0,a.value)):a}function Jo(e){var t;const n=Le(e);return(t=n==null?void 0:n.$el)!=null?t:n}const je=Vo?window:void 0;function Vt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=je):[t,n,r,s]=e,!t)return Wt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,g,w)=>(f.addEventListener(h,g,w),()=>f.removeEventListener(h,g,w)),c=Ye(()=>[Jo(t),Le(s)],([f,h])=>{if(i(),!f)return;const g=qc(h)?{...h}:h;o.push(...n.flatMap(w=>r.map(E=>l(f,w,E,g))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Dr(a),a}function Gc(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function iu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=je,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Gc(t);return Vt(s,o,f=>{f.repeat&&Le(l)||c(f)&&n(f)},i)}function ea(){const e=ae(!1);return Hn()&&At(()=>{e.value=!0}),e}function ta(e){const t=ea();return ue(()=>(t.value,!!e()))}function na(e,t={}){const{window:n=je}=t,r=ta(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=ae(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Rr(()=>{r.value&&(l(),s=n.matchMedia(Le(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Dr(()=>{c(),l(),s=void 0}),o}const ln=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},cn="__vueuse_ssr_handlers__",ra=sa();function sa(){return cn in ln||(ln[cn]=ln[cn]||{}),ln[cn]}function Xo(e,t){return ra[e]||t}function oa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ia={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ms="vueuse-storage";function jr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=je,eventFilter:g,onError:w=_=>{console.error(_)}}=r,E=(f?Or:ae)(t);if(!n)try{n=Xo("getDefaultStorage",()=>{var _;return(_=je)==null?void 0:_.localStorage})()}catch(_){w(_)}if(!n)return E;const S=Le(t),$=oa(S),m=(s=r.serializer)!=null?s:ia[$],{pause:y,resume:N}=Qc(E,()=>A(E.value),{flush:o,deep:i,eventFilter:g});return h&&l&&(Vt(h,"storage",j),Vt(h,Ms,W)),j(),E;function A(_){try{if(_==null)n.removeItem(e);else{const R=m.write(_),I=n.getItem(e);I!==R&&(n.setItem(e,R),h&&h.dispatchEvent(new CustomEvent(Ms,{detail:{key:e,oldValue:I,newValue:R,storageArea:n}})))}}catch(R){w(R)}}function B(_){const R=_?_.newValue:n.getItem(e);if(R==null)return c&&S!==null&&n.setItem(e,m.write(S)),S;if(!_&&a){const I=m.read(R);return typeof a=="function"?a(I,S):$==="object"&&!Array.isArray(I)?{...S,...I}:I}else return typeof R!="string"?R:m.read(R)}function W(_){j(_.detail)}function j(_){if(!(_&&_.storageArea!==n)){if(_&&_.key==null){E.value=S;return}if(!(_&&_.key!==e)){y();try{(_==null?void 0:_.newValue)!==m.write(E.value)&&(E.value=B(_))}catch(R){w(R)}finally{_?Pn(N):N()}}}}}function la(e){return na("(prefers-color-scheme: dark)",e)}function ca(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=je,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},g=la({window:s}),w=ue(()=>g.value?"dark":"light"),E=c||(i==null?zo(r):jr(i,r,o,{window:s,listenToStorageChanges:l})),S=ue(()=>E.value==="auto"?w.value:E.value),$=Xo("updateHTMLAttrs",(A,B,W)=>{const j=typeof A=="string"?s==null?void 0:s.document.querySelector(A):Jo(A);if(!j)return;let _;if(f){_=s.document.createElement("style");const R="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";_.appendChild(document.createTextNode(R)),s.document.head.appendChild(_)}if(B==="class"){const R=W.split(/\s/g);Object.values(h).flatMap(I=>(I||"").split(/\s/g)).filter(Boolean).forEach(I=>{R.includes(I)?j.classList.add(I):j.classList.remove(I)})}else j.setAttribute(B,W);f&&(s.getComputedStyle(_).opacity,document.head.removeChild(_))});function m(A){var B;$(t,n,(B=h[A])!=null?B:A)}function y(A){e.onChanged?e.onChanged(A,m):m(A)}Ye(S,y,{flush:"post",immediate:!0}),Zc(()=>y(S.value));const N=ue({get(){return a?E.value:S.value},set(A){E.value=A}});try{return Object.assign(N,{store:E,system:w,state:S})}catch{return N}}function aa(e={}){const{valueDark:t="dark",valueLight:n=""}=e,r=ca({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return ue({get(){return r.value==="dark"},set(o){const i=o?"dark":"light";r.system.value===i?r.value="auto":r.value=i}})}function Yn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function lu(e,t,n={}){const{window:r=je}=n;return jr(e,t,r==null?void 0:r.localStorage,n)}function Qo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}function cu(e,t=!1){const n=ae(t);let r=null,s;Ye(zo(e),l=>{const c=Yn(Le(l));if(c){const a=c;s=a.style.overflow,n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=Yn(Le(e));!l||n.value||(Rs&&(r=Vt(l,"touchmove",c=>{ua(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Yn(Le(e));!l||!n.value||(Rs&&(r==null||r()),l.style.overflow=s,n.value=!1)};return Dr(i),ue({get(){return n.value},set(l){l?o():i()}})}function au(e,t,n={}){const{window:r=je}=n;return jr(e,t,r==null?void 0:r.sessionStorage,n)}function uu({window:e=je}={}){if(!e)return{x:ae(0),y:ae(0)};const t=ae(e.scrollX),n=ae(e.scrollY);return Vt(e,"scroll",()=>{t.value=e.scrollX,n.value=e.scrollY},{capture:!1,passive:!0}),{x:t,y:n}}const Zo=/^[a-z]+:/i,fa="vitepress-theme-appearance",Go=/#.*$/,da=/(index)?\.(md|html)$/,Ee=typeof document<"u",ei={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ha(e,t,n=!1){if(t===void 0)return!1;if(e=Fs(`/${e}`),n)return new RegExp(t).test(e);if(Fs(t)!==e)return!1;const r=t.match(Go);return r?(Ee?location.hash:"")===r[0]:!0}function Fs(e){return decodeURI(e).replace(Go,"").replace(da,"")}function pa(e){return Zo.test(e)}function ga(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!pa(f)&&ha(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:ni(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function ti(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ma(e.title,r);return`${n}${s}`}function ma(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function _a(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function ni(e,t){return[...e.filter(n=>!_a(t,n)),...t]}const ya=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ba=/^[a-z]:/i;function Is(e){const t=ba.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ya,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const va=Symbol(),ct=Or(Wc);function fu(e){const t=ue(()=>ga(ct.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ae(!0):n?aa({storageKey:fa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ae(!1);return{site:t,theme:ue(()=>t.value.themeConfig),page:ue(()=>e.data),frontmatter:ue(()=>e.data.frontmatter),params:ue(()=>e.data.params),lang:ue(()=>t.value.lang),dir:ue(()=>t.value.dir),localeIndex:ue(()=>t.value.localeIndex||"root"),title:ue(()=>ti(t.value,e.data)),description:ue(()=>e.data.description||t.value.description),isDark:r}}function wa(){const e=bt(va);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ca(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ls(e){return Zo.test(e)||!e.startsWith("/")?e:Ca(ct.value.base,e)}function Ea(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/";t=Is(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Is(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let hn=[];function du(e){hn.push(e),Nn(()=>{hn=hn.filter(t=>t!==e)})}const xa=Symbol(),ri="http://a.com",Ta=()=>({path:"/",component:null,data:ei});function hu(e,t){const n=Sn(Ta()),r={route:n,go:s};async function s(l=Ee?location.href:"/"){var c,a;l=fr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(Hs(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var g;if(await((g=r.onBeforePageLoad)==null?void 0:g.call(r,l))===!1)return;const f=new URL(l,ri),h=o=f.pathname;try{let w=await e(h);if(!w)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:E,__pageData:S}=w;if(!E)throw new Error(`Invalid route component: ${E}`);n.path=Ee?h:Ls(h),n.component=It(E),n.data=It(S),Ee&&Pn(()=>{let $=ct.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ct.value.cleanUrls&&!$.endsWith("/")&&($+=".html"),$!==f.pathname&&(f.pathname=$,l=$+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let m=null;try{m=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(y){console.warn(y)}if(m){Ns(m,f.hash);return}}window.scrollTo(0,c)})}}catch(w){if(!/fetch|Page not found/.test(w.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(w),!a)try{const E=await fetch(ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await E.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ee?h:Ls(h),n.component=t?It(t):null,n.data=ei)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:g,pathname:w,hash:E,search:S}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),$=window.location,m=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&g===$.origin&&!(m&&m[0]!==".html")&&(l.preventDefault(),w===$.pathname&&S===$.search?(E!==$.hash&&(history.pushState(null,"",E),window.dispatchEvent(new Event("hashchange"))),E?Ns(a,E,a.classList.contains("header-anchor")):(Hs(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(fr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Aa(){const e=bt(xa);if(!e)throw new Error("useRouter() is called without provider.");return e}function si(){return Aa().route}function Ns(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=ct.value.scrollOffset,o=0,i=24;if(typeof s=="object"&&"padding"in s&&(i=s.padding,s=s.selector),typeof s=="number")o=s;else if(typeof s=="string")o=$s(s,i);else if(Array.isArray(s))for(const f of s){const h=$s(f,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-o+l;requestAnimationFrame(a)}}function $s(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function Hs(e){Ee&&e!==fr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function fr(e){const t=new URL(e,ri);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Ds=()=>hn.forEach(e=>e()),pu=Mr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=si(),{site:n}=wa();return()=>ar(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?ar(t.component,{onVnodeMounted:Ds,onVnodeUpdated:Ds}):"404 Page Not Found"])}}),Sa="modulepreload",Oa=function(e){return"/"+e},js={},gu=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=Oa(o),o in js)return;js[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let f=s.length-1;f>=0;f--){const h=s[f];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Sa,i||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),i)return new Promise((f,h)=>{a.addEventListener("load",f),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},mu=Mr({setup(e,{slots:t}){const n=ae(!1);return At(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function _u(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function yu(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Pa(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 Pa(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 r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function bu(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}n.forEach(i=>document.head.removeChild(i)),n=[],o.forEach(i=>{const l=Bs(i);document.head.appendChild(l),n.push(l)})};Rr(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[];document.title=ti(i,o);const a=l||i.description;let f=document.querySelector("meta[name=description]");f?f.setAttribute("content",a):Bs(["meta",{name:"description",content:a}]),s(ni(i.head,Ma(c)))})}function Bs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Ra(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ma(e){return e.filter(t=>!Ra(t))}const Jn=new Set,oi=()=>document.createElement("link"),Fa=e=>{const t=oi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ia=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let an;const La=Ee&&(an=oi())&&an.relList&&an.relList.supports&&an.relList.supports("prefetch")?Fa:Ia;function vu(){if(!Ee||!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 r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!Jn.has(c)){Jn.add(c);const a=Ea(c);a&&La(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):Jn.add(l))})})};At(r);const s=si();Ye(()=>s.path,r),Nn(()=>{n&&n.disconnect()})}export{Za as $,Da as A,Pl as B,Ua as C,Ka as D,Or as E,ge as F,du as G,se as H,ka as I,Zo as J,si as K,oc as L,bt as M,_r as N,Pn as O,uu as P,Ja as Q,On as R,iu as S,Uo as T,Ba as U,gu as V,cu as W,Kl as X,Va as Y,Ga as Z,ru as _,Ho as a,qa as a0,ja as a1,eu as a2,bu as a3,xa as a4,fu as a5,va as a6,pu as a7,mu as a8,ct as a9,nu as aa,hu as ab,Ea as ac,vu as ad,yu as ae,_u as af,ar as ag,Jo as ah,Dr as ai,ou as aj,au as ak,lu as al,su as am,Aa as an,Vt as ao,bo as ap,Qa as aq,ce as ar,za as as,It as at,tu as au,Lo as b,Ya as c,Mr as d,Xa as e,Ls as f,ue as g,ae as h,pa as i,At as j,$o as k,io as l,Ha as m,yr as n,Fo as o,$a as p,ha as q,Wa as r,Ee as s,Na as t,wa as u,na as v,pl as w,Ye as x,Rr as y,Nn as z}; diff --git a/assets/chunks/framework.e4c952c1.js b/assets/chunks/framework.e4c952c1.js new file mode 100644 index 0000000..18aeada --- /dev/null +++ b/assets/chunks/framework.e4c952c1.js @@ -0,0 +1,2 @@ +function yr(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const te={},mt=[],Oe=()=>{},pi=()=>!1,gi=/^on[^a-z]/,Yt=e=>gi.test(e),_r=e=>e.startsWith("onUpdate:"),ae=Object.assign,br=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},mi=Object.prototype.hasOwnProperty,X=(e,t)=>mi.call(e,t),U=Array.isArray,yt=e=>Sn(e)==="[object Map]",qs=e=>Sn(e)==="[object Set]",W=e=>typeof e=="function",ne=e=>typeof e=="string",An=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",zs=e=>(ee(e)||W(e))&&W(e.then)&&W(e.catch),Ys=Object.prototype.toString,Sn=e=>Ys.call(e),yi=e=>Sn(e).slice(8,-1),Js=e=>Sn(e)==="[object Object]",vr=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Lt=yr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Rn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},_i=/-(\w)/g,Ne=Rn(e=>e.replace(_i,(t,n)=>n?n.toUpperCase():"")),bi=/\B([A-Z])/g,ft=Rn(e=>e.replace(bi,"-$1").toLowerCase()),On=Rn(e=>e.charAt(0).toUpperCase()+e.slice(1)),hn=Rn(e=>e?`on${On(e)}`:""),ut=(e,t)=>!Object.is(e,t),pn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},tr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},vi=e=>{const t=ne(e)?Number(e):NaN;return isNaN(t)?e:t};let Jr;const nr=()=>Jr||(Jr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function wr(e){if(U(e)){const t={};for(let n=0;n{if(n){const r=n.split(Ei);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Er(e){let t="";if(ne(e))t=e;else if(U(e))for(let n=0;nne(e)?e:e==null?"":U(e)||ee(e)&&(e.toString===Ys||!W(e.toString))?JSON.stringify(e,Qs,2):String(e),Qs=(e,t)=>t&&t.__v_isRef?Qs(e,t.value):yt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:qs(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!U(t)&&!Js(t)?String(t):t;let be;class Si{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Gs=e=>(e.w&Qe)>0,eo=e=>(e.n&Qe)>0,Pi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(f==="length"||!An(f)&&f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":U(e)?vr(n)&&l.push(i.get("length")):(l.push(i.get(lt)),yt(e)&&l.push(i.get(sr)));break;case"delete":U(e)||(l.push(i.get(lt)),yt(e)&&l.push(i.get(sr)));break;case"set":yt(e)&&l.push(i.get(lt));break}if(l.length===1)l[0]&&or(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);or(Cr(c))}}function or(e,t){const n=U(e)?e:[...e];for(const r of n)r.computed&&Qr(r);for(const r of n)r.computed||Qr(r)}function Qr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Fi(e,t){var n;return(n=_n.get(e))==null?void 0:n.get(t)}const Ii=yr("__proto__,__v_isRef,__isVue"),ro=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(An)),Zr=Li();function Li(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Q(this);for(let o=0,i=this.length;o{e[t]=function(...n){At();const r=Q(this)[t].apply(this,n);return St(),r}}),e}function Ni(e){const t=Q(this);return ye(t,"has",e),t.hasOwnProperty(e)}class so{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const s=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw"&&r===(s?o?Yi:co:o?lo:io).get(t))return t;const i=U(t);if(!s){if(i&&X(Zr,n))return Reflect.get(Zr,n,r);if(n==="hasOwnProperty")return Ni}const l=Reflect.get(t,n,r);return(An(n)?ro.has(n):Ii(n))||(s||ye(t,"get",n),o)?l:le(l)?i&&vr(n)?l:l.value:ee(l)?s?Fn(l):Mn(l):l}}class oo extends so{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(Et(o)&&le(o)&&!le(r))return!1;if(!this._shallow&&(!bn(r)&&!Et(r)&&(o=Q(o),r=Q(r)),!U(t)&&le(o)&&!le(r)))return o.value=r,!0;const i=U(t)&&vr(n)?Number(n)e,Pn=e=>Reflect.getPrototypeOf(e);function Gt(e,t,n=!1,r=!1){e=e.__v_raw;const s=Q(e),o=Q(t);n||(ut(t,o)&&ye(s,"get",t),ye(s,"get",o));const{has:i}=Pn(s),l=r?Tr:n?Rr:kt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function en(e,t=!1){const n=this.__v_raw,r=Q(n),s=Q(e);return t||(ut(e,s)&&ye(r,"has",e),ye(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function tn(e,t=!1){return e=e.__v_raw,!t&&ye(Q(e),"iterate",lt),Reflect.get(e,"size",e)}function Gr(e){e=Q(e);const t=Q(this);return Pn(t).has.call(t,e)||(t.add(e),je(t,"add",e,e)),this}function es(e,t){t=Q(t);const n=Q(this),{has:r,get:s}=Pn(n);let o=r.call(n,e);o||(e=Q(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?ut(t,i)&&je(n,"set",e,t):je(n,"add",e,t),this}function ts(e){const t=Q(this),{has:n,get:r}=Pn(t);let s=n.call(t,e);s||(e=Q(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&je(t,"delete",e,void 0),o}function ns(){const e=Q(this),t=e.size!==0,n=e.clear();return t&&je(e,"clear",void 0,void 0),n}function nn(e,t){return function(r,s){const o=this,i=o.__v_raw,l=Q(i),c=t?Tr:e?Rr:kt;return!e&&ye(l,"iterate",lt),i.forEach((a,f)=>r.call(s,c(a),c(f),o))}}function rn(e,t,n){return function(...r){const s=this.__v_raw,o=Q(s),i=yt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),f=n?Tr:t?Rr:kt;return!t&&ye(o,"iterate",c?sr:lt),{next(){const{value:h,done:m}=a.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:this}}function Bi(){const e={get(o){return Gt(this,o)},get size(){return tn(this)},has:en,add:Gr,set:es,delete:ts,clear:ns,forEach:nn(!1,!1)},t={get(o){return Gt(this,o,!1,!0)},get size(){return tn(this)},has:en,add:Gr,set:es,delete:ts,clear:ns,forEach:nn(!1,!0)},n={get(o){return Gt(this,o,!0)},get size(){return tn(this,!0)},has(o){return en.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:nn(!0,!1)},r={get(o){return Gt(this,o,!0,!0)},get size(){return tn(this,!0)},has(o){return en.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:nn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=rn(o,!1,!1),n[o]=rn(o,!0,!1),t[o]=rn(o,!1,!0),r[o]=rn(o,!0,!0)}),[e,n,t,r]}const[ki,Ui,Ki,Wi]=Bi();function Ar(e,t){const n=t?e?Wi:Ki:e?Ui:ki;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(X(n,s)&&s in r?n:r,s,o)}const Vi={get:Ar(!1,!1)},qi={get:Ar(!1,!0)},zi={get:Ar(!0,!1)},io=new WeakMap,lo=new WeakMap,co=new WeakMap,Yi=new WeakMap;function Ji(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Xi(e){return e.__v_skip||!Object.isExtensible(e)?0:Ji(yi(e))}function Mn(e){return Et(e)?e:Sr(e,!1,$i,Vi,io)}function Qi(e){return Sr(e,!1,ji,qi,lo)}function Fn(e){return Sr(e,!0,Di,zi,co)}function Sr(e,t,n,r,s){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=Xi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function _t(e){return Et(e)?_t(e.__v_raw):!!(e&&e.__v_isReactive)}function Et(e){return!!(e&&e.__v_isReadonly)}function bn(e){return!!(e&&e.__v_isShallow)}function ao(e){return _t(e)||Et(e)}function Q(e){const t=e&&e.__v_raw;return t?Q(t):e}function Nt(e){return yn(e,"__v_skip",!0),e}const kt=e=>ee(e)?Mn(e):e,Rr=e=>ee(e)?Fn(e):e;function Or(e){Ye&&Se&&(e=Q(e),no(e.dep||(e.dep=Cr())))}function Pr(e,t){e=Q(e);const n=e.dep;n&&or(n)}function le(e){return!!(e&&e.__v_isRef===!0)}function ce(e){return uo(e,!1)}function Mr(e){return uo(e,!0)}function uo(e,t){return le(e)?e:new Zi(e,t)}class Zi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Q(t),this._value=n?t:kt(t)}get value(){return Or(this),this._value}set value(t){const n=this.__v_isShallow||bn(t)||Et(t);t=n?t:Q(t),ut(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:kt(t),Pr(this))}}function fo(e){return le(e)?e.value:e}const Gi={get:(e,t,n)=>fo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return le(s)&&!le(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function ho(e){return _t(e)?e:new Proxy(e,Gi)}class el{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Or(this),()=>Pr(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function tl(e){return new el(e)}class nl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Fi(Q(this._object),this._key)}}class rl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function sl(e,t,n){return le(e)?e:W(e)?new rl(e):ee(e)&&arguments.length>1?ol(e,t,n):ce(e)}function ol(e,t,n){const r=e[t];return le(r)?r:new nl(e,t,n)}class il{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new xr(t,()=>{this._dirty||(this._dirty=!0,Pr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=Q(this);return Or(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function ll(e,t,n=!1){let r,s;const o=W(e);return o?(r=e,s=Oe):(r=e.get,s=e.set),new il(r,s,o||!s,n)}function Je(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){Jt(o,t,n)}return s}function xe(e,t,n,r){if(W(e)){const o=Je(e,t,n,r);return o&&zs(o)&&o.catch(i=>{Jt(i,t,n)}),o}const s=[];for(let o=0;o>>1,s=he[r],o=Kt(s);oIe&&he.splice(t,1)}function fl(e){U(e)?bt.push(...e):(!De||!De.includes(e,e.allowRecurse?rt+1:rt))&&bt.push(e),go()}function rs(e,t=Ut?Ie+1:0){for(;tKt(n)-Kt(r)),rt=0;rte.id==null?1/0:e.id,dl=(e,t)=>{const n=Kt(e)-Kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function mo(e){ir=!1,Ut=!0,he.sort(dl);const t=Oe;try{for(Ie=0;Iene(w)?w.trim():w)),h&&(s=n.map(tr))}let l,c=r[l=hn(t)]||r[l=hn(Ne(t))];!c&&o&&(c=r[l=hn(ft(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function yo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!W(e)){const c=a=>{const f=yo(a,t,!0);f&&(l=!0,ae(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&r.set(e,null),null):(U(o)?o.forEach(c=>i[c]=null):ae(i,o),ee(e)&&r.set(e,i),i)}function Nn(e,t){return!e||!Yt(t)?!1:(t=t.slice(2).replace(/Once$/,""),X(e,t[0].toLowerCase()+t.slice(1))||X(e,ft(t))||X(e,t))}let de=null,Hn=null;function wn(e){const t=de;return de=e,Hn=e&&e.type.__scopeId||null,t}function Ha(e){Hn=e}function $a(){Hn=null}function pl(e,t=de,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&ms(-1);const o=wn(t);let i;try{i=e(...s)}finally{wn(o),r._d&&ms(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Vn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:m,setupState:w,ctx:C,inheritAttrs:T}=e;let L,B;const k=wn(e);try{if(n.shapeFlag&4){const p=s||r;L=Ae(f.call(p,p,h,o,w,m,C)),B=c}else{const p=t;L=Ae(p.length>1?p(o,{attrs:c,slots:l,emit:a}):p(o,null)),B=t.props?c:gl(c)}}catch(p){jt.length=0,Jt(p,e,1),L=re(ve)}let y=L;if(B&&T!==!1){const p=Object.keys(B),{shapeFlag:F}=y;p.length&&F&7&&(i&&p.some(_r)&&(B=ml(B,i)),y=Ze(y,B))}return n.dirs&&(y=Ze(y),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&(y.transition=n.transition),L=y,wn(k),L}const gl=e=>{let t;for(const n in e)(n==="class"||n==="style"||Yt(n))&&((t||(t={}))[n]=e[n]);return t},ml=(e,t)=>{const n={};for(const r in e)(!_r(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function yl(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ss(r,i,a):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function _o(e,t){t&&t.pendingBranch?U(e)?t.effects.push(...e):t.effects.push(e):fl(e)}function Ir(e,t){return $n(e,null,t)}function Da(e,t){return $n(e,null,{flush:"post"})}const sn={};function Xe(e,t,n){return $n(e,t,n)}function $n(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=te){var l;const c=Zs()===((l=ie)==null?void 0:l.scope)?ie:null;let a,f=!1,h=!1;if(le(e)?(a=()=>e.value,f=bn(e)):_t(e)?(a=()=>e,r=!0):U(e)?(h=!0,f=e.some(p=>_t(p)||bn(p)),a=()=>e.map(p=>{if(le(p))return p.value;if(_t(p))return it(p);if(W(p))return Je(p,c,2)})):W(e)?t?a=()=>Je(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return m&&m(),xe(e,c,3,[w])}:a=Oe,t&&r){const p=a;a=()=>it(p())}let m,w=p=>{m=k.onStop=()=>{Je(p,c,4)}},C;if(Tt)if(w=Oe,t?n&&xe(t,c,3,[a(),h?[]:void 0,w]):a(),s==="sync"){const p=gc();C=p.__watcherHandles||(p.__watcherHandles=[])}else return Oe;let T=h?new Array(e.length).fill(sn):sn;const L=()=>{if(k.active)if(t){const p=k.run();(r||f||(h?p.some((F,K)=>ut(F,T[K])):ut(p,T)))&&(m&&m(),xe(t,c,3,[p,T===sn?void 0:h&&T[0]===sn?[]:T,w]),T=p)}else k.run()};L.allowRecurse=!!t;let B;s==="sync"?B=L:s==="post"?B=()=>ge(L,c&&c.suspense):(L.pre=!0,c&&(L.id=c.uid),B=()=>Ln(L));const k=new xr(a,B);t?n?L():T=k.run():s==="post"?ge(k.run.bind(k),c&&c.suspense):k.run();const y=()=>{k.stop(),c&&c.scope&&br(c.scope.effects,k)};return C&&C.push(y),y}function vl(e,t,n){const r=this.proxy,s=ne(e)?e.includes(".")?bo(r,e):()=>r[e]:e.bind(r,r);let o;W(t)?o=t:(o=t.handler,n=t);const i=ie;xt(this);const l=$n(s,o.bind(r),n);return i?xt(i):ct(),l}function bo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{it(n,t)});else if(Js(e))for(const n in e)it(e[n],t);return e}function ja(e,t){const n=de;if(n===null)return e;const r=Un(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),xo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],vo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},El={name:"BaseTransition",props:vo,setup(e,{slots:t}){const n=kn(),r=wl();let s;return()=>{const o=t.default&&Eo(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const T of o)if(T.type!==ve){i=T;break}}const l=Q(e),{mode:c}=l;if(r.isLeaving)return qn(i);const a=os(i);if(!a)return qn(i);const f=lr(a,l,r,n);cr(a,f);const h=n.subTree,m=h&&os(h);let w=!1;const{getTransitionKey:C}=a.type;if(C){const T=C();s===void 0?s=T:T!==s&&(s=T,w=!0)}if(m&&m.type!==ve&&(!st(a,m)||w)){const T=lr(m,l,r,n);if(cr(m,T),c==="out-in")return r.isLeaving=!0,T.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},qn(i);c==="in-out"&&a.type!==ve&&(T.delayLeave=(L,B,k)=>{const y=wo(r,m);y[String(m.key)]=m,L[qe]=()=>{B(),L[qe]=void 0,delete f.delayedLeave},f.delayedLeave=k})}return i}}},Cl=El;function wo(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function lr(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:m,onAfterLeave:w,onLeaveCancelled:C,onBeforeAppear:T,onAppear:L,onAfterAppear:B,onAppearCancelled:k}=t,y=String(e.key),p=wo(n,e),F=(v,M)=>{v&&xe(v,r,9,M)},K=(v,M)=>{const R=M[1];F(v,M),U(v)?v.every(z=>z.length<=1)&&R():v.length<=1&&R()},N={mode:o,persisted:i,beforeEnter(v){let M=l;if(!n.isMounted)if(s)M=T||l;else return;v[qe]&&v[qe](!0);const R=p[y];R&&st(e,R)&&R.el[qe]&&R.el[qe](),F(M,[v])},enter(v){let M=c,R=a,z=f;if(!n.isMounted)if(s)M=L||c,R=B||a,z=k||f;else return;let O=!1;const q=v[on]=oe=>{O||(O=!0,oe?F(z,[v]):F(R,[v]),N.delayedLeave&&N.delayedLeave(),v[on]=void 0)};M?K(M,[v,q]):q()},leave(v,M){const R=String(e.key);if(v[on]&&v[on](!0),n.isUnmounting)return M();F(h,[v]);let z=!1;const O=v[qe]=q=>{z||(z=!0,M(),q?F(C,[v]):F(w,[v]),v[qe]=void 0,p[R]===e&&delete p[R])};p[R]=e,m?K(m,[v,O]):O()},clone(v){return lr(v,t,n,r)}};return N}function qn(e){if(Xt(e))return e=Ze(e),e.children=null,e}function os(e){return Xt(e)?e.children?e.children[0]:void 0:e}function cr(e,t){e.shapeFlag&6&&e.component?cr(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 Eo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oae({name:e.name},t,{setup:e}))():e}const vt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Ba(e){W(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,m()),m=()=>{let w;return c||(w=c=t().catch(C=>{if(C=C instanceof Error?C:new Error(String(C)),l)return new Promise((T,L)=>{l(C,()=>T(h()),()=>L(C),f+1)});throw C}).then(C=>w!==c&&c?c:(C&&(C.__esModule||C[Symbol.toStringTag]==="Module")&&(C=C.default),a=C,C)))};return Lr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return a},setup(){const w=ie;if(a)return()=>zn(a,w);const C=k=>{c=null,Jt(k,w,13,!r)};if(i&&w.suspense||Tt)return m().then(k=>()=>zn(k,w)).catch(k=>(C(k),()=>r?re(r,{error:k}):null));const T=ce(!1),L=ce(),B=ce(!!s);return s&&setTimeout(()=>{B.value=!1},s),o!=null&&setTimeout(()=>{if(!T.value&&!L.value){const k=new Error(`Async component timed out after ${o}ms.`);C(k),L.value=k}},o),m().then(()=>{T.value=!0,w.parent&&Xt(w.parent.vnode)&&Ln(w.parent.update)}).catch(k=>{C(k),L.value=k}),()=>{if(T.value&&a)return zn(a,w);if(L.value&&r)return re(r,{error:L.value});if(n&&!B.value)return re(n)}}})}function zn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=re(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const Xt=e=>e.type.__isKeepAlive;function xl(e,t){Co(e,"a",t)}function Tl(e,t){Co(e,"da",t)}function Co(e,t,n=ie){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Dn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Xt(s.parent.vnode)&&Al(r,t,n,s),s=s.parent}}function Al(e,t,n,r){const s=Dn(t,e,r,!0);jn(()=>{br(r[t],s)},n)}function Dn(e,t,n=ie,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;At(),xt(n);const l=xe(t,n,e,i);return ct(),St(),l});return r?s.unshift(o):s.push(o),o}}const ke=e=>(t,n=ie)=>(!Tt||e==="sp")&&Dn(e,(...r)=>t(...r),n),Sl=ke("bm"),Rt=ke("m"),Rl=ke("bu"),Ol=ke("u"),xo=ke("bum"),jn=ke("um"),Pl=ke("sp"),Ml=ke("rtg"),Fl=ke("rtc");function Il(e,t=ie){Dn("ec",e,t)}const Nr="components";function ka(e,t){return Ao(Nr,e,!0,t)||e}const To=Symbol.for("v-ndc");function Ua(e){return ne(e)?Ao(Nr,e,!1)||e:e||To}function Ao(e,t,n=!0,r=!1){const s=de||ie;if(s){const o=s.type;if(e===Nr){const l=dc(o,!1);if(l&&(l===t||l===Ne(t)||l===On(Ne(t))))return o}const i=is(s[e]||o[e],t)||is(s.appContext[e],t);return!i&&r?o:i}}function is(e,t){return e&&(e[t]||e[Ne(t)]||e[On(Ne(t))])}function Ka(e,t,n,r){let s;const o=n&&n[r];if(U(e)||ne(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lTn(t)?!(t.type===ve||t.type===me&&!So(t.children)):!0)?e:null}function Va(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:hn(r)]=e[r];return n}const ar=e=>e?Wo(e)?Un(e)||e.proxy:ar(e.parent):null,Ht=ae(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=>ar(e.parent),$root:e=>ar(e.root),$emit:e=>e.emit,$options:e=>Hr(e),$forceUpdate:e=>e.f||(e.f=()=>Ln(e.update)),$nextTick:e=>e.n||(e.n=In.bind(e.proxy)),$watch:e=>vl.bind(e)}),Yn=(e,t)=>e!==te&&!e.__isScriptSetup&&X(e,t),Ll={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const w=i[t];if(w!==void 0)switch(w){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Yn(r,t))return i[t]=1,r[t];if(s!==te&&X(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&X(a,t))return i[t]=3,o[t];if(n!==te&&X(n,t))return i[t]=4,n[t];ur&&(i[t]=0)}}const f=Ht[t];let h,m;if(f)return t==="$attrs"&&ye(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&X(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,X(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Yn(s,t)?(s[t]=n,!0):r!==te&&X(r,t)?(r[t]=n,!0):X(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&X(e,i)||Yn(t,i)||(l=o[0])&&X(l,i)||X(r,i)||X(Ht,i)||X(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:X(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function qa(){return Nl().slots}function Nl(){const e=kn();return e.setupContext||(e.setupContext=qo(e))}function ls(e){return U(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ur=!0;function Hl(e){const t=Hr(e),n=e.proxy,r=e.ctx;ur=!1,t.beforeCreate&&cs(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:m,beforeUpdate:w,updated:C,activated:T,deactivated:L,beforeDestroy:B,beforeUnmount:k,destroyed:y,unmounted:p,render:F,renderTracked:K,renderTriggered:N,errorCaptured:v,serverPrefetch:M,expose:R,inheritAttrs:z,components:O,directives:q,filters:oe}=t;if(a&&$l(a,r,null),i)for(const Y in i){const j=i[Y];W(j)&&(r[Y]=j.bind(n))}if(s){const Y=s.call(n,n);ee(Y)&&(e.data=Mn(Y))}if(ur=!0,o)for(const Y in o){const j=o[Y],He=W(j)?j.bind(n,n):W(j.get)?j.get.bind(n,n):Oe,Qt=!W(j)&&W(j.set)?j.set.bind(n):Oe,Ge=ue({get:He,set:Qt});Object.defineProperty(r,Y,{enumerable:!0,configurable:!0,get:()=>Ge.value,set:Pe=>Ge.value=Pe})}if(l)for(const Y in l)Ro(l[Y],r,n,Y);if(c){const Y=W(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(j=>{Kl(j,Y[j])})}f&&cs(f,e,"c");function H(Y,j){U(j)?j.forEach(He=>Y(He.bind(n))):j&&Y(j.bind(n))}if(H(Sl,h),H(Rt,m),H(Rl,w),H(Ol,C),H(xl,T),H(Tl,L),H(Il,v),H(Fl,K),H(Ml,N),H(xo,k),H(jn,p),H(Pl,M),U(R))if(R.length){const Y=e.exposed||(e.exposed={});R.forEach(j=>{Object.defineProperty(Y,j,{get:()=>n[j],set:He=>n[j]=He})})}else e.exposed||(e.exposed={});F&&e.render===Oe&&(e.render=F),z!=null&&(e.inheritAttrs=z),O&&(e.components=O),q&&(e.directives=q)}function $l(e,t,n=Oe){U(e)&&(e=fr(e));for(const r in e){const s=e[r];let o;ee(s)?"default"in s?o=wt(s.from||r,s.default,!0):o=wt(s.from||r):o=wt(s),le(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function cs(e,t,n){xe(U(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ro(e,t,n,r){const s=r.includes(".")?bo(n,r):()=>n[r];if(ne(e)){const o=t[e];W(o)&&Xe(s,o)}else if(W(e))Xe(s,e.bind(n));else if(ee(e))if(U(e))e.forEach(o=>Ro(o,t,n,r));else{const o=W(e.handler)?e.handler.bind(n):t[e.handler];W(o)&&Xe(s,o,e)}}function Hr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>En(c,a,i,!0)),En(c,t,i)),ee(t)&&o.set(t,c),c}function En(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&En(e,o,n,!0),s&&s.forEach(i=>En(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Dl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Dl={data:as,props:us,emits:us,methods:It,computed:It,beforeCreate:pe,created:pe,beforeMount:pe,mounted:pe,beforeUpdate:pe,updated:pe,beforeDestroy:pe,beforeUnmount:pe,destroyed:pe,unmounted:pe,activated:pe,deactivated:pe,errorCaptured:pe,serverPrefetch:pe,components:It,directives:It,watch:Bl,provide:as,inject:jl};function as(e,t){return t?e?function(){return ae(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function jl(e,t){return It(fr(e),fr(t))}function fr(e){if(U(e)){const t={};for(let n=0;n1)return n&&W(t)?t.call(r&&r.proxy):t}}function Wl(e,t,n,r=!1){const s={},o={};yn(o,Bn,1),e.propsDefaults=Object.create(null),Po(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:Qi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Vl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=Q(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,w]=Mo(h,t,!0);ae(i,m),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return ee(e)&&r.set(e,mt),mt;if(U(o))for(let f=0;f-1,w[1]=T<0||C-1||X(w,"default"))&&l.push(h)}}}const a=[i,l];return ee(e)&&r.set(e,a),a}function fs(e){return e[0]!=="$"}function ds(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function hs(e,t){return ds(e)===ds(t)}function ps(e,t){return U(t)?t.findIndex(n=>hs(n,e)):W(t)&&hs(t,e)?0:-1}const Fo=e=>e[0]==="_"||e==="$stable",$r=e=>U(e)?e.map(Ae):[Ae(e)],ql=(e,t,n)=>{if(t._n)return t;const r=pl((...s)=>$r(t(...s)),n);return r._c=!1,r},Io=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Fo(s))continue;const o=e[s];if(W(o))t[s]=ql(s,o,r);else if(o!=null){const i=$r(o);t[s]=()=>i}}},Lo=(e,t)=>{const n=$r(t);e.slots.default=()=>n},zl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Q(t),yn(t,"_",n)):Io(t,e.slots={})}else e.slots={},t&&Lo(e,t);yn(e.slots,Bn,1)},Yl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ae(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Io(t,s)),i=t}else t&&(Lo(e,t),i={default:1});if(o)for(const l in s)!Fo(l)&&i[l]==null&&delete s[l]};function xn(e,t,n,r,s=!1){if(U(e)){e.forEach((m,w)=>xn(m,t&&(U(t)?t[w]:t),n,r,s));return}if(vt(r)&&!s)return;const o=r.shapeFlag&4?Un(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,f=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(ne(a)?(f[a]=null,X(h,a)&&(h[a]=null)):le(a)&&(a.value=null)),W(c))Je(c,l,12,[i,f]);else{const m=ne(c),w=le(c);if(m||w){const C=()=>{if(e.f){const T=m?X(h,c)?h[c]:f[c]:c.value;s?U(T)&&br(T,o):U(T)?T.includes(o)||T.push(o):m?(f[c]=[o],X(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,X(h,c)&&(h[c]=i)):w&&(c.value=i,e.k&&(f[e.k]=i))};i?(C.id=-1,ge(C,n)):C()}}}let Ke=!1;const ln=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",cn=e=>e.nodeType===8;function Jl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,f=(y,p)=>{if(!p.hasChildNodes()){n(null,y,p),vn(),p._vnode=y;return}Ke=!1,h(p.firstChild,y,null,null,null),vn(),p._vnode=y,Ke&&console.error("Hydration completed but contains mismatches.")},h=(y,p,F,K,N,v=!1)=>{const M=cn(y)&&y.data==="[",R=()=>T(y,p,F,K,N,M),{type:z,ref:O,shapeFlag:q,patchFlag:oe}=p;let fe=y.nodeType;p.el=y,oe===-2&&(v=!1,p.dynamicChildren=null);let H=null;switch(z){case Ct:fe!==3?p.children===""?(c(p.el=s(""),i(y),y),H=y):H=R():(y.data!==p.children&&(Ke=!0,y.data=p.children),H=o(y));break;case ve:if(fe!==8||M)if(y.tagName.toLowerCase()==="template"){const Y=p.el.content.firstChild;B(Y,y,F),p.el=y=Y,H=o(y)}else H=R();else H=o(y);break;case Dt:if(M&&(y=o(y),fe=y.nodeType),fe===1||fe===3){H=y;const Y=!p.children.length;for(let j=0;j{v=v||!!p.dynamicChildren;const{type:M,props:R,patchFlag:z,shapeFlag:O,dirs:q,transition:oe}=p,fe=M==="input"&&q||M==="option";if(fe||z!==-1){if(q&&Fe(p,null,F,"created"),R)if(fe||!v||z&48)for(const j in R)(fe&&j.endsWith("value")||Yt(j)&&!Lt(j))&&r(y,j,null,R[j],!1,void 0,F);else R.onClick&&r(y,"onClick",null,R.onClick,!1,void 0,F);let H;(H=R&&R.onVnodeBeforeMount)&&Ee(H,F,p);let Y=!1;if(k(y)){Y=Ho(K,oe)&&F&&F.vnode.props&&F.vnode.props.appear;const j=y.content.firstChild;Y&&oe.beforeEnter(j),B(j,y,F),p.el=y=j}if(q&&Fe(p,null,F,"beforeMount"),((H=R&&R.onVnodeMounted)||q||Y)&&_o(()=>{H&&Ee(H,F,p),Y&&oe.enter(y),q&&Fe(p,null,F,"mounted")},K),O&16&&!(R&&(R.innerHTML||R.textContent))){let j=w(y.firstChild,p,y,F,K,N,v);for(;j;){Ke=!0;const He=j;j=j.nextSibling,l(He)}}else O&8&&y.textContent!==p.children&&(Ke=!0,y.textContent=p.children)}return y.nextSibling},w=(y,p,F,K,N,v,M)=>{M=M||!!p.dynamicChildren;const R=p.children,z=R.length;for(let O=0;O{const{slotScopeIds:M}=p;M&&(N=N?N.concat(M):M);const R=i(y),z=w(o(y),p,R,F,K,N,v);return z&&cn(z)&&z.data==="]"?o(p.anchor=z):(Ke=!0,c(p.anchor=a("]"),R,z),z)},T=(y,p,F,K,N,v)=>{if(Ke=!0,p.el=null,v){const z=L(y);for(;;){const O=o(y);if(O&&O!==z)l(O);else break}}const M=o(y),R=i(y);return l(y),n(null,p,R,M,F,K,ln(R),N),M},L=(y,p="[",F="]")=>{let K=0;for(;y;)if(y=o(y),y&&cn(y)&&(y.data===p&&K++,y.data===F)){if(K===0)return o(y);K--}return y},B=(y,p,F)=>{const K=p.parentNode;K&&K.replaceChild(y,p);let N=F;for(;N;)N.vnode.el===p&&(N.vnode.el=y,N.subTree.el=y),N=N.parent},k=y=>y.nodeType===1&&y.tagName.toLowerCase()==="template";return[f,h]}const ge=_o;function Xl(e){return No(e)}function Ql(e){return No(e,Jl)}function No(e,t){const n=nr();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:m,setScopeId:w=Oe,insertStaticContent:C}=e,T=(u,d,g,_=null,b=null,A=null,P=!1,x=null,S=!!d.dynamicChildren)=>{if(u===d)return;u&&!st(u,d)&&(_=Zt(u),Pe(u,b,A,!0),u=null),d.patchFlag===-2&&(S=!1,d.dynamicChildren=null);const{type:E,ref:$,shapeFlag:I}=d;switch(E){case Ct:L(u,d,g,_);break;case ve:B(u,d,g,_);break;case Dt:u==null&&k(d,g,_,P);break;case me:O(u,d,g,_,b,A,P,x,S);break;default:I&1?F(u,d,g,_,b,A,P,x,S):I&6?q(u,d,g,_,b,A,P,x,S):(I&64||I&128)&&E.process(u,d,g,_,b,A,P,x,S,dt)}$!=null&&b&&xn($,u&&u.ref,A,d||u,!d)},L=(u,d,g,_)=>{if(u==null)r(d.el=l(d.children),g,_);else{const b=d.el=u.el;d.children!==u.children&&a(b,d.children)}},B=(u,d,g,_)=>{u==null?r(d.el=c(d.children||""),g,_):d.el=u.el},k=(u,d,g,_)=>{[u.el,u.anchor]=C(u.children,d,g,_,u.el,u.anchor)},y=({el:u,anchor:d},g,_)=>{let b;for(;u&&u!==d;)b=m(u),r(u,g,_),u=b;r(d,g,_)},p=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=m(u),s(u),u=g;s(d)},F=(u,d,g,_,b,A,P,x,S)=>{P=P||d.type==="svg",u==null?K(d,g,_,b,A,P,x,S):M(u,d,b,A,P,x,S)},K=(u,d,g,_,b,A,P,x)=>{let S,E;const{type:$,props:I,shapeFlag:D,transition:V,dirs:J}=u;if(S=u.el=i(u.type,A,I&&I.is,I),D&8?f(S,u.children):D&16&&v(u.children,S,null,_,b,A&&$!=="foreignObject",P,x),J&&Fe(u,null,_,"created"),N(S,u,u.scopeId,P,_),I){for(const Z in I)Z!=="value"&&!Lt(Z)&&o(S,Z,null,I[Z],A,u.children,_,b,$e);"value"in I&&o(S,"value",null,I.value),(E=I.onVnodeBeforeMount)&&Ee(E,_,u)}J&&Fe(u,null,_,"beforeMount");const G=Ho(b,V);G&&V.beforeEnter(S),r(S,d,g),((E=I&&I.onVnodeMounted)||G||J)&&ge(()=>{E&&Ee(E,_,u),G&&V.enter(S),J&&Fe(u,null,_,"mounted")},b)},N=(u,d,g,_,b)=>{if(g&&w(u,g),_)for(let A=0;A<_.length;A++)w(u,_[A]);if(b){let A=b.subTree;if(d===A){const P=b.vnode;N(u,P,P.scopeId,P.slotScopeIds,b.parent)}}},v=(u,d,g,_,b,A,P,x,S=0)=>{for(let E=S;E{const x=d.el=u.el;let{patchFlag:S,dynamicChildren:E,dirs:$}=d;S|=u.patchFlag&16;const I=u.props||te,D=d.props||te;let V;g&&et(g,!1),(V=D.onVnodeBeforeUpdate)&&Ee(V,g,d,u),$&&Fe(d,u,g,"beforeUpdate"),g&&et(g,!0);const J=b&&d.type!=="foreignObject";if(E?R(u.dynamicChildren,E,x,g,_,J,A):P||j(u,d,x,null,g,_,J,A,!1),S>0){if(S&16)z(x,d,I,D,g,_,b);else if(S&2&&I.class!==D.class&&o(x,"class",null,D.class,b),S&4&&o(x,"style",I.style,D.style,b),S&8){const G=d.dynamicProps;for(let Z=0;Z{V&&Ee(V,g,d,u),$&&Fe(d,u,g,"updated")},_)},R=(u,d,g,_,b,A,P)=>{for(let x=0;x{if(g!==_){if(g!==te)for(const x in g)!Lt(x)&&!(x in _)&&o(u,x,g[x],null,P,d.children,b,A,$e);for(const x in _){if(Lt(x))continue;const S=_[x],E=g[x];S!==E&&x!=="value"&&o(u,x,E,S,P,d.children,b,A,$e)}"value"in _&&o(u,"value",g.value,_.value)}},O=(u,d,g,_,b,A,P,x,S)=>{const E=d.el=u?u.el:l(""),$=d.anchor=u?u.anchor:l("");let{patchFlag:I,dynamicChildren:D,slotScopeIds:V}=d;V&&(x=x?x.concat(V):V),u==null?(r(E,g,_),r($,g,_),v(d.children,g,$,b,A,P,x,S)):I>0&&I&64&&D&&u.dynamicChildren?(R(u.dynamicChildren,D,g,b,A,P,x),(d.key!=null||b&&d===b.subTree)&&Dr(u,d,!0)):j(u,d,g,$,b,A,P,x,S)},q=(u,d,g,_,b,A,P,x,S)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?b.ctx.activate(d,g,_,P,S):oe(d,g,_,b,A,P,S):fe(u,d,S)},oe=(u,d,g,_,b,A,P)=>{const x=u.component=cc(u,_,b);if(Xt(u)&&(x.ctx.renderer=dt),ac(x),x.asyncDep){if(b&&b.registerDep(x,H),!u.el){const S=x.subTree=re(ve);B(null,S,d,g)}return}H(x,u,d,g,b,A,P)},fe=(u,d,g)=>{const _=d.component=u.component;if(yl(u,d,g))if(_.asyncDep&&!_.asyncResolved){Y(_,d,g);return}else _.next=d,ul(_.update),_.update();else d.el=u.el,_.vnode=d},H=(u,d,g,_,b,A,P)=>{const x=()=>{if(u.isMounted){let{next:$,bu:I,u:D,parent:V,vnode:J}=u,G=$,Z;et(u,!1),$?($.el=J.el,Y(u,$,P)):$=J,I&&pn(I),(Z=$.props&&$.props.onVnodeBeforeUpdate)&&Ee(Z,V,$,J),et(u,!0);const se=Vn(u),Te=u.subTree;u.subTree=se,T(Te,se,h(Te.el),Zt(Te),u,b,A),$.el=se.el,G===null&&_l(u,se.el),D&&ge(D,b),(Z=$.props&&$.props.onVnodeUpdated)&&ge(()=>Ee(Z,V,$,J),b)}else{let $;const{el:I,props:D}=d,{bm:V,m:J,parent:G}=u,Z=vt(d);if(et(u,!1),V&&pn(V),!Z&&($=D&&D.onVnodeBeforeMount)&&Ee($,G,d),et(u,!0),I&&Wn){const se=()=>{u.subTree=Vn(u),Wn(I,u.subTree,u,b,null)};Z?d.type.__asyncLoader().then(()=>!u.isUnmounted&&se()):se()}else{const se=u.subTree=Vn(u);T(null,se,g,_,u,b,A),d.el=se.el}if(J&&ge(J,b),!Z&&($=D&&D.onVnodeMounted)){const se=d;ge(()=>Ee($,G,se),b)}(d.shapeFlag&256||G&&vt(G.vnode)&&G.vnode.shapeFlag&256)&&u.a&&ge(u.a,b),u.isMounted=!0,d=g=_=null}},S=u.effect=new xr(x,()=>Ln(E),u.scope),E=u.update=()=>S.run();E.id=u.uid,et(u,!0),E()},Y=(u,d,g)=>{d.component=u;const _=u.vnode.props;u.vnode=d,u.next=null,Vl(u,d.props,_,g),Yl(u,d.children,g),At(),rs(),St()},j=(u,d,g,_,b,A,P,x,S=!1)=>{const E=u&&u.children,$=u?u.shapeFlag:0,I=d.children,{patchFlag:D,shapeFlag:V}=d;if(D>0){if(D&128){Qt(E,I,g,_,b,A,P,x,S);return}else if(D&256){He(E,I,g,_,b,A,P,x,S);return}}V&8?($&16&&$e(E,b,A),I!==E&&f(g,I)):$&16?V&16?Qt(E,I,g,_,b,A,P,x,S):$e(E,b,A,!0):($&8&&f(g,""),V&16&&v(I,g,_,b,A,P,x,S))},He=(u,d,g,_,b,A,P,x,S)=>{u=u||mt,d=d||mt;const E=u.length,$=d.length,I=Math.min(E,$);let D;for(D=0;D$?$e(u,b,A,!0,!1,I):v(d,g,_,b,A,P,x,S,I)},Qt=(u,d,g,_,b,A,P,x,S)=>{let E=0;const $=d.length;let I=u.length-1,D=$-1;for(;E<=I&&E<=D;){const V=u[E],J=d[E]=S?ze(d[E]):Ae(d[E]);if(st(V,J))T(V,J,g,null,b,A,P,x,S);else break;E++}for(;E<=I&&E<=D;){const V=u[I],J=d[D]=S?ze(d[D]):Ae(d[D]);if(st(V,J))T(V,J,g,null,b,A,P,x,S);else break;I--,D--}if(E>I){if(E<=D){const V=D+1,J=V<$?d[V].el:_;for(;E<=D;)T(null,d[E]=S?ze(d[E]):Ae(d[E]),g,J,b,A,P,x,S),E++}}else if(E>D)for(;E<=I;)Pe(u[E],b,A,!0),E++;else{const V=E,J=E,G=new Map;for(E=J;E<=D;E++){const _e=d[E]=S?ze(d[E]):Ae(d[E]);_e.key!=null&&G.set(_e.key,E)}let Z,se=0;const Te=D-J+1;let ht=!1,qr=0;const Ot=new Array(Te);for(E=0;E=Te){Pe(_e,b,A,!0);continue}let Me;if(_e.key!=null)Me=G.get(_e.key);else for(Z=J;Z<=D;Z++)if(Ot[Z-J]===0&&st(_e,d[Z])){Me=Z;break}Me===void 0?Pe(_e,b,A,!0):(Ot[Me-J]=E+1,Me>=qr?qr=Me:ht=!0,T(_e,d[Me],g,null,b,A,P,x,S),se++)}const zr=ht?Zl(Ot):mt;for(Z=zr.length-1,E=Te-1;E>=0;E--){const _e=J+E,Me=d[_e],Yr=_e+1<$?d[_e+1].el:_;Ot[E]===0?T(null,Me,g,Yr,b,A,P,x,S):ht&&(Z<0||E!==zr[Z]?Ge(Me,g,Yr,2):Z--)}}},Ge=(u,d,g,_,b=null)=>{const{el:A,type:P,transition:x,children:S,shapeFlag:E}=u;if(E&6){Ge(u.component.subTree,d,g,_);return}if(E&128){u.suspense.move(d,g,_);return}if(E&64){P.move(u,d,g,dt);return}if(P===me){r(A,d,g);for(let I=0;Ix.enter(A),b);else{const{leave:I,delayLeave:D,afterLeave:V}=x,J=()=>r(A,d,g),G=()=>{I(A,()=>{J(),V&&V()})};D?D(A,J,G):G()}else r(A,d,g)},Pe=(u,d,g,_=!1,b=!1)=>{const{type:A,props:P,ref:x,children:S,dynamicChildren:E,shapeFlag:$,patchFlag:I,dirs:D}=u;if(x!=null&&xn(x,null,g,u,!0),$&256){d.ctx.deactivate(u);return}const V=$&1&&D,J=!vt(u);let G;if(J&&(G=P&&P.onVnodeBeforeUnmount)&&Ee(G,d,u),$&6)hi(u.component,g,_);else{if($&128){u.suspense.unmount(g,_);return}V&&Fe(u,null,d,"beforeUnmount"),$&64?u.type.remove(u,d,g,b,dt,_):E&&(A!==me||I>0&&I&64)?$e(E,d,g,!1,!0):(A===me&&I&384||!b&&$&16)&&$e(S,d,g),_&&Wr(u)}(J&&(G=P&&P.onVnodeUnmounted)||V)&&ge(()=>{G&&Ee(G,d,u),V&&Fe(u,null,d,"unmounted")},g)},Wr=u=>{const{type:d,el:g,anchor:_,transition:b}=u;if(d===me){di(g,_);return}if(d===Dt){p(u);return}const A=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:P,delayLeave:x}=b,S=()=>P(g,A);x?x(u.el,A,S):S()}else A()},di=(u,d)=>{let g;for(;u!==d;)g=m(u),s(u),u=g;s(d)},hi=(u,d,g)=>{const{bum:_,scope:b,update:A,subTree:P,um:x}=u;_&&pn(_),b.stop(),A&&(A.active=!1,Pe(P,u,d,g)),x&&ge(x,d),ge(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},$e=(u,d,g,_=!1,b=!1,A=0)=>{for(let P=A;Pu.shapeFlag&6?Zt(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el),Vr=(u,d,g)=>{u==null?d._vnode&&Pe(d._vnode,null,null,!0):T(d._vnode||null,u,d,null,null,null,g),rs(),vn(),d._vnode=u},dt={p:T,um:Pe,m:Ge,r:Wr,mt:oe,mc:v,pc:j,pbc:R,n:Zt,o:e};let Kn,Wn;return t&&([Kn,Wn]=t(dt)),{render:Vr,hydrate:Kn,createApp:Ul(Vr,Kn)}}function et({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ho(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Dr(e,t,n=!1){const r=e.children,s=t.children;if(U(r)&&U(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Gl=e=>e.__isTeleport,$t=e=>e&&(e.disabled||e.disabled===""),gs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,hr=(e,t)=>{const n=e&&e.to;return ne(n)?t?t(n):null:n},ec={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:f,pc:h,pbc:m,o:{insert:w,querySelector:C,createText:T,createComment:L}}=a,B=$t(t.props);let{shapeFlag:k,children:y,dynamicChildren:p}=t;if(e==null){const F=t.el=T(""),K=t.anchor=T("");w(F,n,r),w(K,n,r);const N=t.target=hr(t.props,C),v=t.targetAnchor=T("");N&&(w(v,N),i=i||gs(N));const M=(R,z)=>{k&16&&f(y,R,z,s,o,i,l,c)};B?M(n,K):N&&M(N,v)}else{t.el=e.el;const F=t.anchor=e.anchor,K=t.target=e.target,N=t.targetAnchor=e.targetAnchor,v=$t(e.props),M=v?n:K,R=v?F:N;if(i=i||gs(K),p?(m(e.dynamicChildren,p,M,s,o,i,l),Dr(e,t,!0)):c||h(e,t,M,R,s,o,i,l,!1),B)v?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):an(t,n,F,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const z=t.target=hr(t.props,C);z&&an(t,z,null,a,0)}else v&&an(t,K,N,a,1)}$o(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:m}=e;if(h&&o(f),i&&o(a),l&16){const w=i||!$t(m);for(let C=0;C0?Re||mt:null,nc(),Wt>0&&Re&&Re.push(e),e}function Ya(e,t,n,r,s,o){return jo(Uo(e,t,n,r,s,o,!0))}function Bo(e,t,n,r,s){return jo(re(e,t,n,r,s,!0))}function Tn(e){return e?e.__v_isVNode===!0:!1}function st(e,t){return e.type===t.type&&e.key===t.key}const Bn="__vInternal",ko=({key:e})=>e??null,gn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||le(e)||W(e)?{i:de,r:e,k:t,f:!!n}:e:null);function Uo(e,t=null,n=null,r=0,s=null,o=e===me?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ko(t),ref:t&&gn(t),scopeId:Hn,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:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:de};return l?(jr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),Wt>0&&!i&&Re&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Re.push(c),c}const re=rc;function rc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===To)&&(e=ve),Tn(e)){const l=Ze(e,t,!0);return n&&jr(l,n),Wt>0&&!o&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(hc(e)&&(e=e.__vccOpts),t){t=sc(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=Er(l)),ee(c)&&(ao(c)&&!U(c)&&(c=ae({},c)),t.style=wr(c))}const i=ne(e)?1:bl(e)?128:Gl(e)?64:ee(e)?4:W(e)?2:0;return Uo(e,t,n,r,s,i,o,!0)}function sc(e){return e?ao(e)||Bn in e?ae({},e):e:null}function Ze(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?oc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ko(l),ref:t&&t.ref?n&&s?U(s)?s.concat(gn(t)):[s,gn(t)]:gn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==me?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ze(e.ssContent),ssFallback:e.ssFallback&&Ze(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ko(e=" ",t=0){return re(Ct,null,e,t)}function Ja(e,t){const n=re(Dt,null,e);return n.staticCount=t,n}function Xa(e="",t=!1){return t?(Do(),Bo(ve,null,e)):re(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?re(ve):U(e)?re(me,null,e.slice()):typeof e=="object"?ze(e):re(Ct,null,String(e))}function ze(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ze(e)}function jr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(U(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),jr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(Bn in t)?t._ctx=de:s===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:de},n=32):(t=String(t),r&64?(n=16,t=[Ko(t)]):n=8);e.children=t,e.shapeFlag|=n}function oc(...e){const t={};for(let n=0;nie||de;let Br,pt,ys="__VUE_INSTANCE_SETTERS__";(pt=nr()[ys])||(pt=nr()[ys]=[]),pt.push(e=>ie=e),Br=e=>{pt.length>1?pt.forEach(t=>t(e)):pt[0](e)};const xt=e=>{Br(e),e.scope.on()},ct=()=>{ie&&ie.scope.off(),Br(null)};function Wo(e){return e.vnode.shapeFlag&4}let Tt=!1;function ac(e,t=!1){Tt=t;const{props:n,children:r}=e.vnode,s=Wo(e);Wl(e,n,s,t),zl(e,r);const o=s?uc(e,t):void 0;return Tt=!1,o}function uc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Nt(new Proxy(e.ctx,Ll));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?qo(e):null;xt(e),At();const o=Je(r,e,0,[e.props,s]);if(St(),ct(),zs(o)){if(o.then(ct,ct),t)return o.then(i=>{_s(e,i,t)}).catch(i=>{Jt(i,e,0)});e.asyncDep=o}else _s(e,o,t)}else Vo(e,t)}function _s(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=ho(t)),Vo(e,n)}let bs;function Vo(e,t,n){const r=e.type;if(!e.render){if(!t&&bs&&!r.render){const s=r.template||Hr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=ae(ae({isCustomElement:o,delimiters:l},i),c);r.render=bs(s,a)}}e.render=r.render||Oe}{xt(e),At();try{Hl(e)}finally{St(),ct()}}}function fc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ye(e,"get","$attrs"),t[n]}}))}function qo(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return fc(e)},slots:e.slots,emit:e.emit,expose:t}}function Un(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ho(Nt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ht)return Ht[n](e)},has(t,n){return n in t||n in Ht}}))}function dc(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function hc(e){return W(e)&&"__vccOpts"in e}const ue=(e,t)=>ll(e,t,Tt);function pr(e,t,n){const r=arguments.length;return r===2?ee(t)&&!U(t)?Tn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Tn(n)&&(n=[n]),re(e,t,n))}const pc=Symbol.for("v-scx"),gc=()=>wt(pc),mc="3.3.7",yc="http://www.w3.org/2000/svg",ot=typeof document<"u"?document:null,vs=ot&&ot.createElement("template"),_c={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?ot.createElementNS(yc,e):ot.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>ot.createTextNode(e),createComment:e=>ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{vs.innerHTML=r?`${e}`:e;const l=vs.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},We="transition",Pt="animation",Vt=Symbol("_vtc"),zo=(e,{slots:t})=>pr(Cl,bc(e),t);zo.displayName="Transition";const Yo={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};zo.props=ae({},vo,Yo);const tt=(e,t=[])=>{U(e)?e.forEach(n=>n(...t)):e&&e(...t)},ws=e=>e?U(e)?e.some(t=>t.length>1):e.length>1:!1;function bc(e){const t={};for(const O in e)O in Yo||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,C=vc(s),T=C&&C[0],L=C&&C[1],{onBeforeEnter:B,onEnter:k,onEnterCancelled:y,onLeave:p,onLeaveCancelled:F,onBeforeAppear:K=B,onAppear:N=k,onAppearCancelled:v=y}=t,M=(O,q,oe)=>{nt(O,q?f:l),nt(O,q?a:i),oe&&oe()},R=(O,q)=>{O._isLeaving=!1,nt(O,h),nt(O,w),nt(O,m),q&&q()},z=O=>(q,oe)=>{const fe=O?N:k,H=()=>M(q,O,oe);tt(fe,[q,H]),Es(()=>{nt(q,O?c:o),Ve(q,O?f:l),ws(fe)||Cs(q,r,T,H)})};return ae(t,{onBeforeEnter(O){tt(B,[O]),Ve(O,o),Ve(O,i)},onBeforeAppear(O){tt(K,[O]),Ve(O,c),Ve(O,a)},onEnter:z(!1),onAppear:z(!0),onLeave(O,q){O._isLeaving=!0;const oe=()=>R(O,q);Ve(O,h),Cc(),Ve(O,m),Es(()=>{O._isLeaving&&(nt(O,h),Ve(O,w),ws(p)||Cs(O,r,L,oe))}),tt(p,[O,oe])},onEnterCancelled(O){M(O,!1),tt(y,[O])},onAppearCancelled(O){M(O,!0),tt(v,[O])},onLeaveCancelled(O){R(O),tt(F,[O])}})}function vc(e){if(e==null)return null;if(ee(e))return[Jn(e.enter),Jn(e.leave)];{const t=Jn(e);return[t,t]}}function Jn(e){return vi(e)}function Ve(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Vt]||(e[Vt]=new Set)).add(t)}function nt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Vt];n&&(n.delete(t),n.size||(e[Vt]=void 0))}function Es(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let wc=0;function Cs(e,t,n,r){const s=e._endId=++wc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Ec(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,m),o()},m=w=>{w.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[C]||"").split(", "),s=r(`${We}Delay`),o=r(`${We}Duration`),i=xs(s,o),l=r(`${Pt}Delay`),c=r(`${Pt}Duration`),a=xs(l,c);let f=null,h=0,m=0;t===We?i>0&&(f=We,h=i,m=o.length):t===Pt?a>0&&(f=Pt,h=a,m=c.length):(h=Math.max(i,a),f=h>0?i>a?We:Pt:null,m=f?f===We?o.length:c.length:0);const w=f===We&&/\b(transform|all)(,|$)/.test(r(`${We}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:w}}function xs(e,t){for(;e.lengthTs(n)+Ts(e[r])))}function Ts(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Cc(){return document.body.offsetHeight}function xc(e,t,n){const r=e[Vt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const kr=Symbol("_vod"),Qa={beforeMount(e,{value:t},{transition:n}){e[kr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Mt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Mt(e,!0),r.enter(e)):r.leave(e,()=>{Mt(e,!1)}):Mt(e,t))},beforeUnmount(e,{value:t}){Mt(e,t)}};function Mt(e,t){e.style.display=t?e[kr]:"none"}function Tc(e,t,n){const r=e.style,s=ne(n);if(n&&!s){if(t&&!ne(t))for(const o in t)n[o]==null&&gr(r,o,"");for(const o in n)gr(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),kr in e&&(r.display=o)}}const As=/\s*!important$/;function gr(e,t,n){if(U(n))n.forEach(r=>gr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Ac(e,t);As.test(n)?e.setProperty(ft(r),n.replace(As,""),"important"):e[r]=n}}const Ss=["Webkit","Moz","ms"],Xn={};function Ac(e,t){const n=Xn[t];if(n)return n;let r=Ne(t);if(r!=="filter"&&r in e)return Xn[t]=r;r=On(r);for(let s=0;sQn||(Fc.then(()=>Qn=0),Qn=Date.now());function Lc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Nc(r,n.value),t,5,[r])};return n.value=e,n.attached=Ic(),n}function Nc(e,t){if(U(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Ms=/^on[a-z]/,Hc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?xc(e,r,s):t==="style"?Tc(e,n,r):Yt(t)?_r(t)||Pc(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):$c(e,t,r,s))?Rc(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Sc(e,t,r,s))};function $c(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Ms.test(t)&&W(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Ms.test(t)&&ne(n)?!1:t in e}const Fs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return U(t)?n=>pn(t,n):t};function Dc(e){e.target.composing=!0}function Is(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Zn=Symbol("_assign"),Za={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Zn]=Fs(s);const o=r||s.props&&s.props.type==="number";gt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=tr(l)),e[Zn](l)}),n&>(e,"change",()=>{e.value=e.value.trim()}),t||(gt(e,"compositionstart",Dc),gt(e,"compositionend",Is),gt(e,"change",Is))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e[Zn]=Fs(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&tr(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},jc=["ctrl","shift","alt","meta"],Bc={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)=>jc.some(n=>e[`${n}Key`]&&!t.includes(n))},Ga=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=ft(n.key);if(t.some(s=>s===r||kc[s]===r))return e(n)},Jo=ae({patchProp:Hc},_c);let Bt,Ls=!1;function Uc(){return Bt||(Bt=Xl(Jo))}function Kc(){return Bt=Ls?Bt:Ql(Jo),Ls=!0,Bt}const tu=(...e)=>{const t=Uc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Xo(r);if(!s)return;const o=t._component;!W(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},nu=(...e)=>{const t=Kc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Xo(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Xo(e){return ne(e)?document.querySelector(e):e}const ru=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Wc=window.__VP_SITE_DATA__;function Ur(e){return Zs()?(Oi(e),!0):!1}function Le(e){return typeof e=="function"?e():fo(e)}const Qo=typeof window<"u"&&typeof document<"u",Vc=Object.prototype.toString,qc=e=>Vc.call(e)==="[object Object]",qt=()=>{},Ns=zc();function zc(){var e;return Qo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Yc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const Zo=e=>e();function Jc(e,t={}){let n,r,s=qt;const o=l=>{clearTimeout(l),s(),s=qt};return l=>{const c=Le(e),a=Le(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function Xc(e=Zo){const t=ce(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Fn(t),pause:n,resume:r,eventFilter:s}}function Go(...e){if(e.length!==1)return sl(...e);const t=e[0];return typeof t=="function"?Fn(tl(()=>({get:t,set:qt}))):ce(t)}function ei(e,t,n={}){const{eventFilter:r=Zo,...s}=n;return Xe(e,Yc(r,t),s)}function Qc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Xc(r);return{stop:ei(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Zc(e,t=!0){kn()?Rt(e):t?e():In(e)}function su(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return ei(e,t,{...o,eventFilter:Jc(r,{maxWait:s})})}function ou(e,t,n){let r;le(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=qt}=r,c=ce(!s),a=i?Mr(t):ce(t);let f=0;return Ir(async h=>{if(!c.value)return;f++;const m=f;let w=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const C=await e(T=>{h(()=>{o&&(o.value=!1),w||T()})});m===f&&(a.value=C)}catch(C){l(C)}finally{o&&m===f&&(o.value=!1),w=!0}}),s?ue(()=>(c.value=!0,a.value)):a}function ti(e){var t;const n=Le(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Be=Qo?window:void 0;function zt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Be):[t,n,r,s]=e,!t)return qt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,m,w)=>(f.addEventListener(h,m,w),()=>f.removeEventListener(h,m,w)),c=Xe(()=>[ti(t),Le(s)],([f,h])=>{if(i(),!f)return;const m=qc(h)?{...h}:h;o.push(...n.flatMap(w=>r.map(C=>l(f,w,C,m))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Ur(a),a}function Gc(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function iu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Be,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Gc(t);return zt(s,o,f=>{f.repeat&&Le(l)||c(f)&&n(f)},i)}function ea(){const e=ce(!1);return kn()&&Rt(()=>{e.value=!0}),e}function ta(e){const t=ea();return ue(()=>(t.value,!!e()))}function na(e,t={}){const{window:n=Be}=t,r=ta(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=ce(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Ir(()=>{r.value&&(l(),s=n.matchMedia(Le(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Ur(()=>{c(),l(),s=void 0}),o}const un=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fn="__vueuse_ssr_handlers__",ra=sa();function sa(){return fn in un||(un[fn]=un[fn]||{}),un[fn]}function ni(e,t){return ra[e]||t}function oa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ia={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Hs="vueuse-storage";function Kr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=Be,eventFilter:m,onError:w=v=>{console.error(v)}}=r,C=(f?Mr:ce)(t);if(!n)try{n=ni("getDefaultStorage",()=>{var v;return(v=Be)==null?void 0:v.localStorage})()}catch(v){w(v)}if(!n)return C;const T=Le(t),L=oa(T),B=(s=r.serializer)!=null?s:ia[L],{pause:k,resume:y}=Qc(C,()=>p(C.value),{flush:o,deep:i,eventFilter:m});return h&&l&&(zt(h,"storage",N),zt(h,Hs,K)),N(),C;function p(v){try{if(v==null)n.removeItem(e);else{const M=B.write(v),R=n.getItem(e);R!==M&&(n.setItem(e,M),h&&h.dispatchEvent(new CustomEvent(Hs,{detail:{key:e,oldValue:R,newValue:M,storageArea:n}})))}}catch(M){w(M)}}function F(v){const M=v?v.newValue:n.getItem(e);if(M==null)return c&&T!==null&&n.setItem(e,B.write(T)),T;if(!v&&a){const R=B.read(M);return typeof a=="function"?a(R,T):L==="object"&&!Array.isArray(R)?{...T,...R}:R}else return typeof M!="string"?M:B.read(M)}function K(v){N(v.detail)}function N(v){if(!(v&&v.storageArea!==n)){if(v&&v.key==null){C.value=T;return}if(!(v&&v.key!==e)){k();try{(v==null?void 0:v.newValue)!==B.write(C.value)&&(C.value=F(v))}catch(M){w(M)}finally{v?In(y):y()}}}}}function la(e){return na("(prefers-color-scheme: dark)",e)}function ca(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Be,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=la({window:s}),w=ue(()=>m.value?"dark":"light"),C=c||(i==null?Go(r):Kr(i,r,o,{window:s,listenToStorageChanges:l})),T=ue(()=>C.value==="auto"?w.value:C.value),L=ni("updateHTMLAttrs",(p,F,K)=>{const N=typeof p=="string"?s==null?void 0:s.document.querySelector(p):ti(p);if(!N)return;let v;if(f){v=s.document.createElement("style");const M="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";v.appendChild(document.createTextNode(M)),s.document.head.appendChild(v)}if(F==="class"){const M=K.split(/\s/g);Object.values(h).flatMap(R=>(R||"").split(/\s/g)).filter(Boolean).forEach(R=>{M.includes(R)?N.classList.add(R):N.classList.remove(R)})}else N.setAttribute(F,K);f&&(s.getComputedStyle(v).opacity,document.head.removeChild(v))});function B(p){var F;L(t,n,(F=h[p])!=null?F:p)}function k(p){e.onChanged?e.onChanged(p,B):B(p)}Xe(T,k,{flush:"post",immediate:!0}),Zc(()=>k(T.value));const y=ue({get(){return a?C.value:T.value},set(p){C.value=p}});try{return Object.assign(y,{store:C,system:w,state:T})}catch{return y}}function aa(e={}){const{valueDark:t="dark",valueLight:n=""}=e,r=ca({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return ue({get(){return r.value==="dark"},set(o){const i=o?"dark":"light";r.system.value===i?r.value="auto":r.value=i}})}function Gn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function lu(e,t,n={}){const{window:r=Be}=n;return Kr(e,t,r==null?void 0:r.localStorage,n)}function ri(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}function cu(e,t=!1){const n=ce(t);let r=null,s;Xe(Go(e),l=>{const c=Gn(Le(l));if(c){const a=c;s=a.style.overflow,n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=Gn(Le(e));!l||n.value||(Ns&&(r=zt(l,"touchmove",c=>{ua(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Gn(Le(e));!l||!n.value||(Ns&&(r==null||r()),l.style.overflow=s,n.value=!1)};return Ur(i),ue({get(){return n.value},set(l){l?o():i()}})}function au(e,t,n={}){const{window:r=Be}=n;return Kr(e,t,r==null?void 0:r.sessionStorage,n)}function uu(e={}){const{window:t=Be}=e;if(!t)return{x:ce(0),y:ce(0)};const n=ce(t.scrollX),r=ce(t.scrollY);return zt(t,"scroll",()=>{n.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:n,y:r}}const si=/^[a-z]+:/i,fa="vitepress-theme-appearance",oi=/#.*$/,da=/(index)?\.(md|html)$/,Ce=typeof document<"u",ii={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ha(e,t,n=!1){if(t===void 0)return!1;if(e=$s(`/${e}`),n)return new RegExp(t).test(e);if($s(t)!==e)return!1;const r=t.match(oi);return r?(Ce?location.hash:"")===r[0]:!0}function $s(e){return decodeURI(e).replace(oi,"").replace(da,"")}function pa(e){return si.test(e)}function ga(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!pa(f)&&ha(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:ci(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function li(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ma(e.title,r);return`${n}${s}`}function ma(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ya(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function ci(e,t){return[...e.filter(n=>!ya(t,n)),...t]}const _a=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ba=/^[a-z]:/i;function Ds(e){const t=ba.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(_a,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const va=Symbol(),at=Mr(Wc);function fu(e){const t=ue(()=>ga(at.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ce(!0):n?aa({storageKey:fa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ce(!1);return{site:t,theme:ue(()=>t.value.themeConfig),page:ue(()=>e.data),frontmatter:ue(()=>e.data.frontmatter),params:ue(()=>e.data.params),lang:ue(()=>t.value.lang),dir:ue(()=>t.value.dir),localeIndex:ue(()=>t.value.localeIndex||"root"),title:ue(()=>li(t.value,e.data)),description:ue(()=>e.data.description||t.value.description),isDark:r}}function wa(){const e=wt(va);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ea(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function js(e){return si.test(e)||!e.startsWith("/")?e:Ea(at.value.base,e)}function Ca(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/";t=Ds(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Ds(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let mn=[];function du(e){mn.push(e),jn(()=>{mn=mn.filter(t=>t!==e)})}const xa=Symbol(),ai="http://a.com",Ta=()=>({path:"/",component:null,data:ii});function hu(e,t){const n=Mn(Ta()),r={route:n,go:s};async function s(l=Ce?location.href:"/"){var c,a;l=mr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(Us(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,ai),h=o=f.pathname;try{let w=await e(h);if(!w)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:C,__pageData:T}=w;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=Ce?h:js(h),n.component=Nt(C),n.data=Nt(T),Ce&&In(()=>{let L=at.value.base+T.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!at.value.cleanUrls&&!L.endsWith("/")&&(L+=".html"),L!==f.pathname&&(f.pathname=L,l=L+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let B=null;try{B=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(k){console.warn(k)}if(B){Bs(B,f.hash);return}}window.scrollTo(0,c)})}}catch(w){if(!/fetch|Page not found/.test(w.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(w),!a)try{const C=await fetch(at.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ce?h:js(h),n.component=t?Nt(t):null,n.data=ii)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:m,pathname:w,hash:C,search:T}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),L=window.location,B=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&m===L.origin&&!(B&&B[0]!==".html")&&(l.preventDefault(),w===L.pathname&&T===L.search?(C!==L.hash&&(history.pushState(null,"",C),window.dispatchEvent(new Event("hashchange"))),C?Bs(a,C,a.classList.contains("header-anchor")):(Us(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(mr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Aa(){const e=wt(xa);if(!e)throw new Error("useRouter() is called without provider.");return e}function ui(){return Aa().route}function Bs(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=at.value.scrollOffset,o=0,i=24;if(typeof s=="object"&&"padding"in s&&(i=s.padding,s=s.selector),typeof s=="number")o=s;else if(typeof s=="string")o=ks(s,i);else if(Array.isArray(s))for(const f of s){const h=ks(f,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-o+l;requestAnimationFrame(a)}}function ks(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function Us(e){Ce&&e!==mr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function mr(e){const t=new URL(e,ai);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),at.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Ks=()=>mn.forEach(e=>e()),pu=Lr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ui(),{site:n}=wa();return()=>pr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?pr(t.component,{onVnodeMounted:Ks,onVnodeUpdated:Ks}):"404 Page Not Found"])}}),Sa="modulepreload",Ra=function(e){return"/"+e},Ws={},gu=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=Ra(o),o in Ws)return;Ws[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let f=s.length-1;f>=0;f--){const h=s[f];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Sa,i||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),i)return new Promise((f,h)=>{a.addEventListener("load",f),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},mu=Lr({setup(e,{slots:t}){const n=ce(!1);return Rt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function yu(){Ce&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function _u(){if(Ce){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Oa(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 Oa(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 r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function bu(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}n.forEach(i=>document.head.removeChild(i)),n=[],o.forEach(i=>{const l=Vs(i);document.head.appendChild(l),n.push(l)})};Ir(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[];document.title=li(i,o);const a=l||i.description;let f=document.querySelector("meta[name=description]");f?f.setAttribute("content",a):Vs(["meta",{name:"description",content:a}]),s(ci(i.head,Ma(c)))})}function Vs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Pa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ma(e){return e.filter(t=>!Pa(t))}const er=new Set,fi=()=>document.createElement("link"),Fa=e=>{const t=fi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ia=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let dn;const La=Ce&&(dn=fi())&&dn.relList&&dn.relList.supports&&dn.relList.supports("prefetch")?Fa:Ia;function vu(){if(!Ce||!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 r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!er.has(c)){er.add(c);const a=Ca(c);a&&La(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):er.add(l))})})};Rt(r);const s=ui();Xe(()=>s.path,r),jn(()=>{n&&n.disconnect()})}export{Ga as $,Da as A,Ol as B,ka as C,Ka as D,Mr as E,me as F,du as G,re as H,Ua as I,si as J,ui as K,oc as L,wt as M,wr as N,In as O,uu as P,Ja as Q,Fn as R,iu as S,zo as T,Ba as U,gu as V,cu as W,Kl as X,Va as Y,eu as Z,ru as _,Ko as a,qa as a0,ja as a1,Qa as a2,bu as a3,xa as a4,fu as a5,va as a6,pu as a7,mu as a8,at as a9,nu as aa,hu as ab,Ca as ac,vu as ad,_u as ae,yu as af,pr as ag,ti as ah,Ur as ai,ou as aj,au as ak,lu as al,su as am,Aa as an,zt as ao,xo as ap,Za as aq,le as ar,za as as,Nt as at,tu as au,Bo as b,Ya as c,Lr as d,Xa as e,js as f,ue as g,ce as h,pa as i,Rt as j,Uo as k,fo as l,$a as m,Er as n,Do as o,Ha as p,ha as q,Wa as r,Ce as s,Na as t,wa as u,na as v,pl as w,Xe as x,Ir as y,jn as z}; diff --git a/assets/chunks/index.03b5fd27.js b/assets/chunks/index.0e6ad99c.js similarity index 69% rename from assets/chunks/index.03b5fd27.js rename to assets/chunks/index.0e6ad99c.js index c7192d8..d26894a 100644 --- a/assets/chunks/index.03b5fd27.js +++ b/assets/chunks/index.0e6ad99c.js @@ -1 +1 @@ -import{o as i,c as a,k as m,N as o,a as p,t as e,e as r}from"./framework.1f7cb35e.js";const h={align:"center",class:"mb-4"},n=["href"],l=["src","alt"],_=["href"],d=["src","alt"],s={key:2},x=m("br",null,null,-1),g=["href"],u={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},v={__name:"ImageComponent",props:["options"],setup(t){return(c,w)=>(i(),a("div",h,[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,l)],8,n)):(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,_)),t.options.caption?(i(),a("figcaption",s,[x,p(" "+e(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",u,e(t.options.caption_link),1)],8,g)):r("",!0)])):r("",!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;"},upload_firmware_build_button:{url:"https://i.imgur.com/5E5u5Jz.png",alt:"'Selecting platformio environment'",max_width:"max-width: 600px;"},upload_firmware_webpage:{url:"https://i.imgur.com/wMXdZcJ.png",alt:"'Firmware uploading web page'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory:{url:"https://i.imgur.com/KnnB28z.png",alt:"'An example of how the bin file directory looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory_file:{url:"https://i.imgur.com/Ujx3iaG.png",alt:"'An example of how the bin file looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_upload_finished:{url:"https://i.imgur.com/O2KzHAN.png",alt:"'A finished OTA upload'",max_width:"max-width: 600px;"},upload_firmware_select_env:{url:"https://i.imgur.com/8sn6FSe.png",alt:"'An example of how the popup list of envs looks like'",max_width:"max-width: 600px;"},upload_firmware_select_env_dropdown:{url:"https://i.imgur.com/nRpuBSI.png",alt:"'An example of how the button for selecting env looks like'",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/fJs4GJR.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;"},unity_vrc_expressions:{url:"https://i.imgur.com/hdbJQ0h.png",alt:"Screenshot showing expressions section of vrc avatar descriptor",max_width:"max-width: 600px;"},unity_vrc_expressions_add_fields:{url:"https://i.imgur.com/VGA0zqb.png",alt:"Screenshot showing adding parameters to parameter menu",max_width:"max-width: 600px;"},unity_vrc_expressions_fields:{url:"https://i.imgur.com/hkcT013.png",alt:"Screenshot showing the params that need to be added",max_width:"max-width: 600px;"},unity_vrc_empty_control:{url:"https://i.imgur.com/PluHjmI.png",alt:"Screenshot showing the the empty controls field",max_width:"max-width: 600px;"},unity_vrc_control_setup:{url:"https://i.imgur.com/XgN2230.png",alt:"Screenshot showing the the controls setup",max_width:"max-width: 600px;"},V4_wire_sketch:{url:"https://i.imgur.com/OWSh6WM.png",alt:"Sketch of V4 wireing",max_width:"max-width: 600px;"},V4_solder_wire:{url:"https://i.imgur.com/yB9e92o.jpg",alt:"Sketch of V4 wire",max_width:"max-width: 400px;"},esp_board_env:{url:"https://i.imgur.com/5BbQmCE.gif",alt:"GIF showing a switch of board enviroments.",max_width:"max-width: 600px;"}};export{v as _,b as i}; +import{o as i,c as a,k as m,N as o,a as p,t as e,e as r}from"./framework.e4c952c1.js";const h={align:"center",class:"mb-4"},n=["href"],l=["src","alt"],_=["href"],d=["src","alt"],s={key:2},x=m("br",null,null,-1),g=["href"],u={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},v={__name:"ImageComponent",props:["options"],setup(t){return(c,w)=>(i(),a("div",h,[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,l)],8,n)):(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,_)),t.options.caption?(i(),a("figcaption",s,[x,p(" "+e(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",u,e(t.options.caption_link),1)],8,g)):r("",!0)])):r("",!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;"},upload_firmware_build_button:{url:"https://i.imgur.com/5E5u5Jz.png",alt:"'Selecting platformio environment'",max_width:"max-width: 600px;"},upload_firmware_webpage:{url:"https://i.imgur.com/wMXdZcJ.png",alt:"'Firmware uploading web page'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory:{url:"https://i.imgur.com/KnnB28z.png",alt:"'An example of how the bin file directory looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory_file:{url:"https://i.imgur.com/Ujx3iaG.png",alt:"'An example of how the bin file looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_upload_finished:{url:"https://i.imgur.com/O2KzHAN.png",alt:"'A finished OTA upload'",max_width:"max-width: 600px;"},upload_firmware_select_env:{url:"https://i.imgur.com/8sn6FSe.png",alt:"'An example of how the popup list of envs looks like'",max_width:"max-width: 600px;"},upload_firmware_select_env_dropdown:{url:"https://i.imgur.com/nRpuBSI.png",alt:"'An example of how the button for selecting env looks like'",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/fJs4GJR.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 Awaiting 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;"},unity_vrc_expressions:{url:"https://i.imgur.com/hdbJQ0h.png",alt:"Screenshot showing expressions section of vrc avatar descriptor",max_width:"max-width: 600px;"},unity_vrc_expressions_add_fields:{url:"https://i.imgur.com/VGA0zqb.png",alt:"Screenshot showing adding parameters to parameter menu",max_width:"max-width: 600px;"},unity_vrc_expressions_fields:{url:"https://i.imgur.com/hkcT013.png",alt:"Screenshot showing the params that need to be added",max_width:"max-width: 600px;"},unity_vrc_empty_control:{url:"https://i.imgur.com/PluHjmI.png",alt:"Screenshot showing the the empty controls field",max_width:"max-width: 600px;"},unity_vrc_control_setup:{url:"https://i.imgur.com/XgN2230.png",alt:"Screenshot showing the the controls setup",max_width:"max-width: 600px;"},V4_wire_sketch:{url:"https://i.imgur.com/OWSh6WM.png",alt:"Sketch of V4 wiring",max_width:"max-width: 600px;"},V4_solder_wire:{url:"https://i.imgur.com/yB9e92o.jpg",alt:"Sketch of V4 wire",max_width:"max-width: 400px;"},esp_board_env:{url:"https://i.imgur.com/5BbQmCE.gif",alt:"GIF showing a switch of board environments.",max_width:"max-width: 600px;"},flashing_tool:{url:"https://docs.eyetrackvr.dev/imgs/flashing_tool.png",alt:"Flashing Tool ui",max_width:"max-width: 600px;"},flashing_tool_1:{url:"https://docs.eyetrackvr.dev/imgs/flashing_tool_1.png",alt:"Flashing Tool ui lower half",max_width:"max-width: 600px;"}};export{v as _,b as i}; diff --git a/assets/chunks/index.2510e13f.js b/assets/chunks/index.8ad7dc66.js similarity index 97% rename from assets/chunks/index.2510e13f.js rename to assets/chunks/index.8ad7dc66.js index 54d2a1c..85c1987 100644 --- a/assets/chunks/index.2510e13f.js +++ b/assets/chunks/index.8ad7dc66.js @@ -1 +1 @@ -import{C as n,o as r,c as s,k as e,H as i,t as _,n as o,r as x}from"./framework.1f7cb35e.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,p)=>{const a=n("Badge");return r(),s("div",c,[e("div",null,[e("span",d,[i(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])},_(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[x(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{C as n,o as r,c as s,k as e,H as i,t as _,n as o,r as x}from"./framework.e4c952c1.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,p)=>{const a=n("Badge");return r(),s("div",c,[e("div",null,[e("span",d,[i(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])},_(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[x(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/theme.3f27bc77.js b/assets/chunks/theme.bd876814.js similarity index 87% rename from assets/chunks/theme.3f27bc77.js rename to assets/chunks/theme.bd876814.js index e58ccf2..f97f38d 100644 --- a/assets/chunks/theme.3f27bc77.js +++ b/assets/chunks/theme.bd876814.js @@ -1 +1 @@ -import{d as g,o as a,c as r,r as u,a as A,t as L,n as I,_ as m,b,w as v,e as h,T as ue,u as De,i as Ee,f as de,g as P,h as C,j as K,k as c,l as i,p as z,m as x,q as j,s as W,v as re,x as q,y as te,z as _e,A as we,B as Fe,C as R,F as N,D as H,E as ve,G as Y,H as f,I as U,J as Le,K as se,L as Z,M as ne,N as Oe,O as Ge,P as Se,Q as Ue,R as je,S as ye,U as Ke,V as qe,W as Me,X as Te,Y as Re,Z as We,$ as Ye,a0 as Xe}from"./framework.1f7cb35e.js";const Je=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),r("span",{class:I(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const Ze=m(Je,[["__scopeId","data-v-4415f8bd"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),b(ue,{name:"fade"},{default:v(()=>[e.show?(a(),r("div",Qe)):h("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-b2600058"]]),V=De;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function X(s){if(Ee(s))return s;const{site:e}=V(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return de(l)}function J({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=V(),d=P(()=>{var _,$;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,$])=>s&&d.value.label===$.label?[]:{text:$.label,link:nt($.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(z("data-v-572b3891"),s=s(),x(),s),at={class:"NotFound"},lt={class:"code"},rt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=V(),{localeLinks:n}=J({removeCurrent:!1}),o=C("/");return K(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,$,w,S;return a(),r("div",at,[c("p",lt,L(((p=i(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",rt,L(((_=i(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,L((($=i(t).notFound)==null?void 0:$.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:i(de)(o.value),"aria-label":((w=i(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=i(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-572b3891"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(ie(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ce(s,e){return Array.isArray(e)?e.some(t=>ce(s,t)):j(s,e.link)?!0:e.items?ce(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function O(){const{frontmatter:s,page:e,theme:t}=V(),n=re("(min-width: 960px)"),o=C(!1),l=P(()=>{const T=t.value.sidebar,y=e.value.relativePath;return T?Ie(T,y):[]}),d=C(l.value);q(l,(T,y)=>{JSON.stringify(T)!==JSON.stringify(y)&&(d.value=l.value)});const p=P(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=P(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=P(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),w=P(()=>p.value&&n.value),S=P(()=>p.value?pt(d.value):[]);function B(){o.value=!0}function k(){o.value=!1}function M(){o.value?k():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:p,hasAside:$,leftAside:_,isSidebarEnabled:w,open:B,close:k,toggle:M}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",n)}),_e(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ce=C(W?location.hash:"");W&&window.addEventListener("hashchange",()=>{Ce.value=location.hash});function mt(s){const{page:e}=V(),t=C(!1),n=P(()=>s.value.collapsed!=null),o=P(()=>!!s.value.link),l=C(!1),d=()=>{l.value=j(e.value.relativePath,s.value.link)};q([e,s,Ce],d),K(d);const p=P(()=>l.value?!0:s.value.items?ce(e.value.relativePath,s.value.items):!1),_=P(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(l.value||p.value)&&(t.value=!1)});function $(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:$}}function gt(){const{hasSidebar:s}=O(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const $t=71;function pe(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function he(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:bt(t),link:"#"+t.id,level:n}});return kt(e,s)}function bt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const $=s[_];if($.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),Fe(()=>{d(location.hash)}),_e(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>p.some(M=>M.hash===k.hash&&k.offsetParent!==null)),$=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs($+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let k=0;k<_.length;k++){const M=_[k],T=_[k+1],[y,E]=Pt(k,M,T);if(y){d(E);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-$t}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),r("ul",{class:I(t.root?"root":"nested")},[(a(!0),r(N,null,H(t.headers,({children:l,link:d,title:p})=>(a(),r("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Vt),l!=null&&l.length?(a(),b(o,{key:0,headers:l},null,8,["headers"])):h("",!0)]))),256))],2)}}});const fe=m(wt,[["__scopeId","data-v-74479eb5"]]),Lt=s=>(z("data-v-d8517c5e"),s=s(),x(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Tt={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ct=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),n=ve([]);Y(()=>{n.value=he(e.value.outline??t.value.outline)});const o=C(),l=C();return yt(o,l),(d,p)=>(a(),r("div",{class:I(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Mt,L(i(pe)(i(t))),1),c("nav",Tt,[It,f(fe,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Nt=m(Ct,[["__scopeId","data-v-d8517c5e"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),r("div",Bt,[f(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ht=s=>(z("data-v-79cae1a0"),s=s(),x(),s),zt={class:"VPDocAside"},xt=Ht(()=>c("div",{class:"spacer"},null,-1)),Dt=g({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,n)=>(a(),r("div",zt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),f(Nt),u(t.$slots,"aside-outline-after",{},void 0,!0),xt,u(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),b(At,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Et=m(Dt,[["__scopeId","data-v-79cae1a0"]]);function Ft(){const{theme:s,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=V();return P(()=>{var _,$,w,S,B,k,M,T;const n=Ie(e.value.sidebar,s.value.relativePath),o=ht(n),l=o.findIndex(y=>j(s.value.relativePath,y.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=(($=e.value.docFooter)==null?void 0:$.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((k=o[l+1])==null?void 0:k.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((T=o[l+1])==null?void 0:T.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("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),Kt=c("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),qt=[jt,Kt];function Rt(s,e){return a(),r("svg",Ut,qt)}const Wt=m(Gt,[["render",Rt]]),D=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&Le.test(e.href));return(o,l)=>(a(),b(U(t.value),{class:I(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?i(X)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Xt=["datetime"],Jt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=V(),l=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),p=C("");return K(()=>{te(()=>{var _,$,w;p.value=new Intl.DateTimeFormat(($=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&$.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,$)=>{var w;return a(),r("p",Yt,[A(L(((w=i(e).lastUpdated)==null?void 0:w.text)||i(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Xt)])}}});const Zt=m(Jt,[["__scopeId","data-v-5be60f87"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=V(),o=Ft(),l=Ot(),d=P(()=>e.value.editLink&&n.value.editLink!==!1),p=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=P(()=>d.value||p.value||l.value.prev||l.value.next);return($,w)=>{var S,B,k,M,T,y;return _.value?(a(),r("footer",Qt,[u($.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),r("div",es,[d.value?(a(),r("div",ts,[f(D,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:v(()=>[f(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(i(o).text),1)]),_:1},8,["href"])])):h("",!0),p.value?(a(),r("div",ss,[f(Zt)])):h("",!0)])):h("",!0),(S=i(l).prev)!=null&&S.link||(B=i(l).next)!=null&&B.link?(a(),r("nav",ns,[c("div",os,[(k=i(l).prev)!=null&&k.link?(a(),r("a",{key:0,class:"pager-link prev",href:i(X)(i(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=i(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:i(l).prev.text},null,8,rs)],8,as)):h("",!0)]),c("div",is,[(T=i(l).next)!=null&&T.link?(a(),r("a",{key:0,class:"pager-link next",href:i(X)(i(l).next.link)},[c("span",{class:"desc",innerHTML:((y=i(e).docFooter)==null?void 0:y.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:i(l).next.text},null,8,ds)],8,cs)):h("",!0)])])):h("",!0)])):h("",!0)}}});const vs=m(_s,[["__scopeId","data-v-67de71aa"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),r("svg",hs,ms)}const me=m(ps,[["render",gs]]),$s={key:0,class:"VPDocOutlineDropdown"},bs={key:0,class:"items"},ks=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=V(),n=C(!1);Y(()=>{n.value=!1});const o=ve([]);return Y(()=>{o.value=he(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),r("div",$s,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:I({open:n.value})},[A(L(i(pe)(i(t)))+" ",1),f(me,{class:"icon"})],2),n.value?(a(),r("div",bs,[f(fe,{headers:o.value},null,8,["headers"])])):h("",!0)])):h("",!0)}});const ys=m(ks,[["__scopeId","data-v-3686ba1c"]]),Ps=s=>(z("data-v-281cfc61"),s=s(),x(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Ts={class:"content-container"},Is={class:"main"},Cs=g({__name:"VPDoc",setup(s){const{theme:e}=V(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=O(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const $=R("Content");return a(),r("div",{class:I(["VPDoc",{"has-sidebar":i(n),"has-aside":i(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[i(o)?(a(),r("div",{key:0,class:I(["aside",{"left-aside":i(l)}])},[ws,c("div",Ls,[c("div",Ss,[f(Et,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),c("div",Ms,[c("div",Ts,[u(p.$slots,"doc-before",{},void 0,!0),f(ys),c("main",Is,[f($,{class:I(["vp-doc",[d.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Ns=m(Cs,[["__scopeId","data-v-281cfc61"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=P(()=>e.href&&Le.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),b(U(n.value),{class:I(["VPButton",[o.size,o.theme]]),href:o.href?i(X)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-de3c2b62"]]),Hs=["src","alt"],zs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),r(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),r("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Hs)):(a(),r(N,{key:1},[f(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),f(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}});const ee=m(zs,[["__scopeId","data-v-4d414b82"]]),xs=s=>(z("data-v-3d564967"),s=s(),x(),s),Ds={class:"container"},Es={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},Ks={key:0,class:"image"},qs={class:"image-container"},Rs=xs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),r("div",{class:I(["VPHero",{"has-image":t.image||i(e)}])},[c("div",Ds,[c("div",Es,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),r("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):h("",!0),t.text?(a(),r("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):h("",!0),t.tagline?(a(),r("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):h("",!0)],!0),t.actions?(a(),r("div",js,[(a(!0),r(N,null,H(t.actions,o=>(a(),r("div",{key:o.link,class:"action"},[f(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):h("",!0)]),t.image||i(e)?(a(),r("div",Ks,[c("div",qs,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),b(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-3d564967"]]),Xs=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,n)=>i(e).hero?(a(),b(Ys,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Js={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("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),en=[Qs];function tn(s,e){return a(),r("svg",Zs,en)}const sn=m(Js,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],ln=["innerHTML"],rn=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),b(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),r("div",on,[f(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),b(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),r("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):h("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),r("p",{key:3,class:"details",innerHTML:e.details},null,8,rn)):h("",!0),e.linkText?(a(),r("div",cn,[c("p",un,[A(L(e.linkText)+" ",1),f(sn,{class:"link-text-icon"})])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-c552d5c5"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=P(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),r("div",vn,[c("div",pn,[c("div",hn,[(a(!0),r(N,null,H(n.features,l=>(a(),r("div",{key:l.title,class:I(["item",[t.value]])},[f(_n,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}});const mn=m(fn,[["__scopeId","data-v-1da4ff3d"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,n)=>i(e).features?(a(),b(mn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),$n={class:"VPHome"},bn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),r("div",$n,[u(e.$slots,"home-hero-before",{},void 0,!0),f(Xs,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),f(gn),u(e.$slots,"home-features-after",{},void 0,!0),f(n)])}}});const kn=m(bn,[["__scopeId","data-v-8ebac4ee"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=R("Content");return a(),r("div",Pn,[u(s.$slots,"page-top"),f(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=O();return(o,l)=>(a(),r("div",{class:I(["VPContent",{"has-sidebar":i(n),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[f(vt)],!0):i(t).layout==="page"?(a(),b(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),b(kn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),b(U(i(t).layout),{key:3})):(a(),b(Ns,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-b7946bfc"]]),Mn={class:"container"},Tn=["innerHTML"],In=["innerHTML"],Cn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=O();return(o,l)=>i(e).footer&&i(t).footer!==!1?(a(),r("footer",{key:0,class:I(["VPFooter",{"has-sidebar":i(n)}])},[c("div",Mn,[i(e).footer.message?(a(),r("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,Tn)):h("",!0),i(e).footer.copyright?(a(),r("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,In)):h("",!0)])],2)):h("",!0)}});const Nn=m(Cn,[["__scopeId","data-v-04a39284"]]),Bn={class:"header"},An={class:"outline"},Hn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),n=C(!1),o=C(0),l=C();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p($){$.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ge(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(a(),r("div",{class:"VPLocalNavOutlineDropdown",style:Oe({"--vp-vh":o.value+"px"})},[$.headers.length>0?(a(),r("button",{key:0,onClick:d,class:I({open:n.value})},[A(L(i(pe)(i(t)))+" ",1),f(me,{class:"icon"})],2)):(a(),r("button",{key:1,onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)),f(ue,{name:"flyout"},{default:v(()=>[n.value?(a(),r("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[f(fe,{headers:$.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}});const zn=m(Hn,[["__scopeId","data-v-2c1007a4"]]),xn={},Dn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},En=c("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),Fn=c("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),On=c("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),Gn=c("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),Un=[En,Fn,On,Gn];function jn(s,e){return a(),r("svg",Dn,Un)}const Kn=m(xn,[["render",jn]]),qn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=O(),{y:o}=Se(),l=ve([]),d=C(0);K(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{l.value=he(t.value.outline??e.value.outline)});const p=P(()=>l.value.length===0&&!n.value),_=P(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return($,w)=>i(t).layout!=="home"&&(!p.value||i(o)>=d.value)?(a(),r("div",{key:0,class:I(_.value)},[i(n)?(a(),r("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[f(Kn,{class:"menu-icon"}),c("span",Rn,L(i(e).sidebarMenuLabel||"Menu"),1)],8,qn)):h("",!0),f(zn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):h("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-3c3d80ab"]]);function Xn(){const s=C(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return q(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Jn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),r("button",Zn,[c("span",Qn,[s.$slots.default?(a(),r("span",eo,[u(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const so=m(Jn,[["render",to],["__scopeId","data-v-0b5e260c"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("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),lo=[ao];function ro(s,e){return a(),r("svg",oo,lo)}const io=m(no,[["render",ro]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Ue('',9),vo=[_o];function po(s,e){return a(),r("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=V(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),b(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(t)},{default:v(()=>[f(ho,{class:"sun"}),f(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const ge=m(fo,[["__scopeId","data-v-fdee46ce"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"?(a(),r("div",mo,[f(ge)])):h("",!0)}});const $o=m(go,[["__scopeId","data-v-f774fc1d"]]),$e=C();let Ne=!1,le=0;function bo(s){const e=C(!1);if(W){!Ne&&ko(),le++;const t=q($e,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});_e(()=>{t(),le--,le||yo()})}return je(e)}function ko(){document.addEventListener("focusin",Be),Ne=!0,$e.value=document.activeElement}function yo(){document.removeEventListener("focusin",Be)}function Be(){$e.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("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),Lo=[wo];function So(s,e){return a(),r("svg",Vo,Lo)}const Ae=m(Po,[["render",So]]),Mo={},To={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),No=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,Co,No];function Ao(s,e){return a(),r("svg",To,Bo)}const Ho=m(Mo,[["render",Ao]]),zo={class:"VPMenuLink"},xo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),r("div",zo,[f(D,{class:I({active:i(j)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(xo,[["__scopeId","data-v-71c5411b"]]),Do={class:"VPMenuGroup"},Eo={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),r("div",Do,[e.text?(a(),r("p",Eo,L(e.text),1)):h("",!0),(a(!0),r(N,null,H(e.items,n=>(a(),r(N,null,["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):h("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-2bec9359"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),r("div",Go,[e.items?(a(),r("div",Uo,[(a(!0),r(N,null,H(e.items,n=>(a(),r(N,{key:n.text},["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):(a(),b(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ko=m(jo,[["__scopeId","data-v-7bffa9cd"]]),qo=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Xo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=C(!1),t=C();bo({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),r("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),r("span",Ro,[o.icon?(a(),b(U(o.icon),{key:0,class:"option-icon"})):h("",!0),o.button?(a(),r("span",{key:1,innerHTML:o.button},null,8,Wo)):h("",!0),f(Ae,{class:"text-icon"})])):(a(),b(Ho,{key:1,class:"icon"}))],8,qo),c("div",Yo,[f(Ko,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Xo,[["__scopeId","data-v-1a2ceba0"]]),Jo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=P(()=>typeof e.icon=="object"?e.icon.svg:Jo[e.icon]);return(n,o)=>(a(),r("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-efc53bd4"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),r("div",ta,[(a(!0),r(N,null,H(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),b(ea,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const ae=m(sa,[["__scopeId","data-v-f2234a39"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},la={class:"item appearance"},ra={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:o}=J({correspondingLink:!0}),l=P(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),b(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[i(n).length&&i(o).label?(a(),r("div",na,[c("p",oa,L(i(o).label),1),(a(!0),r(N,null,H(i(n),_=>(a(),b(oe,{key:_.link,item:_},null,8,["item"]))),128))])):h("",!0),i(e).appearance?(a(),r("div",aa,[c("div",la,[c("p",ra,L(i(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[f(ge)])])])):h("",!0),i(t).socialLinks?(a(),r("div",ca,[c("div",ua,[f(ae,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}});const _a=m(da,[["__scopeId","data-v-47bb42ad"]]),va=s=>(z("data-v-670493dd"),s=s(),x(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),r("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-670493dd"]]),$a=["innerHTML"],ba=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),b(D,{class:I({VPNavBarMenuLink:!0,active:i(j)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,$a)]),_:1},8,["class","href","target","rel"]))}});const ka=m(ba,[["__scopeId","data-v-97d30ef6"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),n=l=>"link"in l?j(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=P(()=>n(e.item));return(l,d)=>(a(),b(be,{class:I({VPNavBarMenuGroup:!0,active:i(j)(i(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Pa=s=>(z("data-v-c6c3e6d4"),s=s(),x(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,n)=>i(e).nav?(a(),r("nav",Va,[wa,(a(!0),r(N,null,H(i(e).nav,o=>(a(),r(N,{key:o.text},["link"in o?(a(),b(ka,{key:0,item:o},null,8,["item"])):(a(),b(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):h("",!0)}});const Sa=m(La,[["__scopeId","data-v-c6c3e6d4"]]);const Ma={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Ta={class:"DocSearch-Button-Container"},Ia=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ca={class:"DocSearch-Button-Placeholder"},Na=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),r("button",Ma,[c("span",Ta,[Ia,c("span",Ca,L(e.placeholder),1)]),Na]))}});const Ba={class:"VPNavBarSearch"},Aa={id:"local-search"},Ha={key:1,id:"docsearch"},za=g({__name:"VPNavBarSearch",setup(s){const e=Ke(()=>qe(()=>import("./VPLocalSearchBox.03f5fd54.js"),["assets/chunks/VPLocalSearchBox.03f5fd54.js","assets/chunks/framework.1f7cb35e.js"])),t=()=>null,{theme:n,localeIndex:o}=V(),l=C(!1),d=C(!1),p=P(()=>{var M,T,y,E,G,F,ke;const k=((M=n.value.search)==null?void 0:M.options)??n.value.algolia;return((G=(E=(y=(T=k==null?void 0:k.locales)==null?void 0:T[o.value])==null?void 0:y.translations)==null?void 0:E.button)==null?void 0:G.buttonText)||((ke=(F=k==null?void 0:k.translations)==null?void 0:F.button)==null?void 0:ke.buttonText)||"Search"});K(()=>{});function _(){l.value||(l.value=!0,setTimeout($,16))}function $(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||$()},16)}function w(k){const M=k.target,T=M.tagName;return M.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const S=C(!1);ye("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),S.value=!0)}),ye("/",k=>{w(k)||(k.preventDefault(),S.value=!0)});const B="local";return(k,M)=>{var T;return a(),r("div",Ba,[i(B)==="local"?(a(),r(N,{key:0},[S.value?(a(),b(i(e),{key:0,placeholder:p.value,onClose:M[0]||(M[0]=y=>S.value=!1)},null,8,["placeholder"])):h("",!0),c("div",Aa,[f(Ve,{placeholder:p.value,onClick:M[1]||(M[1]=y=>S.value=!0)},null,8,["placeholder"])])],64)):i(B)==="algolia"?(a(),r(N,{key:1},[l.value?(a(),b(i(t),{key:0,algolia:((T=i(n).search)==null?void 0:T.options)??i(n).algolia,onVnodeBeforeMount:M[2]||(M[2]=y=>d.value=!0)},null,8,["algolia"])):h("",!0),d.value?h("",!0):(a(),r("div",Ha,[f(Ve,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):h("",!0)])}}});const xa=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>i(e).socialLinks?(a(),b(ae,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}});const Da=m(xa,[["__scopeId","data-v-08b35e6f"]]),Ea=["href"],Fa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:n}=O(),{currentLang:o}=J();return(l,d)=>(a(),r("div",{class:I(["VPNavBarTitle",{"has-sidebar":i(n)}])},[c("a",{class:"title",href:i(t).logoLink??i(X)(i(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),b(ee,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(a(),r(N,{key:1},[A(L(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(a(),r(N,{key:2},[A(L(i(e).title),1)],64)):h("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ea)],2))}});const Oa=m(Fa,[["__scopeId","data-v-2d6ff155"]]),Ga={},Ua={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("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),qa=[ja,Ka];function Ra(s,e){return a(),r("svg",Ua,qa)}const He=m(Ga,[["render",Ra]]),Wa={class:"items"},Ya={class:"title"},Xa=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:n}=J({correspondingLink:!0});return(o,l)=>i(t).length&&i(n).label?(a(),b(be,{key:0,class:"VPNavBarTranslations",icon:He,label:i(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Wa,[c("p",Ya,L(i(n).label),1),(a(!0),r(N,null,H(i(t),d=>(a(),b(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}});const Ja=m(Xa,[["__scopeId","data-v-3bf1c934"]]),Za=s=>(z("data-v-dfeca417"),s=s(),x(),s),Qa={class:"container"},el={class:"title"},tl={class:"content"},sl=Za(()=>c("div",{class:"curtain"},null,-1)),nl={class:"content-body"},ol=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=O(),{frontmatter:n}=V(),o=C({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),r("div",{class:I(["VPNavBar",o.value])},[c("div",Qa,[c("div",el,[f(Oa,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",tl,[sl,c("div",nl,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),f(za,{class:"search"}),f(Sa,{class:"menu"}),f(Ja,{class:"translations"}),f($o,{class:"appearance"}),f(Da,{class:"social-links"}),f(_a,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),f(ga,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const al=m(ol,[["__scopeId","data-v-dfeca417"]]),ll={key:0,class:"VPNavScreenAppearance"},rl={class:"text"},il=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(n,o)=>i(e).appearance?(a(),r("div",ll,[c("p",rl,L(i(t).darkModeSwitchLabel||"Appearance"),1),f(ge)])):h("",!0)}});const cl=m(il,[["__scopeId","data-v-8d2d8cf1"]]),ul=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const dl=m(ul,[["__scopeId","data-v-083b71b4"]]),_l={},vl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=c("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),hl=[pl];function fl(s,e){return a(),r("svg",vl,hl)}const ml=m(_l,[["render",fl]]),gl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const ze=m(gl,[["__scopeId","data-v-ed7bb82d"]]),$l={class:"VPNavScreenMenuGroupSection"},bl={key:0,class:"title"},kl=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),r("div",$l,[e.text?(a(),r("p",bl,L(e.text),1)):h("",!0),(a(!0),r(N,null,H(e.items,n=>(a(),b(ze,{key:n.text,item:n},null,8,["item"]))),128))]))}});const yl=m(kl,[["__scopeId","data-v-836cddb8"]]),Pl=["aria-controls","aria-expanded"],Vl={class:"button-text"},wl=["id"],Ll={key:1,class:"group"},Sl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=C(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),r("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Vl,L(l.text),1),f(ml,{class:"button-icon"})],8,Pl),c("div",{id:n.value,class:"items"},[(a(!0),r(N,null,H(l.items,p=>(a(),r(N,{key:p.text},["link"in p?(a(),r("div",{key:p.text,class:"item"},[f(ze,{item:p},null,8,["item"])])):(a(),r("div",Ll,[f(yl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,wl)],2))}});const Ml=m(Sl,[["__scopeId","data-v-31b21668"]]),Tl={key:0,class:"VPNavScreenMenu"},Il=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,n)=>i(e).nav?(a(),r("nav",Tl,[(a(!0),r(N,null,H(i(e).nav,o=>(a(),r(N,{key:o.text},["link"in o?(a(),b(dl,{key:0,item:o},null,8,["item"])):(a(),b(Ml,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Cl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>i(e).socialLinks?(a(),b(ae,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),Nl={class:"list"},Bl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=J({correspondingLink:!0}),n=C(!1);function o(){n.value=!n.value}return(l,d)=>i(e).length&&i(t).label?(a(),r("div",{key:0,class:I(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[f(He,{class:"icon lang"}),A(" "+L(i(t).label)+" ",1),f(Ae,{class:"icon chevron"})]),c("ul",Nl,[(a(!0),r(N,null,H(i(e),p=>(a(),r("li",{key:p.link,class:"item"},[f(D,{class:"link",href:p.link},{default:v(()=>[A(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}});const Al=m(Bl,[["__scopeId","data-v-b72581fd"]]),Hl={class:"container"},zl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=C(null),t=Me(W?document.body:null);return(n,o)=>(a(),b(ue,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),r("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Hl,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),f(Il,{class:"menu"}),f(Al,{class:"translations"}),f(cl,{class:"appearance"}),f(Cl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}});const xl=m(zl,[["__scopeId","data-v-5f4e75ae"]]),Dl={key:0,class:"VPNav"},El=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Xn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Te("close-screen",t),te(()=>{W&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),r("header",Dl,[f(al,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(xl,{open:i(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}});const Fl=m(El,[["__scopeId","data-v-a46e73f0"]]),Ol=s=>(z("data-v-f0f37ff4"),s=s(),x(),s),Gl=["role","tabindex"],Ul=Ol(()=>c("div",{class:"indicator"},null,-1)),jl=["onKeydown"],Kl={key:1,class:"items"},ql=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=mt(P(()=>e.item)),$=P(()=>p.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M(y){"key"in y&&y.key!=="Enter"||!e.item.link&&_()}function T(){e.item.link&&_()}return(y,E)=>{const G=R("VPSidebarItem",!0);return a(),b(U($.value),{class:I(["VPSidebarItem",k.value])},{default:v(()=>[y.item.text?(a(),r("div",Z({key:0,class:"item",role:B.value},Re(y.item.items?{click:M,keydown:M}:{},!0),{tabindex:y.item.items&&0}),[Ul,y.item.link?(a(),b(D,{key:0,tag:w.value,class:"link",href:y.item.link,rel:y.item.rel,target:y.item.target},{default:v(()=>[(a(),b(U(S.value),{class:"text",innerHTML:y.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),b(U(S.value),{key:1,class:"text",innerHTML:y.item.text},null,8,["innerHTML"])),y.item.collapsed!=null?(a(),r("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:T,onKeydown:We(T,["enter"]),tabindex:"0"},[f(me,{class:"caret-icon"})],40,jl)):h("",!0)],16,Gl)):h("",!0),y.item.items&&y.item.items.length?(a(),r("div",Kl,[y.depth<5?(a(!0),r(N,{key:0},H(y.item.items,F=>(a(),b(G,{key:F.text,item:F,depth:y.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}});const Rl=m(ql,[["__scopeId","data-v-f0f37ff4"]]),xe=s=>(z("data-v-45ef976a"),s=s(),x(),s),Wl=xe(()=>c("div",{class:"curtain"},null,-1)),Yl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Xl=xe(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Jl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const e=s,{sidebarGroups:t,hasSidebar:n}=O(),o=C(null),l=Me(W?document.body:null);return q([e,o],()=>{var d;e.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>i(n)?(a(),r("aside",{key:0,class:I(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Wl,c("nav",Yl,[Xl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),r(N,null,H(i(t),_=>(a(),r("div",{key:_.text,class:"group"},[f(Rl,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}});const Zl=m(Jl,[["__scopeId","data-v-45ef976a"]]),Ql=g({__name:"VPSkipLink",setup(s){const e=se(),t=C();q(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),r(N,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const er=m(Ql,[["__scopeId","data-v-b22defb4"]]),tr=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=O(),o=se();q(()=>o.path,n),ft(e,n);const{frontmatter:l}=V(),d=Xe(),p=P(()=>!!d["home-hero-image"]);return Te("hero-image-slot-exists",p),(_,$)=>{const w=R("Content");return i(l).layout!==!1?(a(),r("div",{key:0,class:I(["Layout",i(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),f(er),f(tt,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),f(Fl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Yn,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),f(Zl,{open:i(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(Nn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),b(w,{key:1}))}}});const sr=m(tr,[["__scopeId","data-v-527a0310"]]),nr={},or={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ar=c("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),lr=[ar];function rr(s,e){return a(),r("svg",or,lr)}const ir=m(nr,[["render",rr]]);const cr={},ur={class:"VPTeamPage"};function dr(s,e){return a(),r("div",ur,[u(s.$slots,"default")])}const Gr=m(cr,[["render",dr],["__scopeId","data-v-05fecbf1"]]);const _r={},vr={class:"VPTeamPageTitle"},pr={key:0,class:"title"},hr={key:1,class:"lead"};function fr(s,e){return a(),r("div",vr,[s.$slots.title?(a(),r("h1",pr,[u(s.$slots,"title",{},void 0,!0)])):h("",!0),s.$slots.lead?(a(),r("p",hr,[u(s.$slots,"lead",{},void 0,!0)])):h("",!0)])}const Ur=m(_r,[["render",fr],["__scopeId","data-v-6ce551d6"]]);const mr={},gr=s=>(z("data-v-1ac32f26"),s=s(),x(),s),$r={class:"VPTeamPageSection"},br={class:"title"},kr=gr(()=>c("div",{class:"title-line"},null,-1)),yr={key:0,class:"title-text"},Pr={key:0,class:"lead"},Vr={key:1,class:"members"};function wr(s,e){return a(),r("section",$r,[c("div",br,[kr,s.$slots.title?(a(),r("h2",yr,[u(s.$slots,"title",{},void 0,!0)])):h("",!0)]),s.$slots.lead?(a(),r("p",Pr,[u(s.$slots,"lead",{},void 0,!0)])):h("",!0),s.$slots.members?(a(),r("div",Vr,[u(s.$slots,"members",{},void 0,!0)])):h("",!0)])}const jr=m(mr,[["render",wr],["__scopeId","data-v-1ac32f26"]]),Lr={class:"profile"},Sr={class:"avatar"},Mr=["src","alt"],Tr={class:"data"},Ir={class:"name"},Cr={key:0,class:"affiliation"},Nr={key:0,class:"title"},Br={key:1,class:"at"},Ar=["innerHTML"],Hr={key:2,class:"links"},zr={key:0,class:"sp"},xr=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(s){return(e,t)=>(a(),r("article",{class:I(["VPTeamMembersItem",[e.size]])},[c("div",Lr,[c("figure",Sr,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Mr)]),c("div",Tr,[c("h1",Ir,L(e.member.name),1),e.member.title||e.member.org?(a(),r("p",Cr,[e.member.title?(a(),r("span",Nr,L(e.member.title),1)):h("",!0),e.member.title&&e.member.org?(a(),r("span",Br," @ ")):h("",!0),e.member.org?(a(),b(D,{key:2,class:I(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:v(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):h("",!0)])):h("",!0),e.member.desc?(a(),r("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,Ar)):h("",!0),e.member.links?(a(),r("div",Hr,[f(ae,{links:e.member.links},null,8,["links"])])):h("",!0)])]),e.member.sponsor?(a(),r("div",zr,[f(D,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:v(()=>[f(ir,{class:"sp-icon"}),A(" Sponsor ")]),_:1},8,["href"])])):h("",!0)],2))}});const Dr=m(xr,[["__scopeId","data-v-c1d54081"]]),Er={class:"container"},Fr=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(s){const e=s,t=P(()=>[e.size,`count-${e.members.length}`]);return(n,o)=>(a(),r("div",{class:I(["VPTeamMembers",t.value])},[c("div",Er,[(a(!0),r(N,null,H(n.members,l=>(a(),r("div",{key:l.name,class:"item"},[f(Dr,{size:n.size,member:l},null,8,["size","member"])]))),128))])],2))}});const Kr=m(Fr,[["__scopeId","data-v-3ca0e3f5"]]),qr={Layout:sr,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};function Rr(s,e){const{localeIndex:t}=V();function n(o){var k,M;const l=o.split("."),d=s&&typeof s=="object",p=d&&((M=(k=s.locales)==null?void 0:k[t.value])==null?void 0:M.translations)||null,_=d&&s.translations||null;let $=p,w=_,S=e;const B=l.pop();for(const T of l){let y=null;const E=S==null?void 0:S[T];E&&(y=S=E);const G=w==null?void 0:w[T];G&&(y=w=G);const F=$==null?void 0:$[T];F&&(y=$=F),E||(S=y),G||(w=y),F||($=y)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return n}export{Ur as V,Kr as a,jr as b,Gr as c,Rr as d,qr as t,V as u}; +import{d as g,o as a,c as r,r as u,a as A,t as L,n as I,_ as m,b,w as v,e as h,T as ue,u as De,i as Ee,f as de,g as P,h as C,j as K,k as c,l as i,p as z,m as x,q as j,s as W,v as re,x as q,y as te,z as _e,A as we,B as Fe,C as R,F as N,D as H,E as ve,G as Y,H as f,I as U,J as Le,K as se,L as Z,M as ne,N as Oe,O as Ge,P as Se,Q as Ue,R as je,S as ye,U as Ke,V as qe,W as Me,X as Te,Y as Re,Z as We,$ as Ye,a0 as Xe}from"./framework.e4c952c1.js";const Je=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),r("span",{class:I(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const Ze=m(Je,[["__scopeId","data-v-4415f8bd"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),b(ue,{name:"fade"},{default:v(()=>[e.show?(a(),r("div",Qe)):h("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-b2600058"]]),V=De;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function X(s){if(Ee(s))return s;const{site:e}=V(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return de(l)}function J({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=V(),d=P(()=>{var _,$;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,$])=>s&&d.value.label===$.label?[]:{text:$.label,link:nt($.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(z("data-v-572b3891"),s=s(),x(),s),at={class:"NotFound"},lt={class:"code"},rt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=V(),{localeLinks:n}=J({removeCurrent:!1}),o=C("/");return K(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,$,w,S;return a(),r("div",at,[c("p",lt,L(((p=i(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",rt,L(((_=i(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,L((($=i(t).notFound)==null?void 0:$.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:i(de)(o.value),"aria-label":((w=i(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=i(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-572b3891"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(ie(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ce(s,e){return Array.isArray(e)?e.some(t=>ce(s,t)):j(s,e.link)?!0:e.items?ce(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function O(){const{frontmatter:s,page:e,theme:t}=V(),n=re("(min-width: 960px)"),o=C(!1),l=P(()=>{const T=t.value.sidebar,y=e.value.relativePath;return T?Ie(T,y):[]}),d=C(l.value);q(l,(T,y)=>{JSON.stringify(T)!==JSON.stringify(y)&&(d.value=l.value)});const p=P(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=P(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=P(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),w=P(()=>p.value&&n.value),S=P(()=>p.value?pt(d.value):[]);function B(){o.value=!0}function k(){o.value=!1}function M(){o.value?k():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:p,hasAside:$,leftAside:_,isSidebarEnabled:w,open:B,close:k,toggle:M}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",n)}),_e(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ce=C(W?location.hash:"");W&&window.addEventListener("hashchange",()=>{Ce.value=location.hash});function mt(s){const{page:e}=V(),t=C(!1),n=P(()=>s.value.collapsed!=null),o=P(()=>!!s.value.link),l=C(!1),d=()=>{l.value=j(e.value.relativePath,s.value.link)};q([e,s,Ce],d),K(d);const p=P(()=>l.value?!0:s.value.items?ce(e.value.relativePath,s.value.items):!1),_=P(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(l.value||p.value)&&(t.value=!1)});function $(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:$}}function gt(){const{hasSidebar:s}=O(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const $t=71;function pe(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function he(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:bt(t),link:"#"+t.id,level:n}});return kt(e,s)}function bt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const $=s[_];if($.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),Fe(()=>{d(location.hash)}),_e(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>p.some(M=>M.hash===k.hash&&k.offsetParent!==null)),$=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs($+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let k=0;k<_.length;k++){const M=_[k],T=_[k+1],[y,E]=Pt(k,M,T);if(y){d(E);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-$t}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),r("ul",{class:I(t.root?"root":"nested")},[(a(!0),r(N,null,H(t.headers,({children:l,link:d,title:p})=>(a(),r("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Vt),l!=null&&l.length?(a(),b(o,{key:0,headers:l},null,8,["headers"])):h("",!0)]))),256))],2)}}});const fe=m(wt,[["__scopeId","data-v-74479eb5"]]),Lt=s=>(z("data-v-d8517c5e"),s=s(),x(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Tt={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ct=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),n=ve([]);Y(()=>{n.value=he(e.value.outline??t.value.outline)});const o=C(),l=C();return yt(o,l),(d,p)=>(a(),r("div",{class:I(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Mt,L(i(pe)(i(t))),1),c("nav",Tt,[It,f(fe,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Nt=m(Ct,[["__scopeId","data-v-d8517c5e"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),r("div",Bt,[f(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ht=s=>(z("data-v-79cae1a0"),s=s(),x(),s),zt={class:"VPDocAside"},xt=Ht(()=>c("div",{class:"spacer"},null,-1)),Dt=g({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,n)=>(a(),r("div",zt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),f(Nt),u(t.$slots,"aside-outline-after",{},void 0,!0),xt,u(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),b(At,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Et=m(Dt,[["__scopeId","data-v-79cae1a0"]]);function Ft(){const{theme:s,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=V();return P(()=>{var _,$,w,S,B,k,M,T;const n=Ie(e.value.sidebar,s.value.relativePath),o=ht(n),l=o.findIndex(y=>j(s.value.relativePath,y.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=(($=e.value.docFooter)==null?void 0:$.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((k=o[l+1])==null?void 0:k.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((T=o[l+1])==null?void 0:T.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("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),Kt=c("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),qt=[jt,Kt];function Rt(s,e){return a(),r("svg",Ut,qt)}const Wt=m(Gt,[["render",Rt]]),D=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&Le.test(e.href));return(o,l)=>(a(),b(U(t.value),{class:I(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?i(X)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Xt=["datetime"],Jt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=V(),l=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),p=C("");return K(()=>{te(()=>{var _,$,w;p.value=new Intl.DateTimeFormat(($=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&$.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,$)=>{var w;return a(),r("p",Yt,[A(L(((w=i(e).lastUpdated)==null?void 0:w.text)||i(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Xt)])}}});const Zt=m(Jt,[["__scopeId","data-v-5be60f87"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=V(),o=Ft(),l=Ot(),d=P(()=>e.value.editLink&&n.value.editLink!==!1),p=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=P(()=>d.value||p.value||l.value.prev||l.value.next);return($,w)=>{var S,B,k,M,T,y;return _.value?(a(),r("footer",Qt,[u($.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),r("div",es,[d.value?(a(),r("div",ts,[f(D,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:v(()=>[f(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(i(o).text),1)]),_:1},8,["href"])])):h("",!0),p.value?(a(),r("div",ss,[f(Zt)])):h("",!0)])):h("",!0),(S=i(l).prev)!=null&&S.link||(B=i(l).next)!=null&&B.link?(a(),r("nav",ns,[c("div",os,[(k=i(l).prev)!=null&&k.link?(a(),r("a",{key:0,class:"pager-link prev",href:i(X)(i(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=i(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:i(l).prev.text},null,8,rs)],8,as)):h("",!0)]),c("div",is,[(T=i(l).next)!=null&&T.link?(a(),r("a",{key:0,class:"pager-link next",href:i(X)(i(l).next.link)},[c("span",{class:"desc",innerHTML:((y=i(e).docFooter)==null?void 0:y.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:i(l).next.text},null,8,ds)],8,cs)):h("",!0)])])):h("",!0)])):h("",!0)}}});const vs=m(_s,[["__scopeId","data-v-67de71aa"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),r("svg",hs,ms)}const me=m(ps,[["render",gs]]),$s={key:0,class:"VPDocOutlineDropdown"},bs={key:0,class:"items"},ks=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=V(),n=C(!1);Y(()=>{n.value=!1});const o=ve([]);return Y(()=>{o.value=he(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),r("div",$s,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:I({open:n.value})},[A(L(i(pe)(i(t)))+" ",1),f(me,{class:"icon"})],2),n.value?(a(),r("div",bs,[f(fe,{headers:o.value},null,8,["headers"])])):h("",!0)])):h("",!0)}});const ys=m(ks,[["__scopeId","data-v-3686ba1c"]]),Ps=s=>(z("data-v-281cfc61"),s=s(),x(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Ts={class:"content-container"},Is={class:"main"},Cs=g({__name:"VPDoc",setup(s){const{theme:e}=V(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=O(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const $=R("Content");return a(),r("div",{class:I(["VPDoc",{"has-sidebar":i(n),"has-aside":i(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[i(o)?(a(),r("div",{key:0,class:I(["aside",{"left-aside":i(l)}])},[ws,c("div",Ls,[c("div",Ss,[f(Et,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),c("div",Ms,[c("div",Ts,[u(p.$slots,"doc-before",{},void 0,!0),f(ys),c("main",Is,[f($,{class:I(["vp-doc",[d.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Ns=m(Cs,[["__scopeId","data-v-281cfc61"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=P(()=>e.href&&Le.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),b(U(n.value),{class:I(["VPButton",[o.size,o.theme]]),href:o.href?i(X)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-de3c2b62"]]),Hs=["src","alt"],zs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),r(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),r("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Hs)):(a(),r(N,{key:1},[f(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),f(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}});const ee=m(zs,[["__scopeId","data-v-4d414b82"]]),xs=s=>(z("data-v-3d564967"),s=s(),x(),s),Ds={class:"container"},Es={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},Ks={key:0,class:"image"},qs={class:"image-container"},Rs=xs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),r("div",{class:I(["VPHero",{"has-image":t.image||i(e)}])},[c("div",Ds,[c("div",Es,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),r("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):h("",!0),t.text?(a(),r("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):h("",!0),t.tagline?(a(),r("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):h("",!0)],!0),t.actions?(a(),r("div",js,[(a(!0),r(N,null,H(t.actions,o=>(a(),r("div",{key:o.link,class:"action"},[f(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):h("",!0)]),t.image||i(e)?(a(),r("div",Ks,[c("div",qs,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),b(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-3d564967"]]),Xs=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,n)=>i(e).hero?(a(),b(Ys,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Js={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("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),en=[Qs];function tn(s,e){return a(),r("svg",Zs,en)}const sn=m(Js,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],ln=["innerHTML"],rn=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),b(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),r("div",on,[f(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),b(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),r("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):h("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),r("p",{key:3,class:"details",innerHTML:e.details},null,8,rn)):h("",!0),e.linkText?(a(),r("div",cn,[c("p",un,[A(L(e.linkText)+" ",1),f(sn,{class:"link-text-icon"})])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-c552d5c5"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=P(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),r("div",vn,[c("div",pn,[c("div",hn,[(a(!0),r(N,null,H(n.features,l=>(a(),r("div",{key:l.title,class:I(["item",[t.value]])},[f(_n,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}});const mn=m(fn,[["__scopeId","data-v-1da4ff3d"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,n)=>i(e).features?(a(),b(mn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),$n={class:"VPHome"},bn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),r("div",$n,[u(e.$slots,"home-hero-before",{},void 0,!0),f(Xs,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),f(gn),u(e.$slots,"home-features-after",{},void 0,!0),f(n)])}}});const kn=m(bn,[["__scopeId","data-v-8ebac4ee"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=R("Content");return a(),r("div",Pn,[u(s.$slots,"page-top"),f(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=O();return(o,l)=>(a(),r("div",{class:I(["VPContent",{"has-sidebar":i(n),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[f(vt)],!0):i(t).layout==="page"?(a(),b(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),b(kn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),b(U(i(t).layout),{key:3})):(a(),b(Ns,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-b7946bfc"]]),Mn={class:"container"},Tn=["innerHTML"],In=["innerHTML"],Cn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=O();return(o,l)=>i(e).footer&&i(t).footer!==!1?(a(),r("footer",{key:0,class:I(["VPFooter",{"has-sidebar":i(n)}])},[c("div",Mn,[i(e).footer.message?(a(),r("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,Tn)):h("",!0),i(e).footer.copyright?(a(),r("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,In)):h("",!0)])],2)):h("",!0)}});const Nn=m(Cn,[["__scopeId","data-v-04a39284"]]),Bn={class:"header"},An={class:"outline"},Hn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),n=C(!1),o=C(0),l=C();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p($){$.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ge(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(a(),r("div",{class:"VPLocalNavOutlineDropdown",style:Oe({"--vp-vh":o.value+"px"})},[$.headers.length>0?(a(),r("button",{key:0,onClick:d,class:I({open:n.value})},[A(L(i(pe)(i(t)))+" ",1),f(me,{class:"icon"})],2)):(a(),r("button",{key:1,onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)),f(ue,{name:"flyout"},{default:v(()=>[n.value?(a(),r("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[f(fe,{headers:$.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}});const zn=m(Hn,[["__scopeId","data-v-2c1007a4"]]),xn={},Dn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},En=c("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),Fn=c("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),On=c("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),Gn=c("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),Un=[En,Fn,On,Gn];function jn(s,e){return a(),r("svg",Dn,Un)}const Kn=m(xn,[["render",jn]]),qn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=O(),{y:o}=Se(),l=ve([]),d=C(0);K(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{l.value=he(t.value.outline??e.value.outline)});const p=P(()=>l.value.length===0&&!n.value),_=P(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return($,w)=>i(t).layout!=="home"&&(!p.value||i(o)>=d.value)?(a(),r("div",{key:0,class:I(_.value)},[i(n)?(a(),r("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[f(Kn,{class:"menu-icon"}),c("span",Rn,L(i(e).sidebarMenuLabel||"Menu"),1)],8,qn)):h("",!0),f(zn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):h("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-3c3d80ab"]]);function Xn(){const s=C(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return q(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Jn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),r("button",Zn,[c("span",Qn,[s.$slots.default?(a(),r("span",eo,[u(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const so=m(Jn,[["render",to],["__scopeId","data-v-0b5e260c"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("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),lo=[ao];function ro(s,e){return a(),r("svg",oo,lo)}const io=m(no,[["render",ro]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Ue('',9),vo=[_o];function po(s,e){return a(),r("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=V(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),b(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(t)},{default:v(()=>[f(ho,{class:"sun"}),f(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const ge=m(fo,[["__scopeId","data-v-fdee46ce"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"?(a(),r("div",mo,[f(ge)])):h("",!0)}});const $o=m(go,[["__scopeId","data-v-f774fc1d"]]),$e=C();let Ne=!1,le=0;function bo(s){const e=C(!1);if(W){!Ne&&ko(),le++;const t=q($e,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});_e(()=>{t(),le--,le||yo()})}return je(e)}function ko(){document.addEventListener("focusin",Be),Ne=!0,$e.value=document.activeElement}function yo(){document.removeEventListener("focusin",Be)}function Be(){$e.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("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),Lo=[wo];function So(s,e){return a(),r("svg",Vo,Lo)}const Ae=m(Po,[["render",So]]),Mo={},To={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),No=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,Co,No];function Ao(s,e){return a(),r("svg",To,Bo)}const Ho=m(Mo,[["render",Ao]]),zo={class:"VPMenuLink"},xo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),r("div",zo,[f(D,{class:I({active:i(j)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(xo,[["__scopeId","data-v-71c5411b"]]),Do={class:"VPMenuGroup"},Eo={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),r("div",Do,[e.text?(a(),r("p",Eo,L(e.text),1)):h("",!0),(a(!0),r(N,null,H(e.items,n=>(a(),r(N,null,["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):h("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-2bec9359"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),r("div",Go,[e.items?(a(),r("div",Uo,[(a(!0),r(N,null,H(e.items,n=>(a(),r(N,{key:n.text},["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):(a(),b(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ko=m(jo,[["__scopeId","data-v-7bffa9cd"]]),qo=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Xo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=C(!1),t=C();bo({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),r("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),r("span",Ro,[o.icon?(a(),b(U(o.icon),{key:0,class:"option-icon"})):h("",!0),o.button?(a(),r("span",{key:1,innerHTML:o.button},null,8,Wo)):h("",!0),f(Ae,{class:"text-icon"})])):(a(),b(Ho,{key:1,class:"icon"}))],8,qo),c("div",Yo,[f(Ko,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Xo,[["__scopeId","data-v-1a2ceba0"]]),Jo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=P(()=>typeof e.icon=="object"?e.icon.svg:Jo[e.icon]);return(n,o)=>(a(),r("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-efc53bd4"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),r("div",ta,[(a(!0),r(N,null,H(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),b(ea,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const ae=m(sa,[["__scopeId","data-v-f2234a39"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},la={class:"item appearance"},ra={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:o}=J({correspondingLink:!0}),l=P(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),b(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[i(n).length&&i(o).label?(a(),r("div",na,[c("p",oa,L(i(o).label),1),(a(!0),r(N,null,H(i(n),_=>(a(),b(oe,{key:_.link,item:_},null,8,["item"]))),128))])):h("",!0),i(e).appearance?(a(),r("div",aa,[c("div",la,[c("p",ra,L(i(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[f(ge)])])])):h("",!0),i(t).socialLinks?(a(),r("div",ca,[c("div",ua,[f(ae,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}});const _a=m(da,[["__scopeId","data-v-47bb42ad"]]),va=s=>(z("data-v-670493dd"),s=s(),x(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),r("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-670493dd"]]),$a=["innerHTML"],ba=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),b(D,{class:I({VPNavBarMenuLink:!0,active:i(j)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,$a)]),_:1},8,["class","href","target","rel"]))}});const ka=m(ba,[["__scopeId","data-v-97d30ef6"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),n=l=>"link"in l?j(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=P(()=>n(e.item));return(l,d)=>(a(),b(be,{class:I({VPNavBarMenuGroup:!0,active:i(j)(i(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Pa=s=>(z("data-v-c6c3e6d4"),s=s(),x(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,n)=>i(e).nav?(a(),r("nav",Va,[wa,(a(!0),r(N,null,H(i(e).nav,o=>(a(),r(N,{key:o.text},["link"in o?(a(),b(ka,{key:0,item:o},null,8,["item"])):(a(),b(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):h("",!0)}});const Sa=m(La,[["__scopeId","data-v-c6c3e6d4"]]);const Ma={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Ta={class:"DocSearch-Button-Container"},Ia=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ca={class:"DocSearch-Button-Placeholder"},Na=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),r("button",Ma,[c("span",Ta,[Ia,c("span",Ca,L(e.placeholder),1)]),Na]))}});const Ba={class:"VPNavBarSearch"},Aa={id:"local-search"},Ha={key:1,id:"docsearch"},za=g({__name:"VPNavBarSearch",setup(s){const e=Ke(()=>qe(()=>import("./VPLocalSearchBox.9f9b3188.js"),["assets/chunks/VPLocalSearchBox.9f9b3188.js","assets/chunks/framework.e4c952c1.js"])),t=()=>null,{theme:n,localeIndex:o}=V(),l=C(!1),d=C(!1),p=P(()=>{var M,T,y,E,G,F,ke;const k=((M=n.value.search)==null?void 0:M.options)??n.value.algolia;return((G=(E=(y=(T=k==null?void 0:k.locales)==null?void 0:T[o.value])==null?void 0:y.translations)==null?void 0:E.button)==null?void 0:G.buttonText)||((ke=(F=k==null?void 0:k.translations)==null?void 0:F.button)==null?void 0:ke.buttonText)||"Search"});K(()=>{});function _(){l.value||(l.value=!0,setTimeout($,16))}function $(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||$()},16)}function w(k){const M=k.target,T=M.tagName;return M.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const S=C(!1);ye("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),S.value=!0)}),ye("/",k=>{w(k)||(k.preventDefault(),S.value=!0)});const B="local";return(k,M)=>{var T;return a(),r("div",Ba,[i(B)==="local"?(a(),r(N,{key:0},[S.value?(a(),b(i(e),{key:0,placeholder:p.value,onClose:M[0]||(M[0]=y=>S.value=!1)},null,8,["placeholder"])):h("",!0),c("div",Aa,[f(Ve,{placeholder:p.value,onClick:M[1]||(M[1]=y=>S.value=!0)},null,8,["placeholder"])])],64)):i(B)==="algolia"?(a(),r(N,{key:1},[l.value?(a(),b(i(t),{key:0,algolia:((T=i(n).search)==null?void 0:T.options)??i(n).algolia,onVnodeBeforeMount:M[2]||(M[2]=y=>d.value=!0)},null,8,["algolia"])):h("",!0),d.value?h("",!0):(a(),r("div",Ha,[f(Ve,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):h("",!0)])}}});const xa=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>i(e).socialLinks?(a(),b(ae,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}});const Da=m(xa,[["__scopeId","data-v-08b35e6f"]]),Ea=["href"],Fa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:n}=O(),{currentLang:o}=J();return(l,d)=>(a(),r("div",{class:I(["VPNavBarTitle",{"has-sidebar":i(n)}])},[c("a",{class:"title",href:i(t).logoLink??i(X)(i(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),b(ee,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(a(),r(N,{key:1},[A(L(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(a(),r(N,{key:2},[A(L(i(e).title),1)],64)):h("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ea)],2))}});const Oa=m(Fa,[["__scopeId","data-v-2d6ff155"]]),Ga={},Ua={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("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),qa=[ja,Ka];function Ra(s,e){return a(),r("svg",Ua,qa)}const He=m(Ga,[["render",Ra]]),Wa={class:"items"},Ya={class:"title"},Xa=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:n}=J({correspondingLink:!0});return(o,l)=>i(t).length&&i(n).label?(a(),b(be,{key:0,class:"VPNavBarTranslations",icon:He,label:i(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Wa,[c("p",Ya,L(i(n).label),1),(a(!0),r(N,null,H(i(t),d=>(a(),b(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}});const Ja=m(Xa,[["__scopeId","data-v-3bf1c934"]]),Za=s=>(z("data-v-dfeca417"),s=s(),x(),s),Qa={class:"container"},el={class:"title"},tl={class:"content"},sl=Za(()=>c("div",{class:"curtain"},null,-1)),nl={class:"content-body"},ol=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=O(),{frontmatter:n}=V(),o=C({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),r("div",{class:I(["VPNavBar",o.value])},[c("div",Qa,[c("div",el,[f(Oa,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",tl,[sl,c("div",nl,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),f(za,{class:"search"}),f(Sa,{class:"menu"}),f(Ja,{class:"translations"}),f($o,{class:"appearance"}),f(Da,{class:"social-links"}),f(_a,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),f(ga,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const al=m(ol,[["__scopeId","data-v-dfeca417"]]),ll={key:0,class:"VPNavScreenAppearance"},rl={class:"text"},il=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(n,o)=>i(e).appearance?(a(),r("div",ll,[c("p",rl,L(i(t).darkModeSwitchLabel||"Appearance"),1),f(ge)])):h("",!0)}});const cl=m(il,[["__scopeId","data-v-8d2d8cf1"]]),ul=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const dl=m(ul,[["__scopeId","data-v-083b71b4"]]),_l={},vl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=c("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),hl=[pl];function fl(s,e){return a(),r("svg",vl,hl)}const ml=m(_l,[["render",fl]]),gl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const ze=m(gl,[["__scopeId","data-v-ed7bb82d"]]),$l={class:"VPNavScreenMenuGroupSection"},bl={key:0,class:"title"},kl=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),r("div",$l,[e.text?(a(),r("p",bl,L(e.text),1)):h("",!0),(a(!0),r(N,null,H(e.items,n=>(a(),b(ze,{key:n.text,item:n},null,8,["item"]))),128))]))}});const yl=m(kl,[["__scopeId","data-v-836cddb8"]]),Pl=["aria-controls","aria-expanded"],Vl={class:"button-text"},wl=["id"],Ll={key:1,class:"group"},Sl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=C(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),r("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Vl,L(l.text),1),f(ml,{class:"button-icon"})],8,Pl),c("div",{id:n.value,class:"items"},[(a(!0),r(N,null,H(l.items,p=>(a(),r(N,{key:p.text},["link"in p?(a(),r("div",{key:p.text,class:"item"},[f(ze,{item:p},null,8,["item"])])):(a(),r("div",Ll,[f(yl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,wl)],2))}});const Ml=m(Sl,[["__scopeId","data-v-31b21668"]]),Tl={key:0,class:"VPNavScreenMenu"},Il=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,n)=>i(e).nav?(a(),r("nav",Tl,[(a(!0),r(N,null,H(i(e).nav,o=>(a(),r(N,{key:o.text},["link"in o?(a(),b(dl,{key:0,item:o},null,8,["item"])):(a(),b(Ml,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Cl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>i(e).socialLinks?(a(),b(ae,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),Nl={class:"list"},Bl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=J({correspondingLink:!0}),n=C(!1);function o(){n.value=!n.value}return(l,d)=>i(e).length&&i(t).label?(a(),r("div",{key:0,class:I(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[f(He,{class:"icon lang"}),A(" "+L(i(t).label)+" ",1),f(Ae,{class:"icon chevron"})]),c("ul",Nl,[(a(!0),r(N,null,H(i(e),p=>(a(),r("li",{key:p.link,class:"item"},[f(D,{class:"link",href:p.link},{default:v(()=>[A(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}});const Al=m(Bl,[["__scopeId","data-v-b72581fd"]]),Hl={class:"container"},zl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=C(null),t=Me(W?document.body:null);return(n,o)=>(a(),b(ue,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),r("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Hl,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),f(Il,{class:"menu"}),f(Al,{class:"translations"}),f(cl,{class:"appearance"}),f(Cl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}});const xl=m(zl,[["__scopeId","data-v-5f4e75ae"]]),Dl={key:0,class:"VPNav"},El=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Xn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Te("close-screen",t),te(()=>{W&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),r("header",Dl,[f(al,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(xl,{open:i(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}});const Fl=m(El,[["__scopeId","data-v-a46e73f0"]]),Ol=s=>(z("data-v-f0f37ff4"),s=s(),x(),s),Gl=["role","tabindex"],Ul=Ol(()=>c("div",{class:"indicator"},null,-1)),jl=["onKeydown"],Kl={key:1,class:"items"},ql=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=mt(P(()=>e.item)),$=P(()=>p.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M(y){"key"in y&&y.key!=="Enter"||!e.item.link&&_()}function T(){e.item.link&&_()}return(y,E)=>{const G=R("VPSidebarItem",!0);return a(),b(U($.value),{class:I(["VPSidebarItem",k.value])},{default:v(()=>[y.item.text?(a(),r("div",Z({key:0,class:"item",role:B.value},Re(y.item.items?{click:M,keydown:M}:{},!0),{tabindex:y.item.items&&0}),[Ul,y.item.link?(a(),b(D,{key:0,tag:w.value,class:"link",href:y.item.link,rel:y.item.rel,target:y.item.target},{default:v(()=>[(a(),b(U(S.value),{class:"text",innerHTML:y.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),b(U(S.value),{key:1,class:"text",innerHTML:y.item.text},null,8,["innerHTML"])),y.item.collapsed!=null?(a(),r("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:T,onKeydown:We(T,["enter"]),tabindex:"0"},[f(me,{class:"caret-icon"})],40,jl)):h("",!0)],16,Gl)):h("",!0),y.item.items&&y.item.items.length?(a(),r("div",Kl,[y.depth<5?(a(!0),r(N,{key:0},H(y.item.items,F=>(a(),b(G,{key:F.text,item:F,depth:y.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}});const Rl=m(ql,[["__scopeId","data-v-f0f37ff4"]]),xe=s=>(z("data-v-45ef976a"),s=s(),x(),s),Wl=xe(()=>c("div",{class:"curtain"},null,-1)),Yl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Xl=xe(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Jl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=O(),n=s,o=C(null),l=Me(W?document.body:null);return q([n,o],()=>{var d;n.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>i(t)?(a(),r("aside",{key:0,class:I(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Wl,c("nav",Yl,[Xl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),r(N,null,H(i(e),_=>(a(),r("div",{key:_.text,class:"group"},[f(Rl,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}});const Zl=m(Jl,[["__scopeId","data-v-45ef976a"]]),Ql=g({__name:"VPSkipLink",setup(s){const e=se(),t=C();q(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),r(N,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const er=m(Ql,[["__scopeId","data-v-b22defb4"]]),tr=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=O(),o=se();q(()=>o.path,n),ft(e,n);const{frontmatter:l}=V(),d=Xe(),p=P(()=>!!d["home-hero-image"]);return Te("hero-image-slot-exists",p),(_,$)=>{const w=R("Content");return i(l).layout!==!1?(a(),r("div",{key:0,class:I(["Layout",i(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),f(er),f(tt,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),f(Fl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Yn,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),f(Zl,{open:i(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(Nn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),b(w,{key:1}))}}});const sr=m(tr,[["__scopeId","data-v-527a0310"]]),nr={},or={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ar=c("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),lr=[ar];function rr(s,e){return a(),r("svg",or,lr)}const ir=m(nr,[["render",rr]]);const cr={},ur={class:"VPTeamPage"};function dr(s,e){return a(),r("div",ur,[u(s.$slots,"default")])}const Gr=m(cr,[["render",dr],["__scopeId","data-v-05fecbf1"]]);const _r={},vr={class:"VPTeamPageTitle"},pr={key:0,class:"title"},hr={key:1,class:"lead"};function fr(s,e){return a(),r("div",vr,[s.$slots.title?(a(),r("h1",pr,[u(s.$slots,"title",{},void 0,!0)])):h("",!0),s.$slots.lead?(a(),r("p",hr,[u(s.$slots,"lead",{},void 0,!0)])):h("",!0)])}const Ur=m(_r,[["render",fr],["__scopeId","data-v-6ce551d6"]]);const mr={},gr=s=>(z("data-v-1ac32f26"),s=s(),x(),s),$r={class:"VPTeamPageSection"},br={class:"title"},kr=gr(()=>c("div",{class:"title-line"},null,-1)),yr={key:0,class:"title-text"},Pr={key:0,class:"lead"},Vr={key:1,class:"members"};function wr(s,e){return a(),r("section",$r,[c("div",br,[kr,s.$slots.title?(a(),r("h2",yr,[u(s.$slots,"title",{},void 0,!0)])):h("",!0)]),s.$slots.lead?(a(),r("p",Pr,[u(s.$slots,"lead",{},void 0,!0)])):h("",!0),s.$slots.members?(a(),r("div",Vr,[u(s.$slots,"members",{},void 0,!0)])):h("",!0)])}const jr=m(mr,[["render",wr],["__scopeId","data-v-1ac32f26"]]),Lr={class:"profile"},Sr={class:"avatar"},Mr=["src","alt"],Tr={class:"data"},Ir={class:"name"},Cr={key:0,class:"affiliation"},Nr={key:0,class:"title"},Br={key:1,class:"at"},Ar=["innerHTML"],Hr={key:2,class:"links"},zr={key:0,class:"sp"},xr=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(s){return(e,t)=>(a(),r("article",{class:I(["VPTeamMembersItem",[e.size]])},[c("div",Lr,[c("figure",Sr,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Mr)]),c("div",Tr,[c("h1",Ir,L(e.member.name),1),e.member.title||e.member.org?(a(),r("p",Cr,[e.member.title?(a(),r("span",Nr,L(e.member.title),1)):h("",!0),e.member.title&&e.member.org?(a(),r("span",Br," @ ")):h("",!0),e.member.org?(a(),b(D,{key:2,class:I(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:v(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):h("",!0)])):h("",!0),e.member.desc?(a(),r("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,Ar)):h("",!0),e.member.links?(a(),r("div",Hr,[f(ae,{links:e.member.links},null,8,["links"])])):h("",!0)])]),e.member.sponsor?(a(),r("div",zr,[f(D,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:v(()=>[f(ir,{class:"sp-icon"}),A(" Sponsor ")]),_:1},8,["href"])])):h("",!0)],2))}});const Dr=m(xr,[["__scopeId","data-v-c1d54081"]]),Er={class:"container"},Fr=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(s){const e=s,t=P(()=>[e.size,`count-${e.members.length}`]);return(n,o)=>(a(),r("div",{class:I(["VPTeamMembers",t.value])},[c("div",Er,[(a(!0),r(N,null,H(n.members,l=>(a(),r("div",{key:l.name,class:"item"},[f(Dr,{size:n.size,member:l},null,8,["size","member"])]))),128))])],2))}});const Kr=m(Fr,[["__scopeId","data-v-3ca0e3f5"]]),qr={Layout:sr,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};function Rr(s,e){const{localeIndex:t}=V();function n(o){var k,M;const l=o.split("."),d=s&&typeof s=="object",p=d&&((M=(k=s.locales)==null?void 0:k[t.value])==null?void 0:M.translations)||null,_=d&&s.translations||null;let $=p,w=_,S=e;const B=l.pop();for(const T of l){let y=null;const E=S==null?void 0:S[T];E&&(y=S=E);const G=w==null?void 0:w[T];G&&(y=w=G);const F=$==null?void 0:$[T];F&&(y=$=F),E||(S=y),G||(w=y),F||($=y)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return n}export{Ur as V,Kr as a,jr as b,Gr as c,Rr as d,qr as t,V as u}; diff --git a/assets/contact.md.a2c6963a.js b/assets/contact.md.c2e94634.js similarity index 92% rename from assets/contact.md.a2c6963a.js rename to assets/contact.md.c2e94634.js index 116da23..7950363 100644 --- a/assets/contact.md.a2c6963a.js +++ b/assets/contact.md.c2e94634.js @@ -1 +1 @@ -import{_ as e,o as a,c as o,k as t,a as s}from"./chunks/framework.1f7cb35e.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),s(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("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=e(r,[["render",n]]);export{f as __pageData,b as default}; +import{_ as e,o as a,c as o,k as t,a as s}from"./chunks/framework.e4c952c1.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),s(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("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=e(r,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/contact.md.a2c6963a.lean.js b/assets/contact.md.c2e94634.lean.js similarity index 92% rename from assets/contact.md.a2c6963a.lean.js rename to assets/contact.md.c2e94634.lean.js index 116da23..7950363 100644 --- a/assets/contact.md.a2c6963a.lean.js +++ b/assets/contact.md.c2e94634.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as o,k as t,a as s}from"./chunks/framework.1f7cb35e.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),s(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("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=e(r,[["render",n]]);export{f as __pageData,b as default}; +import{_ as e,o as a,c as o,k as t,a as s}from"./chunks/framework.e4c952c1.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),r={name:"contact.md"},c=t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),s(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("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=e(r,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/dev_roadmap.md.c17da989.js b/assets/dev_roadmap.md.e0297856.js similarity index 94% rename from assets/dev_roadmap.md.c17da989.js rename to assets/dev_roadmap.md.e0297856.js index a053597..0a2ea06 100644 --- a/assets/dev_roadmap.md.c17da989.js +++ b/assets/dev_roadmap.md.e0297856.js @@ -1 +1 @@ -import{_ as t}from"./chunks/CheckBoxList.26e03ba7.js";import{o as r,c as n,H as o,l,k as e,a}from"./chunks/framework.1f7cb35e.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"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"}]},i={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"New backend for GUI"},{label:"V5 hardware (focus on wired usage)"}]},d={state:!1,object:[{label:"HELP NEEDED: Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"HELP NEEDED: 3D point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras?"}]},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-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),m=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1),b=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1),h=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1),E=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),u={name:"dev_roadmap.md"},k=Object.assign(u,{setup(f){return(_,g)=>(r(),n("div",null,[c,p,m,o(t,{options:{...l(s)}},null,8,["options"]),b,o(t,{options:{...l(i)}},null,8,["options"]),h,o(t,{options:{...l(d)}},null,8,["options"])]))}});export{E as __pageData,k as default}; +import{_ as t}from"./chunks/CheckBoxList.9fb033ec.js";import{o as r,c as n,H as o,l,k as e,a}from"./chunks/framework.e4c952c1.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"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"}]},i={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"New backend for GUI"},{label:"V5 hardware (focus on wired usage)"}]},d={state:!1,object:[{label:"HELP NEEDED: Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"HELP NEEDED: 3D point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras?"}]},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-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),m=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1),b=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1),h=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1),E=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),u={name:"dev_roadmap.md"},k=Object.assign(u,{setup(f){return(_,g)=>(r(),n("div",null,[c,p,m,o(t,{options:{...l(s)}},null,8,["options"]),b,o(t,{options:{...l(i)}},null,8,["options"]),h,o(t,{options:{...l(d)}},null,8,["options"])]))}});export{E as __pageData,k as default}; diff --git a/assets/dev_roadmap.md.c17da989.lean.js b/assets/dev_roadmap.md.e0297856.lean.js similarity index 94% rename from assets/dev_roadmap.md.c17da989.lean.js rename to assets/dev_roadmap.md.e0297856.lean.js index a053597..0a2ea06 100644 --- a/assets/dev_roadmap.md.c17da989.lean.js +++ b/assets/dev_roadmap.md.e0297856.lean.js @@ -1 +1 @@ -import{_ as t}from"./chunks/CheckBoxList.26e03ba7.js";import{o as r,c as n,H as o,l,k as e,a}from"./chunks/framework.1f7cb35e.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"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"}]},i={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"New backend for GUI"},{label:"V5 hardware (focus on wired usage)"}]},d={state:!1,object:[{label:"HELP NEEDED: Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"HELP NEEDED: 3D point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras?"}]},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-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),m=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1),b=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1),h=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1),E=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),u={name:"dev_roadmap.md"},k=Object.assign(u,{setup(f){return(_,g)=>(r(),n("div",null,[c,p,m,o(t,{options:{...l(s)}},null,8,["options"]),b,o(t,{options:{...l(i)}},null,8,["options"]),h,o(t,{options:{...l(d)}},null,8,["options"])]))}});export{E as __pageData,k as default}; +import{_ as t}from"./chunks/CheckBoxList.9fb033ec.js";import{o as r,c as n,H as o,l,k as e,a}from"./chunks/framework.e4c952c1.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"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"}]},i={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Release of V1 to the masses"},{label:"Auto ROI cropping"},{label:"Setup flashing of ESPs through anything other than VSC"},{label:"New GUI"},{label:"New backend for GUI"},{label:"V5 hardware (focus on wired usage)"}]},d={state:!1,object:[{label:"HELP NEEDED: Dynamic foveated rendering via OpenXR (not a guarantee)"},{label:"HELP NEEDED: 3D point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras?"}]},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-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1),p=e("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1),m=e("h2",{id:"completed",tabindex:"-1"},[a("Completed "),e("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1),b=e("h2",{id:"in-progress",tabindex:"-1"},[a("In Progress "),e("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1),h=e("h2",{id:"planned",tabindex:"-1"},[a("Planned "),e("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1),E=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),u={name:"dev_roadmap.md"},k=Object.assign(u,{setup(f){return(_,g)=>(r(),n("div",null,[c,p,m,o(t,{options:{...l(s)}},null,8,["options"]),b,o(t,{options:{...l(i)}},null,8,["options"]),h,o(t,{options:{...l(d)}},null,8,["options"])]))}});export{E as __pageData,k as default}; diff --git a/assets/development_docs_dev_docs.md.88818b58.js b/assets/development_docs_dev_docs.md.c7de805c.js similarity index 97% rename from assets/development_docs_dev_docs.md.88818b58.js rename to assets/development_docs_dev_docs.md.c7de805c.js index 6a5bd03..f267d00 100644 --- a/assets/development_docs_dev_docs.md.88818b58.js +++ b/assets/development_docs_dev_docs.md.c7de805c.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.1f7cb35e.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=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/EyeTrackVR/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.
',12),n=[o];function l(i,c,p,d,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.e4c952c1.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=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/EyeTrackVR/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.
',12),n=[o];function l(i,c,p,d,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; diff --git a/assets/development_docs_dev_docs.md.88818b58.lean.js b/assets/development_docs_dev_docs.md.c7de805c.lean.js similarity index 74% rename from assets/development_docs_dev_docs.md.88818b58.lean.js rename to assets/development_docs_dev_docs.md.c7de805c.lean.js index b0f3a83..dec98d1 100644 --- a/assets/development_docs_dev_docs.md.88818b58.lean.js +++ b/assets/development_docs_dev_docs.md.c7de805c.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.1f7cb35e.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=s("",12),n=[o];function l(i,c,p,d,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.e4c952c1.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=s("",12),n=[o];function l(i,c,p,d,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; diff --git a/assets/development_docs_pages.md.69bf3e35.js b/assets/development_docs_pages.md.ec947cc8.js similarity index 98% rename from assets/development_docs_pages.md.69bf3e35.js rename to assets/development_docs_pages.md.ec947cc8.js index 50644a8..1fc7391 100644 --- a/assets/development_docs_pages.md.69bf3e35.js +++ b/assets/development_docs_pages.md.ec947cc8.js @@ -1,4 +1,4 @@ -import{_ as e,o as s,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o(`

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,Q as o}from"./chunks/framework.e4c952c1.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o(`

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.69bf3e35.lean.js b/assets/development_docs_pages.md.ec947cc8.lean.js
similarity index 70%
rename from assets/development_docs_pages.md.69bf3e35.lean.js
rename to assets/development_docs_pages.md.ec947cc8.lean.js
index c4fc901..beab6c0 100644
--- a/assets/development_docs_pages.md.69bf3e35.lean.js
+++ b/assets/development_docs_pages.md.ec947cc8.lean.js
@@ -1 +1 @@
-import{_ as e,o as s,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o("",24),l=[t];function p(c,r,i,d,F,y){return s(),a("div",null,l)}const D=e(n,[["render",p]]);export{u as __pageData,D as default};
+import{_ as e,o as s,c as a,Q as o}from"./chunks/framework.e4c952c1.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o("",24),l=[t];function p(c,r,i,d,F,y){return s(),a("div",null,l)}const D=e(n,[["render",p]]);export{u as __pageData,D as default};
diff --git a/assets/development_docs_standards.md.413d5844.js b/assets/development_docs_standards.md.20a7ac2c.js
similarity index 98%
rename from assets/development_docs_standards.md.413d5844.js
rename to assets/development_docs_standards.md.20a7ac2c.js
index 5862aa9..c820f72 100644
--- a/assets/development_docs_standards.md.413d5844.js
+++ b/assets/development_docs_standards.md.20a7ac2c.js
@@ -1,4 +1,4 @@
-import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.1f7cb35e.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"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,Q as n}from"./chunks/framework.e4c952c1.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"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.413d5844.lean.js b/assets/development_docs_standards.md.20a7ac2c.lean.js
similarity index 72%
rename from assets/development_docs_standards.md.413d5844.lean.js
rename to assets/development_docs_standards.md.20a7ac2c.lean.js
index 05f149c..bed13ed 100644
--- a/assets/development_docs_standards.md.413d5844.lean.js
+++ b/assets/development_docs_standards.md.20a7ac2c.lean.js
@@ -1 +1 @@
-import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.1f7cb35e.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"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 g=e(t,[["render",i]]);export{y as __pageData,g as default};
+import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.e4c952c1.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"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 g=e(t,[["render",i]]);export{y as __pageData,g as default};
diff --git a/assets/firmware_guide_configure_firmware.md.7852fa9f.js b/assets/firmware_guide_configure_firmware.md.7852fa9f.js
new file mode 100644
index 0000000..d28ee5a
--- /dev/null
+++ b/assets/firmware_guide_configure_firmware.md.7852fa9f.js
@@ -0,0 +1 @@
+import{_ as s,a as d}from"./chunks/index.8ad7dc66.js";import{_ as n,i}from"./chunks/index.0e6ad99c.js";import{o as h,c,H as t,l as a,w as l,k as e,a as o,Q as r}from"./chunks/framework.e4c952c1.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-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-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-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1),m=r('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

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.

',3),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),_=r('

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

Additional 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.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

',16),E=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1698315393000}'),y={name:"firmware_guide/configure_firmware.md"},k=Object.assign(y,{setup(g){return(P,b)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{E as __pageData,k as default}; diff --git a/assets/firmware_guide_configure_firmware.md.d87cb28a.lean.js b/assets/firmware_guide_configure_firmware.md.7852fa9f.lean.js similarity index 75% rename from assets/firmware_guide_configure_firmware.md.d87cb28a.lean.js rename to assets/firmware_guide_configure_firmware.md.7852fa9f.lean.js index d6477a6..000bfa5 100644 --- a/assets/firmware_guide_configure_firmware.md.d87cb28a.lean.js +++ b/assets/firmware_guide_configure_firmware.md.7852fa9f.lean.js @@ -1 +1 @@ -import{_ as s,a as d}from"./chunks/index.2510e13f.js";import{_ as n,i}from"./chunks/index.03b5fd27.js";import{o as h,c,H as t,l as a,w as l,k as e,a as o,Q as r}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-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-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1),m=r("",3),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),_=r("",17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),g={name:"firmware_guide/configure_firmware.md"},E=Object.assign(g,{setup(y){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default}; +import{_ as s,a as d}from"./chunks/index.8ad7dc66.js";import{_ as n,i}from"./chunks/index.0e6ad99c.js";import{o as h,c,H as t,l as a,w as l,k as e,a as o,Q as r}from"./chunks/framework.e4c952c1.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-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-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-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1),m=r("",3),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),_=r("",16),E=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1698315393000}'),y={name:"firmware_guide/configure_firmware.md"},k=Object.assign(y,{setup(g){return(P,b)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{E as __pageData,k as default}; diff --git a/assets/firmware_guide_configure_firmware.md.d87cb28a.js b/assets/firmware_guide_configure_firmware.md.d87cb28a.js deleted file mode 100644 index 7094683..0000000 --- a/assets/firmware_guide_configure_firmware.md.d87cb28a.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,a as d}from"./chunks/index.2510e13f.js";import{_ as n,i}from"./chunks/index.03b5fd27.js";import{o as h,c,H as t,l as a,w as l,k as e,a as o,Q as r}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-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-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1),m=r('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

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.

',3),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),_=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.

Please reference the Firmware Enviroments Page for more information.

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

',17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),g={name:"firmware_guide/configure_firmware.md"},E=Object.assign(g,{setup(y){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default}; diff --git a/assets/firmware_guide_environments.md.4794ed72.js b/assets/firmware_guide_environments.md.5499e526.js similarity index 95% rename from assets/firmware_guide_environments.md.4794ed72.js rename to assets/firmware_guide_environments.md.5499e526.js index e77a4c6..ced2427 100644 --- a/assets/firmware_guide_environments.md.4794ed72.js +++ b/assets/firmware_guide_environments.md.5499e526.js @@ -1 +1 @@ -import{_ as e,i as o}from"./chunks/index.03b5fd27.js";import{o as i,c as t,H as s,l as n,Q as a}from"./chunks/framework.1f7cb35e.js";const r=a('

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 firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

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

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

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 - 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).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default}; +import{_ as e,i as o}from"./chunks/index.0e6ad99c.js";import{o as i,c as t,H as s,l as n,Q as a}from"./chunks/framework.e4c952c1.js";const r=a('

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 firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

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

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

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 - 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).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_environments.md.4794ed72.lean.js b/assets/firmware_guide_environments.md.5499e526.lean.js similarity index 66% rename from assets/firmware_guide_environments.md.4794ed72.lean.js rename to assets/firmware_guide_environments.md.5499e526.lean.js index 9a360fa..3806db6 100644 --- a/assets/firmware_guide_environments.md.4794ed72.lean.js +++ b/assets/firmware_guide_environments.md.5499e526.lean.js @@ -1 +1 @@ -import{_ as e,i as o}from"./chunks/index.03b5fd27.js";import{o as i,c as t,H as s,l as n,Q as a}from"./chunks/framework.1f7cb35e.js";const r=a("",17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default}; +import{_ as e,i as o}from"./chunks/index.0e6ad99c.js";import{o as i,c as t,H as s,l as n,Q as a}from"./chunks/framework.e4c952c1.js";const r=a("",17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_firmware.md.2745189a.js b/assets/firmware_guide_firmware.md.2745189a.js new file mode 100644 index 0000000..196bcf1 --- /dev/null +++ b/assets/firmware_guide_firmware.md.2745189a.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1698315393000}'),r={name:"firmware_guide/firmware.md"},s=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. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for OTA and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

',10),i=[s];function n(l,d,h,c,p,u){return a(),t("div",null,i)}const w=e(r,[["render",n]]);export{m as __pageData,w as default}; diff --git a/assets/firmware_guide_firmware.md.2745189a.lean.js b/assets/firmware_guide_firmware.md.2745189a.lean.js new file mode 100644 index 0000000..ef43e06 --- /dev/null +++ b/assets/firmware_guide_firmware.md.2745189a.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1698315393000}'),r={name:"firmware_guide/firmware.md"},s=o("",10),i=[s];function n(l,d,h,c,p,u){return a(),t("div",null,i)}const w=e(r,[["render",n]]);export{m as __pageData,w as default}; diff --git a/assets/firmware_guide_firmware.md.343c04a7.js b/assets/firmware_guide_firmware.md.343c04a7.js deleted file mode 100644 index 42bfdb7..0000000 --- a/assets/firmware_guide_firmware.md.343c04a7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.1f7cb35e.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=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),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default}; diff --git a/assets/firmware_guide_firmware.md.343c04a7.lean.js b/assets/firmware_guide_firmware.md.343c04a7.lean.js deleted file mode 100644 index a80a52a..0000000 --- a/assets/firmware_guide_firmware.md.343c04a7.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.1f7cb35e.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=o("",6),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default}; diff --git a/assets/firmware_guide_flashing_tool.md.52fe420e.js b/assets/firmware_guide_flashing_tool.md.52fe420e.js new file mode 100644 index 0000000..3a03ee0 --- /dev/null +++ b/assets/firmware_guide_flashing_tool.md.52fe420e.js @@ -0,0 +1 @@ +import{_ as a,i as o}from"./chunks/index.0e6ad99c.js";import{o as n,c as s,H as i,l as r,Q as l,k as e,a as t}from"./chunks/framework.e4c952c1.js";const h=l('

Firmware Flashing Tool

What is this?

The Firmware Flashing Tool allows you to flash the firmware to your ESPs without requiring VScode. It is a GUI tool that is built using Tauri and SolidJS.

Features include:

  • download pre-built firmware binaries
  • configure firmware settings
  • flash firmware to ESPs
  • open a serial monitor to view the ESPs output for debugging

Note

This tool is currently in beta, and we are working on adding support for OTA and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

',6),f=e("h2",{id:"environments",tabindex:"-1"},[e("code",null,"Environments"),t(),e("a",{class:"header-anchor",href:"#environments","aria-label":'Permalink to "`Environments`"'},"​")],-1),c=e("p",null,"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.",-1),u=e("p",null,[t("Please reference the "),e("a",{href:"./../firmware_guide/environments"},"Firmware Environments Page"),t(" for more information.")],-1),b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/flashing_tool.md"},v=Object.assign(d,{setup(m){return(_,p)=>(n(),s("div",null,[h,i(a,{options:r(o).flashing_tool},null,8,["options"]),i(a,{options:r(o).flashing_tool_1},null,8,["options"]),f,c,u]))}});export{b as __pageData,v as default}; diff --git a/assets/firmware_guide_flashing_tool.md.52fe420e.lean.js b/assets/firmware_guide_flashing_tool.md.52fe420e.lean.js new file mode 100644 index 0000000..61b967b --- /dev/null +++ b/assets/firmware_guide_flashing_tool.md.52fe420e.lean.js @@ -0,0 +1 @@ +import{_ as a,i as o}from"./chunks/index.0e6ad99c.js";import{o as n,c as s,H as i,l as r,Q as l,k as e,a as t}from"./chunks/framework.e4c952c1.js";const h=l("",6),f=e("h2",{id:"environments",tabindex:"-1"},[e("code",null,"Environments"),t(),e("a",{class:"header-anchor",href:"#environments","aria-label":'Permalink to "`Environments`"'},"​")],-1),c=e("p",null,"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.",-1),u=e("p",null,[t("Please reference the "),e("a",{href:"./../firmware_guide/environments"},"Firmware Environments Page"),t(" for more information.")],-1),b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/flashing_tool.md"},v=Object.assign(d,{setup(m){return(_,p)=>(n(),s("div",null,[h,i(a,{options:r(o).flashing_tool},null,8,["options"]),i(a,{options:r(o).flashing_tool_1},null,8,["options"]),f,c,u]))}});export{b as __pageData,v as default}; diff --git a/assets/firmware_guide_mdns.md.219d73d2.js b/assets/firmware_guide_mdns.md.7fbdf94c.js similarity index 97% rename from assets/firmware_guide_mdns.md.219d73d2.js rename to assets/firmware_guide_mdns.md.7fbdf94c.js index bc25df1..e89f833 100644 --- a/assets/firmware_guide_mdns.md.219d73d2.js +++ b/assets/firmware_guide_mdns.md.7fbdf94c.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.1f7cb35e.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a('

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),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a('

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),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default}; diff --git a/assets/firmware_guide_mdns.md.219d73d2.lean.js b/assets/firmware_guide_mdns.md.7fbdf94c.lean.js similarity index 70% rename from assets/firmware_guide_mdns.md.219d73d2.lean.js rename to assets/firmware_guide_mdns.md.7fbdf94c.lean.js index 463ed51..901e54a 100644 --- a/assets/firmware_guide_mdns.md.219d73d2.lean.js +++ b/assets/firmware_guide_mdns.md.7fbdf94c.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.1f7cb35e.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a("",21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a("",21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default}; diff --git a/assets/firmware_guide_rest_api.md.c9512bce.js b/assets/firmware_guide_rest_api.md.4fe3ee89.js similarity index 99% rename from assets/firmware_guide_rest_api.md.c9512bce.js rename to assets/firmware_guide_rest_api.md.4fe3ee89.js index 8c823c1..9098040 100644 --- a/assets/firmware_guide_rest_api.md.c9512bce.js +++ b/assets/firmware_guide_rest_api.md.4fe3ee89.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as t,Q as a}from"./chunks/framework.1f7cb35e.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a(`

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 {
+import{_ as s,o as e,c as t,Q as a}from"./chunks/framework.e4c952c1.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a(`

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
     WIFI_POWER_18_5dBm = 74,// 18.5dBm
diff --git a/assets/firmware_guide_rest_api.md.c9512bce.lean.js b/assets/firmware_guide_rest_api.md.4fe3ee89.lean.js
similarity index 71%
rename from assets/firmware_guide_rest_api.md.c9512bce.lean.js
rename to assets/firmware_guide_rest_api.md.4fe3ee89.lean.js
index 2c2cf38..05bdf15 100644
--- a/assets/firmware_guide_rest_api.md.c9512bce.lean.js
+++ b/assets/firmware_guide_rest_api.md.4fe3ee89.lean.js
@@ -1 +1 @@
-import{_ as s,o as e,c as t,Q as a}from"./chunks/framework.1f7cb35e.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a("",33),o=[l];function p(r,c,i,d,y,F){return e(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
+import{_ as s,o as e,c as t,Q as a}from"./chunks/framework.e4c952c1.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a("",33),o=[l];function p(r,c,i,d,y,F){return e(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
diff --git a/assets/firmware_guide_setup_vscode.md.17bb0fe1.js b/assets/firmware_guide_setup_vscode.md.bc9620d8.js
similarity index 97%
rename from assets/firmware_guide_setup_vscode.md.17bb0fe1.js
rename to assets/firmware_guide_setup_vscode.md.bc9620d8.js
index ef02413..b758935 100644
--- a/assets/firmware_guide_setup_vscode.md.17bb0fe1.js
+++ b/assets/firmware_guide_setup_vscode.md.bc9620d8.js
@@ -1 +1 @@
-import{_ as o,i as a}from"./chunks/index.03b5fd27.js";import{o as i,c as s,H as l,l as n,Q as r,k as e,a as t}from"./chunks/framework.1f7cb35e.js";const d=r('

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-label":'Permalink to "Install"'},"​")],-1),c=e("br",null,null,-1),_=r('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. 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.

',5),p=r('

4. 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/EyeTrackVR/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),u=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),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=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),g=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),w=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),v=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),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,l(o,{options:n(a).setup_vscode_image_one},null,8,["options"]),h,c,l(o,{options:n(a).setup_vscode_image_two},null,8,["options"]),_,l(o,{options:n(a).setup_vscode_image_three},null,8,["options"]),p,l(o,{options:n(a).setup_vscode_image_four},null,8,["options"]),u,l(o,{options:n(a).setup_vscode_image_five},null,8,["options"]),m,l(o,{options:n(a).setup_vscode_image_six},null,8,["options"]),f,g,w,l(o,{options:n(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default}; +import{_ as o,i as a}from"./chunks/index.0e6ad99c.js";import{o as i,c as s,H as l,l as n,Q as r,k as e,a as t}from"./chunks/framework.e4c952c1.js";const d=r('

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-label":'Permalink to "Install"'},"​")],-1),c=e("br",null,null,-1),_=r('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. 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.

',5),p=r('

4. 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/EyeTrackVR/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),u=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),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=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),g=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),w=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),v=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),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,l(o,{options:n(a).setup_vscode_image_one},null,8,["options"]),h,c,l(o,{options:n(a).setup_vscode_image_two},null,8,["options"]),_,l(o,{options:n(a).setup_vscode_image_three},null,8,["options"]),p,l(o,{options:n(a).setup_vscode_image_four},null,8,["options"]),u,l(o,{options:n(a).setup_vscode_image_five},null,8,["options"]),m,l(o,{options:n(a).setup_vscode_image_six},null,8,["options"]),f,g,w,l(o,{options:n(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default}; diff --git a/assets/firmware_guide_setup_vscode.md.17bb0fe1.lean.js b/assets/firmware_guide_setup_vscode.md.bc9620d8.lean.js similarity index 94% rename from assets/firmware_guide_setup_vscode.md.17bb0fe1.lean.js rename to assets/firmware_guide_setup_vscode.md.bc9620d8.lean.js index 492e47b..4bddfbf 100644 --- a/assets/firmware_guide_setup_vscode.md.17bb0fe1.lean.js +++ b/assets/firmware_guide_setup_vscode.md.bc9620d8.lean.js @@ -1 +1 @@ -import{_ as o,i as a}from"./chunks/index.03b5fd27.js";import{o as i,c as s,H as l,l as n,Q as r,k as e,a as t}from"./chunks/framework.1f7cb35e.js";const d=r("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1),c=e("br",null,null,-1),_=r("",5),p=r("",3),u=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),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=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),g=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),w=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),v=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),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,l(o,{options:n(a).setup_vscode_image_one},null,8,["options"]),h,c,l(o,{options:n(a).setup_vscode_image_two},null,8,["options"]),_,l(o,{options:n(a).setup_vscode_image_three},null,8,["options"]),p,l(o,{options:n(a).setup_vscode_image_four},null,8,["options"]),u,l(o,{options:n(a).setup_vscode_image_five},null,8,["options"]),m,l(o,{options:n(a).setup_vscode_image_six},null,8,["options"]),f,g,w,l(o,{options:n(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default}; +import{_ as o,i as a}from"./chunks/index.0e6ad99c.js";import{o as i,c as s,H as l,l as n,Q as r,k as e,a as t}from"./chunks/framework.e4c952c1.js";const d=r("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1),c=e("br",null,null,-1),_=r("",5),p=r("",3),u=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),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=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),g=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),w=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),v=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),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,l(o,{options:n(a).setup_vscode_image_one},null,8,["options"]),h,c,l(o,{options:n(a).setup_vscode_image_two},null,8,["options"]),_,l(o,{options:n(a).setup_vscode_image_three},null,8,["options"]),p,l(o,{options:n(a).setup_vscode_image_four},null,8,["options"]),u,l(o,{options:n(a).setup_vscode_image_five},null,8,["options"]),m,l(o,{options:n(a).setup_vscode_image_six},null,8,["options"]),f,g,w,l(o,{options:n(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default}; diff --git a/assets/firmware_guide_update_platformio.md.9b9a64fd.js b/assets/firmware_guide_update_platformio.md.af6d4d76.js similarity index 97% rename from assets/firmware_guide_update_platformio.md.9b9a64fd.js rename to assets/firmware_guide_update_platformio.md.af6d4d76.js index 456100f..5a52011 100644 --- a/assets/firmware_guide_update_platformio.md.9b9a64fd.js +++ b/assets/firmware_guide_update_platformio.md.af6d4d76.js @@ -1 +1 @@ -import{_ as a,i as e}from"./chunks/index.03b5fd27.js";import{o as s,c as r,H as i,l,Q as n,k as o,a as t}from"./chunks/framework.1f7cb35e.js";const d=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=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=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=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default}; +import{_ as a,i as e}from"./chunks/index.0e6ad99c.js";import{o as s,c as r,H as i,l,Q as n,k as o,a as t}from"./chunks/framework.e4c952c1.js";const d=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=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=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=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default}; diff --git a/assets/firmware_guide_update_platformio.md.9b9a64fd.lean.js b/assets/firmware_guide_update_platformio.md.af6d4d76.lean.js similarity index 94% rename from assets/firmware_guide_update_platformio.md.9b9a64fd.lean.js rename to assets/firmware_guide_update_platformio.md.af6d4d76.lean.js index ede5b09..5355b4c 100644 --- a/assets/firmware_guide_update_platformio.md.9b9a64fd.lean.js +++ b/assets/firmware_guide_update_platformio.md.af6d4d76.lean.js @@ -1 +1 @@ -import{_ as a,i as e}from"./chunks/index.03b5fd27.js";import{o as s,c as r,H as i,l,Q as n,k as o,a as t}from"./chunks/framework.1f7cb35e.js";const d=n("",7),c=n("",4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n("",5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default}; +import{_ as a,i as e}from"./chunks/index.0e6ad99c.js";import{o as s,c as r,H as i,l,Q as n,k as o,a as t}from"./chunks/framework.e4c952c1.js";const d=n("",7),c=n("",4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n("",5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default}; diff --git a/assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.js b/assets/firmware_guide_upload_and_update_firmware.md.1076bd51.js similarity index 98% rename from assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.js rename to assets/firmware_guide_upload_and_update_firmware.md.1076bd51.js index 85fa560..0829532 100644 --- a/assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.js +++ b/assets/firmware_guide_upload_and_update_firmware.md.1076bd51.js @@ -1,4 +1,4 @@ -import{_ as s,a as l}from"./chunks/index.2510e13f.js";import{_ as a,i as r}from"./chunks/index.03b5fd27.js";import{o as u,c as d,H as o,w as p,l as t,Q as i,k as e,a as n}from"./chunks/framework.1f7cb35e.js";const h=i('

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

Option 1: Connect ESP32-CAM 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.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

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, 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

',17),c=e("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),m=i('
  • 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. Follow the manual building guide

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

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),S=i(`

For firmware versions of 1.0.0 and under:

  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

Like so:

ini
[ota]
+import{_ as s,a as l}from"./chunks/index.8ad7dc66.js";import{_ as a,i as r}from"./chunks/index.0e6ad99c.js";import{o as u,c as d,H as o,w as p,l as t,Q as i,k as e,a as n}from"./chunks/framework.e4c952c1.js";const h=i('

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

Option 1: Connect ESP32-CAM 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.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

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, 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

',17),c=e("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),m=i('
  • 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. Follow the manual building guide

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

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),S=i(`

For firmware versions of 1.0.0 and under:

  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

Like so:

ini
[ota]
 enableota = 1
 otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
 otapassword = "12345678"
diff --git a/assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.lean.js b/assets/firmware_guide_upload_and_update_firmware.md.1076bd51.lean.js
similarity index 94%
rename from assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.lean.js
rename to assets/firmware_guide_upload_and_update_firmware.md.1076bd51.lean.js
index 88bdc95..d09b0d9 100644
--- a/assets/firmware_guide_upload_and_update_firmware.md.2c6d4eed.lean.js
+++ b/assets/firmware_guide_upload_and_update_firmware.md.1076bd51.lean.js
@@ -1 +1 @@
-import{_ as s,a as l}from"./chunks/index.2510e13f.js";import{_ as a,i as r}from"./chunks/index.03b5fd27.js";import{o as u,c as d,H as o,w as p,l as t,Q as i,k as e,a as n}from"./chunks/framework.1f7cb35e.js";const h=i("",17),c=e("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),m=i("",14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i("",3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),S=i("",8),P=e("p",null,"This will open a list of all available environments, select the one that matches your board and has a _OTA suffix",-1),A=i("",3),C=e("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),D=i("",5),I=e("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=i("",6),U=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),B={name:"firmware_guide/upload_and_update_firmware.md"},R=Object.assign(B,{setup(O){return(E,q)=>(u(),d("div",null,[h,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),m,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[f]),_:1},8,["options"]),_,o(a,{options:t(r).upload_firmware_build_button},null,8,["options"]),g,o(a,{options:t(r).upload_firmware_webpage},null,8,["options"]),y,w,b,o(a,{options:t(r).upload_firmware_webpage_directory},null,8,["options"]),v,k,o(a,{options:t(r).upload_firmware_webpage_directory_file},null,8,["options"]),T,o(a,{options:t(r).upload_firmware_webpage_upload_finished},null,8,["options"]),S,o(a,{options:t(r).upload_firmware_select_env},null,8,["options"]),P,o(a,{options:t(r).upload_firmware_select_env_dropdown},null,8,["options"]),A,o(a,{options:t(r).upload_firmware_image_one},null,8,["options"]),C,o(a,{options:t(r).upload_firmware_image_two},null,8,["options"]),D,o(s,{options:t(l).user_warning},{content:p(()=>[I]),_:1},8,["options"]),F]))}});export{U as __pageData,R as default};
+import{_ as s,a as l}from"./chunks/index.8ad7dc66.js";import{_ as a,i as r}from"./chunks/index.0e6ad99c.js";import{o as u,c as d,H as o,w as p,l as t,Q as i,k as e,a as n}from"./chunks/framework.e4c952c1.js";const h=i("",17),c=e("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),m=i("",14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i("",3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),S=i("",8),P=e("p",null,"This will open a list of all available environments, select the one that matches your board and has a _OTA suffix",-1),A=i("",3),C=e("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),D=i("",5),I=e("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=i("",6),U=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),B={name:"firmware_guide/upload_and_update_firmware.md"},R=Object.assign(B,{setup(O){return(E,q)=>(u(),d("div",null,[h,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),m,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[f]),_:1},8,["options"]),_,o(a,{options:t(r).upload_firmware_build_button},null,8,["options"]),g,o(a,{options:t(r).upload_firmware_webpage},null,8,["options"]),y,w,b,o(a,{options:t(r).upload_firmware_webpage_directory},null,8,["options"]),v,k,o(a,{options:t(r).upload_firmware_webpage_directory_file},null,8,["options"]),T,o(a,{options:t(r).upload_firmware_webpage_upload_finished},null,8,["options"]),S,o(a,{options:t(r).upload_firmware_select_env},null,8,["options"]),P,o(a,{options:t(r).upload_firmware_select_env_dropdown},null,8,["options"]),A,o(a,{options:t(r).upload_firmware_image_one},null,8,["options"]),C,o(a,{options:t(r).upload_firmware_image_two},null,8,["options"]),D,o(s,{options:t(l).user_warning},{content:p(()=>[I]),_:1},8,["options"]),F]))}});export{U as __pageData,R as default};
diff --git a/assets/getting_started_intro.md.f3812501.js b/assets/getting_started_intro.md.193e8e8d.js
similarity index 96%
rename from assets/getting_started_intro.md.f3812501.js
rename to assets/getting_started_intro.md.193e8e8d.js
index 9dec21f..411861a 100644
--- a/assets/getting_started_intro.md.f3812501.js
+++ b/assets/getting_started_intro.md.193e8e8d.js
@@ -1 +1 @@
-import{_ as s,a as i}from"./chunks/index.2510e13f.js";import{_ as l,i as d}from"./chunks/index.03b5fd27.js";import{o as c,c as h,H as a,w as n,l as r,Q as t,k as e,a as o}from"./chunks/framework.1f7cb35e.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),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=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),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=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

ICNIRP: Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm)

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),b=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),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default}; +import{_ as s,a as i}from"./chunks/index.8ad7dc66.js";import{_ as l,i as d}from"./chunks/index.0e6ad99c.js";import{o as c,c as h,H as a,w as n,l as r,Q as t,k as e,a as o}from"./chunks/framework.e4c952c1.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),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=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),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=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

ICNIRP: Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm)

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),b=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),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1698315393000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default}; diff --git a/assets/getting_started_intro.md.f3812501.lean.js b/assets/getting_started_intro.md.193e8e8d.lean.js similarity index 76% rename from assets/getting_started_intro.md.f3812501.lean.js rename to assets/getting_started_intro.md.193e8e8d.lean.js index 7b08156..5738f96 100644 --- a/assets/getting_started_intro.md.f3812501.lean.js +++ b/assets/getting_started_intro.md.193e8e8d.lean.js @@ -1 +1 @@ -import{_ as s,a as i}from"./chunks/index.2510e13f.js";import{_ as l,i as d}from"./chunks/index.03b5fd27.js";import{o as c,c as h,H as a,w as n,l as r,Q as t,k as e,a as o}from"./chunks/framework.1f7cb35e.js";const u=t("",4),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=t("",5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t("",9),b=t("",3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default}; +import{_ as s,a as i}from"./chunks/index.8ad7dc66.js";import{_ as l,i as d}from"./chunks/index.0e6ad99c.js";import{o as c,c as h,H as a,w as n,l as r,Q as t,k as e,a as o}from"./chunks/framework.e4c952c1.js";const u=t("",4),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=t("",5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t("",9),b=t("",3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1698315393000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default}; diff --git a/assets/getting_started_led_safety.md.ee0ec671.js b/assets/getting_started_led_safety.md.694b59dc.js similarity index 97% rename from assets/getting_started_led_safety.md.ee0ec671.js rename to assets/getting_started_led_safety.md.694b59dc.js index fce0a75..243cc89 100644 --- a/assets/getting_started_led_safety.md.ee0ec671.js +++ b/assets/getting_started_led_safety.md.694b59dc.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.2510e13f.js";import{o,c as s,H as r,w as i,l as n,Q as e,k as l}from"./chunks/framework.1f7cb35e.js";const u=e('

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 or are not understand something, just do exactly what we do. Don't use different emitters, don't use different 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, excessive eye-strain 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.

What we care about:

We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.

Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.

The International Commission on Non-Ionizing Radiation Protection's Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm) states:

"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"

So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.

It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.

',12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e('

V3 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.

(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2

Now, this is only for 1 LED, in the case of V3 we have 2 so we can:

0.8 mW/cm2 * 2 = 1.6 mW/cm2

This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.

V4 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

V4 hardware is actively limited to ~2.4 mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2

Now, this is only for 1 LED, in the case of V4 we have 4 so we can:

0.6 mW/cm2 * 4 = 2.4 mW/cm2

This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.

',21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default}; +import{_ as t,a}from"./chunks/index.8ad7dc66.js";import{o,c as s,H as r,w as i,l as n,Q as e,k as l}from"./chunks/framework.e4c952c1.js";const u=e('

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 or are not understand something, just do exactly what we do. Don't use different emitters, don't use different 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, excessive eye-strain 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.

What we care about:

We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.

Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.

The International Commission on Non-Ionizing Radiation Protection's Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm) states:

"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"

So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.

It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.

',12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e('

V3 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.

(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2

Now, this is only for 1 LED, in the case of V3 we have 2 so we can:

0.8 mW/cm2 * 2 = 1.6 mW/cm2

This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.

V4 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

V4 hardware is actively limited to ~2.4 mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2

Now, this is only for 1 LED, in the case of V4 we have 4 so we can:

0.6 mW/cm2 * 4 = 2.4 mW/cm2

This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.

',21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default}; diff --git a/assets/getting_started_led_safety.md.ee0ec671.lean.js b/assets/getting_started_led_safety.md.694b59dc.lean.js similarity index 82% rename from assets/getting_started_led_safety.md.ee0ec671.lean.js rename to assets/getting_started_led_safety.md.694b59dc.lean.js index 92bb441..bd9aea7 100644 --- a/assets/getting_started_led_safety.md.ee0ec671.lean.js +++ b/assets/getting_started_led_safety.md.694b59dc.lean.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.2510e13f.js";import{o,c as s,H as r,w as i,l as n,Q as e,k as l}from"./chunks/framework.1f7cb35e.js";const u=e("",12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e("",21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default}; +import{_ as t,a}from"./chunks/index.8ad7dc66.js";import{o,c as s,H as r,w as i,l as n,Q as e,k as l}from"./chunks/framework.e4c952c1.js";const u=e("",12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e("",21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default}; diff --git a/assets/getting_started_things_to_know.md.21105a37.js b/assets/getting_started_things_to_know.md.b44e9a98.js similarity index 96% rename from assets/getting_started_things_to_know.md.21105a37.js rename to assets/getting_started_things_to_know.md.b44e9a98.js index 4a2944f..32a4920 100644 --- a/assets/getting_started_things_to_know.md.21105a37.js +++ b/assets/getting_started_things_to_know.md.b44e9a98.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=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. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar

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

',13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.e4c952c1.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=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. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar

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

',13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default}; diff --git a/assets/getting_started_things_to_know.md.21105a37.lean.js b/assets/getting_started_things_to_know.md.b44e9a98.lean.js similarity index 73% rename from assets/getting_started_things_to_know.md.21105a37.lean.js rename to assets/getting_started_things_to_know.md.b44e9a98.lean.js index 80d095c..c2640ed 100644 --- a/assets/getting_started_things_to_know.md.21105a37.lean.js +++ b/assets/getting_started_things_to_know.md.b44e9a98.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o("",13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.e4c952c1.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o("",13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.5fb1a297.js b/assets/how_to_build_creating_your_own_mount.md.3ddf5184.js similarity index 97% rename from assets/how_to_build_creating_your_own_mount.md.5fb1a297.js rename to assets/how_to_build_creating_your_own_mount.md.3ddf5184.js index bc4f7c0..0555d57 100644 --- a/assets/how_to_build_creating_your_own_mount.md.5fb1a297.js +++ b/assets/how_to_build_creating_your_own_mount.md.3ddf5184.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=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=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.e4c952c1.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=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=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.5fb1a297.lean.js b/assets/how_to_build_creating_your_own_mount.md.3ddf5184.lean.js similarity index 74% rename from assets/how_to_build_creating_your_own_mount.md.5fb1a297.lean.js rename to assets/how_to_build_creating_your_own_mount.md.3ddf5184.lean.js index e2db2cf..e8f11f9 100644 --- a/assets/how_to_build_creating_your_own_mount.md.5fb1a297.lean.js +++ b/assets/how_to_build_creating_your_own_mount.md.3ddf5184.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.1f7cb35e.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o("",18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.e4c952c1.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o("",18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default}; diff --git a/assets/how_to_build_full_build.md.5bb31bfb.js b/assets/how_to_build_full_build.md.b9c84c14.js similarity index 98% rename from assets/how_to_build_full_build.md.5bb31bfb.js rename to assets/how_to_build_full_build.md.b9c84c14.js index 356092d..a4e7897 100644 --- a/assets/how_to_build_full_build.md.5bb31bfb.js +++ b/assets/how_to_build_full_build.md.b9c84c14.js @@ -1 +1 @@ -import{_ as r,a as l}from"./chunks/index.2510e13f.js";import{_ as h}from"./chunks/CheckBoxList.26e03ba7.js";import{_ as a,i as s}from"./chunks/index.03b5fd27.js";import{o as d,c as p,H as t,l as o,k as e,w as c,Q as i,a as n}from"./chunks/framework.1f7cb35e.js";const u={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."}]},_=i('

Build Guide

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

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are WIP: V4 LED Solderless assemblly rough edit:

',3),m=e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1),f=e("p",null,"Sketch of V4 solderless wiring:",-1),w=e("p",null,[n("Credit: @seniorpringles, @g0ldjay via "),e("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1),g=e("p",null,"Sketch of solder assembbly of V4:",-1),b=i('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

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:

',9),y=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-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1),v=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),S=e("p",null,"The first option is to use an external antenna.",-1),k=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),P=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),T=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),E=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),x=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),C=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-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1),I=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),V=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),D=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),A=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),B=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-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1),q=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),N=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),L=i('

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),R=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-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1),G=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),U=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),O=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-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1),H=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),W=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-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1),M=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),j=i('

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),F=i('

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),Y=e("p",null,"Here are the PCB pin-out labels:",-1),z=e("p",null,"LED labels:",-1),$=i('

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),Q=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),X=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),Z=e("p",null,"Flip the PCB and solder the other end.",-1),K=e("p",null,"Now repeat for the other one.",-1),ee=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-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1),te=e("p",null,"Tin the LED pads.",-1),oe=e("p",null,"Orientate the LED and hold it in place.",-1),ae=e("p",null,"Solder one end.",-1),se=e("p",null,"Flip around and solder the other end.",-1),ne=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-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1),ie=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),re=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),le=e("p",null,"Use the following diagram:",-1),he=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),de=e("p",null,"Use the following diagram:",-1),pe=i('

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),ce=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),ue=e("p",null,"Place the camera into the mount",-1),_e=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),me={align:"center"},fe=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),we=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1),ge=e("p",null,"This uses the method of gluing the camera.",-1),be=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),ye=e("p",null,"Place the camera on the mount.",-1),ve=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1),Se=e("p",null,"This again differs from mount to mount.",-1),ke=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),Pe=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),Te=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),qe=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1694358539000}'),Ee={name:"how_to_build/full_build.md"},Ne=Object.assign(Ee,{setup(xe){return(Ce,Ie)=>(d(),p("div",null,[_,m,f,t(a,{options:o(s).V4_wire_sketch},null,8,["options"]),w,g,t(a,{options:o(s).V4_solder_wire},null,8,["options"]),b,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),y,v,S,k,t(a,{options:o(s).external_antenna},null,8,["options"]),P,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),T,E,x,C,I,t(a,{options:o(s).camera_socket},null,8,["options"]),V,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),D,t(a,{options:o(s).camera_cable},null,8,["options"]),A,t(a,{options:o(s).camera_clip_close},null,8,["options"]),B,q,N,t(a,{options:o(s)._7_12_one},null,8,["options"]),L,t(a,{options:o(s)._7_12_two},null,8,["options"]),R,G,U,O,H,t(a,{options:o(s)._7_12_three},null,8,["options"]),W,M,t(a,{options:o(s)._13_18_one},null,8,["options"]),j,t(a,{options:o(s)._13_18_two},null,8,["options"]),F,t(a,{options:o(s)._13_18_three},null,8,["options"]),Y,t(a,{options:o(s)._13_18_four},null,8,["options"]),z,t(a,{options:o(s)._13_18_five},null,8,["options"]),$,t(a,{options:o(s)._13_18_six},null,8,["options"]),J,t(a,{options:o(s)._13_18_seven},null,8,["options"]),Q,X,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Z,t(a,{options:o(s)._13_18_nine},null,8,["options"]),K,t(a,{options:o(s)._13_18_ten},null,8,["options"]),ee,te,t(a,{options:o(s).end_one},null,8,["options"]),oe,t(a,{options:o(s).end_two},null,8,["options"]),ae,t(a,{options:o(s).end_three},null,8,["options"]),se,t(a,{options:o(s).end_four},null,8,["options"]),ne,ie,re,t(a,{options:o(s).end_five},null,8,["options"]),le,t(a,{options:o(s).end_six},null,8,["options"]),he,t(a,{options:o(s).end_seven},null,8,["options"]),de,t(a,{options:o(s).end_eight},null,8,["options"]),pe,t(a,{options:o(s).end_nine},null,8,["options"]),ce,ue,t(a,{options:o(s).end_ten},null,8,["options"]),_e,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",me,[t(r,{options:o(l).end_one},{content:c(()=>[fe]),_:1},8,["options"])]),we,t(a,{options:o(s).end_twelve},null,8,["options"]),ge,be,t(a,{options:o(s).end_thirteen},null,8,["options"]),ye,t(a,{options:o(s).end_fourteen},null,8,["options"]),ve,Se,ke,t(a,{options:o(s).end_fifteen},null,8,["options"]),Pe,t(a,{options:o(s).end_sixteen},null,8,["options"]),Te]))}});export{qe as __pageData,Ne as default}; +import{_ as r,a as l}from"./chunks/index.8ad7dc66.js";import{_ as h}from"./chunks/CheckBoxList.9fb033ec.js";import{_ as a,i as s}from"./chunks/index.0e6ad99c.js";import{o as d,c as p,H as t,l as o,k as e,w as c,Q as i,a as n}from"./chunks/framework.e4c952c1.js";const u={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."}]},_=i('

Build Guide

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

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are WIP: V4 LED Solderless assemblly rough edit:

',3),m=e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1),f=e("p",null,"Sketch of V4 solderless wiring:",-1),w=e("p",null,[n("Credit: @seniorpringles, @g0ldjay via "),e("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1),g=e("p",null,"Sketch of solder assembbly of V4:",-1),b=i('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

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:

',9),y=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-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1),v=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),S=e("p",null,"The first option is to use an external antenna.",-1),k=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),P=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),T=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),E=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),x=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),C=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-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1),I=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),V=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),D=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),A=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),B=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-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1),q=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),N=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),L=i('

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),R=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-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1),G=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),U=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),O=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-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1),H=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),W=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-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1),M=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),j=i('

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),F=i('

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),Y=e("p",null,"Here are the PCB pin-out labels:",-1),z=e("p",null,"LED labels:",-1),$=i('

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),Q=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),X=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),Z=e("p",null,"Flip the PCB and solder the other end.",-1),K=e("p",null,"Now repeat for the other one.",-1),ee=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-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1),te=e("p",null,"Tin the LED pads.",-1),oe=e("p",null,"Orientate the LED and hold it in place.",-1),ae=e("p",null,"Solder one end.",-1),se=e("p",null,"Flip around and solder the other end.",-1),ne=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-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1),ie=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),re=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),le=e("p",null,"Use the following diagram:",-1),he=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),de=e("p",null,"Use the following diagram:",-1),pe=i('

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),ce=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),ue=e("p",null,"Place the camera into the mount",-1),_e=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),me={align:"center"},fe=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),we=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1),ge=e("p",null,"This uses the method of gluing the camera.",-1),be=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),ye=e("p",null,"Place the camera on the mount.",-1),ve=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1),Se=e("p",null,"This again differs from mount to mount.",-1),ke=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),Pe=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),Te=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),qe=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1694358539000}'),Ee={name:"how_to_build/full_build.md"},Ne=Object.assign(Ee,{setup(xe){return(Ce,Ie)=>(d(),p("div",null,[_,m,f,t(a,{options:o(s).V4_wire_sketch},null,8,["options"]),w,g,t(a,{options:o(s).V4_solder_wire},null,8,["options"]),b,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),y,v,S,k,t(a,{options:o(s).external_antenna},null,8,["options"]),P,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),T,E,x,C,I,t(a,{options:o(s).camera_socket},null,8,["options"]),V,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),D,t(a,{options:o(s).camera_cable},null,8,["options"]),A,t(a,{options:o(s).camera_clip_close},null,8,["options"]),B,q,N,t(a,{options:o(s)._7_12_one},null,8,["options"]),L,t(a,{options:o(s)._7_12_two},null,8,["options"]),R,G,U,O,H,t(a,{options:o(s)._7_12_three},null,8,["options"]),W,M,t(a,{options:o(s)._13_18_one},null,8,["options"]),j,t(a,{options:o(s)._13_18_two},null,8,["options"]),F,t(a,{options:o(s)._13_18_three},null,8,["options"]),Y,t(a,{options:o(s)._13_18_four},null,8,["options"]),z,t(a,{options:o(s)._13_18_five},null,8,["options"]),$,t(a,{options:o(s)._13_18_six},null,8,["options"]),J,t(a,{options:o(s)._13_18_seven},null,8,["options"]),Q,X,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Z,t(a,{options:o(s)._13_18_nine},null,8,["options"]),K,t(a,{options:o(s)._13_18_ten},null,8,["options"]),ee,te,t(a,{options:o(s).end_one},null,8,["options"]),oe,t(a,{options:o(s).end_two},null,8,["options"]),ae,t(a,{options:o(s).end_three},null,8,["options"]),se,t(a,{options:o(s).end_four},null,8,["options"]),ne,ie,re,t(a,{options:o(s).end_five},null,8,["options"]),le,t(a,{options:o(s).end_six},null,8,["options"]),he,t(a,{options:o(s).end_seven},null,8,["options"]),de,t(a,{options:o(s).end_eight},null,8,["options"]),pe,t(a,{options:o(s).end_nine},null,8,["options"]),ce,ue,t(a,{options:o(s).end_ten},null,8,["options"]),_e,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",me,[t(r,{options:o(l).end_one},{content:c(()=>[fe]),_:1},8,["options"])]),we,t(a,{options:o(s).end_twelve},null,8,["options"]),ge,be,t(a,{options:o(s).end_thirteen},null,8,["options"]),ye,t(a,{options:o(s).end_fourteen},null,8,["options"]),ve,Se,ke,t(a,{options:o(s).end_fifteen},null,8,["options"]),Pe,t(a,{options:o(s).end_sixteen},null,8,["options"]),Te]))}});export{qe as __pageData,Ne as default}; diff --git a/assets/how_to_build_full_build.md.5bb31bfb.lean.js b/assets/how_to_build_full_build.md.b9c84c14.lean.js similarity index 97% rename from assets/how_to_build_full_build.md.5bb31bfb.lean.js rename to assets/how_to_build_full_build.md.b9c84c14.lean.js index aee1fe2..1e67d99 100644 --- a/assets/how_to_build_full_build.md.5bb31bfb.lean.js +++ b/assets/how_to_build_full_build.md.b9c84c14.lean.js @@ -1 +1 @@ -import{_ as r,a as l}from"./chunks/index.2510e13f.js";import{_ as h}from"./chunks/CheckBoxList.26e03ba7.js";import{_ as a,i as s}from"./chunks/index.03b5fd27.js";import{o as d,c as p,H as t,l as o,k as e,w as c,Q as i,a as n}from"./chunks/framework.1f7cb35e.js";const u={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."}]},_=i("",3),m=e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1),f=e("p",null,"Sketch of V4 solderless wiring:",-1),w=e("p",null,[n("Credit: @seniorpringles, @g0ldjay via "),e("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1),g=e("p",null,"Sketch of solder assembbly of V4:",-1),b=i("",9),y=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-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1),v=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),S=e("p",null,"The first option is to use an external antenna.",-1),k=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),P=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),T=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),E=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),x=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),C=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-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1),I=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),V=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),D=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),A=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),B=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-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1),q=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),N=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),L=i("",8),R=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-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1),G=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),U=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),O=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-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1),H=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),W=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-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1),M=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),j=i("",4),F=i("",5),Y=e("p",null,"Here are the PCB pin-out labels:",-1),z=e("p",null,"LED labels:",-1),$=i("",11),J=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),Q=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),X=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),Z=e("p",null,"Flip the PCB and solder the other end.",-1),K=e("p",null,"Now repeat for the other one.",-1),ee=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-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1),te=e("p",null,"Tin the LED pads.",-1),oe=e("p",null,"Orientate the LED and hold it in place.",-1),ae=e("p",null,"Solder one end.",-1),se=e("p",null,"Flip around and solder the other end.",-1),ne=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-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1),ie=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),re=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),le=e("p",null,"Use the following diagram:",-1),he=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),de=e("p",null,"Use the following diagram:",-1),pe=i("",6),ce=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),ue=e("p",null,"Place the camera into the mount",-1),_e=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),me={align:"center"},fe=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),we=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1),ge=e("p",null,"This uses the method of gluing the camera.",-1),be=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),ye=e("p",null,"Place the camera on the mount.",-1),ve=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1),Se=e("p",null,"This again differs from mount to mount.",-1),ke=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),Pe=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),Te=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),qe=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1694358539000}'),Ee={name:"how_to_build/full_build.md"},Ne=Object.assign(Ee,{setup(xe){return(Ce,Ie)=>(d(),p("div",null,[_,m,f,t(a,{options:o(s).V4_wire_sketch},null,8,["options"]),w,g,t(a,{options:o(s).V4_solder_wire},null,8,["options"]),b,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),y,v,S,k,t(a,{options:o(s).external_antenna},null,8,["options"]),P,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),T,E,x,C,I,t(a,{options:o(s).camera_socket},null,8,["options"]),V,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),D,t(a,{options:o(s).camera_cable},null,8,["options"]),A,t(a,{options:o(s).camera_clip_close},null,8,["options"]),B,q,N,t(a,{options:o(s)._7_12_one},null,8,["options"]),L,t(a,{options:o(s)._7_12_two},null,8,["options"]),R,G,U,O,H,t(a,{options:o(s)._7_12_three},null,8,["options"]),W,M,t(a,{options:o(s)._13_18_one},null,8,["options"]),j,t(a,{options:o(s)._13_18_two},null,8,["options"]),F,t(a,{options:o(s)._13_18_three},null,8,["options"]),Y,t(a,{options:o(s)._13_18_four},null,8,["options"]),z,t(a,{options:o(s)._13_18_five},null,8,["options"]),$,t(a,{options:o(s)._13_18_six},null,8,["options"]),J,t(a,{options:o(s)._13_18_seven},null,8,["options"]),Q,X,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Z,t(a,{options:o(s)._13_18_nine},null,8,["options"]),K,t(a,{options:o(s)._13_18_ten},null,8,["options"]),ee,te,t(a,{options:o(s).end_one},null,8,["options"]),oe,t(a,{options:o(s).end_two},null,8,["options"]),ae,t(a,{options:o(s).end_three},null,8,["options"]),se,t(a,{options:o(s).end_four},null,8,["options"]),ne,ie,re,t(a,{options:o(s).end_five},null,8,["options"]),le,t(a,{options:o(s).end_six},null,8,["options"]),he,t(a,{options:o(s).end_seven},null,8,["options"]),de,t(a,{options:o(s).end_eight},null,8,["options"]),pe,t(a,{options:o(s).end_nine},null,8,["options"]),ce,ue,t(a,{options:o(s).end_ten},null,8,["options"]),_e,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",me,[t(r,{options:o(l).end_one},{content:c(()=>[fe]),_:1},8,["options"])]),we,t(a,{options:o(s).end_twelve},null,8,["options"]),ge,be,t(a,{options:o(s).end_thirteen},null,8,["options"]),ye,t(a,{options:o(s).end_fourteen},null,8,["options"]),ve,Se,ke,t(a,{options:o(s).end_fifteen},null,8,["options"]),Pe,t(a,{options:o(s).end_sixteen},null,8,["options"]),Te]))}});export{qe as __pageData,Ne as default}; +import{_ as r,a as l}from"./chunks/index.8ad7dc66.js";import{_ as h}from"./chunks/CheckBoxList.9fb033ec.js";import{_ as a,i as s}from"./chunks/index.0e6ad99c.js";import{o as d,c as p,H as t,l as o,k as e,w as c,Q as i,a as n}from"./chunks/framework.e4c952c1.js";const u={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."}]},_=i("",3),m=e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1),f=e("p",null,"Sketch of V4 solderless wiring:",-1),w=e("p",null,[n("Credit: @seniorpringles, @g0ldjay via "),e("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1),g=e("p",null,"Sketch of solder assembbly of V4:",-1),b=i("",9),y=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-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1),v=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),S=e("p",null,"The first option is to use an external antenna.",-1),k=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),P=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),T=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),E=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),x=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),C=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-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1),I=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),V=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),D=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),A=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),B=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-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1),q=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),N=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),L=i("",8),R=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-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1),G=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),U=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),O=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-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1),H=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),W=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-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1),M=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),j=i("",4),F=i("",5),Y=e("p",null,"Here are the PCB pin-out labels:",-1),z=e("p",null,"LED labels:",-1),$=i("",11),J=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),Q=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),X=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),Z=e("p",null,"Flip the PCB and solder the other end.",-1),K=e("p",null,"Now repeat for the other one.",-1),ee=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-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1),te=e("p",null,"Tin the LED pads.",-1),oe=e("p",null,"Orientate the LED and hold it in place.",-1),ae=e("p",null,"Solder one end.",-1),se=e("p",null,"Flip around and solder the other end.",-1),ne=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-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1),ie=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),re=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),le=e("p",null,"Use the following diagram:",-1),he=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),de=e("p",null,"Use the following diagram:",-1),pe=i("",6),ce=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),ue=e("p",null,"Place the camera into the mount",-1),_e=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),me={align:"center"},fe=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),we=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1),ge=e("p",null,"This uses the method of gluing the camera.",-1),be=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),ye=e("p",null,"Place the camera on the mount.",-1),ve=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1),Se=e("p",null,"This again differs from mount to mount.",-1),ke=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),Pe=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),Te=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),qe=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1694358539000}'),Ee={name:"how_to_build/full_build.md"},Ne=Object.assign(Ee,{setup(xe){return(Ce,Ie)=>(d(),p("div",null,[_,m,f,t(a,{options:o(s).V4_wire_sketch},null,8,["options"]),w,g,t(a,{options:o(s).V4_solder_wire},null,8,["options"]),b,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),y,v,S,k,t(a,{options:o(s).external_antenna},null,8,["options"]),P,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),T,E,x,C,I,t(a,{options:o(s).camera_socket},null,8,["options"]),V,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),D,t(a,{options:o(s).camera_cable},null,8,["options"]),A,t(a,{options:o(s).camera_clip_close},null,8,["options"]),B,q,N,t(a,{options:o(s)._7_12_one},null,8,["options"]),L,t(a,{options:o(s)._7_12_two},null,8,["options"]),R,G,U,O,H,t(a,{options:o(s)._7_12_three},null,8,["options"]),W,M,t(a,{options:o(s)._13_18_one},null,8,["options"]),j,t(a,{options:o(s)._13_18_two},null,8,["options"]),F,t(a,{options:o(s)._13_18_three},null,8,["options"]),Y,t(a,{options:o(s)._13_18_four},null,8,["options"]),z,t(a,{options:o(s)._13_18_five},null,8,["options"]),$,t(a,{options:o(s)._13_18_six},null,8,["options"]),J,t(a,{options:o(s)._13_18_seven},null,8,["options"]),Q,X,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Z,t(a,{options:o(s)._13_18_nine},null,8,["options"]),K,t(a,{options:o(s)._13_18_ten},null,8,["options"]),ee,te,t(a,{options:o(s).end_one},null,8,["options"]),oe,t(a,{options:o(s).end_two},null,8,["options"]),ae,t(a,{options:o(s).end_three},null,8,["options"]),se,t(a,{options:o(s).end_four},null,8,["options"]),ne,ie,re,t(a,{options:o(s).end_five},null,8,["options"]),le,t(a,{options:o(s).end_six},null,8,["options"]),he,t(a,{options:o(s).end_seven},null,8,["options"]),de,t(a,{options:o(s).end_eight},null,8,["options"]),pe,t(a,{options:o(s).end_nine},null,8,["options"]),ce,ue,t(a,{options:o(s).end_ten},null,8,["options"]),_e,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",me,[t(r,{options:o(l).end_one},{content:c(()=>[fe]),_:1},8,["options"])]),we,t(a,{options:o(s).end_twelve},null,8,["options"]),ge,be,t(a,{options:o(s).end_thirteen},null,8,["options"]),ye,t(a,{options:o(s).end_fourteen},null,8,["options"]),ve,Se,ke,t(a,{options:o(s).end_fifteen},null,8,["options"]),Pe,t(a,{options:o(s).end_sixteen},null,8,["options"]),Te]))}});export{qe as __pageData,Ne as default}; diff --git a/assets/how_to_build_parts_list.md.d6d922fd.js b/assets/how_to_build_parts_list.md.aba29938.js similarity index 99% rename from assets/how_to_build_parts_list.md.d6d922fd.js rename to assets/how_to_build_parts_list.md.aba29938.js index da61bfe..32ccb42 100644 --- a/assets/how_to_build_parts_list.md.d6d922fd.js +++ b/assets/how_to_build_parts_list.md.aba29938.js @@ -1 +1 @@ -import{_ as h,a as d}from"./chunks/index.2510e13f.js";import{A as w}from"./chunks/Accordion.990634ba.js";import{o as t,c as a,F as u,D as c,b as y,w as o,k as e,t as m,e as k,l as i,H as s,a as r,Q as b}from"./chunks/framework.1f7cb35e.js";const g={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/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/EyeTrackVR/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/bitbyt3r/index-eyetrackvr/blob/main/Index-EyetrackVRv4.stl",desc:"★ V4 IR and Camera mount by bitbyt3r"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)/Gen%203%20Prohurtz%20V2%20Mounts%20(VROptician)",desc:"★ VROptician V4 IR and Camera mount by MUTE the Cyberwolf"},{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"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"V3 High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"V3 Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:6},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:7}]},P={class:"font-semibold text-xl"},E={class:""},R={style:{"list-style":"none"}},S=["href"],x={__name:"PartsList",setup(_){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(g).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",R,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,S)]))),256)):k("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-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),T=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),A=b('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

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

AliExpress

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

Things worth noting:

  • There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.

  • 2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.

Wires and adapters

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',41),C=e("p",null,"4x Unfocused SMD IR emitters",-1),I=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),q=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" 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.")])],-1),M=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),B=e("li",null,[e("p",null,"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)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"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.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),U=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),W=b('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

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.

',7),N=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),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(_){return(p,f)=>(t(),a("div",null,[v,s(h,{options:i(d).parts_list_one},{content:o(()=>[V]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[T]),_:1},8,["options"]),A,e("ul",null,[e("li",null,[C,s(h,{options:i(d).parts_list_four},{content:o(()=>[I]),_:1},8,["options"]),q]),M,B,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[U]),_:1},8,["options"]),s(x),W,s(h,{options:i(d).parts_list_six},{content:o(()=>[N]),_:1},8,["options"])]))}});export{Z as __pageData,J as default}; +import{_ as h,a as d}from"./chunks/index.8ad7dc66.js";import{A as w}from"./chunks/Accordion.a0a88ff3.js";import{o as t,c as a,F as u,D as c,b as y,w as o,k as e,t as m,e as k,l as i,H as s,a as r,Q as b}from"./chunks/framework.e4c952c1.js";const g={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/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/EyeTrackVR/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/bitbyt3r/index-eyetrackvr/blob/main/Index-EyetrackVRv4.stl",desc:"★ V4 IR and Camera mount by bitbyt3r"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)/Gen%203%20Prohurtz%20V2%20Mounts%20(VROptician)",desc:"★ VROptician V4 IR and Camera mount by MUTE the Cyberwolf"},{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"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"V3 High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"V3 Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:6},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:7}]},P={class:"font-semibold text-xl"},E={class:""},R={style:{"list-style":"none"}},S=["href"],x={__name:"PartsList",setup(_){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(g).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",R,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,S)]))),256)):k("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-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),T=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),A=b('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

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

AliExpress

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

Things worth noting:

  • There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.

  • 2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.

Wires and adapters

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',41),C=e("p",null,"4x Unfocused SMD IR emitters",-1),I=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),q=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" 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.")])],-1),M=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),B=e("li",null,[e("p",null,"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)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"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.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),U=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),W=b('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

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.

',7),N=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),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(_){return(p,f)=>(t(),a("div",null,[v,s(h,{options:i(d).parts_list_one},{content:o(()=>[V]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[T]),_:1},8,["options"]),A,e("ul",null,[e("li",null,[C,s(h,{options:i(d).parts_list_four},{content:o(()=>[I]),_:1},8,["options"]),q]),M,B,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[U]),_:1},8,["options"]),s(x),W,s(h,{options:i(d).parts_list_six},{content:o(()=>[N]),_:1},8,["options"])]))}});export{Z as __pageData,J as default}; diff --git a/assets/how_to_build_parts_list.md.d6d922fd.lean.js b/assets/how_to_build_parts_list.md.aba29938.lean.js similarity index 97% rename from assets/how_to_build_parts_list.md.d6d922fd.lean.js rename to assets/how_to_build_parts_list.md.aba29938.lean.js index 0578758..b9e0a52 100644 --- a/assets/how_to_build_parts_list.md.d6d922fd.lean.js +++ b/assets/how_to_build_parts_list.md.aba29938.lean.js @@ -1 +1 @@ -import{_ as h,a as d}from"./chunks/index.2510e13f.js";import{A as w}from"./chunks/Accordion.990634ba.js";import{o as t,c as a,F as u,D as c,b as y,w as o,k as e,t as m,e as k,l as i,H as s,a as r,Q as b}from"./chunks/framework.1f7cb35e.js";const g={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/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/EyeTrackVR/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/bitbyt3r/index-eyetrackvr/blob/main/Index-EyetrackVRv4.stl",desc:"★ V4 IR and Camera mount by bitbyt3r"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)/Gen%203%20Prohurtz%20V2%20Mounts%20(VROptician)",desc:"★ VROptician V4 IR and Camera mount by MUTE the Cyberwolf"},{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"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"V3 High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"V3 Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:6},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:7}]},P={class:"font-semibold text-xl"},E={class:""},R={style:{"list-style":"none"}},S=["href"],x={__name:"PartsList",setup(_){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(g).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",R,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,S)]))),256)):k("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-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),T=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),A=b("",41),C=e("p",null,"4x Unfocused SMD IR emitters",-1),I=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),q=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" 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.")])],-1),M=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),B=e("li",null,[e("p",null,"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)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"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.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),U=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),W=b("",7),N=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),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(_){return(p,f)=>(t(),a("div",null,[v,s(h,{options:i(d).parts_list_one},{content:o(()=>[V]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[T]),_:1},8,["options"]),A,e("ul",null,[e("li",null,[C,s(h,{options:i(d).parts_list_four},{content:o(()=>[I]),_:1},8,["options"]),q]),M,B,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[U]),_:1},8,["options"]),s(x),W,s(h,{options:i(d).parts_list_six},{content:o(()=>[N]),_:1},8,["options"])]))}});export{Z as __pageData,J as default}; +import{_ as h,a as d}from"./chunks/index.8ad7dc66.js";import{A as w}from"./chunks/Accordion.a0a88ff3.js";import{o as t,c as a,F as u,D as c,b as y,w as o,k as e,t as m,e as k,l as i,H as s,a as r,Q as b}from"./chunks/framework.e4c952c1.js";const g={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/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/EyeTrackVR/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/bitbyt3r/index-eyetrackvr/blob/main/Index-EyetrackVRv4.stl",desc:"★ V4 IR and Camera mount by bitbyt3r"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)/Gen%203%20Prohurtz%20V2%20Mounts%20(VROptician)",desc:"★ VROptician V4 IR and Camera mount by MUTE the Cyberwolf"},{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"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"V3 High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"V3 Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 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/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:6},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:7}]},P={class:"font-semibold text-xl"},E={class:""},R={style:{"list-style":"none"}},S=["href"],x={__name:"PartsList",setup(_){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(g).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",R,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,S)]))),256)):k("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},v=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-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),T=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),A=b("",41),C=e("p",null,"4x Unfocused SMD IR emitters",-1),I=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),q=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" 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.")])],-1),M=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),B=e("li",null,[e("p",null,"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)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"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.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),U=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),W=b("",7),N=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),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(_){return(p,f)=>(t(),a("div",null,[v,s(h,{options:i(d).parts_list_one},{content:o(()=>[V]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[T]),_:1},8,["options"]),A,e("ul",null,[e("li",null,[C,s(h,{options:i(d).parts_list_four},{content:o(()=>[I]),_:1},8,["options"]),q]),M,B,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[U]),_:1},8,["options"]),s(x),W,s(h,{options:i(d).parts_list_six},{content:o(()=>[N]),_:1},8,["options"])]))}});export{Z as __pageData,J as default}; diff --git a/assets/index.md.ca39f1a7.js b/assets/index.md.0b651dfd.js similarity index 96% rename from assets/index.md.ca39f1a7.js rename to assets/index.md.0b651dfd.js index b6556ab..e3da0f9 100644 --- a/assets/index.md.ca39f1a7.js +++ b/assets/index.md.0b651dfd.js @@ -1 +1 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.1f7cb35e.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR ETVR VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Open-source and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR 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/EyeTrackVR/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","filePath":"index.md","lastUpdated":1695743559000}'),o={name:"index.md"};function n(i,r,l,c,s,d){return t(),a("div")}const p=e(o,[["render",n]]);export{m as __pageData,p as default}; +import{_ as e,o as t,c as a}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR ETVR VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Open-source and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR 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/EyeTrackVR/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","filePath":"index.md","lastUpdated":1695743559000}'),o={name:"index.md"};function n(i,r,l,c,s,d){return t(),a("div")}const p=e(o,[["render",n]]);export{m as __pageData,p as default}; diff --git a/assets/index.md.ca39f1a7.lean.js b/assets/index.md.0b651dfd.lean.js similarity index 96% rename from assets/index.md.ca39f1a7.lean.js rename to assets/index.md.0b651dfd.lean.js index b6556ab..e3da0f9 100644 --- a/assets/index.md.ca39f1a7.lean.js +++ b/assets/index.md.0b651dfd.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.1f7cb35e.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR ETVR VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Open-source and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR 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/EyeTrackVR/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","filePath":"index.md","lastUpdated":1695743559000}'),o={name:"index.md"};function n(i,r,l,c,s,d){return t(),a("div")}const p=e(o,[["render",n]]);export{m as __pageData,p as default}; +import{_ as e,o as t,c as a}from"./chunks/framework.e4c952c1.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR ETVR VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Open-source and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR 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/EyeTrackVR/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","filePath":"index.md","lastUpdated":1695743559000}'),o={name:"index.md"};function n(i,r,l,c,s,d){return t(),a("div")}const p=e(o,[["render",n]]);export{m as __pageData,p as default}; diff --git a/assets/misc_faq.md.3dbf62c9.js b/assets/misc_faq.md.314d6845.js similarity index 96% rename from assets/misc_faq.md.3dbf62c9.js rename to assets/misc_faq.md.314d6845.js index 48fb683..7b28de2 100644 --- a/assets/misc_faq.md.3dbf62c9.js +++ b/assets/misc_faq.md.314d6845.js @@ -1 +1 @@ -import{A as c}from"./chunks/Accordion.990634ba.js";import{o as s,c as a,F as d,D as h,b as u,w as o,k as e,t as n,e as p,l as f,H as _,a as m}from"./chunks/framework.1f7cb35e.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking 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 $30-80. 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:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",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:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default}; +import{A as c}from"./chunks/Accordion.a0a88ff3.js";import{o as s,c as a,F as d,D as h,b as u,w as o,k as e,t as n,e as p,l as f,H as _,a as m}from"./chunks/framework.e4c952c1.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking 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 $30-80. 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:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",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:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default}; diff --git a/assets/misc_faq.md.3dbf62c9.lean.js b/assets/misc_faq.md.314d6845.lean.js similarity index 96% rename from assets/misc_faq.md.3dbf62c9.lean.js rename to assets/misc_faq.md.314d6845.lean.js index 48fb683..7b28de2 100644 --- a/assets/misc_faq.md.3dbf62c9.lean.js +++ b/assets/misc_faq.md.314d6845.lean.js @@ -1 +1 @@ -import{A as c}from"./chunks/Accordion.990634ba.js";import{o as s,c as a,F as d,D as h,b as u,w as o,k as e,t as n,e as p,l as f,H as _,a as m}from"./chunks/framework.1f7cb35e.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking 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 $30-80. 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:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",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:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default}; +import{A as c}from"./chunks/Accordion.a0a88ff3.js";import{o as s,c as a,F as d,D as h,b as u,w as o,k as e,t as n,e as p,l as f,H as _,a as m}from"./chunks/framework.e4c952c1.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking 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 $30-80. 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:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",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:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default}; diff --git a/assets/misc_vrc_avatar_setup.md.bfdb6de4.js b/assets/misc_vrc_avatar_setup.md.e817a3ae.js similarity index 94% rename from assets/misc_vrc_avatar_setup.md.bfdb6de4.js rename to assets/misc_vrc_avatar_setup.md.e817a3ae.js index 73df872..ad52846 100644 --- a/assets/misc_vrc_avatar_setup.md.bfdb6de4.js +++ b/assets/misc_vrc_avatar_setup.md.e817a3ae.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.2510e13f.js";import{o as r,c as o,k as e,H as s,w as c,l as n,a as i,Q as d}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-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),_=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),h={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":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default}; +import{_ as t,a}from"./chunks/index.8ad7dc66.js";import{o as r,c as o,k as e,H as s,w as c,l as n,a as i,Q as d}from"./chunks/framework.e4c952c1.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-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-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),_=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),h={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":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default}; diff --git a/assets/misc_vrc_avatar_setup.md.bfdb6de4.lean.js b/assets/misc_vrc_avatar_setup.md.e817a3ae.lean.js similarity index 90% rename from assets/misc_vrc_avatar_setup.md.bfdb6de4.lean.js rename to assets/misc_vrc_avatar_setup.md.e817a3ae.lean.js index 835f979..e0c5020 100644 --- a/assets/misc_vrc_avatar_setup.md.bfdb6de4.lean.js +++ b/assets/misc_vrc_avatar_setup.md.e817a3ae.lean.js @@ -1 +1 @@ -import{_ as t,a}from"./chunks/index.2510e13f.js";import{o as r,c as o,k as e,H as s,w as c,l as n,a as i,Q as d}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-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),_=d("",7),h={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":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default}; +import{_ as t,a}from"./chunks/index.8ad7dc66.js";import{o as r,c as o,k as e,H as s,w as c,l as n,a as i,Q as d}from"./chunks/framework.e4c952c1.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-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-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),_=d("",7),h={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":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default}; diff --git a/assets/software_guide_build_software.md.10b4fcdc.js b/assets/software_guide_build_software.md.067d21a0.js similarity index 94% rename from assets/software_guide_build_software.md.10b4fcdc.js rename to assets/software_guide_build_software.md.067d21a0.js index bcbdf91..4323ebb 100644 --- a/assets/software_guide_build_software.md.10b4fcdc.js +++ b/assets/software_guide_build_software.md.067d21a0.js @@ -1 +1 @@ -import{_ as r,a as n}from"./chunks/index.2510e13f.js";import{_ as i}from"./chunks/CheckBoxList.26e03ba7.js";import{o as l,c as s,H as o,w as d,l as a,k as e,a as t,Q as h}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1),f=h('

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),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default}; +import{_ as r,a as n}from"./chunks/index.8ad7dc66.js";import{_ as i}from"./chunks/CheckBoxList.9fb033ec.js";import{o as l,c as s,H as o,w as d,l as a,k as e,a as t,Q as h}from"./chunks/framework.e4c952c1.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-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1),f=h('

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),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default}; diff --git a/assets/software_guide_build_software.md.10b4fcdc.lean.js b/assets/software_guide_build_software.md.067d21a0.lean.js similarity index 89% rename from assets/software_guide_build_software.md.10b4fcdc.lean.js rename to assets/software_guide_build_software.md.067d21a0.lean.js index 54fe08b..891692b 100644 --- a/assets/software_guide_build_software.md.10b4fcdc.lean.js +++ b/assets/software_guide_build_software.md.067d21a0.lean.js @@ -1 +1 @@ -import{_ as r,a as n}from"./chunks/index.2510e13f.js";import{_ as i}from"./chunks/CheckBoxList.26e03ba7.js";import{o as l,c as s,H as o,w as d,l as a,k as e,a as t,Q as h}from"./chunks/framework.1f7cb35e.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-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1),f=h("",12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default}; +import{_ as r,a as n}from"./chunks/index.8ad7dc66.js";import{_ as i}from"./chunks/CheckBoxList.9fb033ec.js";import{o as l,c as s,H as o,w as d,l as a,k as e,a as t,Q as h}from"./chunks/framework.e4c952c1.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-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-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-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1),f=h("",12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.js b/assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.js similarity index 98% rename from assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.js rename to assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.js index 9f31c0b..51f2f8e 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.js @@ -1 +1 @@ -import{_ as s,a as l}from"./chunks/index.2510e13f.js";import{_ as o,i as r}from"./chunks/index.03b5fd27.js";import{o as d,c as h,H as t,l as a,w as c,Q as n,k as e,a as i}from"./chunks/framework.1f7cb35e.js";const p=n('

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 Setup.exe file.

Follow the prompts and the app should be installed.

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:

',7),u=n('

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

Wireless configuration

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.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers i. e. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

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

',36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=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),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n('

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),C=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),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"​")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default}; +import{_ as s,a as l}from"./chunks/index.8ad7dc66.js";import{_ as o,i as r}from"./chunks/index.0e6ad99c.js";import{o as d,c as h,H as t,l as a,w as c,Q as n,k as e,a as i}from"./chunks/framework.e4c952c1.js";const p=n('

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 Setup.exe file.

Follow the prompts and the app should be installed.

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:

',7),u=n('

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

Wireless configuration

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.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers i. e. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

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

',36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=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),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n('

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),C=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),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"​")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.lean.js b/assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.lean.js similarity index 93% rename from assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.lean.js rename to assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.lean.js index 5bad720..f604023 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.dcb1818d.lean.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.7beed7fa.lean.js @@ -1 +1 @@ -import{_ as s,a as l}from"./chunks/index.2510e13f.js";import{_ as o,i as r}from"./chunks/index.03b5fd27.js";import{o as d,c as h,H as t,l as a,w as c,Q as n,k as e,a as i}from"./chunks/framework.1f7cb35e.js";const p=n("",7),u=n("",36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=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),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n("",8),C=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),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"​")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default}; +import{_ as s,a as l}from"./chunks/index.8ad7dc66.js";import{_ as o,i as r}from"./chunks/index.0e6ad99c.js";import{o as d,c as h,H as t,l as a,w as c,Q as n,k as e,a as i}from"./chunks/framework.e4c952c1.js";const p=n("",7),u=n("",36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=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),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n("",8),C=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),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"​")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default}; diff --git a/assets/software_guide_osc_setup.md.bb0fc577.js b/assets/software_guide_osc_setup.md.5969c73c.js similarity index 96% rename from assets/software_guide_osc_setup.md.bb0fc577.js rename to assets/software_guide_osc_setup.md.5969c73c.js index e3d7c7f..69239a5 100644 --- a/assets/software_guide_osc_setup.md.bb0fc577.js +++ b/assets/software_guide_osc_setup.md.5969c73c.js @@ -1 +1 @@ -import{_ as r,a as l}from"./chunks/index.2510e13f.js";import{_ as a,i as n}from"./chunks/index.03b5fd27.js";import{o as c,c as d,H as t,w as h,l as o,k as e,a as i,Q as s}from"./chunks/framework.1f7cb35e.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),x=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Reseting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the adresses can be changed in the app settings, if need be.

',14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),S={name:"software_guide/osc_setup.md"},B=Object.assign(S,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),x]))}});export{O as __pageData,B as default}; +import{_ as r,a as l}from"./chunks/index.8ad7dc66.js";import{_ as a,i as n}from"./chunks/index.0e6ad99c.js";import{o as c,c as d,H as t,w as h,l as o,k as e,a as i,Q as s}from"./chunks/framework.e4c952c1.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),x=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Reseting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the adresses can be changed in the app settings, if need be.

',14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),S={name:"software_guide/osc_setup.md"},B=Object.assign(S,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),x]))}});export{O as __pageData,B as default}; diff --git a/assets/software_guide_osc_setup.md.bb0fc577.lean.js b/assets/software_guide_osc_setup.md.5969c73c.lean.js similarity index 94% rename from assets/software_guide_osc_setup.md.bb0fc577.lean.js rename to assets/software_guide_osc_setup.md.5969c73c.lean.js index 986d20d..b44acf2 100644 --- a/assets/software_guide_osc_setup.md.bb0fc577.lean.js +++ b/assets/software_guide_osc_setup.md.5969c73c.lean.js @@ -1 +1 @@ -import{_ as r,a as l}from"./chunks/index.2510e13f.js";import{_ as a,i as n}from"./chunks/index.03b5fd27.js";import{o as c,c as d,H as t,w as h,l as o,k as e,a as i,Q as s}from"./chunks/framework.1f7cb35e.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s("",6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),x=s("",14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),S={name:"software_guide/osc_setup.md"},B=Object.assign(S,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),x]))}});export{O as __pageData,B as default}; +import{_ as r,a as l}from"./chunks/index.8ad7dc66.js";import{_ as a,i as n}from"./chunks/index.0e6ad99c.js";import{o as c,c as d,H as t,w as h,l as o,k as e,a as i,Q as s}from"./chunks/framework.e4c952c1.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s("",6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),x=s("",14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),S={name:"software_guide/osc_setup.md"},B=Object.assign(S,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),x]))}});export{O as __pageData,B as default}; diff --git a/contact.html b/contact.html index a16295a..7fb195f 100644 --- a/contact.html +++ b/contact.html @@ -7,17 +7,17 @@ - + - - - + + + - - + + \ No newline at end of file diff --git a/dev_roadmap.html b/dev_roadmap.html index 9dc2769..3656c11 100644 --- a/dev_roadmap.html +++ b/dev_roadmap.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

Released under the MIT License.

- +
Skip to content

Released under the MIT License.

+ \ No newline at end of file diff --git a/development/docs/dev_docs.html b/development/docs/dev_docs.html index b7a7a62..62be0c5 100644 --- a/development/docs/dev_docs.html +++ b/development/docs/dev_docs.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

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/EyeTrackVR/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.

- +
Skip to content

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/EyeTrackVR/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.html b/development/docs/pages.html index 5edec36..c371835 100644 --- a/development/docs/pages.html +++ b/development/docs/pages.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

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

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,7 +25,7 @@
         { text: "My Page", link: "/my_folder/my_page" }, // Add this line - subdir then file
     ],
 },

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.html b/development/docs/standards.html index 9807c03..dfe9773 100644 --- a/development/docs/standards.html +++ b/development/docs/standards.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

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

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 @@
 
 - added new thing # some detail about the new thing
 
-BREAKING CHANGE: this is a breaking change #this line is optionaland only used if needed

Released under the MIT License.

- +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.html b/firmware_guide/configure_firmware.html index 812809f..a830250 100644 --- a/firmware_guide/configure_firmware.html +++ b/firmware_guide/configure_firmware.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

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'

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

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.

Please reference the Firmware Enviroments Page for more information.

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

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'

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

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.

Additional 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.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

Released under the MIT License.

+ \ No newline at end of file diff --git a/firmware_guide/environments.html b/firmware_guide/environments.html index 942f681..f6c8b87 100644 --- a/firmware_guide/environments.html +++ b/firmware_guide/environments.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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 firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

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

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

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 - 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).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

GIF showing a switch of board enviroments.

Released under the MIT License.

- +
Skip to content

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 firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

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

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

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 - 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).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

GIF showing a switch of board environments.

Released under the MIT License.

+ \ No newline at end of file diff --git a/firmware_guide/firmware.html b/firmware_guide/firmware.html index 511389b..955f4fa 100644 --- a/firmware_guide/firmware.html +++ b/firmware_guide/firmware.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

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

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. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for OTA and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

Released under the MIT License.

+ \ No newline at end of file diff --git a/firmware_guide/flashing_tool.html b/firmware_guide/flashing_tool.html new file mode 100644 index 0000000..f702ba3 --- /dev/null +++ b/firmware_guide/flashing_tool.html @@ -0,0 +1,24 @@ + + + + + + Firmware Flashing Tool | EyeTrackVR Docs + + + + + + + + + + + + + +
Skip to content

Firmware Flashing Tool

What is this?

The Firmware Flashing Tool allows you to flash the firmware to your ESPs without requiring VScode. It is a GUI tool that is built using Tauri and SolidJS.

Features include:

  • download pre-built firmware binaries
  • configure firmware settings
  • flash firmware to ESPs
  • open a serial monitor to view the ESPs output for debugging

Note

This tool is currently in beta, and we are working on adding support for OTA and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

Flashing Tool ui
Flashing Tool ui lower half

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.

Please reference the Firmware Environments Page for more information.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/firmware_guide/mdns.html b/firmware_guide/mdns.html index de6a8aa..98caf6e 100644 --- a/firmware_guide/mdns.html +++ b/firmware_guide/mdns.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

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

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.html b/firmware_guide/rest_api.html index 981bfd9..09f8962 100644 --- a/firmware_guide/rest_api.html +++ b/firmware_guide/rest_api.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

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 {
+    
Skip to content

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
     WIFI_POWER_18_5dBm = 74,// 18.5dBm
@@ -43,7 +43,7 @@
     WIFI_POWER_2dBm = 8,// 2dBm
     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.html b/firmware_guide/setup_vscode.html index 0ca1b6c..d9ebe78 100644 --- a/firmware_guide/setup_vscode.html +++ b/firmware_guide/setup_vscode.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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 the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. 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'

4. 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/EyeTrackVR/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/EyeTrackVR/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

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 the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. 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'

4. 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/EyeTrackVR/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/EyeTrackVR/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.html b/firmware_guide/update_platformio.html index 388cfcf..0fa30b1 100644 --- a/firmware_guide/update_platformio.html +++ b/firmware_guide/update_platformio.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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.

- +
Skip to content

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_and_update_firmware.html b/firmware_guide/upload_and_update_firmware.html index cf05ed5..c66e4bd 100644 --- a/firmware_guide/upload_and_update_firmware.html +++ b/firmware_guide/upload_and_update_firmware.html @@ -7,23 +7,23 @@ - + - - - - - + + + + + -
Skip to content

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

Option 1: Connect ESP32-CAM 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.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

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, 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. Follow the manual building guide

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

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

NOTE

You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi.

  1. Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the _OTA suffix. Next, press the checkmark button to build it without uploading.
'Selecting platformio environment'
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

'Firmware uploading web page'

Click on the select file button, and navigate to where you cloned the project and then to the ESP/ directory.

Once there, open .pio\build\your-environment like so:

By default, windows treats files and directories with a dot in front of their name as hidden. To change that - see here

'An example of how the bin file directory looks like'

You'll find a couple files in there, select the one named your-environment-vVersion-feature.

like this one:

'An example of how the bin file looks like'
  1. Press upload and wait for it to finish. Done!
'A finished OTA upload'

For firmware versions of 1.0.0 and under:

  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

Like so:

ini
[ota]
+    
Skip to content

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

Option 1: Connect ESP32-CAM 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.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

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, 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. Follow the manual building guide

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

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

NOTE

You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi.

  1. Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the _OTA suffix. Next, press the checkmark button to build it without uploading.
'Selecting platformio environment'
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

'Firmware uploading web page'

Click on the select file button, and navigate to where you cloned the project and then to the ESP/ directory.

Once there, open .pio\build\your-environment like so:

By default, windows treats files and directories with a dot in front of their name as hidden. To change that - see here

'An example of how the bin file directory looks like'

You'll find a couple files in there, select the one named your-environment-vVersion-feature.

like this one:

'An example of how the bin file looks like'
  1. Press upload and wait for it to finish. Done!
'A finished OTA upload'

For firmware versions of 1.0.0 and under:

  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

Like so:

ini
[ota]
 enableota = 1
 otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
 otapassword = "12345678"
-otaserverport = 3232
  1. Change to OTA env

To do that, in visual studio code, locate the uplaod button, next to it will be listed a couple of buttons and your current environment.

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

Click on it.

'An example of how the popup list of envs looks like'

This will open a list of all available environments, select the one that matches your board and has a _OTA suffix

'An example of how the button for selecting env looks like'
  1. Restart the ESPs, they must be power cycled
  2. Press the upload button to upload the firmware.

    img
  3. Do not touch esps or move them during OTA upload
  4. Wait around 1 minute.
  5. 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 C:/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.

- +otaserverport = 3232
  1. Change to OTA env

To do that, in visual studio code, locate the uplaod button, next to it will be listed a couple of buttons and your current environment.

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

Click on it.

'An example of how the popup list of envs looks like'

This will open a list of all available environments, select the one that matches your board and has a _OTA suffix

'An example of how the button for selecting env looks like'
  1. Restart the ESPs, they must be power cycled
  2. Press the upload button to upload the firmware.

    img
  3. Do not touch esps or move them during OTA upload
  4. Wait around 1 minute.
  5. 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 C:/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.html b/getting_started/intro.html index 94b0d35..c786595 100644 --- a/getting_started/intro.html +++ b/getting_started/intro.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

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 no more than 5 mW/sr 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

ICNIRP: Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm)

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

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 no more than 5 mW/sr 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

ICNIRP: Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm)

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/led_safety.html b/getting_started/led_safety.html index 454aebc..da8a52b 100644 --- a/getting_started/led_safety.html +++ b/getting_started/led_safety.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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 or are not understand something, just do exactly what we do. Don't use different emitters, don't use different 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, excessive eye-strain 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.

What we care about:

We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.

Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.

The International Commission on Non-Ionizing Radiation Protection's Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm) states:

"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"

So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.

It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.

NOTE

This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins.

V3 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.

(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2

Now, this is only for 1 LED, in the case of V3 we have 2 so we can:

0.8 mW/cm2 * 2 = 1.6 mW/cm2

This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.

V4 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

V4 hardware is actively limited to ~2.4 mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2

Now, this is only for 1 LED, in the case of V4 we have 4 so we can:

0.6 mW/cm2 * 4 = 2.4 mW/cm2

This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.

Released under the MIT License.

- +
Skip to content

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 or are not understand something, just do exactly what we do. Don't use different emitters, don't use different 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, excessive eye-strain 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.

What we care about:

We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.

Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.

The International Commission on Non-Ionizing Radiation Protection's Guidelines of limits of exposure to broad-band incoherent optical radiation (0.38 to 3 µm) states:

"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"

So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.

It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.

NOTE

This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins.

V3 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.

(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2

Now, this is only for 1 LED, in the case of V3 we have 2 so we can:

0.8 mW/cm2 * 2 = 1.6 mW/cm2

This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.

V4 Hardware Safety Outline and Exposure Numbers:

For all of this math we will assume the "worst" to ensure we are well within safety.

V4 hardware is actively limited to ~2.4 mA

The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.

5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr

Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr

0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2

Now, this is only for 1 LED, in the case of V4 we have 4 so we can:

0.6 mW/cm2 * 4 = 2.4 mW/cm2

This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.

Released under the MIT License.

+ \ No newline at end of file diff --git a/getting_started/things_to_know.html b/getting_started/things_to_know.html index fe88323..236c6aa 100644 --- a/getting_started/things_to_know.html +++ b/getting_started/things_to_know.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

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. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar

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

Released under the MIT License.

- +
Skip to content

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. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special 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 f03c060..b208085 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"contact.md":"a2c6963a","development_docs_standards.md":"413d5844","firmware_guide_configure_firmware.md":"d87cb28a","firmware_guide_environments.md":"4794ed72","firmware_guide_firmware.md":"343c04a7","firmware_guide_mdns.md":"219d73d2","firmware_guide_rest_api.md":"c9512bce","firmware_guide_setup_vscode.md":"17bb0fe1","firmware_guide_update_platformio.md":"9b9a64fd","firmware_guide_upload_and_update_firmware.md":"2c6d4eed","getting_started_intro.md":"f3812501","getting_started_led_safety.md":"ee0ec671","how_to_build_creating_your_own_mount.md":"5fb1a297","index.md":"ca39f1a7","getting_started_things_to_know.md":"21105a37","how_to_build_parts_list.md":"d6d922fd","misc_vrc_avatar_setup.md":"bfdb6de4","software_guide_build_software.md":"10b4fcdc","misc_faq.md":"3dbf62c9","software_guide_osc_setup.md":"bb0fc577","archive_fox_ir_v2_build_instructions.md":"37294e54","development_docs_dev_docs.md":"88818b58","dev_roadmap.md":"c17da989","about.md":"c167d8c9","software_guide_eyetrackvr_app_guide.md":"dcb1818d","how_to_build_full_build.md":"5bb31bfb","development_docs_pages.md":"69bf3e35"} +{"misc_faq.md":"314d6845","firmware_guide_update_platformio.md":"af6d4d76","contact.md":"c2e94634","dev_roadmap.md":"e0297856","development_docs_dev_docs.md":"c7de805c","development_docs_pages.md":"ec947cc8","development_docs_standards.md":"20a7ac2c","firmware_guide_configure_firmware.md":"7852fa9f","firmware_guide_environments.md":"5499e526","firmware_guide_firmware.md":"2745189a","firmware_guide_flashing_tool.md":"52fe420e","firmware_guide_mdns.md":"7fbdf94c","firmware_guide_rest_api.md":"4fe3ee89","firmware_guide_setup_vscode.md":"bc9620d8","misc_vrc_avatar_setup.md":"e817a3ae","how_to_build_full_build.md":"b9c84c14","getting_started_intro.md":"193e8e8d","software_guide_build_software.md":"067d21a0","software_guide_eyetrackvr_app_guide.md":"7beed7fa","software_guide_osc_setup.md":"5969c73c","firmware_guide_upload_and_update_firmware.md":"1076bd51","index.md":"0b651dfd","archive_fox_ir_v2_build_instructions.md":"b320b3b5","how_to_build_creating_your_own_mount.md":"3ddf5184","about.md":"e87a2ce6","how_to_build_parts_list.md":"aba29938","getting_started_things_to_know.md":"b44e9a98","getting_started_led_safety.md":"694b59dc"} diff --git a/how_to_build/creating_your_own_mount.html b/how_to_build/creating_your_own_mount.html index 8bd846f..1dc441f 100644 --- a/how_to_build/creating_your_own_mount.html +++ b/how_to_build/creating_your_own_mount.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

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

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.html b/how_to_build/full_build.html index 3ee2f5c..abcd49e 100644 --- a/how_to_build/full_build.html +++ b/how_to_build/full_build.html @@ -7,20 +7,20 @@ - + - - - - - - + + + + + + -
Skip to content

Build Guide

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

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are WIP: V4 LED Solderless assemblly rough edit:

Sketch of V4 solderless wiring:

Sketch of V4 wireing

Credit: @seniorpringles, @g0ldjay via Discord

Sketch of solder assembbly of V4:

Sketch of V4 wire

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

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

Build Guide

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

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are WIP: V4 LED Solderless assemblly rough edit:

Sketch of V4 solderless wiring:

Sketch of V4 wiring

Credit: @seniorpringles, @g0ldjay via Discord

Sketch of solder assembbly of V4:

Sketch of V4 wire

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

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.html b/how_to_build/parts_list.html index c58438b..4912f42 100644 --- a/how_to_build/parts_list.html +++ b/how_to_build/parts_list.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

Parts List

CAUTION

Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes.

NOTE

It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay.

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

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

AliExpress

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

Things worth noting:

  • There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.

  • 2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.

Wires and adapters

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

  • 4x Unfocused SMD IR emitters

    NOTE

    The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.

  • 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.

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.

NOTE

You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't.

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

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

Parts List

CAUTION

Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes.

NOTE

It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay.

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

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

AliExpress

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

Things worth noting:

  • There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.

  • 2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.

Wires and adapters

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

  • 4x Unfocused SMD IR emitters

    NOTE

    The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.

  • 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.

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.

NOTE

You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't.

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

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/imgs/flashingtool.png b/imgs/flashingtool.png new file mode 100644 index 0000000000000000000000000000000000000000..e452886858ea88c9930b9904024a2a6801df2000 GIT binary patch literal 116506 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 (X( zEpDhABG5bDW*m(=zvQ2PtR=r<(OFO9+PU$;z90hMT8Mufq®Sbh}3-&E-Fq1#=u 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"acG_P7Luw{#*Udbl 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 literal 0 HcmV?d00001 diff --git a/imgs/flashingtool_1.png b/imgs/flashingtool_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e61788922d9b14c1d12a1f1392163e58d0c328cf GIT binary patch literal 127303 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 Gah+( z^vkZSbDPoiRsQ8Q>C$Rzxc+EMmN9pNuE0m&dQOzepKbDl`lyONr3Gxfg)47$i*+7c zYd!Vs8d`Hs5E^hh2nnB5Hzk$)Fyx9-|I(6xn)h`e4oH5fJk>PUfBUzEMU=pi_)`_S zO6H4YvmUGIeac->VS@zta|Dhn=%eg)YE19O5~tI**fv>~GML3&0Fa$8&7o*)@yw%24WY|Q2J-ctINIwR&r(gbk$5IL4_JSi@{o98Y2j` zMlwO&CORCfJ->7|LVWUeX-HeMf3XpJ@~)MsIXBV%mDZbM5~{bMvIbSu z7Q(bsajd9$aVder*er)$Zs*6H;8G+%_b?WYYA|%tpvS!13GZ_@6WQ}+Jj{{TLWg&G z>_8N%gU$+<>>aQY_#=5>Dos|JovewfTKUp|S<;MsDf?eI)GE zn5o=sRxw6+z5V@=A5l3THgMs7k*)I2@q}C>6IizV>~|-0m8Zo-Mb|2fTdZ`lKtGc1 z_@W6owXtdQdu5MAgr&Q;8I67lDRh{0XeL}dP!k>e3aJ@6^4eMb-w1)3_I0BN>Baw; z`l7lz;ksccE>6g^lh$=7cALjmo+?{{a7)=n^BM$q6BhavG1VzUpA>^VFo@mNyN2-w zEsBmXp&|DLs;rJfz{1tY0!D#*Ej0{qo^Gg2 zqGa%rRGgqm!h^gI`ITlrPXd~N>diLq?Wn`B@4IpA3P0(Hum+j~GnYhZ`)E;ZD7^*a zH}Cp^o+7Z+^7HfT!NfDVfNvdp@}iWQD<%c2B0-%7HO6Do*1uS_M3yLxk?i^=7e45< z%J?tedYB@sy>7wYr*}r=&3c-EgI$ATMd+4OCS`GM#GFFM@aHx<@ps-#fL`Rk*p}8T zx-rB@I4_I0D2iM2a9Ud7F0_qX0^QYSSx*Fc=F8KOZF5b$=PND$l0|~0+_7{r*iZ2( zhh|Sd_RqL~QFTJf*#&4iHv^06;+m^CFg)U(z-oJId0kgoTe#4}SLb}|7s;|+hE7;f z-lsvdMA=_m;urk+P_?h@Fl*UZ)czFIGE!%Yfgmg6N%AGX<3Z+^O0Ln|I=YJ|20XIl zm0nY^uT|7os|~VdvnVpK+jZ%DOZRJ@wDZk5@b1`*Uc;3ePT#x5rF1vO;4{it%P=BY zL$i~?oKt`M_v9=H8BG*>NWx-t5Q)+;vtDWptr!Np*Du?0aN@Fu* zv35{8H|%1$ZF!s0L+mAvhY(>o6{G)qt0-)p=;m=rzi**bC~f zbo#elXfciWO-sX!+6HT-$*ssB#aetGIK3G!fOhG>PJKEX0=<}^8&V~*)Yc}|P{^_2 zjbej;9ji1Jzr$R}?!Xdw^b+rU$&*+4hWI=}P^rAV^11QcIs>9H8$V91c3~eb>f3c- zIPvdLK8p1UHKLEut4LfRjnZ~3_~m8>Yb~?Hzs9%99-i-rmlzMKyz0U$x2jqfag74^Tje?X91!Yf`PDOALhehdnt zoGo57UYfxDx&n}E=%ND_*Go+BKEJubVoNsiGLeVOJ~lf{m%_c)7TwPGWqt<0$RtrI zc@9|1>p10UR1!ss4k3OW)nvwRvjvA6T37E&gBx>5tNrU|HE&iw72p!r6e!5MgtdHX zE>h?bN}+y8M!WurYmN3@BkTDUCs2z$stfM&#*t8S({I2PEH=_&azYk@Mmy})W=vjg z?jYEUyMC3%@Th4L-wAX?!eh5%RE!9fVZG;A5)1N%;TXIq7A1mN8UokL)gg5^3`OnS zF#n(eoK6-SLJdn~cA?z0BWd++%?wW1EjJjfyw+i_>e}MpY$aCqotrPMdi3(btF*pH zVwHocgs-v{JxVL}%U-2DV&(0IM_Q)W5DTmNN-fi?ol&vHcUbupTQrRn7mh6i!O+E} zjbhye!qbOj-}b7&E$-PIHNF!qA*AR!{o>S?9eys>DUk!KyQnmrs$YwfvaMb;r{NtE zTiKpdqDg)YpkJoa$p99Q)Z!QH9xc1YWpndnuffpYS(^>|XBP;R<;#O|3nJys63DSzUEMUtqZrW^akC|Y0Ey~#CrB-n?1O8Q zg4&>UUQL3*4ey46dTPRoWcB`xYmz(Acd7!(QV&bfC&F6XK>$CN{X@`4JPbk;>_w9FebPHc1{Vt$koqRjr8vCY>7^eBnvQsC zBR&nR%-NIaU%v{cp-L>q=lUf}+P-f>z?+uZeRb9nEOzpr)@l}!&BE38aKjAiJ^00{ z^2gNfF$unpNZ<|(=Wf$>?4%ejXlBFYjlZN2gs`PG(P}6x!gA3(oTiNF!G_MmUoC}d zBhfEtEF=;SD-Pw7`p2KGWo&yswoUg@-y$d){?Qgt2P?w|LTG1l6IrolZGy^2obp_S z3mBDpn~{bZORO`Sy~`7d(T%r$)|o0e0#;tov3&IaVSX0d9yFFgt@>%`-VzG<)7xDA zSW_|hMw(vMfjPM6();+T8wioxO>+&F0;Emsx!UbfF~(shfnCQz2wzQ$qp6j1kDZ39 z#By)kK5?W{iJe%3)Slu<&eU$bxSO{YGcqtsjoIpo?{EtPS_AbE{h`+Xl#Q zs0A%450B$T#|v)dKy69|^$4Gh$mN=@ST~s&J%4{nM?6SQVk7#cRut7}XRafwnT8@{ zQzjmn)*rix#f_=swFcA`fzM8H4)cP9tK$%Sb@*4iA2b1MF8aO??b|^#;+qkuPA6>i zsohq_j7KiqKdX-|A`N+d*Bvm!u)yiY%CldxdRQ3{hH+vb{};WRJ+!MzM>58iqn%+} z-$U?kJ5|b)W(4<%O@l%gQ_AUzdb)__AwpFp2S#~)qL}X3@9U`Cm{z@Jq5<+NfN)&! zQ0nhJmKuMwh_%co?s4uNvfV~sTHb9Vt`pL)qTI>UiW&*3%AJRx@7}D}$JbQ$j(Tdf zRhoX?7#a2a&W_g(qiJ=b=}(qh9#e+;?_A$N3sYGI@Z#R~)sJ^nx%csJtO%PC0Noh% zQz_FeoFVz8KfuptxKFqM*uU%ESqRTHaG^#ERO?;t@J=f=vcqgrk;fC-;rXE=9-W0# zk*AF4QF&+42Yt#HoOIWN9L~&Svy%i$%6B&=(;5+5yn(4;D^$44@r70)YJs2e2IU3`N|cLWs`=Xg-qTkH!FvDgSokXw(uv7nK9v)*VjD9NS#5 z*ub65^t|LVnP!ouZASk39BHh{WU&zmzKi3J!qKUgk2j}ieUZHfZpCDLic`Q-u$@OlxLA!*LSM4ywxrREkDv-sN10mrqO($K*FulxqmlV z%C2N>2LCDu(aUAy!MTjisO}RQzmT*9}e1ny4&MbE@+L&9QFyE{*@;bxtaFJ z2*CMQ9yzrQwY^F`voO+cf+71gL^Jb@D8moEqkB}`Wjcz=c~YOwY1tjjrleYujmrt1 z!q0fh+Qw@Z%TRSoC$^UK&1O2Y##=BR5>I&U9rRIO_dNZxpjnIDC#8q%6&rV*>J!el zm{2_$c`M+40u7oas4mfUg}BVMF{7FB``y~%00x|bR{{}rxz)XfV@LkO9fRZS6A|A! zgD8uI@-P2& z^UeDb*0HgJ{gyk#niHE?!+CZPCFqJel6_LzBto>4xRkgwSthr1aBO`ps10wTLmz@; zVAs*6KINYsWwp9I>bo4K$mrH~o33<dHX z`e31Mci})`R=J(I+vg1;^}h~QOV;FZBNY#A+UL6nCkZfi>v`pao`$)@PYb5ldFrMw zq$&2Th&Zi=)_TzAmrYSe&^6MBVtkx@Z6FoJ^sioIsA~B@2{yjdyRfAc>KV1 z09yr?*d!2+8cU-YSed$Nl=_Jwf8|Zct=t2uVa;@zSlPF}xs~#o<{GG3y>VLiiI8VA70OO$h{X_N53aC{` zx{Dj>0aVHQ)X+PeY@1uN{C$!I2Bb$7wf%B@bA|e`#fFsDrM^dDr1wgw#QA$qN}EyC z0XtF$kMI_3-am(2!dvjW&2Be%)kRvm39A{=`G5EITQ^tV;2md=EW8*AE+!q>5>Q@U zJinAgZ|${{q$&^EV*V0qFAoF$0R6|!MXB+ppBp$(N6Bj*r)}ZadR1$=A3#r0XUYfg z>o!z@>sxi^R~KcecvMvB#%Gq{Q*Q3BVQJ+#Z3rQdE^)Ld$#W1*Wk7HqB`vSD9lINB z3%_`7X2$GipG{hQIk~I}kEn|;%G!FSMnk-nT{Nkj%8%~rE0N)Dct_OHthg|u(DHeE zaR16zdD_$%seI{cFH|;JyZGvRU7e%j2F140YJ4uqqA4z$Sa#^@F*P^SM{Si5zE88_n@pM&yITp z?IP~G?QbZX0+bY1t8FR#;an>2TGT{!s<=2VAk6sP&Ze&I)u_aY&jFoBrb%<8&jyEu zPpaFg>^!rW{}>u-99j4my9jKb$?m7K@)!MRp0XZ~yeMN|j;loJY7)4JW|jus=5l@c z6<(yS1I70j`+1@OO{blIS~UEf^6RqeHg%q6tSLdD`*?EOUpp_C?Fcxnt~+4`eRBe3 zeDq+M$D^{Bk0kr0K0-UC47?~S6FjIhm)v(ASIK$zejm;v*={*R>yZsdAu7FY<)U9K zg$JrvJ1D-AIC=5Xs=^R8pzqVu^0{*}b0)0vY0oM5LU-F>MK7&-P+l{>;E?m)(&wqC z)deoWsDe`~SKZ&vs6tw!PC%YdhD@ajcXlR5+z#jGO3vl77EkUacan}OSF0DZe(}tN z+Cv=?PphH6f1 z!l-=|Df}Bwku#Yik2qjC*?YFTaCfzyO}BUPIUV(2(faKkyBVtyCxuhZzwHjaw0dUZ zK-s@{h}-+%TM%$|8oR5_M-@>*L?ZdaZzlcOA;r!kYwIBix8FeJAw{2_@t;%adAN=z z6R?6u4>+E`C@tt<>}Obj+eHlcytjQ!@|5ruiZ4MR^aLv2A=Xm1SkdM)nS-ctl{kVs za`aR9Tz*hw$i410Auu5?c0t*8!+kj9#FXusORI7djGb}xxK6GocpNg-tLl_mmDJ7@ zD!vQMh^KvY*BEgyMTaRMnQ1=}BI53|hJywGY?za`NxSNV@B=>!n|I zZi=S9k@^h@;f&>Up=9^n@S+$`fMImCL#nnddR#6x>eqRyjupS;&LQP*SS*z9@ZiHe zcQr4Hi`U5ZjFoR-ppo5{tT~sOG9T++Cu@aNDcs|!&o;AU*69t^z@~_+OfA1O<_O>r z7ERXG4e8(6BG@(aVsw_u|4u=4_6t~)d{?aH@gzH8j+DA1YqAmy3*ALzd$P?4DoWGA zCGH}!exAJKHy^9otMu-97C;MYuFX)iox>7?)#X95RNFU;f|OBrnE7vqe7 zIh%$06S>1Dy6oLAV%5bpAM9p{Y`c8)?H<^*%fl7>OU<|Zwp4mb1OC=-vQ5gNsIkEH zqs82r2{y-fZ%(U|ec4ZR&4HN+y;ZDd>%?k3YG1-75ZaECmaW|ojwPDZhDSuceK=W3 zYk|U|USL6>V=lzl`m_Au^sb&YOhWh9q9q-SyIj#y^EaH6z&(>LJj-6nvbYm2xFh z+q)PBgD|;LpRJ+m_(@Z|c~#sYN`z#8?Pb&Rv8iVRRW~Su@s_NfXm#Cl*RgT!_UBY` zhCCWPgitk1=fEAlC-uiU7QVa)F$mus#`U+t0$Y<>i?Rk>jIpyaO}56njpM+?f<=+D zcfai;=IxeOabO9saDqNM+f=TEJ%JKDy3KJXFxmtamwFdH%n6jl(d~{x;vsR{aHgvW zvr1^^NiIJR=utl0$78XZj{&@j`xz+_VjcaxXVb_99X9eQEBOwswdt+*D=u7GHBaqP zK3D;cm;Sok+k5PMVa4^OILfe(AeQ5rzq3v4fA{zahiNbi?Z=YqEmLr_sG9qZ7QvaE z6Y^^*w8wcAfc8^b($&B62W%@&*nF0Lf{2*bAja=gtpe>V)q`?NNxyv`HFl1Q*QvJH_CH;@SIB38CB;W17 zw0hZRJBSIK$-+1I9Q%MJ!bGzUj{cO=(Ah?mSkZ*JL*E~XH-1->RoAv>q*(kA#Lc0{ zYrw8(dNaZ>?bZR|he)2;94^aeyA>FYbKI<6`aHme2ls^Pvn_QUFJH0nG(k93g=&1P z@TRzYv5DwKKI2XkU8b8i@mJh&xV(h{o#DXHY^#nrK3oy`A5VtmzUCt)t_6QPWr11c z^sC@?_jfML+k&!|h!dz?&Mc)StKk~#lNz~&{=|JRX;G4-V1o)JVD++P;r#$ZC2N*0 zeMDP#+X?r_EV2_M2O9JuIslx_Abz|X{;^)5>KUKIW(?4`CeC*@eQ z(o5PTt|`0*<}L#cXn<9+$e^1xd4i}lwUS13`PRCkej0h#-QvqVY%p`PLFfg50>;=q z!6Wt#j}jM_ zxAZD_GiC%zFAOKbs{nYUsyNlV7;IW>S;YnU!4&vOv?Ys$M3Zl)l~JXHg8D%72ULiy zoeYQ)0*ol}jd7O6dBxGOIu`BsP^CV*{=3gt#4*Q~>i}%`2&qK1y@@-}!SJ62LjVe2 zY$E$A{;H5;eB59OU}K6UYd8D5A|4TmyrQUP<%>}}cB%~g75K+_7F2>6L8>m(87m<( zr5$dt@*%t7THYMaLi6an;{+eB16cm%Vn|Dj=7d9rYL8Ml?>eqPLz*Z7AmQ`USCTMOUz`6Xyba9XAZsVi>B?aMc zcTVs;wDzJLZ09TVe?J~2$We&AXZ$}YL4LqT`V6AISkD8vz)PILVGFsD?}z* zS>7_)|M7c@N9zv0%LC6C{OGO1XxZ78u}>h1`!;MBuM}F*G;mixq8Z$9rlad1ldWxX zf&L6RRd?&>+ab4~6@FeT9cWSJ-1DsJAG9-M4+P;&LVkO4o#B)9gZEAPIEwvBS{!3p z+$_M8DC5Fk;p$REFFX?-G2?3q3jo`+6$5}*KoWCTe(fTTyj7c+f7vj17Sf_kk4de1 z-3E-9Kajoj<2mik(3Jy1rwa9k?xX#BlZ%|hg;OV6n?kILRAgF*j{cAjo!gJ z7VL`eSYLnZy~MFQ`Qypl!hePd>3_B-Wae+_XeAxS zVm29{`SU+)Ag-}zV@YYBBHOC#Q(*AuaO>{Q`~O0ca2@yixO1S&?y?;#bjf|k55X>N zOWXZf+bP*5r+EtQ4l@A`ynRD)`DzC{<32lFxVs!#fmArJqrNp6W<1vjsk(g+^=VvP zJuXVHE9*RyQ=BMH6=Fu8eN6=mS`oKdb&4Z)_T>uN7ED&k3IhL8GgxxI8yB(_#=2z( zzJK&n8ol*!n>vf3)Ft=Ju!X$R<3|s!{!AC*$d}m3GaGZde10*DJM48B6p(0QyW;3I zQ4qtKi~1A*$y;PSTd&sXk3}rAB>u=K3H)65EU{sT47uj=V9=Mr4YFqdRYfQ3TLyC& z)XTF?24r1RJy(b-+C}Un^4I|TX418`h!d6mRiyd*ZL-?AQPvY{BO1(k2|J}-vcPG9 zcT0Czi{GZzMbbS#u+A^&0@^qKSXUEhyHJ6^J*6MdwEX=9Y>*h(Ab_|tCeg6uV!a|m z&rPZ$6jsxR44jk#MI=_bR=DVL{JBa1@0V-dZ!7g{($v8WikKmy#+{B#99Z4M8+)RX z1*4kNi(}Y0%IZeQ>-(qYf=0z>21U$E?cHB9n8AyI{w-#(v6U!ouIapE=nBif@)3r= z5wC|p#RK=2O5Z;rFPL1%E4}f8@S8a+F)=aw6&KEwb^l<)9m6}1%of^iY&xvzCPVoZ z$Kvi&bx`;uO9e$rcFY1pa+TF~c;^oI0Alp#)2Ex$07%@Xj=U#(zf?nW)gE_wmEyyn zrjXpi-2yx%Ko=0(nD>N>21~tW+&%%RB^C2Sg}%u(8FfY6!uwa|>$87+7xCHyF0urE z$=c3e%g?ctIa6~M`9R5}p6dy_C7f%MIh#NaJ%m25S}{Lk^V#KwF!I*wAiu!;kIy}q z%8E=SSr5O>^#JK zHk1Dmv?Jr<`ZUBpTe+F-xn~5dn@O0hNdh0PwHMdQFwjP%RBl4c{k3t;`B;H!R6w%m zufCDKO&4QYQk2EU+Ql~%&I&*M$ZeS%%e?zuQtt@F(pa(%QnDRR%L^t^Tg9`J5&h@g zOxX4zv-gPW7|fQ}MMC1YvQq}dSPG zXp-wUouLUh!>7!wacpYW;S`VqML^|E>eIq`T!3SOGsauF%Ygj~^G`IB#l@NYkk~E9 zc2A`8g2~K)<+<)-uNj$S3L}r)a_cHBU5q>N9)~=u^IqaM5H!e%x#fAKyhpchMfb<6 zQLdFGHN-pa%`PYVs*=C}1Idg50A{~!iVCOotx4|MOvq36>!Ym2Sgt)2!=42zAB;hV z5lXW@kji1Ic=OVhofVRsLH%(>wRd8n?-=`qzw?T~%DYZIqxe4DR?o&@Jj@&zAUHGk zzd%v@l56c>F3fNdxVZArW*au_zcJUuGqhi)+i}h( zFF^(VjQez&w=-5GvOkn#_k+5CJ_%3HP~(uI!Q%{4okclkk|iGOJagpV;P`}3IUX7} zbC^H&!cVRV_Su(PE3etnCe>Zn-fEpJx@`A~a`)RY&ScrQ+nrYmMdXi7CEw|{c>ZIj z$FY4lu2oEM%j@UT&%}b6!I~zvud0I}U8EK=pp3cWx3G~dD`sab zBd8IdCU-*BE)S!A)DfOOymDso%c#$be#L>pFajd?Elv95^vB~BCm|psG5Bu%?L9Hi zcY0g<*uu$$*Oc`YAkttD@9}Zo4JNaduU1_6`;B|pYD}ucK2<2+HE(B1UX1Tw?OmUf zm^p}`thHp!_a6QUTX}S?ecd}}G=8`q9YJ8Jvi6r;BC$y?8aE&$hgzH*>dWZWu(kQVtw>cxZE?IMV1} zS;fH%SQV;=5J(6T7lM5Ne|5b=&lFo>}0bL+T0A`JCYX;iuMq>1q50i8&Y0B>jqV6x?; znUWk3{B$l8Pl34M`(yVX*$Ox|+Ltf`o>M-G9) zV1TCbw1QzDA3weAWgZFBv35Ng=ZS)hR6=18ST)o2etdcnGS{*ea~gf|Za4<@nQUYn zVl4WEX1x!W)+zgMyl;M+QR1cj_sS5!AK}HX)2)mV!&2ur+U7k>0Qorf#v`bNSKK|g% z2%^rJ>jtxm9h;f==H%t?W3QAZM^ZwVDgfgLw_U~Zty?256I_E?%zxN3-DwH#s4j>H0)^DCkP>=uc%3}5T^orwaQD!{^LZt zIm45V&1;fx3RL{tWd{KTflypzWyYWLC)$18M`WjbT-NHWu*kl;IzM3$y9GVquOxB& zks8+Zy=RdabN1!lw6w8?Y z8!e6kc_i1wE^XR!eM@ZIQVBP?j=N_b?Xy@bI4}(Kty9Qb?halQz;{$^Ma!A6J*t2K ztn(U33+$>w8(wKJv_=N4Z}}cL#J=GNa+IhE3(PK*qI7K0;P@G42Kz5{Pp8opcTP?n zw)ZZ_tl7!m3iihj*Fp?BPXfXNe>`yYlA`4iULYphW=@+&G4zSYOnt(SDKeG@rCN9< z5U&G)k67?!az|C*zwCeXXQ42IbT+q18fg>^?$?vQfImJcQ)9zE_zi49wFba3!Nj54 z&kSpb4Ip8~es5I#;Bn;3HtFSy{|F|A_jcB2b+3A)z6Y3VT}WvFQ6L_l{%_0$G~@BD za46n!-G{+d(kw=#9_CTL7^*$!Wo~tD7_j}!M~cAqM}hvNWBdKR{62+eRofXN6fG_BQ3r*x(ae;@5GezU!H)kqUVJ8OZxHD90_Le_bR_YB5t)2at=K?SjcWo8y^D zhaYEh8>`S|TW$9+ppV~7T3Y_#yE?{h@ur0LURBWY%#0>@0#)~0HyJz6Bvwt=t)End zGRC=YqN1+T2JI7ifV_JTrI&`N5j>i>y;0R*oL+eY^!Y-N+FKrLnJrvc?F*w#Kp@xatl2SP_2G#Z<(MVM)amoGmKp*&-JQ!m{L~*QZBc7{Bal7*=+xD8 zLzWCW*XOCiI&aZJl$=dsw;)mnuyp>Zh0i_PplU}h?VOlm#5tz0kXPqTe~MImpNCti z6M{S^Z4=k}S5~aoB3v|G%ppXwD4qJ|J)d+XI9v)ZNqMsE3@TV5O2t zmT)`Ypwr{P$-+;pT*;agN$nl3e~-G_f{OS?D%0AwHm^K9{01WxCQDabeBN%t#xUD0 z4Jh}>&%I?zr$M?CZMaKa{JQ&VcH9gnO&zr`_*?Dkn;x{I~Rk#0UQ8X z_znu2?3?YUBI_^*pZh+xHSqTt+X)%__+?}2@aJ-4BlA3O+qzvx@Ye%92=CEDR=y|E+?_wSh z))@lNzJsX56=7m42+0ny#uN}zhwy2t{K}HUB8Oo zOvqJM&?)WeKjpmJ3jw0Enc5kz57^nEO`)g&XMpsmk7BXfN$e5*hYJBA0=zn%n5A$1 z^h=0vJ1>rO`sC)8^oO=P(zW!sT#t{snlnA)ztz^Ta4m*w$Za7pFQ6moK=ozFquf8Y zU5A_&enyF2J0)IuhA6G@!GmwMm-`hzLm(yblm8K}#jugh!nmfeyPuzrofrJCQvgH< zw5h@4?@AGy^S%4i3?lX0>Bom6Ke+PE8 zUE>>;`Qpo!-An&1k^Vzdak3ujr}K(fdZ6D&JdV}yVcD=}P3@OC?l5b4Ps=`-RmZzU z0JSuJkHW_2?~);->@+b2eGI8q->lJYiFTC7?h1uro7Ez(8DD1_s)ui6oSVof27avj zt0VKTP4`G{V|jPURun85^)gGy6oXa&7E(QPqts#lQ%E(Nw7|H#1_7v7ya}Lwb(HdJ z$4>Wj#_Yqxueqy7UT+gt7ud~r+4gPezX}ukL23&S(~Zd20P6u>a?f4s+DlN?W?5VE zO=2NyZAFfM59jp%q9|5t729uIZi{{PNu6}#JADyMB#wyjJK znVh%U7KN!)Dj^XmjEpeG&{?fQ$@!Ee3Q@?}P(or%5n>z?#(4%a4&yNMy*{5A((ZlV zkNc0`?|wY?ao_juHpa~7{kg8|^?JUpPfIfsPOMJ6{F=x92VvB}l~t;TZ;oL9aPVYn z-LK#op)NGzz*o;minBcT{#rdZPsjR*E!f^;w%zu&JM=81$rrH?zZo2US2PI84%|@F zeNga+m3KjpxYRrpWGV0-5G%q_;>OG^=$a6pM-3GF8WY{NCOC_8rl9B{n!F3WYfvDl zq9%aG&ytBteL?<*Hhs6uqi_p&A?)0Y9M7o+-}3s)tIel^=gaSzelb0x&nHmH3L3xn zQqC=YpvB3o3cc;8i<&e|k>Ab|3Hij0bhTkC8M z7E})#tF;FUk^1tDGX*RYhh6S@7}J|G2>joW;oKxnq{`{jw*oLWC_m+*G>G>NaH} zJgQsp4yT%%nIbVUnSI~Y?7yzwI0J4(0O&@093O(Ojyhn_0L=MCD-kPV8a*zc8@bKu z)Hb&Uuh+ZM5rIAVBRBE?m#>=83u=3ERRk@Ko$eUu_4NV_t9A<7gPzxgs3=t))Al>Rmiaj|RH(0p>NW{pj&@+( zb9lKq|9d`^AQ6o1mJB;usR8$b=Ht1ABHwtlDv_YPpmI~Qr*dcU$jRl4KYk{_^ds=6 zVD3IcX7hCnl?GqgijL~vc2j*4i1$I}4x!R2>^|Y9}9bAoJ&+QqP@e-F(+F+muNAQ55}PH;b`JQXu^0# zt2Gv3q<;_bz(VBl1$<%>H4dBYgc&q@3uv2lBQiZ=HB8Y5 zwR>l!Zz=IZR7}>u_~Nt;K&EwW#CXXwFio2o3z4@1%3b_loJ)3yLFax_H^W*$?VReG?NtH9neEU0ugk<%lAMtp zMIJRB_7BZBOYT4=>gyjinnlclA%H<4^#!5a9(ol14&_Dg0)K$oJ-)8a?kZ|*KPMkT z$M4k$IM_dO0YTJg`e1odG}lQxUp)3VZqSo*-yGBUo~yeTcnms18_X7$ucX_2WbR>W z7$9@cRRc^bp-|5b^A=a?hgTQMWC>5PfbP)vS#27jLqt7)8I4M~^ql?3t(yUC2tx48 z+GfZ&p)ZdBqMloy=Ut)QpB*K!%jy^870CS$-Zr#!=y?Et{Jg*{?D+W=l17MvG-=t+!w71Bs<54fqJWPV80126_uJzmC@!vh8lbpb*h5UWg}b>PAX?X(Pd&8x zK?Q6rkYte?@D6*W|v1MTNloq6Eo(6dOV;5>R)O1Z8FRz(6~O3cRS!lWiR5*T(b6xDf(v6f)lnI&4H(d9USk_?Upgq=lfLW8ABbE%GP z<19&y>hxU|`oEwU^?&cid>8cY*H8OkS>IuMefXc_y`UA7XW!wZ#~*VF(B5WQ3`8~} z{QARN`wFznL5{GnkhgwAwlQjUpO0?E4kT>Vs+g{R ztx+rEne{nxS>2{!{2}=^G3cLWS+|o*Ry|59*$-ds73NP^18=3Lubh0l&aHIQJRoes zY9w3qS#K}jfP(^kI`D(abT-a*@mM_Yp|h_d(1H>76rpPY4~0@Aj|jRWokJnfhDrMV z+(TCeZ=x?CKHG-%K^yiq5p@w&zoOm1L?V79!oa~0Q+W_|<2;;mNdB=bl~u*sOAynU zwh@Mo44NW(+hYg`kf*ik=ujBzUd$D&`h?l)9*4uPfa9z%`zd;E@?CUCaZ*K2pZUND* zajvoyp}byL7M5gGO{4gN0IGsa7qt@ zTi3tBMP%ZQ5Rq~Un>4CDYwdQy0#Sqkt97kDDG*Sh%NfvELDx?%SX?RpgL(=K(gISf zc^#rwg-Q+8Ahh(OC>7so0j*|*-1;BP4fG&*afu1r{^oy|6+@yxVheok)0(wGDm2nk zAfhbO>I4QzWBNQ7&>Bjp68~*$@SF>X%5DU^6wrPLUNPjKWx1(532ecTonN28_JOUnhT^y`CZ8D?q4XV6`zM_M_JU%@d%8of$f-97Fg(W1_)x@ zf$@!8^n(8C8eH`#@jnu~fG%3cOFvg6J8&%(F6p{!2<|?AWc~I-AA63J2$YpWTPy92 zl8Fm_p=x`*(Uth0yVjP%1OB;w@pO}iXg?%in3oM50`F99J{&kq>9Zop^!#vud{$T(*1!F(-z#U= z8;4-JX0f0$v?iSh&k7iPAFQ>W#d0cp6OR*`?}(3rL`uN@+kYxw^}cV#SECGVH&*Qk>B8H}-kGD;EKk_SRhrVD1_*1@#0zA^XJHw-ckqv|MT!SPejs!^n zFrF$E-oof5xczS!`Ld+9G7j%h_O;2p=9)d`{@kJjz^B^j*{Q^unfU}HcMZ51u~&R# zi_Swp$U_=)Lqyfyr9J(K7b;qez_hP-PB^)yP0UJf#>%%enk5yC+w8(6TotU{Jm4FA zMLT>rV-4820vKCMtv9|q@YJh4lR{!&5CA~14>SOfDUZ;~2E3Y(Xj~Gw-TgP{zh;jw zz#!A|%vxkx7V5gS$~rU`I9Jy>k6+J%P~grY%CPfA^`A?Y93di(dALX-N`#>4vItcw`nzg$tHb5}u({%i1unmD(nuA~GtXKrdk8w)f|6OCo9J zT&0)Jr=@0W|Ed$Q8jTs~eNY%7nP0b>N`PNV3rTU*zJ?;B^6@&;wjPOFYpFU)Y17$Z zk_lm#=(TT8fEN(^-gW$$%-cifN#SF4Df!2x%@enE7RV7*nh%psDB<$DV^?|)4IRa> zMgpSmnpBkB_n35oe@?!1blEUdqMf1=8mqEnu|ry|_VkO-dSrtpy=D=+nDpobh_Gwl zsy&?O?>J5yb^bo@Xwv1MtN`b}wU;hBcKDYY6k}X1CH!(jQdjCB3~NldW~f55H+o9> z`|Ww;cODb9dbl!;Kp(kLijUl-qVq?W*^xdSh^Yx&`Pgo~UX)K{sX|I|#} zNtPZ_;U!IR>R+%cYY|L|CU>OrPL+QjcDbD1d!TUrcd@LGQ#JLeEfPsx!%O*zy*GPh z6>i9{Kj0AafSDVndBF|$>V}U_TutB>aos+$xNf!8$+1GdN9g-d3M&INL~q1sZkE#D`gw6m7*mxU_$pX22E$a<0;QLRlIC} zQtxYsw>2%b)V@=>4X74~MQ1+xqm`UdcF zBpCY^GFAi9W!-e`B68~qgoULO0YJrz)w~4rWln5cZ;4RBe{9*d*@uk(>Kp3W1ldr3-ipA#vTMq>Z*R1p8&nUim$|RFn$ZIE9>~bp`*-D#|W}EWI?lI(Pw?%_*H%l>O zf=yb(Vn4qQigZgz4rFg?seO`JSjQBt8=1JqujP!mSOg)v4hwr>hwtRY{Md9E<>{@4 zZTf?bd%leB^Wc{3udYT0+et)N6qXUn}GTf{#N&HiLqaxEK_ z72q*p98Ni$XaajEWGYha+=EopnXhdFKKjQ+{IM@g8u(4l1FEP@GgK_ad7K^!99GmRE zi>D?s5=ctSK`f4_NsMP#XpS-fhb!yi`ihda!;?#JX)|nDl1+r)L zzW%5!8U1WVM}y{T&5o@a2JS_@hX`Mcqc2uZ>B45{d`8@sXX?Q-y-{1TMSYk~l6Iog z2lY#Y$_Ox@`fj&_c?b2~FdM%Xd7Op-zxr`? zM!D}yl0^`*&hGn_3v#c5`y|9}&+c4wBBtNOuac&+Yj=lj6`x0oIqP@(LRCYR_f&&K zSf7=VoZa-8Ch5ox{YuC1mMq7#wSXhLW`p)B(C2}v{FyxU@+8j-Omq7@L{rquj|j-E{p$dX;@}^IUGPE-ksP{? zmrgsRR#W%5L1!%PB@&_+m+%b*ab!+{FCGc{{y5@)q2H7|z+(z2$j?C8A^JPjlHTC1H7-Sv zVoDls%>m)L%>wC863W-6FNRE7;J?qBtHAFPI5kM*le&FEnLG1S{Y%5_47Ar4XzY7+ zb6Zz|vRPE5d~fu-T8RF;?RxS3>w6o>&P_g3&dk;LcsW*k@}QLx{KS)!e*}>pbk&vI zpS)fEULmD^e_pK^#)w`P5-*Xst*-id7q4BNMzpLiKfh(L1cG#$P1;+?to5)OFo<5a z@`sGQAjlmHO7ZnJ(p2bi&8P0O6Fmtxl*@@}p~C?@OHv3$FE8!a4nieaj7YGvZQ5IJ zbxX&rSMr?ZCc*jMrKI_?A3kW8kBeQb}#f#5*q6&L=GKWl9|$mSpU8M@&mi+^+c47cc6B_0hD;t(`L zvBlyx)8g!7ABeGrayCexpomQjitZQxdm{Hr8p^s9#UK!C?wYW0p*tXS;ldzUHMy7V zuNOe6&Y@;Tm_{R`FxvdrWZty*IZR)5JXDZ+pL;W3Q}0S%hqf!|vGBBmxoiTzb^6^R ztUJJ)%zwTl%nGYrD0Xjy*y-H zi>u6m599-|Zn&C=Z`#|}jw_V%_g2@8(TvB8ET3vU#~J!KX7J7dL_)Vl&Y=sW!cE;= z^o!hI<3oGCyaF8NuTeui#RPY}*3faZXo>&90E*F@Le;HWfRf-!d^Ogg z9T0+|;JwxZGysvj^N!VL(Z~_}Ulcuj?ZUpH0jVP@W}iM9$6IKLsrwv=?8F#hBBMNl z-_B>X4sKj|;yUdsM6yS0!?FCpnX!bYFEi|~2Bx$hYr0OuopNBEKO`@wk8GuInfyaC z;%i4gd8<-B@C1Ev%Z`v3!3-`O0~_wwyQ1MtU`K2(%xQk8DKJQz@#GDo`O09x)HwD> z3_WzU|8?FW8-^=m?$Gq=f+QqxfgsevWg35na9`y^Kvj^qQ|g`!>X3wzsdV)(m(&1n8>Z7k;H>!| zHe3ZVXLoK;z*IsL2HaxG&Y$A9AyBM<)SOdUZ*W567_uKwYWhE7B1-%vw*N7IZ;w+Z zC)kxZhSvmEv83{UGB`EMk+ zPE_CLn7>2J><$pcUA~VNaxU*i20BE$_|);r>t$io$4`iz2MYme=i7M+;kdtpRsSO^ zqS(N%jc2K>sTtR*0Eb22kRd=y6~lD zfpkwfEo|FLxCH(Nq-(#;BPZO6TGXr0a1(>j{O63DS>meJH?m+Mk09W^cCG{YJ0HS> zaE5L#FQ*ie^JX4#8nYWL&~T~im#C989hLW7`IxV|PtD2WE{7!zf}JjCP6w=EiAVUH0E8Rys2E|$^#I*F`Szn*IOE*h(ddq{LbTXF z-@Mj0E>iEz6hlEn^S{;T%Z?O{ELh0K`G9D&_6n=LF!%KbKU@*0kWz6ZC@&S@4Sg zv7!QS!}vf;5?`l&(&D&G{{Hy~cW43-w4C$$=cN6-eFN}7b%bbz*2Y&q~X%IEIp z=85!1tWOX*kCOz|>1Gy^(umSp6Ji3huF#nHy3XbAWC-FaxLeLM?L@P7qh!c@UftuO zxc_L~x4gQ=@@30G#VYv>&zbM-TCuNnam${jnZMS_DESp6dc za=q_5_up;1kZJZ~#Ur9Gh*Lj)+m51nrFrdWmNP{4-Z&gD94|u_%Xr;I z0#kx&AM<*bB3xeui)N;D-Lz#*<(NU#G1_G+SLHaE&+?^3q7) zT9^&J<+;$gWK2GALuO%SVkxL|G7wVDsuWc&TSV0YLa4}MVA*l{JvYW}t`8(g68=Qsa9V?vA^-?@b|v#^HSBpswSPZc0(;jMzS zaD4gN&IJ^>iZv_r<)8!f(FEdj`LZi6#b86u?F<1lSIBe-b{x3vE-dRR9=TjR8>>gi zr+EvMdPa!OO(>HO#@*lBzh6dCj2->w|DpX${__e(ejc6skK^*M)b^`^rq~m`hP8#` zgUaJ9(od%XIgvveQQcsoqUb_s-@$FuikF#qKSEn7Ofw!GK~>~ahy7KL#3 zD+@#R4R-_tg6q|4on6TC1fkXe-LS-?c~}TC!riOAhAxsyTP@_MvLz9`q(rzK1|VIi zB{C_i;xA(7d#aBvPye3gGdP04kepdcSASd~a2u@{wx~C+3e3OMboV(cwx3iB$c!-N z1cwL4IPmp=KoqR|in+NH31`eYnxH@5gmf!QZ+5c_EIx3VgF|7fON-WQ&I6o9Sf?aB zJNV`HVgi)P5l|}B9{dWk<1dTXU={6U;v-BEw<-c{(bogj?);m@!kT5i@@!v@=aGY8 z(IWFU>UbbqC5{76bCneGlwEoW+3NnHn=(ahC6DWFlSeG@SIL1gdu@RQy^W?Q0HWqIoby_?^7DS~BLAef^N zG*BZJLTW^S(rnR(WDXLGLNM(!q>ZpE$+difyFbtD`!Pv~B@%5B=n9zISLXvvec__Dim@=tl44Ow9XS;!@v&8)L0l-L2c(E&a+oH5W9;I%hk2Md0D3!k_eR!GU(W1GZqLY9SP-nMm)<{*dj2RN80U755qGM0)+a$C4c#mU(EwzHTQsgm z08p_v3y{|J_vhnS+$GLz1G}bc{YVH!{;?Y<5z;BEI_uL_1dR{83I?2(PDWUbbt$rP zOt=(EEKE7w5{o=iVG8RLA(zeCDbhM@$R5mRjuFz;oRZZ>-b69p#EB`1w~mQ3lG_TX z4IC+tbmGT2+)j};a$qiV5+6z;VzulD4Xa|XZ8>E8iPQo4$cwx>Vw!3j@r@aS9a8vl zdMxVFu#(yr5Sezfw%YV#wXMA-Yl~zhjJiv4+($&_R@m*CW`5pl@K%n~KJH0&f&`^F z(xbb(N<)DZ$hAJ*WJ8?ts${p?MiZH?rg^kxUUo=Wvd+k!jH#@&CW&fQQyD_ET9=x? zQg+d3kd4U`-uo{a7*!nqX?aA6{c!6=1+2Gsg$Px;!OU`SWk%Nrnrbs@x* zJ1DJiU1Cw4=IC?=wZ30LF{Ehbb&k_Q%D7Gh!Mo?E6{8Qo*4)~N`_d#_*MaVkN^D?L zUlIng*EoF^ho|rKlLpn&yN?s7x~&eW{DIAkh2s}R#B|E-N#QLC@&k$u1v4Skme@(_ zEZ&>VjHkAEWjBjUFSr9Dt+FAm%2~W$KSaQjvK}fz^TU1{l^E*N!d^ufZJ^jCSvatt z>qaQ!w3?dTYD20T@P+aUckMIMqMS2x$ICEb7v1hOjP3LD_*7X{stq)oo_p^}Qm?w5tyl$%z`YIbBgv7OkWRTwSqQii^~jDwi=TZ-%WWd=Kj zoX;IJP0M^;nuo6|sbkcLQ_7|-GxeohfJVT%zaTQ?a63&qn9ZaZMG@HxqG1sU>EyP~ zQd~CH&|ivTr`|Ut5i0A=5f5c)c3Bf1O16FYpwpI|&u2bkNbq{ zd}ua}>Pg$>KlQ9T;@Q|WCO*~Mk60rfW0@7+!k829}X9F)S@BC@tCH_!*kcPLr8Zk&Sv$L1NRv9w!BQWE<4+BE58<-tcfT>Ozu?uMR-bq zdla|+a@)#L=asE0mr8!vBJI+Z(g)5gTn)Xcl+a&F^Tt&W3{M#l-lZHJC} zzNsuJgnPg_MVdY0AC@6=F0t%BR$fGV@-l-X%a>u_j_YT~=i>V$V>V7``#)o?e~ICG z<+934ZTz*wsy#=Z+9Ye3sQWE056);kZ$#oLCplb3Hh4dNxL90?xncShiREDQd}_>H zhZ8EzuuR=s`ik*3ZeY!y=V;obmjy9|yu#s$BHjmfpRa3qtZsxfZsH_68OJ|K@HlN< z6~qwdPaa{9YPpKaa!<1}G+fKNg0EYgGv`{9N;sb#;9~YlF0wq(=<&|9DlM91bh)JS zlgDf0D&LsVi;Tuz|D#e)(Zte>)-$}`zz6X3v-;HoH))k`CO=AfkKh{};Ads(mLY#X zkm}||OQvocSUUJ__or6P>G#Qlh8E=15aCXs@Ej5Ft2al%W@Z-JDVt5TpNbJv!p;cyMuhTnkRX8{6kRKD98xzCj zI#vaC6z|IllXHu}?XVupsU^cOhEdtF55#Wy14_Rd1L+7T=X$EwXgB_FtTD*2a#Z)>?Qt5=^a-&FzI!=f!q& zPOxtW%G!yMK06ZFJ1YDcYRvo(&CWiBOVlRLv)?Mq;Qg{CEJUPSZm9LeXH?zMZJP4Q zFZ#i}Ev9iqiJhJpVhW#_GnoazNeZ9wi z@MfR$^Z1ikJ(kC3P5a4WX_~F(xdXY?o&#}wr4(As^k2k=?o?Gby5x)c$=|b@By&2b zhKx$@QCD`Q_gT8<#4|=9wsE1@?pKj7W>#dCbuqFr1Uf?ozbj^3XD!3)_q*pb*Ahc2 z27Ta$FxbZ`Y*%8Z>dfT6@Alz8CejnrRG(o#mNBPR3|wNppP{lMvR^33POGu$F%zbQ ze0qq#diiw6X3u4hs3YSu^@Ht6L|Q}Y&h~VtP!T5G!7=v>JWbEk+(CgKWJ@o{h2y4M zyKF)<6#QRyKhM$788~bkDpy3l$sNEKv^9Tj)zoeuX2d(RsaO#ExeQjC+b+Ldy4p>T zyH=zr+va-jFY51Su)O_wG;GXdaiS-mKCqOopDXF_K&Rd*mn2NJnV;33N{Hb&XwOs( zF~{y}&~* zJg|DFu0x}Pszi|O(@P$+PGsZ1{{#7m~g67|UuE@lD zWV82n2ela~LS&J$Uc=N`!aWOz@ebnlj{60bofDNY`sVrZ+;Hp4ZB#oQms@d;cngmkBLUcQ$BsFO21pPh@bGeJx$r48*5BmJKo{x?HtR!(YDMj`t(`H=g`4b z(6EVG%FPd3X0CRd&@0A27RDXJliY_=KYW^uR-8)za)MChw~tDZR1hzJl~&kvdYHS@ zoW1*bcW1_6R-P=Y@MorO{xc8c(Hk`-!B#T(YR_il!47*uSzJ+x)aCct)O-A)bG5wl zHRgo!Q46KEoKYF}=c_&uaX8{NHLGqT_H8-wo#QQ&yVx%;K9KFA{~=eJ#2$N5IJ{+wmlj5AzGT{;VE2(y#5QC|JdnJ5u;_=i`LZDw zo848sRG7}}EF7hIx~xIlTDv4KlwQ@1_sZa=0CPp!muoeVXr;Q;)PIGfGfTQ*V!LHS zel(skeN~jojA*eXNwuknpXRC)M%!{llN@Z|$1t=BGr9^YZf%6*#?^d@p!~tox_e_b z*5lc)_kX%NY*rl?-L9?UlFWTqs$)gDym`jEZXowd2vtId;mUi#$jP9I!c(zT8z|k! z;Ng@nI|f`wDHoVCLu=YU?dAkbT8yTp&lGfd65^!2Wp&^=f14R&&ZytA8t4G zU!^0F%QDI*Q;rsw!%-zqB~y1;6li)fN?%OPFv@iJ4{{sUX3Jo_e!sA0;05*xYj>Mx z7p+aU-fldP`0#PgWp?1YVIond%mZ3{bJ+9VfNJd_$4 zkdLq$xa3{pV*yXo{J42|;!=0TO-7PV?(1>y=8nFI^qDo;Iyy614L3W^w5_ojmn~;^ z>P;1n?vhFjcW~U0+y5(JROE}7N}CE_N9vZ9(OSjxXBRA3Aa?GAzKx;bf?wf(FNeR7 U|I`= - + - - - + + + -
Skip to content

EyeTrackVR Docs

Open-source and affordable VR eye tracking.

For Social VR Games via OSC and UDP protocol.

ETVR logo

Released under the MIT License.

- +
Skip to content

EyeTrackVR Docs

Open-source and affordable VR eye tracking.

For Social VR Games via OSC and UDP protocol.

ETVR logo

Released under the MIT License.

+ \ No newline at end of file diff --git a/misc/faq.html b/misc/faq.html index 2009e5b..caba43b 100644 --- a/misc/faq.html +++ b/misc/faq.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

Frequently Asked Questions



Released under the MIT License.

- +
Skip to content

Frequently Asked Questions



Released under the MIT License.

+ \ No newline at end of file diff --git a/misc/vrc_avatar_setup.html b/misc/vrc_avatar_setup.html index 05dccbe..ada4803 100644 --- a/misc/vrc_avatar_setup.html +++ b/misc/vrc_avatar_setup.html @@ -7,18 +7,18 @@ - + - - - - + + + + -
Skip to content

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

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.html b/software_guide/build_software.html index ab706b8..b3d0106 100644 --- a/software_guide/build_software.html +++ b/software_guide/build_software.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

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

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.html b/software_guide/eyetrackvr_app_guide.html index 6e2ebe0..24f3087 100644 --- a/software_guide/eyetrackvr_app_guide.html +++ b/software_guide/eyetrackvr_app_guide.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

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 Setup.exe file.

Follow the prompts and the app should be installed.

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

Wireless configuration

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.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers i. e. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

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

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 Setup.exe file.

Follow the prompts and the app should be installed.

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

Wireless configuration

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.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers i. e. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

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

'img'

See the Awaiting 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 diff --git a/software_guide/osc_setup.html b/software_guide/osc_setup.html index 3416fcd..13fb0fe 100644 --- a/software_guide/osc_setup.html +++ b/software_guide/osc_setup.html @@ -7,19 +7,19 @@ - + - - - - - + + + + + -
Skip to content

Setting up recalibration and recentering from VRChat.

ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.

NOTE

Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages.

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

Screenshot showing expressions section of vrc avatar descriptor

Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the Add button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.

Screenshot showing adding parameters to parameter menu
Screenshot showing the params that need to be added

That's it for the parameters.

Adding buttons to the menu

Now, you will need to add actual buttons for them in your gesture menu.

The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.

Screenshot showing expressions section of vrc avatar descriptor

Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.

Screenshot showing the the empty controls field

You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.

Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.

Now, in the parameter section, click on the [None] and select one of the parameters you have created in the previous section.

Screenshot showing the the controls setup

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Reseting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\Users\<user>\AppData\LocalLow\VRChat\VRChat\OSC\<your user uuid>\Avatars\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the adresses can be changed in the app settings, if need be.

Released under the MIT License.

- +
Skip to content

Setting up recalibration and recentering from VRChat.

ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.

NOTE

Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages.

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

Screenshot showing expressions section of vrc avatar descriptor

Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the Add button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.

Screenshot showing adding parameters to parameter menu
Screenshot showing the params that need to be added

That's it for the parameters.

Adding buttons to the menu

Now, you will need to add actual buttons for them in your gesture menu.

The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.

Screenshot showing expressions section of vrc avatar descriptor

Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.

Screenshot showing the the empty controls field

You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.

Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.

Now, in the parameter section, click on the [None] and select one of the parameters you have created in the previous section.

Screenshot showing the the controls setup

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Reseting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\Users\<user>\AppData\LocalLow\VRChat\VRChat\OSC\<your user uuid>\Avatars\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the adresses can be changed in the app settings, if need be.

Released under the MIT License.

+ \ No newline at end of file