From 0948c624b5e9bd62445bc4b535494f55901b252f Mon Sep 17 00:00:00 2001 From: qrkourier Date: Fri, 4 Apr 2025 13:39:19 +0000 Subject: [PATCH] deploy: fcc3484e43ec8b6b8542c9f3417062652f0a1798 --- 404.html | 12 +++++++----- assets/css/styles.b199a884.css | 7 +++++++ assets/css/styles.bcccc215.css | 7 ------- ...01cb08ea.58ce9e89.js => 01cb08ea.e2a119f7.js} | 2 +- ...033e8fc8.550a98dd.js => 033e8fc8.d38e5d82.js} | 2 +- ...07d0b302.de243ccc.js => 07d0b302.d3837b27.js} | 2 +- ...0c1cdb3d.93ac86f2.js => 0c1cdb3d.2f3a3b78.js} | 2 +- ...0c66edb9.a1604a49.js => 0c66edb9.ea664c8d.js} | 2 +- assets/js/0efac3c3.3f261e03.js | 1 - assets/js/0efac3c3.e00c8d4e.js | 1 + ...11b43341.fe1bdd39.js => 11b43341.79f8cce9.js} | 2 +- assets/js/14eb3368.77817439.js | 1 + assets/js/14eb3368.a2fb3a9b.js | 1 - ...17896441.1409512a.js => 17896441.575d0faf.js} | 2 +- assets/js/17f4c24e.17d254d5.js | 1 - assets/js/17f4c24e.e3487d90.js | 1 + assets/js/{416.36a683d5.js => 1809.e9544cab.js} | 2 +- assets/js/1a4e3797.41a00028.js | 1 + assets/js/1a4e3797.b404fedf.js | 2 -- assets/js/1a4e3797.b404fedf.js.LICENSE.txt | 1 - ...1ba5bc99.1ceac7e5.js => 1ba5bc99.29713972.js} | 2 +- ...1dd31738.b424452b.js => 1dd31738.f2361110.js} | 2 +- assets/js/1ddd36f2.031ba1fd.js | 1 - assets/js/1ddd36f2.9d005e77.js | 1 + ...20595907.3e569479.js => 20595907.d363fbd2.js} | 2 +- ...21880a4d.2545a6d9.js => 21880a4d.3fc237ab.js} | 2 +- assets/js/2237.1d1b868c.js | 1 - ...25ef1bb8.5af8d370.js => 25ef1bb8.829f2dbc.js} | 2 +- ...27b0284c.24ca90bb.js => 27b0284c.f6ce6473.js} | 2 +- ...288b1075.7fdf1033.js => 288b1075.d8c0cc34.js} | 2 +- assets/js/2913.952f279a.js | 1 + assets/js/2cc2e835.3f7ac032.js | 1 + assets/js/2cc2e835.42c85917.js | 1 - assets/js/2da89d45.50a9d468.js | 1 + assets/js/2da89d45.c53388d7.js | 1 - ...2e812224.6dc7f702.js => 2e812224.1a40eb4c.js} | 2 +- ...2fede397.d7c9e9b3.js => 2fede397.cf7aaa58.js} | 2 +- assets/js/3042.616631a6.js | 1 + assets/js/339d500a.749f941d.js | 1 - assets/js/339d500a.f2d81bcd.js | 1 + ...35a60099.7bc9aad5.js => 35a60099.e9f86877.js} | 2 +- ...36b94792.799856c4.js => 36b94792.4fa1b781.js} | 2 +- ...392083ed.30911eae.js => 392083ed.44e8edfb.js} | 2 +- ...3fab0acb.d2be5705.js => 3fab0acb.42090723.js} | 2 +- assets/js/4017.7e97479c.js | 1 + ...4277b6a0.4bd27697.js => 4277b6a0.0e01d84b.js} | 2 +- ...43e1c8e4.444957a7.js => 43e1c8e4.968e1006.js} | 2 +- assets/js/47881d5c.207612b2.js | 1 + assets/js/47881d5c.beaba6e5.js | 1 - assets/js/4831.cc421862.js | 1 + ...48341697.f4018882.js => 48341697.ee186ebb.js} | 2 +- ...4f1777fd.7a01d5ed.js => 4f1777fd.8662c934.js} | 2 +- ...50ef9c44.7c0dd56b.js => 50ef9c44.12fc4d19.js} | 2 +- assets/js/5394.216a6dc4.js | 1 - ...54fa7005.cf645e57.js => 54fa7005.b2d85980.js} | 2 +- ...5cd0a723.ff1769bd.js => 5cd0a723.a9c6bc01.js} | 2 +- assets/js/5e95c892.6794ea18.js | 1 - assets/js/5e95c892.6fe04f8c.js | 1 + ...600b2345.18130102.js => 600b2345.9c2e688e.js} | 2 +- ...61ea36d9.f59265a3.js => 61ea36d9.d29dac57.js} | 2 +- ...6272ba0e.e147ca1e.js => 6272ba0e.6f3f0f49.js} | 2 +- ...685bed1a.a03f3930.js => 685bed1a.805a7a11.js} | 2 +- ...6a6a5bbc.7ff8dd0a.js => 6a6a5bbc.492570ea.js} | 2 +- ...6e881e32.58f05075.js => 6e881e32.d1a95584.js} | 2 +- ...71c8a211.0259d6a9.js => 71c8a211.bc7ae09e.js} | 2 +- ...7452427d.951c0809.js => 7452427d.213d2c47.js} | 2 +- ...75b20590.c44edc33.js => 75b20590.6e350206.js} | 2 +- ...7d0a541a.bebc18c0.js => 7d0a541a.60c67a50.js} | 2 +- assets/js/7dd0c8d0.b0b509b1.js | 1 - assets/js/7dd0c8d0.bff7c1df.js | 1 + ...7f5ec875.bb718edf.js => 7f5ec875.930ba73d.js} | 2 +- assets/js/{8158.900dc11d.js => 8158.18bfb97f.js} | 2 +- assets/js/81fb89b8.5431648f.js | 1 + assets/js/81fb89b8.8e503f5a.js | 1 - assets/js/8585.e93703b4.js | 1 - assets/js/8a9ffb5d.77502c26.js | 1 - assets/js/8a9ffb5d.d8752724.js | 1 + ...8b4ddd1a.c9cbe2e9.js => 8b4ddd1a.f19e7085.js} | 2 +- ...8dbf8f84.b796122d.js => 8dbf8f84.3f2e467f.js} | 2 +- ...901ef07d.08f99ecd.js => 901ef07d.b8ef613e.js} | 2 +- assets/js/962.3828f828.js | 1 - ...9939c4f4.0a8ed6f3.js => 9939c4f4.269715f4.js} | 2 +- ...a7bd4aaa.6c642da0.js => a7bd4aaa.cea47d6c.js} | 2 +- assets/js/a94703ab.43814358.js | 1 - assets/js/a94703ab.fa816e76.js | 1 + ...aad6478e.8dd329a2.js => aad6478e.3d3869e2.js} | 2 +- ...adf8dca1.b0b219c1.js => adf8dca1.2569ff33.js} | 2 +- assets/js/b36bb0c9.32b884d9.js | 1 - assets/js/b36bb0c9.40225a52.js | 1 + assets/js/b6569025.6245889e.js | 1 - assets/js/b6569025.fe4b9c1c.js | 1 + ...bbbe662c.b37b0a59.js => bbbe662c.9639f5d7.js} | 2 +- ...bc32cbb6.ac399eaf.js => bc32cbb6.9999155a.js} | 2 +- assets/js/bc747cac.47cf4617.js | 1 + assets/js/bc747cac.7ee6980c.js | 1 - ...bf372175.6ce3604a.js => bf372175.b4ab81db.js} | 2 +- assets/js/bfe99541.bd20f5d0.js | 1 - assets/js/bfe99541.ebbc647d.js | 1 + ...c015c796.32854b4b.js => c015c796.72c3baed.js} | 2 +- assets/js/c304be44.338d89b1.js | 1 - assets/js/c304be44.9bdbc4e1.js | 1 + assets/js/c4f5d8e4.e72ebafa.js | 1 + assets/js/c4f5d8e4.ff3bb442.js | 1 - assets/js/c88279fc.70a81d0d.js | 1 - assets/js/c88279fc.e4590d8c.js | 1 + assets/js/cda0d2e5.2230e891.js | 1 + assets/js/cda0d2e5.a558c3ba.js | 1 - assets/js/ce04f2ae.4cc27842.js | 1 - assets/js/ce04f2ae.7967717a.js | 1 + ...d3a54718.adbe71c6.js => d3a54718.cf229226.js} | 2 +- ...d768dc0f.7eb1170c.js => d768dc0f.3a416f3d.js} | 2 +- ...e1dfe4fe.557c1d76.js => e1dfe4fe.6a8817d7.js} | 2 +- assets/js/ebc0e2a0.2fd8a7d5.js | 1 + assets/js/ebc0e2a0.5671cf6f.js | 1 - ...ecf841c3.7d4c9847.js => ecf841c3.55fddec0.js} | 2 +- assets/js/ef8afbfd.adaf6ea9.js | 1 + assets/js/ef8afbfd.dbcbe2ba.js | 1 - assets/js/f888b719.25860f0f.js | 1 - assets/js/f888b719.5c9a422f.js | 1 + assets/js/f8f494be.6cdbf166.js | 1 + assets/js/f8f494be.f6c4378a.js | 1 - assets/js/main.35a8599c.js | 2 -- assets/js/main.73901735.js | 2 ++ ....LICENSE.txt => main.73901735.js.LICENSE.txt} | 0 assets/js/runtime~main.0fc14dac.js | 1 - assets/js/runtime~main.27dd39d7.js | 1 + docs/0.4/category/guides/index.html | 12 +++++++----- docs/0.4/category/metrics-and-limits/index.html | 12 +++++++----- docs/0.4/category/myzrok/index.html | 12 +++++++----- docs/0.4/category/oauth/index.html | 12 +++++++----- docs/0.4/category/self-hosting/index.html | 12 +++++++----- docs/0.4/concepts/files/index.html | 12 +++++++----- docs/0.4/concepts/hosting/index.html | 12 +++++++----- docs/0.4/concepts/http/index.html | 12 +++++++----- docs/0.4/concepts/index.html | 12 +++++++----- docs/0.4/concepts/opensource/index.html | 12 +++++++----- docs/0.4/concepts/sharing-private/index.html | 12 +++++++----- docs/0.4/concepts/sharing-public/index.html | 12 +++++++----- docs/0.4/concepts/sharing-reserved/index.html | 12 +++++++----- docs/0.4/concepts/tunnels/index.html | 12 +++++++----- docs/0.4/getting-started/index.html | 12 +++++++----- .../docker_private_share_guide/index.html | 12 +++++++----- .../docker_public_share_guide/index.html | 12 +++++++----- docs/0.4/guides/docker-share/index.html | 12 +++++++----- docs/0.4/guides/drives/index.html | 12 +++++++----- docs/0.4/guides/frontdoor/index.html | 12 +++++++----- docs/0.4/guides/install/index.html | 12 +++++++----- docs/0.4/guides/install/linux/index.html | 12 +++++++----- docs/0.4/guides/install/macos/index.html | 12 +++++++----- docs/0.4/guides/install/windows/index.html | 12 +++++++----- docs/0.4/guides/linux-user-share/index.html | 12 +++++++----- docs/0.4/guides/permission-modes/index.html | 12 +++++++----- docs/0.4/guides/self-hosting/docker/index.html | 12 +++++++----- .../instance-configuration/index.html | 12 +++++++----- .../self-hosting/interstitial-page/index.html | 12 +++++++----- .../guides/self-hosting/kubernetes/index.html | 12 +++++++----- docs/0.4/guides/self-hosting/linux/index.html | 12 +++++++----- .../guides/self-hosting/linux/nginx/index.html | 12 +++++++----- .../configuring-limits/index.html | 12 +++++++----- .../configuring-metrics/index.html | 12 +++++++----- .../oauth/configuring-oauth/index.html | 12 +++++++----- .../guides/self-hosting/organizations/index.html | 12 +++++++----- .../personalized-frontend/index.html | 12 +++++++----- .../self-hosting/self-service-invite/index.html | 12 +++++++----- docs/0.4/guides/vpn/index.html | 12 +++++++----- docs/0.4/myzrok/custom-domains/index.html | 12 +++++++----- docs/category/guides/index.html | 12 +++++++----- docs/category/metrics-and-limits/index.html | 12 +++++++----- docs/category/myzrok/index.html | 12 +++++++----- docs/category/oauth/index.html | 12 +++++++----- docs/category/self-hosting/index.html | 12 +++++++----- docs/concepts/files/index.html | 12 +++++++----- docs/concepts/hosting/index.html | 12 +++++++----- docs/concepts/http/index.html | 12 +++++++----- docs/concepts/index.html | 12 +++++++----- docs/concepts/opensource/index.html | 12 +++++++----- docs/concepts/sharing-private/index.html | 12 +++++++----- docs/concepts/sharing-public/index.html | 12 +++++++----- docs/concepts/sharing-reserved/index.html | 12 +++++++----- docs/concepts/tunnels/index.html | 16 +++++++++------- docs/getting-started/index.html | 12 +++++++----- docs/guides/agent/index.html | 12 +++++++----- docs/guides/agent/linux-service/index.html | 12 +++++++----- docs/guides/agent/windows-service/index.html | 12 +++++++----- .../docker_private_share_guide/index.html | 12 +++++++----- .../docker_public_share_guide/index.html | 12 +++++++----- docs/guides/docker-share/index.html | 12 +++++++----- docs/guides/drives/index.html | 14 ++++++++------ docs/guides/frontdoor/index.html | 12 +++++++----- docs/guides/install/index.html | 12 +++++++----- docs/guides/install/linux/index.html | 12 +++++++----- docs/guides/install/macos/index.html | 12 +++++++----- docs/guides/install/windows/index.html | 12 +++++++----- docs/guides/permission-modes/index.html | 12 +++++++----- docs/guides/self-hosting/docker/index.html | 12 +++++++----- .../instance-configuration/index.html | 12 +++++++----- .../self-hosting/interstitial-page/index.html | 12 +++++++----- docs/guides/self-hosting/kubernetes/index.html | 12 +++++++----- docs/guides/self-hosting/linux/index.html | 12 +++++++----- docs/guides/self-hosting/linux/nginx/index.html | 12 +++++++----- .../configuring-limits/index.html | 12 +++++++----- .../configuring-metrics/index.html | 12 +++++++----- .../oauth/configuring-oauth/index.html | 12 +++++++----- .../guides/self-hosting/organizations/index.html | 12 +++++++----- .../personalized-frontend/index.html | 12 +++++++----- .../self-hosting/self-service-invite/index.html | 12 +++++++----- docs/guides/vpn/index.html | 12 +++++++----- docs/myzrok/custom-domains/index.html | 12 +++++++----- index.html | 10 ++++++---- search/index.html | 12 +++++++----- 210 files changed, 693 insertions(+), 525 deletions(-) create mode 100644 assets/css/styles.b199a884.css delete mode 100644 assets/css/styles.bcccc215.css rename assets/js/{01cb08ea.58ce9e89.js => 01cb08ea.e2a119f7.js} (99%) rename assets/js/{033e8fc8.550a98dd.js => 033e8fc8.d38e5d82.js} (96%) rename assets/js/{07d0b302.de243ccc.js => 07d0b302.d3837b27.js} (98%) rename assets/js/{0c1cdb3d.93ac86f2.js => 0c1cdb3d.2f3a3b78.js} (96%) rename assets/js/{0c66edb9.a1604a49.js => 0c66edb9.ea664c8d.js} (99%) delete mode 100644 assets/js/0efac3c3.3f261e03.js create mode 100644 assets/js/0efac3c3.e00c8d4e.js rename assets/js/{11b43341.fe1bdd39.js => 11b43341.79f8cce9.js} (99%) create mode 100644 assets/js/14eb3368.77817439.js delete mode 100644 assets/js/14eb3368.a2fb3a9b.js rename assets/js/{17896441.1409512a.js => 17896441.575d0faf.js} (91%) delete mode 100644 assets/js/17f4c24e.17d254d5.js create mode 100644 assets/js/17f4c24e.e3487d90.js rename assets/js/{416.36a683d5.js => 1809.e9544cab.js} (58%) create mode 100644 assets/js/1a4e3797.41a00028.js delete mode 100644 assets/js/1a4e3797.b404fedf.js delete mode 100644 assets/js/1a4e3797.b404fedf.js.LICENSE.txt rename assets/js/{1ba5bc99.1ceac7e5.js => 1ba5bc99.29713972.js} (54%) rename assets/js/{1dd31738.b424452b.js => 1dd31738.f2361110.js} (98%) delete mode 100644 assets/js/1ddd36f2.031ba1fd.js create mode 100644 assets/js/1ddd36f2.9d005e77.js rename assets/js/{20595907.3e569479.js => 20595907.d363fbd2.js} (96%) rename assets/js/{21880a4d.2545a6d9.js => 21880a4d.3fc237ab.js} (99%) delete mode 100644 assets/js/2237.1d1b868c.js rename assets/js/{25ef1bb8.5af8d370.js => 25ef1bb8.829f2dbc.js} (99%) rename assets/js/{27b0284c.24ca90bb.js => 27b0284c.f6ce6473.js} (98%) rename assets/js/{288b1075.7fdf1033.js => 288b1075.d8c0cc34.js} (99%) create mode 100644 assets/js/2913.952f279a.js create mode 100644 assets/js/2cc2e835.3f7ac032.js delete mode 100644 assets/js/2cc2e835.42c85917.js create mode 100644 assets/js/2da89d45.50a9d468.js delete mode 100644 assets/js/2da89d45.c53388d7.js rename assets/js/{2e812224.6dc7f702.js => 2e812224.1a40eb4c.js} (99%) rename assets/js/{2fede397.d7c9e9b3.js => 2fede397.cf7aaa58.js} (98%) create mode 100644 assets/js/3042.616631a6.js delete mode 100644 assets/js/339d500a.749f941d.js create mode 100644 assets/js/339d500a.f2d81bcd.js rename assets/js/{35a60099.7bc9aad5.js => 35a60099.e9f86877.js} (96%) rename assets/js/{36b94792.799856c4.js => 36b94792.4fa1b781.js} (99%) rename assets/js/{392083ed.30911eae.js => 392083ed.44e8edfb.js} (99%) rename assets/js/{3fab0acb.d2be5705.js => 3fab0acb.42090723.js} (99%) create mode 100644 assets/js/4017.7e97479c.js rename assets/js/{4277b6a0.4bd27697.js => 4277b6a0.0e01d84b.js} (99%) rename assets/js/{43e1c8e4.444957a7.js => 43e1c8e4.968e1006.js} (99%) create mode 100644 assets/js/47881d5c.207612b2.js delete mode 100644 assets/js/47881d5c.beaba6e5.js create mode 100644 assets/js/4831.cc421862.js rename assets/js/{48341697.f4018882.js => 48341697.ee186ebb.js} (99%) rename assets/js/{4f1777fd.7a01d5ed.js => 4f1777fd.8662c934.js} (96%) rename assets/js/{50ef9c44.7c0dd56b.js => 50ef9c44.12fc4d19.js} (97%) delete mode 100644 assets/js/5394.216a6dc4.js rename assets/js/{54fa7005.cf645e57.js => 54fa7005.b2d85980.js} (96%) rename assets/js/{5cd0a723.ff1769bd.js => 5cd0a723.a9c6bc01.js} (98%) delete mode 100644 assets/js/5e95c892.6794ea18.js create mode 100644 assets/js/5e95c892.6fe04f8c.js rename assets/js/{600b2345.18130102.js => 600b2345.9c2e688e.js} (99%) rename assets/js/{61ea36d9.f59265a3.js => 61ea36d9.d29dac57.js} (98%) rename assets/js/{6272ba0e.e147ca1e.js => 6272ba0e.6f3f0f49.js} (98%) rename assets/js/{685bed1a.a03f3930.js => 685bed1a.805a7a11.js} (90%) rename assets/js/{6a6a5bbc.7ff8dd0a.js => 6a6a5bbc.492570ea.js} (98%) rename assets/js/{6e881e32.58f05075.js => 6e881e32.d1a95584.js} (99%) rename assets/js/{71c8a211.0259d6a9.js => 71c8a211.bc7ae09e.js} (99%) rename assets/js/{7452427d.951c0809.js => 7452427d.213d2c47.js} (98%) rename assets/js/{75b20590.c44edc33.js => 75b20590.6e350206.js} (98%) rename assets/js/{7d0a541a.bebc18c0.js => 7d0a541a.60c67a50.js} (98%) delete mode 100644 assets/js/7dd0c8d0.b0b509b1.js create mode 100644 assets/js/7dd0c8d0.bff7c1df.js rename assets/js/{7f5ec875.bb718edf.js => 7f5ec875.930ba73d.js} (99%) rename assets/js/{8158.900dc11d.js => 8158.18bfb97f.js} (82%) create mode 100644 assets/js/81fb89b8.5431648f.js delete mode 100644 assets/js/81fb89b8.8e503f5a.js delete mode 100644 assets/js/8585.e93703b4.js delete mode 100644 assets/js/8a9ffb5d.77502c26.js create mode 100644 assets/js/8a9ffb5d.d8752724.js rename assets/js/{8b4ddd1a.c9cbe2e9.js => 8b4ddd1a.f19e7085.js} (99%) rename assets/js/{8dbf8f84.b796122d.js => 8dbf8f84.3f2e467f.js} (99%) rename assets/js/{901ef07d.08f99ecd.js => 901ef07d.b8ef613e.js} (99%) delete mode 100644 assets/js/962.3828f828.js rename assets/js/{9939c4f4.0a8ed6f3.js => 9939c4f4.269715f4.js} (99%) rename assets/js/{a7bd4aaa.6c642da0.js => a7bd4aaa.cea47d6c.js} (81%) delete mode 100644 assets/js/a94703ab.43814358.js create mode 100644 assets/js/a94703ab.fa816e76.js rename assets/js/{aad6478e.8dd329a2.js => aad6478e.3d3869e2.js} (97%) rename assets/js/{adf8dca1.b0b219c1.js => adf8dca1.2569ff33.js} (98%) delete mode 100644 assets/js/b36bb0c9.32b884d9.js create mode 100644 assets/js/b36bb0c9.40225a52.js delete mode 100644 assets/js/b6569025.6245889e.js create mode 100644 assets/js/b6569025.fe4b9c1c.js rename assets/js/{bbbe662c.b37b0a59.js => bbbe662c.9639f5d7.js} (99%) rename assets/js/{bc32cbb6.ac399eaf.js => bc32cbb6.9999155a.js} (99%) create mode 100644 assets/js/bc747cac.47cf4617.js delete mode 100644 assets/js/bc747cac.7ee6980c.js rename assets/js/{bf372175.6ce3604a.js => bf372175.b4ab81db.js} (97%) delete mode 100644 assets/js/bfe99541.bd20f5d0.js create mode 100644 assets/js/bfe99541.ebbc647d.js rename assets/js/{c015c796.32854b4b.js => c015c796.72c3baed.js} (98%) delete mode 100644 assets/js/c304be44.338d89b1.js create mode 100644 assets/js/c304be44.9bdbc4e1.js create mode 100644 assets/js/c4f5d8e4.e72ebafa.js delete mode 100644 assets/js/c4f5d8e4.ff3bb442.js delete mode 100644 assets/js/c88279fc.70a81d0d.js create mode 100644 assets/js/c88279fc.e4590d8c.js create mode 100644 assets/js/cda0d2e5.2230e891.js delete mode 100644 assets/js/cda0d2e5.a558c3ba.js delete mode 100644 assets/js/ce04f2ae.4cc27842.js create mode 100644 assets/js/ce04f2ae.7967717a.js rename assets/js/{d3a54718.adbe71c6.js => d3a54718.cf229226.js} (99%) rename assets/js/{d768dc0f.7eb1170c.js => d768dc0f.3a416f3d.js} (99%) rename assets/js/{e1dfe4fe.557c1d76.js => e1dfe4fe.6a8817d7.js} (99%) create mode 100644 assets/js/ebc0e2a0.2fd8a7d5.js delete mode 100644 assets/js/ebc0e2a0.5671cf6f.js rename assets/js/{ecf841c3.7d4c9847.js => ecf841c3.55fddec0.js} (99%) create mode 100644 assets/js/ef8afbfd.adaf6ea9.js delete mode 100644 assets/js/ef8afbfd.dbcbe2ba.js delete mode 100644 assets/js/f888b719.25860f0f.js create mode 100644 assets/js/f888b719.5c9a422f.js create mode 100644 assets/js/f8f494be.6cdbf166.js delete mode 100644 assets/js/f8f494be.f6c4378a.js delete mode 100644 assets/js/main.35a8599c.js create mode 100644 assets/js/main.73901735.js rename assets/js/{main.35a8599c.js.LICENSE.txt => main.73901735.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.0fc14dac.js create mode 100644 assets/js/runtime~main.27dd39d7.js diff --git a/404.html b/404.html index 090a6335..ad2f7af4 100644 --- a/404.html +++ b/404.html @@ -2,19 +2,21 @@ - + Page Not Found | zrok - - - + + + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/css/styles.b199a884.css b/assets/css/styles.b199a884.css new file mode 100644 index 00000000..b02db071 --- /dev/null +++ b/assets/css/styles.b199a884.css @@ -0,0 +1,7 @@ +@import url(https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap);@import url(https://fonts.googleapis.com/css2?family=Russo+One&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.button,code{vertical-align:middle}.markdown li,body,code{word-wrap:break-word}*,.DocSearch-Container,.DocSearch-Container *,.downloadCard_D_EY{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;letter-spacing:1}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit;color:var(--code-font-color)}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight)}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.DocSearch-Container a,.downloadLinks_thSu,.downloadLinks_thSu:focus,.downloadLinks_thSu:hover,.dropdown__link--active,.dropdown__link:hover,.getting-started-cards a:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.tag_zVej:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}[data-theme=dark] +h1,h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color)}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white);--ifm-footer-background-color:#0d0235}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.pagination-nav__link,h1,h2,h3,h4,h5,h6{line-height:var(--ifm-heading-line-height)}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{content:"";transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;height:1.25rem;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.navbar__items--center .navbar__brand,code{margin:0}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;color:var(--ifm-navbar-link-color);display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover,.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);overflow-x:hidden;position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#3e2693;--ifm-color-primary-dark:#372284;--ifm-color-primary-darker:#2c196e;--ifm-color-primary-darkest:#211158;--ifm-color-primary-light:#3e2693;--ifm-color-primary-lighter:#5a3cc2;--ifm-color-primary-lightest:#6747d9;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-menu-color:#252525;--code-background-color:#3e26931a;--code-font-color:#252525;--selection-font-color:#0f023b;--selection-background:#9bf316;--ifm-menu-color-background-hover:#6747d955;--sidebar-selected:#6747d955;--contrasting-background:#c4b7f5;--container-border:1px solid #adadad;--button-background-hover:#9c84f9;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#9bf316;--ifm-color-primary-dark:#8cdb14;--ifm-color-primary-darker:#80c814;--ifm-color-primary-darkest:#70b409;--ifm-color-primary-light:#9bf316;--ifm-color-primary-lighter:#9af90a;--ifm-color-primary-lightest:#9f0;--docusaurus-highlighted-code-line-bg:#0000004d;--code-background-color:#4c377b87;--code-font-color:#cdb4f7;--selection-color:#0f023b;--ifm-navbar-background-color:#0d0235;--ifm-background-color:unset;--ifm-link-color:#9bf316;--ifm-menu-color:#ffffffd4;--contrasting-background:#4b359f;--container-border:1px solid #6d6d6d;--button-background-hover:#251463}.navbar .navbar__inner{margin:0 auto;max-width:1360px}.main-wrapper{display:flex;flex-direction:column}[data-theme=dark] +#__docusaurus{background:linear-gradient(180deg,#140c42,#231069)}.getting-started-cards .card,.menu__link--active:not(.menu__link--sublist){background-color:var(--sidebar-selected)}h1,h2,h3,h4,h5,h6{font-family:Russo One,sans-serif;font-weight:400;margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}code,html,p{font-family:JetBrains Mono,Consolas,Courier New,monospace}html,p{font-weight:400}.menu__link{color:#252525;font-weight:600}[data-theme=dark] +.menu__link{color:#ffffffd4}.navbar__link--active,.navbar__link:hover{font-weight:600}code{background-color:#f2f2f2;font-size:85%;font-weight:800;padding:.2em .4em;white-space:break-spaces;color2:#a782d9;border-color:var(--code-background-color);border-radius:6px;border-width:0;color:var(--code-font-color);background-color2:#4c377b87;background-color:var(--code-background-color)}[data-theme=dark] +pre{background-color:#0b0031}[data-theme=dark] +.docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module{border-right:1px solid #9bf316}[data-theme=dark] +.table-of-contents__left-border{border-left:1px solid #9bf316}::selection{background:var(--selection-background);color:var(--selection-font-color)}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.language-buttonless div>button{display:none}.header-discourse-link:hover,.header-github-link:hover{opacity:.6}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%233C4A5E' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:1.25rem;width:1.25rem}[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%2394A3B8' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.header-discourse-link:before,[data-theme=dark] .header-discourse-link:before{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGcgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBkYXRhLW5hbWU9IkxheWVyIDMiPjxwYXRoIGQ9Ik01MS44NyAwQzIzLjcxIDAgMCAyMi44MyAwIDUxdjUyLjgxbDUxLjg2LS4wNWMyOC4xNiAwIDUxLTIzLjcxIDUxLTUxLjg3UzgwIDAgNTEuODcgMCIgc3R5bGU9ImZpbGw6IzIzMWYyMCIvPjxwYXRoIGQ9Ik01Mi4zNyAxOS43NGEzMS42MiAzMS42MiAwIDAgMC0yNy43OSA0Ni42N2wtNS43MiAxOC40IDIwLjU0LTQuNjRhMzEuNjEgMzEuNjEgMCAxIDAgMTMtNjAuNDNaIiBzdHlsZT0iZmlsbDojZmZmOWFlIi8+PHBhdGggZD0iTTc3LjQ1IDMyLjEyYTMxLjYgMzEuNiAwIDAgMS0zOC4wNSA0OGwtMjAuNTQgNC43IDIwLjkxLTIuNDdhMzEuNiAzMS42IDAgMCAwIDM3LjY4LTUwLjIzIiBzdHlsZT0iZmlsbDojMDBhZWVmIi8+PHBhdGggZD0iTTcxLjYzIDI2LjI5QTMxLjYgMzEuNiAwIDAgMSAzOC44IDc4bC0xOS45NCA2LjgyIDIwLjU0LTQuNjVhMzEuNiAzMS42IDAgMCAwIDMyLjIzLTUzLjg4IiBzdHlsZT0iZmlsbDojMDBhOTRmIi8+PHBhdGggZD0iTTI2LjQ3IDY3LjExYTMxLjYxIDMxLjYxIDAgMCAxIDUxLTM1IDMxLjYxIDMxLjYxIDAgMCAwLTUyLjg5IDM0LjNsLTUuNzIgMTguNFoiIHN0eWxlPSJmaWxsOiNmMTVkMjIiLz48cGF0aCBkPSJNMjQuNTggNjYuNDFhMzEuNjEgMzEuNjEgMCAwIDEgNDcuMDUtNDAuMTIgMzEuNjEgMzEuNjEgMCAwIDAtNDkgMzkuNjNsLTMuNzYgMTguOVoiIHN0eWxlPSJmaWxsOiNlMzFiMjMiLz48L2c+PC9nPjwvc3ZnPg==) no-repeat;content:"";display:flex;height:1.25rem;width:1.25rem}.getting-started-cards .button{background-color:var(--contrasting-background);border:1px var(--container-border);color:var(--ifm-link-color);font-family:var(--font-family-monospace);transition:background-color .3s}.downloadButtons_NPAP:focus,.downloadButtons_NPAP:hover,.getting-started-cards .button:hover{background-color:var(--button-background-hover);outline:0}.downloadContainer_nNgj{align-items:stretch;display:flex;flex-direction:row;gap:9px;justify-content:center;padding:20px;width:100%}.downloadCard_D_EY{background-color:var(--sidebar-selected);border-radius:18px;display:flex;flex-direction:column;flex-grow:1;text-align:center;width:30%}.downloadButtons_NPAP,.downloadCard_D_EY .imgContainer_r0QA{background-color:var(--contrasting-background);display:inline-block}.downloadCard_D_EY img{display:block;margin:0 auto;max-height:100px;padding:10px;width:auto}.cardFooter_Rhom{background-color:var(--contrasting-background);border-bottom-left-radius:18px;border-bottom-right-radius:18px;border-top:var(--container-border);margin-top:auto;padding:10px}.downloadCard_D_EY ul{list-style:none;margin:0 0 20px;padding:0}.downloadButtons_NPAP{border:1px var(--container-border);border-radius:18px;margin:5px;padding:10px 15px;text-align:center;transition:background-color .3s}.downloadCard_D_EY h3{margin-top:10px}.downloadCard_D_EY .imgContainer_r0QA{border-bottom:var(--container-border);border-top-left-radius:18px;border-top-right-radius:18px;margin-bottom:auto;padding:10px}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Hit[aria-selected=true] mark,.DocSearch-Prefill:focus,.DocSearch-Prefill:hover,.content_knG7 a{-webkit-text-decoration:underline;text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative;scroll-margin-top:40px}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1416px){.main-wrapper{align-self:center;max-width:1400px;width:1400px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.downloadContainer_nNgj{flex-direction:column}.downloadCard_D_EY{max-width:none;width:auto}.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media (prefers-reduced-motion){.DocSearch-Button-Key{transition:none}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.bcccc215.css b/assets/css/styles.bcccc215.css deleted file mode 100644 index 6609a46b..00000000 --- a/assets/css/styles.bcccc215.css +++ /dev/null @@ -1,7 +0,0 @@ -@import url(https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap);@import url(https://fonts.googleapis.com/css2?family=Russo+One&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.button,code{vertical-align:middle}.markdown li,body,code{word-wrap:break-word}*,.DocSearch-Container,.DocSearch-Container *,.downloadCard_D_EY{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;letter-spacing:1}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit;color:var(--code-font-color)}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight)}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}[data-theme=dark] -h1,h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color)}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white);--ifm-footer-background-color:#0d0235}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.pagination-nav__link,h1,h2,h3,h4,h5,h6{line-height:var(--ifm-heading-line-height)}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;height:1.25rem;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.navbar__items--center .navbar__brand,code{margin:0}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;color:var(--ifm-navbar-link-color);display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover,.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar__brand:hover{text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);overflow-x:hidden;position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.downloadLinks_thSu,.downloadLinks_thSu:focus,.downloadLinks_thSu:hover,.getting-started-cards a:hover,.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#3e2693;--ifm-color-primary-dark:#372284;--ifm-color-primary-darker:#2c196e;--ifm-color-primary-darkest:#211158;--ifm-color-primary-light:#3e2693;--ifm-color-primary-lighter:#5a3cc2;--ifm-color-primary-lightest:#6747d9;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-menu-color:#252525;--code-background-color:#3e26931a;--code-font-color:#252525;--selection-font-color:#0f023b;--selection-background:#9bf316;--ifm-menu-color-background-hover:#6747d955;--sidebar-selected:#6747d955;--contrasting-background:#c4b7f5;--container-border:1px solid #adadad;--button-background-hover:#9c84f9;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#9bf316;--ifm-color-primary-dark:#8cdb14;--ifm-color-primary-darker:#80c814;--ifm-color-primary-darkest:#70b409;--ifm-color-primary-light:#9bf316;--ifm-color-primary-lighter:#9af90a;--ifm-color-primary-lightest:#9f0;--docusaurus-highlighted-code-line-bg:#0000004d;--code-background-color:#4c377b87;--code-font-color:#cdb4f7;--selection-color:#0f023b;--ifm-navbar-background-color:#0d0235;--ifm-background-color:unset;--ifm-link-color:#9bf316;--ifm-menu-color:#ffffffd4;--contrasting-background:#4b359f;--container-border:1px solid #6d6d6d;--button-background-hover:#251463}.navbar .navbar__inner{margin:0 auto;max-width:1360px}.main-wrapper{display:flex;flex-direction:column}[data-theme=dark] -#__docusaurus{background:linear-gradient(180deg,#140c42,#231069)}.getting-started-cards .card,.menu__link--active:not(.menu__link--sublist){background-color:var(--sidebar-selected)}h1,h2,h3,h4,h5,h6{font-family:Russo One,sans-serif;font-weight:400;margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}code,html,p{font-family:JetBrains Mono,Consolas,Courier New,monospace}html,p{font-weight:400}.menu__link{color:#252525;font-weight:600}[data-theme=dark] -.menu__link{color:#ffffffd4}.navbar__link--active,.navbar__link:hover{font-weight:600;text-decoration:none}code{background-color:#f2f2f2;font-size:85%;font-weight:800;padding:.2em .4em;white-space:break-spaces;color2:#a782d9;border-color:var(--code-background-color);border-radius:6px;border-width:0;color:var(--code-font-color);background-color2:#4c377b87;background-color:var(--code-background-color)}[data-theme=dark] -pre{background-color:#0b0031}[data-theme=dark] -.docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module{border-right:1px solid #9bf316}[data-theme=dark] -.table-of-contents__left-border{border-left:1px solid #9bf316}::selection{background:var(--selection-background);color:var(--selection-font-color)}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.language-buttonless div>button{display:none}.header-discourse-link:hover,.header-github-link:hover{opacity:.6}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%233C4A5E' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:1.25rem;width:1.25rem}[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%2394A3B8' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.header-discourse-link:before,[data-theme=dark] .header-discourse-link:before{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGcgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBkYXRhLW5hbWU9IkxheWVyIDMiPjxwYXRoIGQ9Ik01MS44NyAwQzIzLjcxIDAgMCAyMi44MyAwIDUxdjUyLjgxbDUxLjg2LS4wNWMyOC4xNiAwIDUxLTIzLjcxIDUxLTUxLjg3UzgwIDAgNTEuODcgMCIgc3R5bGU9ImZpbGw6IzIzMWYyMCIvPjxwYXRoIGQ9Ik01Mi4zNyAxOS43NGEzMS42MiAzMS42MiAwIDAgMC0yNy43OSA0Ni42N2wtNS43MiAxOC40IDIwLjU0LTQuNjRhMzEuNjEgMzEuNjEgMCAxIDAgMTMtNjAuNDNaIiBzdHlsZT0iZmlsbDojZmZmOWFlIi8+PHBhdGggZD0iTTc3LjQ1IDMyLjEyYTMxLjYgMzEuNiAwIDAgMS0zOC4wNSA0OGwtMjAuNTQgNC43IDIwLjkxLTIuNDdhMzEuNiAzMS42IDAgMCAwIDM3LjY4LTUwLjIzIiBzdHlsZT0iZmlsbDojMDBhZWVmIi8+PHBhdGggZD0iTTcxLjYzIDI2LjI5QTMxLjYgMzEuNiAwIDAgMSAzOC44IDc4bC0xOS45NCA2LjgyIDIwLjU0LTQuNjVhMzEuNiAzMS42IDAgMCAwIDMyLjIzLTUzLjg4IiBzdHlsZT0iZmlsbDojMDBhOTRmIi8+PHBhdGggZD0iTTI2LjQ3IDY3LjExYTMxLjYxIDMxLjYxIDAgMCAxIDUxLTM1IDMxLjYxIDMxLjYxIDAgMCAwLTUyLjg5IDM0LjNsLTUuNzIgMTguNFoiIHN0eWxlPSJmaWxsOiNmMTVkMjIiLz48cGF0aCBkPSJNMjQuNTggNjYuNDFhMzEuNjEgMzEuNjEgMCAwIDEgNDcuMDUtNDAuMTIgMzEuNjEgMzEuNjEgMCAwIDAtNDkgMzkuNjNsLTMuNzYgMTguOVoiIHN0eWxlPSJmaWxsOiNlMzFiMjMiLz48L2c+PC9nPjwvc3ZnPg==) no-repeat;content:"";display:flex;height:1.25rem;width:1.25rem}.getting-started-cards .button{background-color:var(--contrasting-background);border:1px var(--container-border);color:var(--ifm-link-color);font-family:var(--font-family-monospace);transition:background-color .3s}.downloadButtons_NPAP:focus,.downloadButtons_NPAP:hover,.getting-started-cards .button:hover{background-color:var(--button-background-hover);outline:0}.downloadContainer_nNgj{align-items:stretch;display:flex;flex-direction:row;gap:9px;justify-content:center;padding:20px;width:100%}.downloadCard_D_EY{background-color:var(--sidebar-selected);border-radius:18px;display:flex;flex-direction:column;flex-grow:1;text-align:center;width:30%}.downloadButtons_NPAP,.downloadCard_D_EY .imgContainer_r0QA{background-color:var(--contrasting-background);display:inline-block}.downloadCard_D_EY img{display:block;margin:0 auto;max-height:100px;padding:10px;width:auto}.cardFooter_Rhom{background-color:var(--contrasting-background);border-bottom-left-radius:18px;border-bottom-right-radius:18px;border-top:var(--container-border);margin-top:auto;padding:10px}.downloadCard_D_EY ul{list-style:none;margin:0 0 20px;padding:0}.downloadButtons_NPAP{border:1px var(--container-border);border-radius:18px;margin:5px;padding:10px 15px;text-align:center;transition:background-color .3s}.downloadCard_D_EY h3{margin-top:10px}.downloadCard_D_EY .imgContainer_r0QA{border-bottom:var(--container-border);border-top-left-radius:18px;border-top-right-radius:18px;margin-bottom:auto;padding:10px}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1416px){.main-wrapper{align-self:center;max-width:1400px;width:1400px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.downloadContainer_nNgj{flex-direction:column}.downloadCard_D_EY{max-width:none;width:auto}.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/01cb08ea.58ce9e89.js b/assets/js/01cb08ea.e2a119f7.js similarity index 99% rename from assets/js/01cb08ea.58ce9e89.js rename to assets/js/01cb08ea.e2a119f7.js index 6d6f76a3..559b678f 100644 --- a/assets/js/01cb08ea.58ce9e89.js +++ b/assets/js/01cb08ea.e2a119f7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3747],{2264:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","source":"@site/../docs/myzrok/custom-domains/index.mdx","sourceDirName":"myzrok/custom-domains","slug":"/myzrok/custom-domains/","permalink":"/docs/myzrok/custom-domains/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/myzrok/custom-domains/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Custom Domains"},"sidebar":"tutorialSidebar","previous":{"title":"myzrok","permalink":"/docs/category/myzrok"}}');var r=n(4848),i=n(8453);const s={title:"Custom Domains"},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create Your Custom Domain",id:"create-your-custom-domain",level:3},{value:"Creating DNS Records",id:"creating-dns-records",level:3},{value:"Finalizing Your Custom Domain",id:"finalizing-your-custom-domain",level:3},{value:"Start Sharing!",id:"start-sharing",level:3}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares.\nFor example, let's say you own the domain ",(0,r.jsx)(o.code,{children:"foo.example.io"}),", you can leverage zrok custom domains to\ncreate ephemeral shares such as: ",(0,r.jsx)(o.code,{children:"https://vw8jbg4ijz5g.foo.example.io"}),"\nor ",(0,r.jsx)(o.a,{href:"/docs/concepts/sharing-reserved",children:"reserved shares"})," such as ",(0,r.jsx)(o.code,{children:"https://toaster.foo.example.io"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Custom domains require a Pro subscription with ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"}),".\nIf you don't already have an account, you can sign up for one ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"here"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," provides a guided setup with just a few easy steps!"]}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsx)(o.li,{children:"Bring your own custom domain name"}),"\n",(0,r.jsx)(o.li,{children:"Create DNS records for certificate validation and traffic routing"}),"\n",(0,r.jsx)(o.li,{children:"Wait for zrok to validate your records and finalize configuration"}),"\n",(0,r.jsx)(o.li,{children:"Start sharing!"}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:"Detailed setup instructions are documented below."}),"\n",(0,r.jsx)(o.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsxs)(o.p,{children:["In order to create a custom domain in zrok, ",(0,r.jsx)(o.strong,{children:"you must already own the domain you want to use."})]})}),"\n",(0,r.jsx)(o.p,{children:"During the setup process you will need to create DNS records to validate ownership and to allow a certificate to be issued\non behalf of your domain. Once you have your domain registered, you can begin the process of setting up your custom\ndomain with zrok."}),"\n",(0,r.jsx)(o.h3,{id:"create-your-custom-domain",children:"Create Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"Log into the myzrok console and access the domains page by clicking on the globe icon in the left navigation menu."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_domains_page",src:n(2956).A+"",width:"1022",height:"581"})}),"\n",(0,r.jsx)(o.p,{children:"Click the CREATE button on the top right of the page to get started.\nWhen you click the create button you\u2019ll be presented with a form to allow you to enable your custom domain.\nEnter your domain into the form field and click CREATE. This will begin the process for setting up your custom domain.\nA new managed TLS certificate will be created to host traffic on your domain's behalf."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_domain",src:n(675).A+"",width:"844",height:"344"})}),"\n",(0,r.jsxs)(o.p,{children:["This may take a few minutes.\nYou may close the form at this time and come back when your domain is ",(0,r.jsx)(o.em,{children:"pending validation."}),"\nOnce your certificate is ready, you\u2019ll be presented with instructions on how to set up your DNS records."]}),"\n",(0,r.jsx)(o.h3,{id:"creating-dns-records",children:"Creating DNS Records"}),"\n",(0,r.jsx)(o.p,{children:"zrok will host and manage a TLS certificate for the custom domain on your behalf.\nThis process requires a DNS validation record to be created in order to prove ownership of the domain.\nFollow the prompts in the UI to create a CNAME DNS record with the name and value specified in the UI."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_cname",src:n(8881).A+"",width:"847",height:"402"})}),"\n",(0,r.jsx)(o.p,{children:"Next, create an A record to direct all DNS requests for your domain to a set of static IPs that are hosted by zrok."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_a_record",src:n(6212).A+"",width:"830",height:"527"})}),"\n",(0,r.jsx)(o.p,{children:"After you\u2019ve created your records, you can verify that they are configured properly using the instructions provided in the form."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_verify_dns",src:n(1752).A+"",width:"829",height:"528"})}),"\n",(0,r.jsxs)(o.p,{children:["If the ",(0,r.jsx)(o.code,{children:"nslookup"})," command returns the IP addresses supplied for the A-record entry, then DNS for your domain is resolving properly."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"nslookup test.foo.example.io\nServer:\t\t192.168.86.194\nAddress:\t192.168.86.194#53\n\nNon-authoritative answer:\nName:\ttest.foo.example.io\nAddress: 99.83.220.186\nName:\ttest.foo.example.io\nAddress: 52.223.6.108\n"})}),"\n",(0,r.jsx)(o.p,{children:"Once you have created your DNS records, it will take zrok a few minutes to validate that they exist.\nYou can safely close the form until your certificate has been issued."}),"\n",(0,r.jsx)(o.h3,{id:"finalizing-your-custom-domain",children:"Finalizing Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"After your records have been validated and your certificate has been issued, click the FINALIZE button within 72 hours to complete your custom domain setup."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_finalize",src:n(5101).A+"",width:"818",height:"224"})}),"\n",(0,r.jsx)(o.p,{children:"From here, myzrok.io will complete the last few steps of creating your custom domain.\nThis should only take a minute, but if you need to close the form you can find the instructions on how to share your frontend when you return."}),"\n",(0,r.jsx)(o.h3,{id:"start-sharing",children:"Start Sharing!"}),"\n",(0,r.jsx)(o.p,{children:"Once the Finalize stage has completed, you can start sharing with your custom DNS."}),"\n",(0,r.jsxs)(o.p,{children:["In order to create shares that utilize your custom DNS, you will need to specify the ",(0,r.jsx)(o.code,{children:"--frontend"})," flag when creating a share,\nor update your environment configuration to use this new frontend by default."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok share public --frontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsx)(o.p,{children:"You can set the custom frontend as the environment default by running:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok config set defaultFrontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsxs)(o.p,{children:["To validate which frontend is being used, use the ",(0,r.jsx)(o.code,{children:"zrok status"})," command, which will identify the default frontend being used:"]}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"zrok_status",src:n(2679).A+"",width:"404",height:"220"})})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},6212:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_a_record-550b91f870f6e1df4903220bfa78ae25.png"},8881:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_cname-3cbbf4526443142174bab2d22224764a.png"},675:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_domain-bcf860ac29b46cfe5981db391bcbc521.png"},2956:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_domains_page-6d92a9076e1bca9640eb301eb6716e5f.png"},5101:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_finalize-71899efbaf429d9be596363607550730.png"},1752:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_verify_dns-2f721e1a96f56f4f09f3b0b16ea8c1c5.png"},2679:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/zrok_status-0ce131c6d8bba0df50b0f2a577707f0a.png"},8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const r={},i=t.createContext(r);function s(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3747],{7644:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","source":"@site/../docs/myzrok/custom-domains/index.mdx","sourceDirName":"myzrok/custom-domains","slug":"/myzrok/custom-domains/","permalink":"/docs/myzrok/custom-domains/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/myzrok/custom-domains/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Custom Domains"},"sidebar":"tutorialSidebar","previous":{"title":"myzrok","permalink":"/docs/category/myzrok"}}');var r=n(4848),i=n(8453);const s={title:"Custom Domains"},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create Your Custom Domain",id:"create-your-custom-domain",level:3},{value:"Creating DNS Records",id:"creating-dns-records",level:3},{value:"Finalizing Your Custom Domain",id:"finalizing-your-custom-domain",level:3},{value:"Start Sharing!",id:"start-sharing",level:3}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares.\nFor example, let's say you own the domain ",(0,r.jsx)(o.code,{children:"foo.example.io"}),", you can leverage zrok custom domains to\ncreate ephemeral shares such as: ",(0,r.jsx)(o.code,{children:"https://vw8jbg4ijz5g.foo.example.io"}),"\nor ",(0,r.jsx)(o.a,{href:"/docs/concepts/sharing-reserved",children:"reserved shares"})," such as ",(0,r.jsx)(o.code,{children:"https://toaster.foo.example.io"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Custom domains require a Pro subscription with ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"}),".\nIf you don't already have an account, you can sign up for one ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"here"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," provides a guided setup with just a few easy steps!"]}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsx)(o.li,{children:"Bring your own custom domain name"}),"\n",(0,r.jsx)(o.li,{children:"Create DNS records for certificate validation and traffic routing"}),"\n",(0,r.jsx)(o.li,{children:"Wait for zrok to validate your records and finalize configuration"}),"\n",(0,r.jsx)(o.li,{children:"Start sharing!"}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:"Detailed setup instructions are documented below."}),"\n",(0,r.jsx)(o.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsxs)(o.p,{children:["In order to create a custom domain in zrok, ",(0,r.jsx)(o.strong,{children:"you must already own the domain you want to use."})]})}),"\n",(0,r.jsx)(o.p,{children:"During the setup process you will need to create DNS records to validate ownership and to allow a certificate to be issued\non behalf of your domain. Once you have your domain registered, you can begin the process of setting up your custom\ndomain with zrok."}),"\n",(0,r.jsx)(o.h3,{id:"create-your-custom-domain",children:"Create Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"Log into the myzrok console and access the domains page by clicking on the globe icon in the left navigation menu."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_domains_page",src:n(2956).A+"",width:"1022",height:"581"})}),"\n",(0,r.jsx)(o.p,{children:"Click the CREATE button on the top right of the page to get started.\nWhen you click the create button you\u2019ll be presented with a form to allow you to enable your custom domain.\nEnter your domain into the form field and click CREATE. This will begin the process for setting up your custom domain.\nA new managed TLS certificate will be created to host traffic on your domain's behalf."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_domain",src:n(675).A+"",width:"844",height:"344"})}),"\n",(0,r.jsxs)(o.p,{children:["This may take a few minutes.\nYou may close the form at this time and come back when your domain is ",(0,r.jsx)(o.em,{children:"pending validation."}),"\nOnce your certificate is ready, you\u2019ll be presented with instructions on how to set up your DNS records."]}),"\n",(0,r.jsx)(o.h3,{id:"creating-dns-records",children:"Creating DNS Records"}),"\n",(0,r.jsx)(o.p,{children:"zrok will host and manage a TLS certificate for the custom domain on your behalf.\nThis process requires a DNS validation record to be created in order to prove ownership of the domain.\nFollow the prompts in the UI to create a CNAME DNS record with the name and value specified in the UI."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_cname",src:n(8881).A+"",width:"847",height:"402"})}),"\n",(0,r.jsx)(o.p,{children:"Next, create an A record to direct all DNS requests for your domain to a set of static IPs that are hosted by zrok."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_a_record",src:n(6212).A+"",width:"830",height:"527"})}),"\n",(0,r.jsx)(o.p,{children:"After you\u2019ve created your records, you can verify that they are configured properly using the instructions provided in the form."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_verify_dns",src:n(1752).A+"",width:"829",height:"528"})}),"\n",(0,r.jsxs)(o.p,{children:["If the ",(0,r.jsx)(o.code,{children:"nslookup"})," command returns the IP addresses supplied for the A-record entry, then DNS for your domain is resolving properly."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"nslookup test.foo.example.io\nServer:\t\t192.168.86.194\nAddress:\t192.168.86.194#53\n\nNon-authoritative answer:\nName:\ttest.foo.example.io\nAddress: 99.83.220.186\nName:\ttest.foo.example.io\nAddress: 52.223.6.108\n"})}),"\n",(0,r.jsx)(o.p,{children:"Once you have created your DNS records, it will take zrok a few minutes to validate that they exist.\nYou can safely close the form until your certificate has been issued."}),"\n",(0,r.jsx)(o.h3,{id:"finalizing-your-custom-domain",children:"Finalizing Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"After your records have been validated and your certificate has been issued, click the FINALIZE button within 72 hours to complete your custom domain setup."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_finalize",src:n(5101).A+"",width:"818",height:"224"})}),"\n",(0,r.jsx)(o.p,{children:"From here, myzrok.io will complete the last few steps of creating your custom domain.\nThis should only take a minute, but if you need to close the form you can find the instructions on how to share your frontend when you return."}),"\n",(0,r.jsx)(o.h3,{id:"start-sharing",children:"Start Sharing!"}),"\n",(0,r.jsx)(o.p,{children:"Once the Finalize stage has completed, you can start sharing with your custom DNS."}),"\n",(0,r.jsxs)(o.p,{children:["In order to create shares that utilize your custom DNS, you will need to specify the ",(0,r.jsx)(o.code,{children:"--frontend"})," flag when creating a share,\nor update your environment configuration to use this new frontend by default."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok share public --frontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsx)(o.p,{children:"You can set the custom frontend as the environment default by running:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok config set defaultFrontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsxs)(o.p,{children:["To validate which frontend is being used, use the ",(0,r.jsx)(o.code,{children:"zrok status"})," command, which will identify the default frontend being used:"]}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"zrok_status",src:n(2679).A+"",width:"404",height:"220"})})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},6212:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_a_record-550b91f870f6e1df4903220bfa78ae25.png"},8881:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_cname-3cbbf4526443142174bab2d22224764a.png"},675:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_domain-bcf860ac29b46cfe5981db391bcbc521.png"},2956:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_domains_page-6d92a9076e1bca9640eb301eb6716e5f.png"},5101:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_finalize-71899efbaf429d9be596363607550730.png"},1752:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_verify_dns-2f721e1a96f56f4f09f3b0b16ea8c1c5.png"},2679:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/zrok_status-0ce131c6d8bba0df50b0f2a577707f0a.png"},8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const r={},i=t.createContext(r);function s(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/033e8fc8.550a98dd.js b/assets/js/033e8fc8.d38e5d82.js similarity index 96% rename from assets/js/033e8fc8.550a98dd.js rename to assets/js/033e8fc8.d38e5d82.js index 509353fe..59aff254 100644 --- a/assets/js/033e8fc8.550a98dd.js +++ b/assets/js/033e8fc8.d38e5d82.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6475],{2729:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/self-service-invite","permalink":"/docs/0.4/guides/self-hosting/self-service-invite","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Invitations"},"sidebar":"tutorialSidebar","previous":{"title":"Instance Config","permalink":"/docs/0.4/guides/self-hosting/instance-configuration"},"next":{"title":"Drives","permalink":"/docs/0.4/guides/drives"}}');var t=i(4848),o=i(8453);const r={title:"Invitations"},c=void 0,l={},a=[{value:"Overview",id:"overview",level:2},{value:"The Self-Service User Experience",id:"the-self-service-user-experience",level:2},{value:"How it Works",id:"how-it-works",level:2}];function d(e){const s={code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance."}),"\n",(0,t.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can create user accounts directly with the ",(0,t.jsx)(s.code,{children:"zrok admin create account"})," CLI or API instead of inviting them."]}),"\n",(0,t.jsx)(s.li,{children:"You can welcome users to invite themselves via email."}),"\n",(0,t.jsx)(s.li,{children:"To enable self-service invitations you must also configure the controller to send email."}),"\n",(0,t.jsx)(s.li,{children:"You can require an invitation token if you want to restrict self-service."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"the-self-service-user-experience",children:"The Self-Service User Experience"}),"\n",(0,t.jsx)(s.p,{children:"This is what your users will do."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"zrok invite\n"})}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-buttonless",metastring:'title="Output"',children:"enter and confirm your email address...\n\n> user@domain.com\n> user@domain.com\n\n[ Submit ]\n\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"zrok invite"})," command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the ",(0,t.jsx)(s.code,{children:"[ Submit ]"})," button will start the invitation process."]}),"\n",(0,t.jsxs)(s.p,{children:["Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your ",(0,t.jsx)(s.code,{children:"zrok"})," account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Enter a Password",src:i(8083).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Enter a password and its confirmation, and click the ",(0,t.jsx)(s.code,{children:"Register Account"})," button. You'll see the following:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Successful Registration",src:i(4159).A+"",width:"1791",height:"1369"})}),"\n",(0,t.jsxs)(s.p,{children:['For now, we\'ll ignore the "enable your shell for zrok" section. Just click the ',(0,t.jsx)(s.code,{children:"zrok web portal"})," link:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Login",src:i(6658).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["After clicking the ",(0,t.jsx)(s.code,{children:"Log In"})," button, you'll be brought into the ",(0,t.jsx)(s.code,{children:"zrok"})," ",(0,t.jsx)(s.em,{children:"web console"}),":"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Console; Empty",src:i(3824).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Congratulations! Your ",(0,t.jsx)(s.code,{children:"zrok"})," account is ready to go!"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},4159:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_registration_success-05e7e328284f6dc38cd993322698d38b.png"},8083:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_verify-22a26d401b9a77a4278f3c0f54d2a981.png"},3824:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_web_console_empty-cce147eaf8e7bc83abe556336a4aea98.png"},6658:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_web_login-a6161cc79e66932fab76994bdfb8f9c1.png"},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>c});var n=i(6540);const t={},o=n.createContext(t);function r(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6475],{3575:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/self-service-invite","permalink":"/docs/0.4/guides/self-hosting/self-service-invite","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Invitations"},"sidebar":"tutorialSidebar","previous":{"title":"Instance Config","permalink":"/docs/0.4/guides/self-hosting/instance-configuration"},"next":{"title":"Drives","permalink":"/docs/0.4/guides/drives"}}');var t=i(4848),o=i(8453);const r={title:"Invitations"},c=void 0,l={},a=[{value:"Overview",id:"overview",level:2},{value:"The Self-Service User Experience",id:"the-self-service-user-experience",level:2},{value:"How it Works",id:"how-it-works",level:2}];function d(e){const s={code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance."}),"\n",(0,t.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can create user accounts directly with the ",(0,t.jsx)(s.code,{children:"zrok admin create account"})," CLI or API instead of inviting them."]}),"\n",(0,t.jsx)(s.li,{children:"You can welcome users to invite themselves via email."}),"\n",(0,t.jsx)(s.li,{children:"To enable self-service invitations you must also configure the controller to send email."}),"\n",(0,t.jsx)(s.li,{children:"You can require an invitation token if you want to restrict self-service."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"the-self-service-user-experience",children:"The Self-Service User Experience"}),"\n",(0,t.jsx)(s.p,{children:"This is what your users will do."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"zrok invite\n"})}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-buttonless",metastring:'title="Output"',children:"enter and confirm your email address...\n\n> user@domain.com\n> user@domain.com\n\n[ Submit ]\n\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"zrok invite"})," command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the ",(0,t.jsx)(s.code,{children:"[ Submit ]"})," button will start the invitation process."]}),"\n",(0,t.jsxs)(s.p,{children:["Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your ",(0,t.jsx)(s.code,{children:"zrok"})," account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Enter a Password",src:i(8083).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Enter a password and its confirmation, and click the ",(0,t.jsx)(s.code,{children:"Register Account"})," button. You'll see the following:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Successful Registration",src:i(9397).A+"",width:"1791",height:"1369"})}),"\n",(0,t.jsxs)(s.p,{children:['For now, we\'ll ignore the "enable your shell for zrok" section. Just click the ',(0,t.jsx)(s.code,{children:"zrok web portal"})," link:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Login",src:i(6658).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["After clicking the ",(0,t.jsx)(s.code,{children:"Log In"})," button, you'll be brought into the ",(0,t.jsx)(s.code,{children:"zrok"})," ",(0,t.jsx)(s.em,{children:"web console"}),":"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Console; Empty",src:i(3824).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Congratulations! Your ",(0,t.jsx)(s.code,{children:"zrok"})," account is ready to go!"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9397:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_registration_success-05e7e328284f6dc38cd993322698d38b.png"},8083:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_verify-22a26d401b9a77a4278f3c0f54d2a981.png"},3824:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_web_console_empty-cce147eaf8e7bc83abe556336a4aea98.png"},6658:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/zrok_web_login-a6161cc79e66932fab76994bdfb8f9c1.png"},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>c});var n=i(6540);const t={},o=n.createContext(t);function r(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/07d0b302.de243ccc.js b/assets/js/07d0b302.d3837b27.js similarity index 98% rename from assets/js/07d0b302.de243ccc.js rename to assets/js/07d0b302.d3837b27.js index ea93c4ae..ef467668 100644 --- a/assets/js/07d0b302.de243ccc.js +++ b/assets/js/07d0b302.d3837b27.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7499],{6793:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>c,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","source":"@site/../docs/concepts/http.md","sourceDirName":"concepts","slug":"/concepts/http","permalink":"/docs/concepts/http","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/http.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Reserved Shares","permalink":"/docs/concepts/sharing-reserved"},"next":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/concepts/tunnels"}}');var o=t(4848),r=t(8453);const c={sidebar_position:22},i="Sharing HTTP Servers",d={},a=[];function h(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sharing-http-servers",children:"Sharing HTTP Servers"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command using the ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," flag."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," is the default backend mode, so if you do not specify a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," you will get the ",(0,o.jsx)(n.code,{children:"proxy"})," mode by default."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have a web server running on ",(0,o.jsx)(n.code,{children:"localhost"})," that you want to expose to other users using ",(0,o.jsx)(n.code,{children:"zrok"}),", you can execute a command like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["When you execute this command, you'll get a ",(0,o.jsx)(n.code,{children:"zrok"})," bridge like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 http://cht7gj4g5pjf.share.zrok.io \u2502\u2502[PUBLIC] [PROXY]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The URL shown at the top of the bridge shows the address where you can access your ",(0,o.jsx)(n.code,{children:"public"})," share."]}),"\n",(0,o.jsxs)(n.p,{children:["Hit ",(0,o.jsx)(n.code,{children:"CTRL-C"})," or ",(0,o.jsx)(n.code,{children:"q"})," in the bridge to exit it and delete the ",(0,o.jsx)(n.code,{children:"public"})," share."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7499],{6667:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>c,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","source":"@site/../docs/concepts/http.md","sourceDirName":"concepts","slug":"/concepts/http","permalink":"/docs/concepts/http","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/http.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Reserved Shares","permalink":"/docs/concepts/sharing-reserved"},"next":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/concepts/tunnels"}}');var o=t(4848),r=t(8453);const c={sidebar_position:22},i="Sharing HTTP Servers",d={},a=[];function h(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sharing-http-servers",children:"Sharing HTTP Servers"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command using the ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," flag."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," is the default backend mode, so if you do not specify a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," you will get the ",(0,o.jsx)(n.code,{children:"proxy"})," mode by default."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have a web server running on ",(0,o.jsx)(n.code,{children:"localhost"})," that you want to expose to other users using ",(0,o.jsx)(n.code,{children:"zrok"}),", you can execute a command like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["When you execute this command, you'll get a ",(0,o.jsx)(n.code,{children:"zrok"})," bridge like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 http://cht7gj4g5pjf.share.zrok.io \u2502\u2502[PUBLIC] [PROXY]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The URL shown at the top of the bridge shows the address where you can access your ",(0,o.jsx)(n.code,{children:"public"})," share."]}),"\n",(0,o.jsxs)(n.p,{children:["Hit ",(0,o.jsx)(n.code,{children:"CTRL-C"})," or ",(0,o.jsx)(n.code,{children:"q"})," in the bridge to exit it and delete the ",(0,o.jsx)(n.code,{children:"public"})," share."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c1cdb3d.93ac86f2.js b/assets/js/0c1cdb3d.2f3a3b78.js similarity index 96% rename from assets/js/0c1cdb3d.93ac86f2.js rename to assets/js/0c1cdb3d.2f3a3b78.js index b6146703..be5b3a2e 100644 --- a/assets/js/0c1cdb3d.93ac86f2.js +++ b/assets/js/0c1cdb3d.2f3a3b78.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6595],{6762:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","source":"@site/versioned_docs/version-0.4/guides/docker-share/index.mdx","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/","permalink":"/docs/0.4/guides/docker-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Getting Started with Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Permission Modes","permalink":"/docs/0.4/guides/permission-modes"},"next":{"title":"Public Share","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide"}}');var t=r(4848),o=r(8453),i=r(4971);const c={title:"Getting Started with Docker"},a=void 0,l={},d=[{value:"Overview",id:"overview",level:2},{value:"Permanent Public Share",id:"permanent-public-share",level:2},{value:"Temporary Public Share",id:"temporary-public-share",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["To follow the guides in this section you will need ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You have the option to enable a ",(0,t.jsx)(n.code,{children:"zrok"})," account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (",(0,t.jsx)(n.code,{children:"compose.yml"}),") to enable a separate ",(0,t.jsx)(n.code,{children:"zrok"})," environment for each project."]}),"\n",(0,t.jsxs)(n.p,{children:["This page provides ",(0,t.jsx)(n.code,{children:"docker"})," and ",(0,t.jsx)(n.code,{children:"docker compose"})," examples of mounting the host's ",(0,t.jsx)(n.code,{children:"zrok"})," environment on the container. You'll need to first ",(0,t.jsx)(n.a,{href:"/docs/getting-started/#installing-the-zrok-command",children:"enable zrok on the Docker host"})," to use this approach."]}),"\n",(0,t.jsx)(n.h2,{id:"permanent-public-share",children:"Permanent Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a ",(0,t.jsx)(n.code,{children:"compose.yml"})," file that defines a web app known within the project's bridge network as ",(0,t.jsx)(n.code,{children:"https://myapp:8080"})," and you want to publish it as a reliable, public site."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Reserve a subdomain by running ",(0,t.jsx)(n.code,{children:'zrok reserve public --unique-name "myapp" https://myapp:8080'})," on the Docker host."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Merge this YAML with ",(0,t.jsx)(n.code,{children:"compose.yml"})," or save it in the same directory as ",(0,t.jsx)(n.code,{children:"compose.override.yml"})," to let ",(0,t.jsx)(n.code,{children:"docker compose up"})," merge it for you."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n zrok:\n image: openziti/zrok\n restart: unless-stopped\n user: "${UID}"\n volumes:\n - ${HOME}/.zrok:/home/ziggy/.zrok\n environment:\n PFXLOG_NO_JSON: "true"\n command: share reserved "myapp" --headless\n'})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The reserved share will be available at ",(0,t.jsx)(n.code,{children:"https://myapp.share.zrok.io"})," each time the ",(0,t.jsx)(n.code,{children:"zrok"})," container starts up."]}),"\n",(0,t.jsx)(n.h2,{id:"temporary-public-share",children:"Temporary Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a web server running on the host's private network at ",(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"}),". With one additional ",(0,t.jsx)(n.code,{children:"docker"})," command, you can share the web server publicly as long as the ",(0,t.jsx)(n.code,{children:"zrok"})," container stays running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="BASH"',children:'docker run \\\n --rm \\\n --network=host \\\n --volume ~/.zrok:/home/ziggy/.zrok \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"PowerShell"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'docker.exe run `\n --rm `\n --network "host" `\n --volume "${env:USERPROFILE}\\.zrok:/.zrok" `\n --user "1000" `\n openziti/zrok share public `\n --headless `\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Command Prompt (batch)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'docker.exe run ^\n --rm ^\n --network "host" ^\n --volume "%USERPROFILE%\\.zrok:/.zrok" ^\n --user "1000" ^\n openziti/zrok share public ^\n --headless ^\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Windows Subsystem for Linux (WSL)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run \\\n --rm \\\n --network "host" \\\n --volume "/mnt/c/Users/$(powershell.exe -Command \'Write-Output $env:USERNAME\' | tr -d \'\\r\')/.zrok:/home/ziggy/.zrok" \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsx)(n.p,{children:"The public share URL appears near the beginning of the container's log."}),"\n",(0,t.jsx)(n.p,{children:"Let's break down those options and arguments."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--rm"})," don't save this container because it's providing a temporary public share that's destroyed when the container stops"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--network=host"})," shares the host's network with the container so that the container can reach the web server directly. This is always necessary when the web server is listening only on the host's loopback interface, e.g., ",(0,t.jsx)(n.code,{children:"https://::1:8080"}),", and may not be strictly necessary if the target is routeable from the default Docker bridge."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--volume ~/.zrok:/home/ziggy/.zrok"})," mounts the ",(0,t.jsx)(n.code,{children:"zrok"})," configuration from the Docker host into the container."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:'--user "${UID:-1000}:${GID:-1000}"'})," sets the container's user to the current user on the Docker host to avoid permission issues with reading the mounted ",(0,t.jsx)(n.code,{children:"zrok"})," configuration (defaults to ",(0,t.jsx)(n.code,{children:"1000:1000"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"openziti/zrok"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," Docker image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"share public"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," command to share the target publicly until zrok exits."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--headless"})," runs the ",(0,t.jsx)(n.code,{children:"zrok"})," command without the interactive terminal UI."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"})," is the target web server to share."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},4971:(e,n,r)=>{r.d(n,{A:()=>k});var s=r(6540),t=r(8215),o=r(5066),i=r(3427),c=r(2303),a=r(1422);const l={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=r(4848);function h(e){return!!e&&("SUMMARY"===e.tagName||h(e.parentElement))}function u(e,n){return!!e&&(e===n||u(e.parentElement,n))}function p(e){let{summary:n,children:r,...t}=e;(0,i.A)().collectAnchor(t.id);const p=(0,c.A)(),m=(0,s.useRef)(null),{collapsed:x,setCollapsed:j}=(0,a.u)({initialState:!t.open}),[k,g]=(0,s.useState)(t.open),v=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...t,ref:m,open:k,"data-collapsed":x,className:(0,o.A)(l.details,p&&l.isBrowser,t.className),onMouseDown:e=>{h(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;h(n)&&u(n,m.current)&&(e.preventDefault(),x?(j(!1),g(!0)):j(!0))},children:[v,(0,d.jsx)(a.N,{lazy:!1,collapsed:x,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{j(e),g(!e)},children:(0,d.jsx)("div",{className:l.collapsibleContent,children:r})})]})}const m={details:"details_b_Ee"},x="alert alert--info";function j(e){let{...n}=e;return(0,d.jsx)(p,{...n,className:(0,t.A)(x,m.details,n.className)})}function k(e){const n=s.Children.toArray(e.children),r=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),t=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==r))});return(0,d.jsx)(j,{...e,summary:r,children:t})}},8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>c});var s=r(6540);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6595],{8581:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","source":"@site/versioned_docs/version-0.4/guides/docker-share/index.mdx","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/","permalink":"/docs/0.4/guides/docker-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Getting Started with Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Permission Modes","permalink":"/docs/0.4/guides/permission-modes"},"next":{"title":"Public Share","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide"}}');var t=r(4848),o=r(8453),i=r(7763);const c={title:"Getting Started with Docker"},a=void 0,l={},d=[{value:"Overview",id:"overview",level:2},{value:"Permanent Public Share",id:"permanent-public-share",level:2},{value:"Temporary Public Share",id:"temporary-public-share",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["To follow the guides in this section you will need ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You have the option to enable a ",(0,t.jsx)(n.code,{children:"zrok"})," account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (",(0,t.jsx)(n.code,{children:"compose.yml"}),") to enable a separate ",(0,t.jsx)(n.code,{children:"zrok"})," environment for each project."]}),"\n",(0,t.jsxs)(n.p,{children:["This page provides ",(0,t.jsx)(n.code,{children:"docker"})," and ",(0,t.jsx)(n.code,{children:"docker compose"})," examples of mounting the host's ",(0,t.jsx)(n.code,{children:"zrok"})," environment on the container. You'll need to first ",(0,t.jsx)(n.a,{href:"/docs/getting-started/#installing-the-zrok-command",children:"enable zrok on the Docker host"})," to use this approach."]}),"\n",(0,t.jsx)(n.h2,{id:"permanent-public-share",children:"Permanent Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a ",(0,t.jsx)(n.code,{children:"compose.yml"})," file that defines a web app known within the project's bridge network as ",(0,t.jsx)(n.code,{children:"https://myapp:8080"})," and you want to publish it as a reliable, public site."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Reserve a subdomain by running ",(0,t.jsx)(n.code,{children:'zrok reserve public --unique-name "myapp" https://myapp:8080'})," on the Docker host."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Merge this YAML with ",(0,t.jsx)(n.code,{children:"compose.yml"})," or save it in the same directory as ",(0,t.jsx)(n.code,{children:"compose.override.yml"})," to let ",(0,t.jsx)(n.code,{children:"docker compose up"})," merge it for you."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n zrok:\n image: openziti/zrok\n restart: unless-stopped\n user: "${UID}"\n volumes:\n - ${HOME}/.zrok:/home/ziggy/.zrok\n environment:\n PFXLOG_NO_JSON: "true"\n command: share reserved "myapp" --headless\n'})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The reserved share will be available at ",(0,t.jsx)(n.code,{children:"https://myapp.share.zrok.io"})," each time the ",(0,t.jsx)(n.code,{children:"zrok"})," container starts up."]}),"\n",(0,t.jsx)(n.h2,{id:"temporary-public-share",children:"Temporary Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a web server running on the host's private network at ",(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"}),". With one additional ",(0,t.jsx)(n.code,{children:"docker"})," command, you can share the web server publicly as long as the ",(0,t.jsx)(n.code,{children:"zrok"})," container stays running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="BASH"',children:'docker run \\\n --rm \\\n --network=host \\\n --volume ~/.zrok:/home/ziggy/.zrok \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"PowerShell"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'docker.exe run `\n --rm `\n --network "host" `\n --volume "${env:USERPROFILE}\\.zrok:/.zrok" `\n --user "1000" `\n openziti/zrok share public `\n --headless `\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Command Prompt (batch)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'docker.exe run ^\n --rm ^\n --network "host" ^\n --volume "%USERPROFILE%\\.zrok:/.zrok" ^\n --user "1000" ^\n openziti/zrok share public ^\n --headless ^\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Windows Subsystem for Linux (WSL)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run \\\n --rm \\\n --network "host" \\\n --volume "/mnt/c/Users/$(powershell.exe -Command \'Write-Output $env:USERNAME\' | tr -d \'\\r\')/.zrok:/home/ziggy/.zrok" \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsx)(n.p,{children:"The public share URL appears near the beginning of the container's log."}),"\n",(0,t.jsx)(n.p,{children:"Let's break down those options and arguments."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--rm"})," don't save this container because it's providing a temporary public share that's destroyed when the container stops"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--network=host"})," shares the host's network with the container so that the container can reach the web server directly. This is always necessary when the web server is listening only on the host's loopback interface, e.g., ",(0,t.jsx)(n.code,{children:"https://::1:8080"}),", and may not be strictly necessary if the target is routeable from the default Docker bridge."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--volume ~/.zrok:/home/ziggy/.zrok"})," mounts the ",(0,t.jsx)(n.code,{children:"zrok"})," configuration from the Docker host into the container."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:'--user "${UID:-1000}:${GID:-1000}"'})," sets the container's user to the current user on the Docker host to avoid permission issues with reading the mounted ",(0,t.jsx)(n.code,{children:"zrok"})," configuration (defaults to ",(0,t.jsx)(n.code,{children:"1000:1000"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"openziti/zrok"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," Docker image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"share public"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," command to share the target publicly until zrok exits."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--headless"})," runs the ",(0,t.jsx)(n.code,{children:"zrok"})," command without the interactive terminal UI."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"})," is the target web server to share."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},7763:(e,n,r)=>{r.d(n,{A:()=>k});var s=r(6540),t=r(8215),o=r(5066),i=r(5246),c=r(9136),a=r(3535);const l={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=r(4848);function h(e){return!!e&&("SUMMARY"===e.tagName||h(e.parentElement))}function u(e,n){return!!e&&(e===n||u(e.parentElement,n))}function p(e){let{summary:n,children:r,...t}=e;(0,i.A)().collectAnchor(t.id);const p=(0,c.A)(),m=(0,s.useRef)(null),{collapsed:x,setCollapsed:j}=(0,a.u)({initialState:!t.open}),[k,g]=(0,s.useState)(t.open),v=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...t,ref:m,open:k,"data-collapsed":x,className:(0,o.A)(l.details,p&&l.isBrowser,t.className),onMouseDown:e=>{h(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;h(n)&&u(n,m.current)&&(e.preventDefault(),x?(j(!1),g(!0)):j(!0))},children:[v,(0,d.jsx)(a.N,{lazy:!1,collapsed:x,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{j(e),g(!e)},children:(0,d.jsx)("div",{className:l.collapsibleContent,children:r})})]})}const m={details:"details_b_Ee"},x="alert alert--info";function j(e){let{...n}=e;return(0,d.jsx)(p,{...n,className:(0,t.A)(x,m.details,n.className)})}function k(e){const n=s.Children.toArray(e.children),r=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),t=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==r))});return(0,d.jsx)(j,{...e,summary:r,children:t})}},8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>c});var s=r(6540);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c66edb9.a1604a49.js b/assets/js/0c66edb9.ea664c8d.js similarity index 99% rename from assets/js/0c66edb9.a1604a49.js rename to assets/js/0c66edb9.ea664c8d.js index b48f8391..ee91add3 100644 --- a/assets/js/0c66edb9.a1604a49.js +++ b/assets/js/0c66edb9.ea664c8d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7216],{4291:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","source":"@site/../docs/guides/permission-modes.md","sourceDirName":"guides","slug":"/guides/permission-modes","permalink":"/docs/guides/permission-modes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/permission-modes.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"sidebar_position":22,"sidebar_label":"Permission Modes"},"sidebar":"tutorialSidebar","previous":{"title":"frontdoor","permalink":"/docs/guides/frontdoor"},"next":{"title":"Getting Started with Docker","permalink":"/docs/guides/docker-share/"}}');var o=n(4848),i=n(8453);const a={sidebar_position:22,sidebar_label:"Permission Modes"},t="Permission Modes",c={},d=[{value:"Creating a Share with Closed Permission Mode",id:"creating-a-share-with-closed-permission-mode",level:2},{value:"Adding and Removing Access Grants for Existing Shares",id:"adding-and-removing-access-grants-for-existing-shares",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const s={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"permission-modes",children:"Permission Modes"})}),"\n",(0,o.jsxs)(s.p,{children:["Shares created in zrok ",(0,o.jsx)(s.code,{children:"v0.4.26"})," and newer now include a choice of ",(0,o.jsx)(s.em,{children:"permission mode"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Shares created with zrok ",(0,o.jsx)(s.code,{children:"v0.4.25"})," and older were created using what is now called the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". Whether ",(0,o.jsx)(s.em,{children:"public"})," or ",(0,o.jsx)(s.em,{children:"private"}),", these shares can be accessed by any user of the zrok service instance, as long as they know the ",(0,o.jsx)(s.em,{children:"share token"})," of the share. Effectively shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"})," are accessible by any user of the zrok service instance."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok now supports a ",(0,o.jsx)(s.em,{children:"closed permission mode"}),", which allows for more fine-grained control over which zrok users are allowed to privately access your shares using ",(0,o.jsx)(s.code,{children:"zrok access private"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok defaults to continuing to create shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". This will likely change in a future release. We're leaving the default behavior in place to allow users a period of time to get comfortable with the new permission modes."]}),"\n",(0,o.jsx)(s.h2,{id:"creating-a-share-with-closed-permission-mode",children:"Creating a Share with Closed Permission Mode"}),"\n",(0,o.jsxs)(s.p,{children:["Adding the ",(0,o.jsx)(s.code,{children:"--closed"})," flag to the ",(0,o.jsx)(s.code,{children:"zrok share"})," or ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands will create shares using the ",(0,o.jsx)(s.em,{children:"closed permission mode"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.066] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 0vzwzodf0c7g\n"})}),"\n",(0,o.jsxs)(s.p,{children:["By default any environment owned by the account that created the share is ",(0,o.jsx)(s.em,{children:"allowed"})," to access the new share. But a user trying to access the share from an environment owned by a different account will enounter the following error message:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private 0vzwzodf0c7g\n[ERROR]: unable to access ([POST /access][401] accessUnauthorized)\n"})}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"zrok share"})," and ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands now include an ",(0,o.jsx)(s.code,{children:"--access-grant"})," flag, which allows you to specify additional zrok accounts that are allowed to access your shares:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed --access-grant anotheruser@test.com -b web .\n[ 0.062] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private y6h4at5xvn6o\n"})}),"\n",(0,o.jsxs)(s.p,{children:["And now ",(0,o.jsx)(s.code,{children:"anotheruser@test.com"})," will be allowed to access the share:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private --headless y6h4at5xvn6o\n[ 0.049] INFO main.(*accessPrivateCommand).run: allocated frontend 'VyvrJihAOEHD'\n[ 0.051] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: http://127.0.0.1:9191\n"})}),"\n",(0,o.jsx)(s.h2,{id:"adding-and-removing-access-grants-for-existing-shares",children:"Adding and Removing Access Grants for Existing Shares"}),"\n",(0,o.jsxs)(s.p,{children:["If you've created a share (either reserved or ephemeral) and you forgot to include an access grant, or want to remove an access grant that was mistakenly added, you can use the ",(0,o.jsx)(s.code,{children:"zrok modify share"})," command to make the adjustments:"]}),"\n",(0,o.jsx)(s.p,{children:"Create a share:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.064] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private s4czjylwk7wa\n"})}),"\n",(0,o.jsx)(s.p,{children:"In another shell in the same environment you can execute:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --add-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.p,{children:"And to remove the grant:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --remove-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(s.p,{children:["As of ",(0,o.jsx)(s.code,{children:"v0.4.26"})," there is currently no way to ",(0,o.jsx)(s.em,{children:"list"})," the current access grants. This will be addressed shortly in a subsequent update."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>t});var r=n(6540);const o={},i=r.createContext(o);function a(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7216],{6844:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","source":"@site/../docs/guides/permission-modes.md","sourceDirName":"guides","slug":"/guides/permission-modes","permalink":"/docs/guides/permission-modes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/permission-modes.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"sidebar_position":22,"sidebar_label":"Permission Modes"},"sidebar":"tutorialSidebar","previous":{"title":"frontdoor","permalink":"/docs/guides/frontdoor"},"next":{"title":"Getting Started with Docker","permalink":"/docs/guides/docker-share/"}}');var o=n(4848),i=n(8453);const a={sidebar_position:22,sidebar_label:"Permission Modes"},t="Permission Modes",c={},d=[{value:"Creating a Share with Closed Permission Mode",id:"creating-a-share-with-closed-permission-mode",level:2},{value:"Adding and Removing Access Grants for Existing Shares",id:"adding-and-removing-access-grants-for-existing-shares",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const s={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"permission-modes",children:"Permission Modes"})}),"\n",(0,o.jsxs)(s.p,{children:["Shares created in zrok ",(0,o.jsx)(s.code,{children:"v0.4.26"})," and newer now include a choice of ",(0,o.jsx)(s.em,{children:"permission mode"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Shares created with zrok ",(0,o.jsx)(s.code,{children:"v0.4.25"})," and older were created using what is now called the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". Whether ",(0,o.jsx)(s.em,{children:"public"})," or ",(0,o.jsx)(s.em,{children:"private"}),", these shares can be accessed by any user of the zrok service instance, as long as they know the ",(0,o.jsx)(s.em,{children:"share token"})," of the share. Effectively shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"})," are accessible by any user of the zrok service instance."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok now supports a ",(0,o.jsx)(s.em,{children:"closed permission mode"}),", which allows for more fine-grained control over which zrok users are allowed to privately access your shares using ",(0,o.jsx)(s.code,{children:"zrok access private"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok defaults to continuing to create shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". This will likely change in a future release. We're leaving the default behavior in place to allow users a period of time to get comfortable with the new permission modes."]}),"\n",(0,o.jsx)(s.h2,{id:"creating-a-share-with-closed-permission-mode",children:"Creating a Share with Closed Permission Mode"}),"\n",(0,o.jsxs)(s.p,{children:["Adding the ",(0,o.jsx)(s.code,{children:"--closed"})," flag to the ",(0,o.jsx)(s.code,{children:"zrok share"})," or ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands will create shares using the ",(0,o.jsx)(s.em,{children:"closed permission mode"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.066] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 0vzwzodf0c7g\n"})}),"\n",(0,o.jsxs)(s.p,{children:["By default any environment owned by the account that created the share is ",(0,o.jsx)(s.em,{children:"allowed"})," to access the new share. But a user trying to access the share from an environment owned by a different account will enounter the following error message:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private 0vzwzodf0c7g\n[ERROR]: unable to access ([POST /access][401] accessUnauthorized)\n"})}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"zrok share"})," and ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands now include an ",(0,o.jsx)(s.code,{children:"--access-grant"})," flag, which allows you to specify additional zrok accounts that are allowed to access your shares:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed --access-grant anotheruser@test.com -b web .\n[ 0.062] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private y6h4at5xvn6o\n"})}),"\n",(0,o.jsxs)(s.p,{children:["And now ",(0,o.jsx)(s.code,{children:"anotheruser@test.com"})," will be allowed to access the share:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private --headless y6h4at5xvn6o\n[ 0.049] INFO main.(*accessPrivateCommand).run: allocated frontend 'VyvrJihAOEHD'\n[ 0.051] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: http://127.0.0.1:9191\n"})}),"\n",(0,o.jsx)(s.h2,{id:"adding-and-removing-access-grants-for-existing-shares",children:"Adding and Removing Access Grants for Existing Shares"}),"\n",(0,o.jsxs)(s.p,{children:["If you've created a share (either reserved or ephemeral) and you forgot to include an access grant, or want to remove an access grant that was mistakenly added, you can use the ",(0,o.jsx)(s.code,{children:"zrok modify share"})," command to make the adjustments:"]}),"\n",(0,o.jsx)(s.p,{children:"Create a share:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.064] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private s4czjylwk7wa\n"})}),"\n",(0,o.jsx)(s.p,{children:"In another shell in the same environment you can execute:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --add-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.p,{children:"And to remove the grant:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --remove-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(s.p,{children:["As of ",(0,o.jsx)(s.code,{children:"v0.4.26"})," there is currently no way to ",(0,o.jsx)(s.em,{children:"list"})," the current access grants. This will be addressed shortly in a subsequent update."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>t});var r=n(6540);const o={},i=r.createContext(o);function a(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0efac3c3.3f261e03.js b/assets/js/0efac3c3.3f261e03.js deleted file mode 100644 index 7a049060..00000000 --- a/assets/js/0efac3c3.3f261e03.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8173],{9411:(e,n,s)=>{s.d(n,{Ay:()=>o,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},898:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>b,frontMatter:()=>h,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","source":"@site/versioned_docs/version-0.4/guides/install/linux.mdx","sourceDirName":"guides/install","slug":"/guides/install/linux","permalink":"/docs/0.4/guides/install/linux","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/linux.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Install","permalink":"/docs/0.4/guides/install/"},"next":{"title":"macOS","permalink":"/docs/0.4/guides/install/macos"}}');var t=s(4848),i=s(8453),a=s(8151),o=s(595),l=s(1342),c=s(6559),d=s(3902),u=s(9411);const h={title:"Install zrok in Linux",sidebar_label:"Linux"},p=void 0,m={},x=[{value:"Install zrok from the Repository",id:"install-zrok-from-the-repository",level:2},{value:"Homebrew",id:"homebrew",level:2},...u.RM,{value:"Linux Binary",id:"linux-binary",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.h2,{id:"install-zrok-from-the-repository",children:["Install ",(0,t.jsx)(n.code,{children:"zrok"})," from the Repository"]}),"\n",(0,t.jsx)(n.p,{children:"This will configure the system to receive DEB or RPM package updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Check out ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/frontdoor?os=Linux",children:"zrok frontdoor"})," for running ",(0,t.jsx)(n.code,{children:"zrok"})," as an always-on service."]})}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Ansible Playbook"}),(0,t.jsxs)(d.A,{title:"Set up package repository and install zrok",children:[c.A,"\n- name: Install zrok package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok\n ansible.builtin.package:\n name: zrok\n state: present\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(u.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"linux-binary",children:"Linux Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(o.A,{osName:"Linux",osLogo:"/img/logo-linux.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your Linux distribution's architecture or run the install script below to pick the correct CPU architecture automatically. For Intel and AMD 64-bit machines use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Raspberry Pi use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Manually install in ",(0,t.jsx)(n.code,{children:"~/bin/zrok"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir /tmp/zrok && tar -xf ./zrok*linux*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Script to install binary in ",(0,t.jsx)(n.code,{children:"/usr/local/bin/zrok"})]}),(0,t.jsx)(n.p,{children:"This script auto-selects the correct architecture and may be helpful for Raspberry Pi users."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd $(mktemp -d);\n\nZROK_VERSION=$(\n curl -sSf https://api.github.com/repos/openziti/zrok/releases/latest \\\n | jq -r '.tag_name'\n);\n\ncase $(uname -m) in\n x86_64) GOXARCH=amd64\n ;;\n aarch64|arm64) GOXARCH=arm64\n ;;\n arm*) GOXARCH=armv7\n ;;\n *) echo \"ERROR: unknown arch '$(uname -m)'\" >&2\n exit 1\n ;;\nesac;\n\ncurl -sSfL \\\n \"https://github.com/openziti/zrok/releases/download/${ZROK_VERSION}/zrok_${ZROK_VERSION#v}_linux_${GOXARCH}.tar.gz\" \\\n | tar -xz -f -;\n\nsudo install -o root -g root ./zrok /usr/local/bin/;\n\nzrok version;\n"})})]})]})}function b(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},8151:(e,n,s)=>{s.d(n,{F:()=>o,d:()=>a});var r=s(6540),t=s(4848);const i=(0,r.createContext)([]),a=()=>(0,r.useContext)(i),o=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(i.Provider,{value:s,children:n})}},3902:(e,n,s)=>{s.d(n,{A:()=>a});s(6540);var r=s(382),t=s(1432),i=s(4848);const a=e=>{let{title:n,children:s}=e;const a=s.map((e=>"string"==typeof e?e.trim():r.Ay.dump(e).trim())).join("\n\n");return(0,i.jsx)("div",{children:(0,i.jsx)(t.A,{language:"yaml",title:n,children:a})})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(8151),t=s(1342),i=s(5293),a=s(4848);const o=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,i.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),p=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",p),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),p.length>0&&(0,a.jsx)("ul",{children:p.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:o(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},6559:(e,n,s)=>{s.d(n,{A:()=>r});const r=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/0efac3c3.e00c8d4e.js b/assets/js/0efac3c3.e00c8d4e.js new file mode 100644 index 00000000..909a4f66 --- /dev/null +++ b/assets/js/0efac3c3.e00c8d4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8173],{5294:(e,n,s)=>{s.d(n,{Ay:()=>o,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},9563:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>b,frontMatter:()=>h,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","source":"@site/versioned_docs/version-0.4/guides/install/linux.mdx","sourceDirName":"guides/install","slug":"/guides/install/linux","permalink":"/docs/0.4/guides/install/linux","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/linux.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Install","permalink":"/docs/0.4/guides/install/"},"next":{"title":"macOS","permalink":"/docs/0.4/guides/install/macos"}}');var t=s(4848),i=s(8453),a=s(3070),o=s(3484),l=s(3769),c=s(6559),d=s(4119),u=s(5294);const h={title:"Install zrok in Linux",sidebar_label:"Linux"},p=void 0,m={},x=[{value:"Install zrok from the Repository",id:"install-zrok-from-the-repository",level:2},{value:"Homebrew",id:"homebrew",level:2},...u.RM,{value:"Linux Binary",id:"linux-binary",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.h2,{id:"install-zrok-from-the-repository",children:["Install ",(0,t.jsx)(n.code,{children:"zrok"})," from the Repository"]}),"\n",(0,t.jsx)(n.p,{children:"This will configure the system to receive DEB or RPM package updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Check out ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/frontdoor?os=Linux",children:"zrok frontdoor"})," for running ",(0,t.jsx)(n.code,{children:"zrok"})," as an always-on service."]})}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Ansible Playbook"}),(0,t.jsxs)(d.A,{title:"Set up package repository and install zrok",children:[c.A,"\n- name: Install zrok package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok\n ansible.builtin.package:\n name: zrok\n state: present\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(u.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"linux-binary",children:"Linux Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(o.A,{osName:"Linux",osLogo:"/img/logo-linux.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your Linux distribution's architecture or run the install script below to pick the correct CPU architecture automatically. For Intel and AMD 64-bit machines use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Raspberry Pi use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Manually install in ",(0,t.jsx)(n.code,{children:"~/bin/zrok"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir /tmp/zrok && tar -xf ./zrok*linux*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Script to install binary in ",(0,t.jsx)(n.code,{children:"/usr/local/bin/zrok"})]}),(0,t.jsx)(n.p,{children:"This script auto-selects the correct architecture and may be helpful for Raspberry Pi users."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd $(mktemp -d);\n\nZROK_VERSION=$(\n curl -sSf https://api.github.com/repos/openziti/zrok/releases/latest \\\n | jq -r '.tag_name'\n);\n\ncase $(uname -m) in\n x86_64) GOXARCH=amd64\n ;;\n aarch64|arm64) GOXARCH=arm64\n ;;\n arm*) GOXARCH=armv7\n ;;\n *) echo \"ERROR: unknown arch '$(uname -m)'\" >&2\n exit 1\n ;;\nesac;\n\ncurl -sSfL \\\n \"https://github.com/openziti/zrok/releases/download/${ZROK_VERSION}/zrok_${ZROK_VERSION#v}_linux_${GOXARCH}.tar.gz\" \\\n | tar -xz -f -;\n\nsudo install -o root -g root ./zrok /usr/local/bin/;\n\nzrok version;\n"})})]})]})}function b(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},3070:(e,n,s)=>{s.d(n,{F:()=>o,d:()=>a});var r=s(6540),t=s(4848);const i=(0,r.createContext)([]),a=()=>(0,r.useContext)(i),o=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(i.Provider,{value:s,children:n})}},4119:(e,n,s)=>{s.d(n,{A:()=>a});s(6540);var r=s(382),t=s(8069),i=s(4848);const a=e=>{let{title:n,children:s}=e;const a=s.map((e=>"string"==typeof e?e.trim():r.Ay.dump(e).trim())).join("\n\n");return(0,i.jsx)("div",{children:(0,i.jsx)(t.A,{language:"yaml",title:n,children:a})})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(3070),t=s(3769),i=s(8532),a=s(4848);const o=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,i.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),p=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",p),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),p.length>0&&(0,a.jsx)("ul",{children:p.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:o(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},6559:(e,n,s)=>{s.d(n,{A:()=>r});const r=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/11b43341.fe1bdd39.js b/assets/js/11b43341.79f8cce9.js similarity index 99% rename from assets/js/11b43341.fe1bdd39.js rename to assets/js/11b43341.79f8cce9.js index e0139032..f0abf0e6 100644 --- a/assets/js/11b43341.fe1bdd39.js +++ b/assets/js/11b43341.79f8cce9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2256],{7674:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"1.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"getting-started","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Private Shares","href":"/docs/concepts/sharing-private","docId":"concepts/sharing-private","unlisted":false},{"type":"link","label":"Public Shares","href":"/docs/concepts/sharing-public","docId":"concepts/sharing-public","unlisted":false},{"type":"link","label":"Reserved Shares","href":"/docs/concepts/sharing-reserved","docId":"concepts/sharing-reserved","unlisted":false},{"type":"link","label":"Sharing HTTP Servers","href":"/docs/concepts/http","docId":"concepts/http","unlisted":false},{"type":"link","label":"Sharing TCP and UDP Servers","href":"/docs/concepts/tunnels","docId":"concepts/tunnels","unlisted":false},{"type":"link","label":"Sharing Websites and Files","href":"/docs/concepts/files","docId":"concepts/files","unlisted":false},{"type":"link","label":"Open Source","href":"/docs/concepts/opensource","docId":"concepts/opensource","unlisted":false},{"type":"link","label":"Hosting","href":"/docs/concepts/hosting","docId":"concepts/hosting","unlisted":false}],"href":"/docs/concepts/"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Install","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux","href":"/docs/guides/install/linux","docId":"guides/install/linux","unlisted":false},{"type":"link","label":"macOS","href":"/docs/guides/install/macos","docId":"guides/install/macos","unlisted":false},{"type":"link","label":"Windows","href":"/docs/guides/install/windows","docId":"guides/install/windows","unlisted":false}],"href":"/docs/guides/install/"},{"type":"category","label":"The zrok Agent","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux Agent Service","href":"/docs/guides/agent/linux-service","docId":"guides/agent/linux-service","unlisted":false},{"type":"link","label":"Windows Agent Service","href":"/docs/guides/agent/windows-service/","docId":"guides/agent/windows-service/index","unlisted":false}],"href":"/docs/guides/agent/"},{"type":"link","label":"frontdoor","href":"/docs/guides/frontdoor","docId":"guides/frontdoor","unlisted":false},{"type":"link","label":"Permission Modes","href":"/docs/guides/permission-modes","docId":"guides/permission-modes","unlisted":false},{"type":"category","label":"Docker Share","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Public Share","href":"/docs/guides/docker-share/docker_public_share_guide","docId":"guides/docker-share/docker_public_share_guide","unlisted":false},{"type":"link","label":"Private Share","href":"/docs/guides/docker-share/docker_private_share_guide","docId":"guides/docker-share/docker_private_share_guide","unlisted":false}],"href":"/docs/guides/docker-share/"},{"type":"category","label":"Self Hosting","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NGINX TLS","href":"/docs/guides/self-hosting/linux/nginx","docId":"guides/self-hosting/linux/nginx","unlisted":false}],"href":"/docs/guides/self-hosting/linux/"},{"type":"link","label":"Interstitial Pages","href":"/docs/guides/self-hosting/interstitial-page","docId":"guides/self-hosting/interstitial-page","unlisted":false},{"type":"link","label":"Organizations","href":"/docs/guides/self-hosting/organizations","docId":"guides/self-hosting/organizations","unlisted":false},{"type":"link","label":"Personalized Frontend","href":"/docs/guides/self-hosting/personalized-frontend","docId":"guides/self-hosting/personalized-frontend","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/self-hosting/docker","docId":"guides/self-hosting/docker","unlisted":false},{"type":"link","label":"Kubernetes","href":"/docs/guides/self-hosting/kubernetes","docId":"guides/self-hosting/kubernetes","unlisted":false},{"type":"category","label":"Metrics and Limits","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring Metrics","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","docId":"guides/self-hosting/metrics-and-limits/configuring-metrics","unlisted":false},{"type":"link","label":"Configuring Limits","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","docId":"guides/self-hosting/metrics-and-limits/configuring-limits","unlisted":false}],"href":"/docs/category/metrics-and-limits"},{"type":"category","label":"OAuth","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OAuth Public Frontend Configuration","href":"/docs/guides/self-hosting/oauth/configuring-oauth","docId":"guides/self-hosting/oauth/configuring-oauth","unlisted":false}],"href":"/docs/category/oauth"},{"type":"link","label":"Instance Config","href":"/docs/guides/self-hosting/instance-configuration","docId":"guides/self-hosting/instance-configuration","unlisted":false},{"type":"link","label":"Invitations","href":"/docs/guides/self-hosting/self-service-invite","docId":"guides/self-hosting/self-service-invite","unlisted":false}],"href":"/docs/category/self-hosting"},{"type":"link","label":"Drives","href":"/docs/guides/drives","docId":"guides/drives","unlisted":false},{"type":"link","label":"VPN","href":"/docs/guides/vpn/","docId":"guides/vpn/vpn","unlisted":false}],"href":"/docs/category/guides"},{"type":"category","label":"myzrok","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Custom Domains","href":"/docs/myzrok/custom-domains/","docId":"myzrok/custom-domains/index","unlisted":false}],"href":"/docs/category/myzrok"}]},"docs":{"concepts/files":{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","sidebar":"tutorialSidebar"},"concepts/hosting":{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","sidebar":"tutorialSidebar"},"concepts/http":{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","sidebar":"tutorialSidebar"},"concepts/index":{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","sidebar":"tutorialSidebar"},"concepts/opensource":{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","sidebar":"tutorialSidebar"},"concepts/sharing-private":{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","sidebar":"tutorialSidebar"},"concepts/sharing-public":{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","sidebar":"tutorialSidebar"},"concepts/sharing-reserved":{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","sidebar":"tutorialSidebar"},"concepts/tunnels":{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started","description":"If you\'ve upgraded to v1.0.0 from a previous version and you receive an error message like this:","sidebar":"tutorialSidebar"},"guides/agent/index":{"id":"guides/agent/index","title":"Agent","description":"The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.","sidebar":"tutorialSidebar"},"guides/agent/linux-service":{"id":"guides/agent/linux-service","title":"Linux Agent Service","description":"Overview","sidebar":"tutorialSidebar"},"guides/agent/windows-service/index":{"id":"guides/agent/windows-service/index","title":"Configuring a Windows Service","description":"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.","sidebar":"tutorialSidebar"},"guides/docker-share/docker_private_share_guide":{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/docker_public_share_guide":{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/index":{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","sidebar":"tutorialSidebar"},"guides/drives":{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","sidebar":"tutorialSidebar"},"guides/frontdoor":{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","sidebar":"tutorialSidebar"},"guides/install/index":{"id":"guides/install/index","title":"Install","description":"","sidebar":"tutorialSidebar"},"guides/install/linux":{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","sidebar":"tutorialSidebar"},"guides/install/macos":{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","sidebar":"tutorialSidebar"},"guides/install/windows":{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","sidebar":"tutorialSidebar"},"guides/permission-modes":{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","sidebar":"tutorialSidebar"},"guides/self-hosting/docker":{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","sidebar":"tutorialSidebar"},"guides/self-hosting/instance-configuration":{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","sidebar":"tutorialSidebar"},"guides/self-hosting/interstitial-page":{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","sidebar":"tutorialSidebar"},"guides/self-hosting/kubernetes":{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","sidebar":"tutorialSidebar"},"guides/self-hosting/linux/index":{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","sidebar":"tutorialSidebar"},"guides/self-hosting/linux/nginx":{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","sidebar":"tutorialSidebar"},"guides/self-hosting/metrics-and-limits/configuring-limits":{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","sidebar":"tutorialSidebar"},"guides/self-hosting/metrics-and-limits/configuring-metrics":{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","sidebar":"tutorialSidebar"},"guides/self-hosting/oauth/configuring-oauth":{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","sidebar":"tutorialSidebar"},"guides/self-hosting/organizations":{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","sidebar":"tutorialSidebar"},"guides/self-hosting/personalized-frontend":{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","sidebar":"tutorialSidebar"},"guides/self-hosting/self-service-invite":{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","sidebar":"tutorialSidebar"},"guides/vpn/vpn":{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","sidebar":"tutorialSidebar"},"myzrok/custom-domains/index":{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2256],{5293:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"1.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"getting-started","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Private Shares","href":"/docs/concepts/sharing-private","docId":"concepts/sharing-private","unlisted":false},{"type":"link","label":"Public Shares","href":"/docs/concepts/sharing-public","docId":"concepts/sharing-public","unlisted":false},{"type":"link","label":"Reserved Shares","href":"/docs/concepts/sharing-reserved","docId":"concepts/sharing-reserved","unlisted":false},{"type":"link","label":"Sharing HTTP Servers","href":"/docs/concepts/http","docId":"concepts/http","unlisted":false},{"type":"link","label":"Sharing TCP and UDP Servers","href":"/docs/concepts/tunnels","docId":"concepts/tunnels","unlisted":false},{"type":"link","label":"Sharing Websites and Files","href":"/docs/concepts/files","docId":"concepts/files","unlisted":false},{"type":"link","label":"Open Source","href":"/docs/concepts/opensource","docId":"concepts/opensource","unlisted":false},{"type":"link","label":"Hosting","href":"/docs/concepts/hosting","docId":"concepts/hosting","unlisted":false}],"href":"/docs/concepts/"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Install","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux","href":"/docs/guides/install/linux","docId":"guides/install/linux","unlisted":false},{"type":"link","label":"macOS","href":"/docs/guides/install/macos","docId":"guides/install/macos","unlisted":false},{"type":"link","label":"Windows","href":"/docs/guides/install/windows","docId":"guides/install/windows","unlisted":false}],"href":"/docs/guides/install/"},{"type":"category","label":"The zrok Agent","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux Agent Service","href":"/docs/guides/agent/linux-service","docId":"guides/agent/linux-service","unlisted":false},{"type":"link","label":"Windows Agent Service","href":"/docs/guides/agent/windows-service/","docId":"guides/agent/windows-service/index","unlisted":false}],"href":"/docs/guides/agent/"},{"type":"link","label":"frontdoor","href":"/docs/guides/frontdoor","docId":"guides/frontdoor","unlisted":false},{"type":"link","label":"Permission Modes","href":"/docs/guides/permission-modes","docId":"guides/permission-modes","unlisted":false},{"type":"category","label":"Docker Share","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Public Share","href":"/docs/guides/docker-share/docker_public_share_guide","docId":"guides/docker-share/docker_public_share_guide","unlisted":false},{"type":"link","label":"Private Share","href":"/docs/guides/docker-share/docker_private_share_guide","docId":"guides/docker-share/docker_private_share_guide","unlisted":false}],"href":"/docs/guides/docker-share/"},{"type":"category","label":"Self Hosting","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NGINX TLS","href":"/docs/guides/self-hosting/linux/nginx","docId":"guides/self-hosting/linux/nginx","unlisted":false}],"href":"/docs/guides/self-hosting/linux/"},{"type":"link","label":"Interstitial Pages","href":"/docs/guides/self-hosting/interstitial-page","docId":"guides/self-hosting/interstitial-page","unlisted":false},{"type":"link","label":"Organizations","href":"/docs/guides/self-hosting/organizations","docId":"guides/self-hosting/organizations","unlisted":false},{"type":"link","label":"Personalized Frontend","href":"/docs/guides/self-hosting/personalized-frontend","docId":"guides/self-hosting/personalized-frontend","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/self-hosting/docker","docId":"guides/self-hosting/docker","unlisted":false},{"type":"link","label":"Kubernetes","href":"/docs/guides/self-hosting/kubernetes","docId":"guides/self-hosting/kubernetes","unlisted":false},{"type":"category","label":"Metrics and Limits","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring Metrics","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","docId":"guides/self-hosting/metrics-and-limits/configuring-metrics","unlisted":false},{"type":"link","label":"Configuring Limits","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","docId":"guides/self-hosting/metrics-and-limits/configuring-limits","unlisted":false}],"href":"/docs/category/metrics-and-limits"},{"type":"category","label":"OAuth","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OAuth Public Frontend Configuration","href":"/docs/guides/self-hosting/oauth/configuring-oauth","docId":"guides/self-hosting/oauth/configuring-oauth","unlisted":false}],"href":"/docs/category/oauth"},{"type":"link","label":"Instance Config","href":"/docs/guides/self-hosting/instance-configuration","docId":"guides/self-hosting/instance-configuration","unlisted":false},{"type":"link","label":"Invitations","href":"/docs/guides/self-hosting/self-service-invite","docId":"guides/self-hosting/self-service-invite","unlisted":false}],"href":"/docs/category/self-hosting"},{"type":"link","label":"Drives","href":"/docs/guides/drives","docId":"guides/drives","unlisted":false},{"type":"link","label":"VPN","href":"/docs/guides/vpn/","docId":"guides/vpn/vpn","unlisted":false}],"href":"/docs/category/guides"},{"type":"category","label":"myzrok","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Custom Domains","href":"/docs/myzrok/custom-domains/","docId":"myzrok/custom-domains/index","unlisted":false}],"href":"/docs/category/myzrok"}]},"docs":{"concepts/files":{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","sidebar":"tutorialSidebar"},"concepts/hosting":{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","sidebar":"tutorialSidebar"},"concepts/http":{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","sidebar":"tutorialSidebar"},"concepts/index":{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","sidebar":"tutorialSidebar"},"concepts/opensource":{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","sidebar":"tutorialSidebar"},"concepts/sharing-private":{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","sidebar":"tutorialSidebar"},"concepts/sharing-public":{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","sidebar":"tutorialSidebar"},"concepts/sharing-reserved":{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","sidebar":"tutorialSidebar"},"concepts/tunnels":{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started","description":"If you\'ve upgraded to v1.0.0 from a previous version and you receive an error message like this:","sidebar":"tutorialSidebar"},"guides/agent/index":{"id":"guides/agent/index","title":"Agent","description":"The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.","sidebar":"tutorialSidebar"},"guides/agent/linux-service":{"id":"guides/agent/linux-service","title":"Linux Agent Service","description":"Overview","sidebar":"tutorialSidebar"},"guides/agent/windows-service/index":{"id":"guides/agent/windows-service/index","title":"Configuring a Windows Service","description":"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.","sidebar":"tutorialSidebar"},"guides/docker-share/docker_private_share_guide":{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/docker_public_share_guide":{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/index":{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","sidebar":"tutorialSidebar"},"guides/drives":{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","sidebar":"tutorialSidebar"},"guides/frontdoor":{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","sidebar":"tutorialSidebar"},"guides/install/index":{"id":"guides/install/index","title":"Install","description":"","sidebar":"tutorialSidebar"},"guides/install/linux":{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","sidebar":"tutorialSidebar"},"guides/install/macos":{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","sidebar":"tutorialSidebar"},"guides/install/windows":{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","sidebar":"tutorialSidebar"},"guides/permission-modes":{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","sidebar":"tutorialSidebar"},"guides/self-hosting/docker":{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","sidebar":"tutorialSidebar"},"guides/self-hosting/instance-configuration":{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","sidebar":"tutorialSidebar"},"guides/self-hosting/interstitial-page":{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","sidebar":"tutorialSidebar"},"guides/self-hosting/kubernetes":{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","sidebar":"tutorialSidebar"},"guides/self-hosting/linux/index":{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","sidebar":"tutorialSidebar"},"guides/self-hosting/linux/nginx":{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","sidebar":"tutorialSidebar"},"guides/self-hosting/metrics-and-limits/configuring-limits":{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","sidebar":"tutorialSidebar"},"guides/self-hosting/metrics-and-limits/configuring-metrics":{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","sidebar":"tutorialSidebar"},"guides/self-hosting/oauth/configuring-oauth":{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","sidebar":"tutorialSidebar"},"guides/self-hosting/organizations":{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","sidebar":"tutorialSidebar"},"guides/self-hosting/personalized-frontend":{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","sidebar":"tutorialSidebar"},"guides/self-hosting/self-service-invite":{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","sidebar":"tutorialSidebar"},"guides/vpn/vpn":{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","sidebar":"tutorialSidebar"},"myzrok/custom-domains/index":{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.77817439.js b/assets/js/14eb3368.77817439.js new file mode 100644 index 00000000..65e620ec --- /dev/null +++ b/assets/js/14eb3368.77817439.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6969],{7519:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var s=n(8215),r=n(204),i=n(3751),a=n(214),l=n(6289),o=n(539),c=n(9030),d=n(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function x(e){let{children:t,href:n,isLast:s}=e;const r="breadcrumbs__link";return s?(0,d.jsx)("span",{className:r,itemProp:"name",children:t}):n?(0,d.jsx)(l.A,{className:r,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:r,children:t})}function p(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(r+1)})]})}function g(){const e=(0,i.OF)(),t=(0,a.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(r.G.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,r="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(p,{active:s,index:n,addMicrodata:!!r,children:(0,d.jsx)(x,{href:r,isLast:s,children:t.label})},n)}))]})}):null}},7981:(e,t,n)=>{n.r(t),n.d(t,{default:()=>w});n(6540);var s=n(9144),r=n(3751),i=n(9030),a=n(8215),l=n(6289),o=n(1430),c=n(2887),d=n(539),u=n(9303);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=n(4848);function b(e){let{href:t,children:n}=e;return(0,h.jsx)(l.A,{href:t,className:(0,a.A)("card padding--lg",m.cardContainer),children:n})}function x(e){let{href:t,icon:n,title:s,description:r}=e;return(0,h.jsxs)(b,{href:t,children:[(0,h.jsxs)(u.A,{as:"h2",className:(0,a.A)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),r&&(0,h.jsx)("p",{className:(0,a.A)("text--truncate",m.cardDescription),title:r,children:r})]})}function p(e){let{item:t}=e;const n=(0,r.Nr)(t),s=function(){const{selectMessage:e}=(0,o.W)();return t=>e(t,(0,d.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,h.jsx)(x,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function g(e){let{item:t}=e;const n=(0,c.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,r.cC)(t.docId??void 0);return(0,h.jsx)(x,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,h.jsx)(g,{item:t});case"category":return(0,h.jsx)(p,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,r.$S)();return(0,h.jsx)(j,{items:n.items,className:t})}function j(e){const{items:t,className:n}=e;if(!t)return(0,h.jsx)(f,{...e});const s=(0,r.d1)(t);return(0,h.jsx)("section",{className:(0,a.A)("row",n),children:s.map(((e,t)=>(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(v,{item:e})},t)))})}var A=n(807),N=n(5833),T=n(5730),L=n(7519);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function k(e){let{categoryGeneratedIndex:t}=e;return(0,h.jsx)(s.be,{title:t.title,description:t.description,keywords:t.keywords,image:(0,i.Ay)(t.image)})}function y(e){let{categoryGeneratedIndex:t}=e;const n=(0,r.$S)();return(0,h.jsxs)("div",{className:_.generatedIndexPage,children:[(0,h.jsx)(N.A,{}),(0,h.jsx)(L.A,{}),(0,h.jsx)(T.A,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.A,{as:"h1",className:_.title,children:t.title}),t.description&&(0,h.jsx)("p",{children:t.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:n.items,className:_.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(A.A,{previous:t.navigation.previous,next:t.navigation.next})})]})}function w(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(k,{...e}),(0,h.jsx)(y,{...e})]})}},807:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(539),r=n(8215),i=n(6289),a=n(4848);function l(e){const{permalink:t,title:n,subLabel:s,isNext:l}=e;return(0,a.jsxs)(i.A,{className:(0,r.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,a.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,a.jsx)("div",{className:"pagination-nav__label",children:n})]})}function o(e){const{previous:t,next:n}=e;return(0,a.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,a.jsx)(l,{...t,subLabel:(0,a.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,a.jsx)(l,{...n,subLabel:(0,a.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},5730:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(8215),r=n(539),i=n(204),a=n(1858),l=n(4848);function o(e){let{className:t}=e;const n=(0,a.r)();return n.badge?(0,l.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(r.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},5833:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(8215),r=n(797),i=n(6289),a=n(539),l=n(6942),o=n(204),c=n(6351),d=n(1858),u=n(4848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,r.A)(),{pluginId:a}=(0,l.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(a),{latestDocSuggestion:m,latestVersionSuggestion:x}=(0,l.HW)(a),p=m??(g=x).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.A)(t,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:x.label,to:p.path,onClick:()=>d(x.name)})})]})}function p(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(x,{className:t,versionMetadata:n}):null}},1430:(e,t,n)=>{n.d(t,{W:()=>c});var s=n(6540),r=n(797);const i=["zero","one","two","few","many","other"];function a(e){return i.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,r.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const r=n.select(t),i=n.pluralForms.indexOf(r);return s[Math.min(i,s.length-1)]}(n,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.a2fb3a9b.js b/assets/js/14eb3368.a2fb3a9b.js deleted file mode 100644 index 2504e0c9..00000000 --- a/assets/js/14eb3368.a2fb3a9b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6969],{1243:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var s=n(8215),r=n(7559),i=n(6972),a=n(9169),l=n(8774),o=n(1312),c=n(6025),d=n(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function x(e){let{children:t,href:n,isLast:s}=e;const r="breadcrumbs__link";return s?(0,d.jsx)("span",{className:r,itemProp:"name",children:t}):n?(0,d.jsx)(l.A,{className:r,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:r,children:t})}function p(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(r+1)})]})}function g(){const e=(0,i.OF)(),t=(0,a.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(r.G.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,r="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(p,{active:s,index:n,addMicrodata:!!r,children:(0,d.jsx)(x,{href:r,isLast:s,children:t.label})},n)}))]})}):null}},4136:(e,t,n)=>{n.r(t),n.d(t,{default:()=>w});n(6540);var s=n(9024),r=n(6972),i=n(6025),a=n(8215),l=n(8774),o=n(5846),c=n(6654),d=n(1312),u=n(1107);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=n(4848);function b(e){let{href:t,children:n}=e;return(0,h.jsx)(l.A,{href:t,className:(0,a.A)("card padding--lg",m.cardContainer),children:n})}function x(e){let{href:t,icon:n,title:s,description:r}=e;return(0,h.jsxs)(b,{href:t,children:[(0,h.jsxs)(u.A,{as:"h2",className:(0,a.A)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),r&&(0,h.jsx)("p",{className:(0,a.A)("text--truncate",m.cardDescription),title:r,children:r})]})}function p(e){let{item:t}=e;const n=(0,r.Nr)(t),s=function(){const{selectMessage:e}=(0,o.W)();return t=>e(t,(0,d.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,h.jsx)(x,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function g(e){let{item:t}=e;const n=(0,c.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,r.cC)(t.docId??void 0);return(0,h.jsx)(x,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,h.jsx)(g,{item:t});case"category":return(0,h.jsx)(p,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,r.$S)();return(0,h.jsx)(j,{items:n.items,className:t})}function j(e){const{items:t,className:n}=e;if(!t)return(0,h.jsx)(f,{...e});const s=(0,r.d1)(t);return(0,h.jsx)("section",{className:(0,a.A)("row",n),children:s.map(((e,t)=>(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(v,{item:e})},t)))})}var A=n(6929),N=n(1878),T=n(4267),L=n(1243);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function k(e){let{categoryGeneratedIndex:t}=e;return(0,h.jsx)(s.be,{title:t.title,description:t.description,keywords:t.keywords,image:(0,i.Ay)(t.image)})}function y(e){let{categoryGeneratedIndex:t}=e;const n=(0,r.$S)();return(0,h.jsxs)("div",{className:_.generatedIndexPage,children:[(0,h.jsx)(N.A,{}),(0,h.jsx)(L.A,{}),(0,h.jsx)(T.A,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.A,{as:"h1",className:_.title,children:t.title}),t.description&&(0,h.jsx)("p",{children:t.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:n.items,className:_.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(A.A,{previous:t.navigation.previous,next:t.navigation.next})})]})}function w(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(k,{...e}),(0,h.jsx)(y,{...e})]})}},6929:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(1312),r=n(8215),i=n(8774),a=n(4848);function l(e){const{permalink:t,title:n,subLabel:s,isNext:l}=e;return(0,a.jsxs)(i.A,{className:(0,r.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,a.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,a.jsx)("div",{className:"pagination-nav__label",children:n})]})}function o(e){const{previous:t,next:n}=e;return(0,a.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,a.jsx)(l,{...t,subLabel:(0,a.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,a.jsx)(l,{...n,subLabel:(0,a.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},4267:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(8215),r=n(1312),i=n(7559),a=n(3025),l=n(4848);function o(e){let{className:t}=e;const n=(0,a.r)();return n.badge?(0,l.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(r.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},1878:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(8215),r=n(4586),i=n(8774),a=n(1312),l=n(4070),o=n(7559),c=n(3886),d=n(3025),u=n(4848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,r.A)(),{pluginId:a}=(0,l.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(a),{latestDocSuggestion:m,latestVersionSuggestion:x}=(0,l.HW)(a),p=m??(g=x).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.A)(t,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:x.label,to:p.path,onClick:()=>d(x.name)})})]})}function p(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(x,{className:t,versionMetadata:n}):null}},5846:(e,t,n)=>{n.d(t,{W:()=>c});var s=n(6540),r=n(4586);const i=["zero","one","two","few","many","other"];function a(e){return i.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,r.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const r=n.select(t),i=n.pluralForms.indexOf(r);return s[Math.min(i,s.length-1)]}(n,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/17896441.1409512a.js b/assets/js/17896441.575d0faf.js similarity index 91% rename from assets/js/17896441.1409512a.js rename to assets/js/17896441.575d0faf.js index b0f1796d..5542c57f 100644 --- a/assets/js/17896441.1409512a.js +++ b/assets/js/17896441.575d0faf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8401],{1759:(t,e,a)=>{a.d(e,{A:()=>m});a(6540);var r=a(7667),s=a(53),c=a(4848);const l=t=>{let{className:e,style:a,children:r,shadow:l}=t;const n=l?`item shadow--${l}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card",e,n),style:a,children:r})},n=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__body",e,u,$,y,N,A,v,b,g),style:a,children:r})},i=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__footer",e,u,$,y,N,A,v,b,g),style:a,children:r})},o=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__header",e,u,$,y,N,A,v,b,g),style:a,children:r})};var d=a(6025);const x=t=>{let{className:e,style:a,cardImageUrl:r,alt:l,title:n}=t;const i=(0,d.Ay)(r);return(0,c.jsx)("img",{className:(0,s.A)("card__image",e),style:a,src:i,alt:l,title:n})};const m={...r.A,Card:l,CardHeader:o,CardBody:n,CardFooter:i,CardImage:x,Columns:function(t){let{children:e,className:a,style:r}=t;return(0,c.jsx)("div",{className:"container center",children:(0,c.jsx)("div",{className:(0,s.A)("row",a),style:r,children:e})})},Column:function(t){let{children:e,className:a,style:r}=t;return(0,c.jsx)("div",{className:(0,s.A)("col",a),style:r,children:e})}}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8401],{8419:(t,e,a)=>{a.d(e,{A:()=>m});a(6540);var r=a(3425),s=a(53),c=a(4848);const l=t=>{let{className:e,style:a,children:r,shadow:l}=t;const n=l?`item shadow--${l}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card",e,n),style:a,children:r})},n=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__body",e,u,$,y,N,A,v,b,g),style:a,children:r})},i=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__footer",e,u,$,y,N,A,v,b,g),style:a,children:r})},o=t=>{let{className:e,style:a,children:r,textAlign:l,variant:n,italic:i=!1,noDecoration:o=!1,transform:d,breakWord:x=!1,truncate:m=!1,weight:h}=t;const u=l?`text--${l}`:"",y=n?`text--${n}`:"",N=i?"text--italic":"",A=o?"text-no-decoration":"",$=d?`text--${d}`:"",v=x?"text--break":"",b=m?"text--truncate":"",g=h?`text--${h}`:"";return(0,c.jsx)("div",{className:(0,s.A)("card__header",e,u,$,y,N,A,v,b,g),style:a,children:r})};var d=a(9030);const x=t=>{let{className:e,style:a,cardImageUrl:r,alt:l,title:n}=t;const i=(0,d.Ay)(r);return(0,c.jsx)("img",{className:(0,s.A)("card__image",e),style:a,src:i,alt:l,title:n})};const m={...r.A,Card:l,CardHeader:o,CardBody:n,CardFooter:i,CardImage:x,Columns:function(t){let{children:e,className:a,style:r}=t;return(0,c.jsx)("div",{className:"container center",children:(0,c.jsx)("div",{className:(0,s.A)("row",a),style:r,children:e})})},Column:function(t){let{children:e,className:a,style:r}=t;return(0,c.jsx)("div",{className:(0,s.A)("col",a),style:r,children:e})}}}}]); \ No newline at end of file diff --git a/assets/js/17f4c24e.17d254d5.js b/assets/js/17f4c24e.17d254d5.js deleted file mode 100644 index 7b4beed8..00000000 --- a/assets/js/17f4c24e.17d254d5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8875],{9411:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4185:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>p,frontMatter:()=>d,metadata:()=>r,toc:()=>m});const r=JSON.parse('{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","source":"@site/versioned_docs/version-0.4/guides/install/macos.mdx","sourceDirName":"guides/install","slug":"/guides/install/macos","permalink":"/docs/0.4/guides/install/macos","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/macos.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in macOS","sidebar_label":"macOS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/0.4/guides/install/linux"},"next":{"title":"Windows","permalink":"/docs/0.4/guides/install/windows"}}');var t=s(4848),o=s(8453),a=s(8151),i=s(595),l=s(1342),c=s(9411);const d={title:"Install zrok in macOS",sidebar_label:"macOS"},u=void 0,h={},m=[{value:"Homebrew",id:"homebrew",level:2},...c.RM,{value:"Darwin Binary",id:"darwin-binary",level:2}];function x(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"darwin-binary",children:"Darwin Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your macOS architecture. For Intel Macs use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Apple Silicon Macs use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd ~/Downloads && mkdir -p /tmp/zrok && tar -xf ./zrok*darwin*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},8151:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var r=s(6540),t=s(4848);const o=(0,r.createContext)([]),a=()=>(0,r.useContext)(o),i=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(o.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(8151),t=s(1342),o=s(5293),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),m.length>0&&(0,a.jsx)("ul",{children:m.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17f4c24e.e3487d90.js b/assets/js/17f4c24e.e3487d90.js new file mode 100644 index 00000000..84ad3699 --- /dev/null +++ b/assets/js/17f4c24e.e3487d90.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8875],{5294:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},7650:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>p,frontMatter:()=>d,metadata:()=>r,toc:()=>m});const r=JSON.parse('{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","source":"@site/versioned_docs/version-0.4/guides/install/macos.mdx","sourceDirName":"guides/install","slug":"/guides/install/macos","permalink":"/docs/0.4/guides/install/macos","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/macos.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in macOS","sidebar_label":"macOS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/0.4/guides/install/linux"},"next":{"title":"Windows","permalink":"/docs/0.4/guides/install/windows"}}');var t=s(4848),o=s(8453),a=s(3070),i=s(3484),l=s(3769),c=s(5294);const d={title:"Install zrok in macOS",sidebar_label:"macOS"},u=void 0,h={},m=[{value:"Homebrew",id:"homebrew",level:2},...c.RM,{value:"Darwin Binary",id:"darwin-binary",level:2}];function x(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"darwin-binary",children:"Darwin Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your macOS architecture. For Intel Macs use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Apple Silicon Macs use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd ~/Downloads && mkdir -p /tmp/zrok && tar -xf ./zrok*darwin*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},3070:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var r=s(6540),t=s(4848);const o=(0,r.createContext)([]),a=()=>(0,r.useContext)(o),i=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(o.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(3070),t=s(3769),o=s(8532),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),m.length>0&&(0,a.jsx)("ul",{children:m.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/416.36a683d5.js b/assets/js/1809.e9544cab.js similarity index 58% rename from assets/js/416.36a683d5.js rename to assets/js/1809.e9544cab.js index ab8fcaac..937f0e16 100644 --- a/assets/js/416.36a683d5.js +++ b/assets/js/1809.e9544cab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[416],{416:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1809],{4190:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.41a00028.js b/assets/js/1a4e3797.41a00028.js new file mode 100644 index 00000000..19937981 --- /dev/null +++ b/assets/js/1a4e3797.41a00028.js @@ -0,0 +1 @@ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function i(e){return"object"==typeof e&&null!==e}function n(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(n(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(i(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var i=!1;function n(){this.removeListener(e,n),i||(i=!0,t.apply(this,arguments))}return n.listener=t,this.on(e,n),this},t.prototype.removeListener=function(e,t){var n,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(n=this._events[e]).length,s=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(i(n)){for(c=a;c-- >0;)if(n[c]===t||n[c].listener&&n[c].listener===t){s=c;break}if(s<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(i=this._events[e]))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var i=r(6571),n=r(9127),s=r(2223),a=r(3371),c=r(7691);function o(e,t,r,n){return new i(e,t,r,n)}o.version=r(6938),o.AlgoliaSearchHelper=i,o.SearchParameters=a,o.RecommendParameters=n,o.SearchResults=c,o.RecommendResults=s,e.exports=o},6732:(e,t,r)=>{"use strict";var i=r(2733);function n(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(3014)(n,i),n.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},n.prototype.getModifiedState=function(e){return this.fn(e)},n.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=n},9127:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e,threshold:t.threshold||0});return delete r.$$id,r}))}},e.exports=t},2223:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var i=e.$$id;r[i]=t[i],r._rawResults[i]=t[i]}))}t.prototype={constructor:t},e.exports=t},1673:(e,t,r)=>{"use strict";var i=r(9110),n=r(317),s=r(1383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var n=""+r,s=e[t]?e[t].concat(n):[n],c={};return c[t]=s,i(c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var i=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&i===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return n(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var i=!1,a=Object.keys(e).reduce((function(n,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(i=!0),n[s]=c,n}),{});return i?a:e}},isRefined:function(e,t,r){var i=Boolean(e[t])&&e[t].length>0;if(void 0===r||!i)return i;var n=""+r;return-1!==e[t].indexOf(n)}};e.exports=a},3371:(e,t,r)=>{"use strict";var i=r(9110),n=r(849),s=r(4843),a=r(4728),c=r(317),o=r(1383),u=r(7507),h=r(2208),l=r(1673);function f(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return f(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var i=-1!==m.PARAMETERS.indexOf(e),n=void 0!==t[e];!i&&n&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var i=e[r];if("string"==typeof i){var n=parseFloat(i);t[r]=isNaN(n)?i:n}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var i=e.numericRefinements[t]||{};r[t]={},Object.keys(i).forEach((function(e){var n=i[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=n}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:l.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:l.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:l.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:l.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var i=u(r);if(this.isNumericRefined(e,t,i))return this;var n=a({},this.numericRefinements);return n[e]=a({},n[e]),n[e][t]?(n[e][t]=n[e][t].slice(),n[e][t].push(i)):n[e][t]=[i],this.setQueryParameters({numericRefinements:n})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var i=r;return void 0!==i?this.isNumericRefined(e,t,i)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t&&f(r.val,u(i))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,i=Object.keys(r).reduce((function(i,n){var s=r[n],a={};return s=s||{},Object.keys(s).forEach((function(r){var i=s[r]||[],c=[];i.forEach((function(t){e({val:t,op:r},n,"numeric")||c.push(t)})),c.length!==i.length&&(t=!0),a[r]=c})),i[n]=a,i}),{});return t?i:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:l.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:l.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return l.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:l.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:l.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:l.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return l.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:l.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:l.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:l.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:l.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),n={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?n[e]=[]:n[e]=[t.slice(0,t.lastIndexOf(r))]:n[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i(n,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i(r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:i(t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&l.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&l.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&l.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var i=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!i)return i;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,n(s,(function(e){return f(e,a)})));return i&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(i){var n=r[i];-1===e.indexOf(i)&&void 0!==n&&(t[i]=n)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,i=m._parseNumbers(e),n=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(i).reduce((function(e,t){var r=void 0!==e[t],n=void 0!==i[t];return r&&!n?o(e,[t]):(n&&(e[t]=i[t]),e)}),n);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return n(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var i=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[i.name]&&e.hierarchicalFacetsRefinements[i.name][0]||"",h=e._getHierarchicalFacetSeparator(i),l=e._getHierarchicalRootPath(i),f=e._getHierarchicalShowParentLevel(i),m=s(e._getHierarchicalFacetSortBy(i)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,i,s){return function(u,h,l){var f=u;if(l>0){var m=0;for(f=u;m{"use strict";var i=r(8965),n=r(9110),s=r(2909),a=r(849),c=r(3917),o=r(7577),u=r(2183),h=r(8601),l=s.escapeFacetValue,f=s.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=n(r,{persistHierarchicalRootCount:!1});Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var l=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,i,n=R[t],u=(r=e.hierarchicalFacets,i=t,a(r,(function(e){return(e.attributes||[]).indexOf(i)>-1})));if(u){var h=u.attributes.indexOf(t),l=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[l][h]={attribute:t,data:n,exhaustive:s.exhaustiveFacetsCount}}else{var f,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(f=v[t],o.disjunctiveFacets[f]={name:t,data:n,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[f],s.facets_stats,t)),d&&(f=g[t],o.facets[f]={name:t,data:n,exhaustive:s.exhaustiveFacetsCount},p(o.facets[f],s.facets_stats,t))}})),this.hierarchicalFacets=i(this.hierarchicalFacets),l.forEach((function(r){var i=t[y],a=i&&i.facets?i.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,l=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=o.persistHierarchicalRootCount?u(o.hierarchicalFacets[r][m].data,l):n(l,o.hierarchicalFacets[r][m].data)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:u(d,l),exhaustive:i.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],i.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(i){!o.disjunctiveFacets[r].data[i]&&e.disjunctiveFacetsRefinements[t].indexOf(f(i))>-1&&(o.disjunctiveFacets[r].data[i]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var i=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(i),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===i.name})),l=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==l){var f={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];f[m]=o.hierarchicalFacets[h][l].data[m]}o.hierarchicalFacets[h][l].data=n(f,u,o.hierarchicalFacets[h][l].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],i=g[t];o.facets[i]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[i]=o.facets[i]||{name:t},o.facets[i].data=o.facets[i].data||{},o.facets[i].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=i(this.facets),this.disjunctiveFacets=i(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var i=a(e.facets,r);return i?Object.keys(i.data).map((function(r){var n=l(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isFacetRefined(t,n),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var n=a(e.disjunctiveFacets,r);return n?Object.keys(n.data).map((function(r){var i=l(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,i)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=f(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,i){if(i=i||0,Array.isArray(t))return e(t,r[i]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,i+1)})),a=e(s,r[i]);return n({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function _(e,t,r,i,n){var s=a(n,(function(e){return e.name===r})),c=s&&s.data&&s.data[i]?s.data[i]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:i,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var i,s=n(t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))i=[e];else i=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],i=[],n=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=n.indexOf(t)>-1;a||void 0===s[t]?a||i.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(i,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var i=o(s.sortBy,g.DEFAULT_SORT);return h(e,i[0],i[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,i)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(i){e.facetsRefinements[i].forEach((function(n){r.push(_(e,"facet",i,n,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(i){e.facetsExcludes[i].forEach((function(n){r.push(_(e,"exclude",i,n,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(i){e.disjunctiveFacetsRefinements[i].forEach((function(n){r.push(_(e,"disjunctive",i,n,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(i){e.hierarchicalFacetsRefinements[i].forEach((function(n){r.push(function(e,t,r,i){var n=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(n),c=r.split(s),o=a(i,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,l=u&&u.exhaustive||!1,f=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:f,count:h,exhaustive:l}}(e,i,n,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var i=e.numericRefinements[t];Object.keys(i).forEach((function(e){i[e].forEach((function(i){r.push({type:"numeric",attributeName:t,name:i,numericValue:i,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=g},6571:(e,t,r)=>{"use strict";var i=r(2733),n=r(6732),s=r(2909).escapeFacetValue,a=r(3014),c=r(4728),o=r(317),u=r(1383),h=r(9127),l=r(2223),f=r(9228),m=r(3371),d=r(7691),p=r(7749),g=r(6938);function v(e,t,r,i){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var n=r||{};n.index=t,this.state=m.make(n),this.recommendState=new h({params:n.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=i,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,i),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.searchWithComposition=function(){return this._runComposition({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return f._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,i=f._getQueries(r.index,r),n=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(i).then((function(e){return n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),e}));this.client.search(i).then((function(e){n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),t(e,null,r)}))},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var i=r.getModifiedState(t),n=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(f._getHitsSearchParams(i),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(i.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(i.query,e.queryLanguages,n)},v.prototype.searchForFacetValues=function(e,t,r,i){var n="function"==typeof this.client.searchForFacetValues&&"function"!=typeof this.client.searchForFacets,a="function"==typeof this.client.initIndex;if(!n&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(i||{}),o=c.isDisjunctiveFacet(e),u=f.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,l=this;return n?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},v.prototype.searchForCompositionFacetValues=function(e,t,r,i){if("function"!=typeof this.client.searchForFacetValues)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues");var n=this.state.setQueryParameters(i||{}),a=n.isDisjunctiveFacet(e);this._currentNbQueries++;var c,o=this;return c=this.client.searchForFacetValues({compositionID:n.index,facetName:e,searchForFacetValuesRequest:{params:{query:t,maxFacetHits:r,searchQuery:f._getCompositionHitsSearchParams(n)}}}),this.emit("searchForFacetValues",{state:n,facet:e,query:t}),c.then((function(t){return o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),(t=t.results[0]).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=a?n.isDisjunctiveFacetRefined(e,t.escapedValue):n.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),e}))},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var i=r[e];t.push({value:i,operator:e,type:"numeric"})})),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],i=[];e.onlyWithDerivedHelpers||(i=f._getQueries(t.index,t),r.push({state:t,queriesCount:i.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var n=this.derivedHelpers.map((function(e){var i=e.getModifiedState(t),n=i.index?f._getQueries(i.index,i):[];return r.push({state:i,queriesCount:n.length,helper:e}),e.emit("search",{state:i,results:e.lastResults}),n})),s=Array.prototype.concat.apply(i,n),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._runComposition=function(){var e=this.state,t=[],r=this.derivedHelpers.map((function(r){var i=r.getModifiedState(e),n=f._getCompositionQueries(i);return t.push({state:i,queriesCount:n.length,helper:r}),r.emit("search",{state:i,results:r.lastResults}),n})),i=Array.prototype.concat.apply([],r),n=this._queryId++;if(this._currentNbQueries++,!i.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,t,n));if(i.length>1)throw new Error("Only one query is allowed when using a composition.");var s=i[0];try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,t,n)).catch(this._dispatchAlgoliaError.bind(this,n))}catch(a){this.emit("error",{error:a})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),i=[{state:t,index:r,helper:this}],n=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return i.push({state:a,index:r,helper:t}),n=Array.prototype.concat.apply(n,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,i,n)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var i=this;if(!(t0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new n(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},7577:(e,t,r)=>{"use strict";var i=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var n=t.split(":"),s=i(r,(function(e){return e[0]===n[0]}));return n.length>1||!s?(e[0].push(n[0]),e[1].push(n[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,i){return t.indexOf(r)>-1&&e.indexOf(r)===i}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,i){if(e===i)return e;for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)&&"__proto__"!==n&&"constructor"!==n){var s=i[n],a=e[n];void 0!==a&&void 0===s||(t(a)&&t(s)?e[n]=r(a,s):e[n]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var i=1,n=arguments.length;i{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){var i="number"==typeof e[r]?e[r]:0,n=t[r];void 0!==n&&n>=i&&(void 0!==e[r]&&delete e[r],e[r]=n)})),e}),{})}},317:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,i,n={},s=Object.keys(e);for(i=0;i=0||(n[r]=e[r]);return n}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,i=null===e,n=void 0!==t,s=null===t;if(!s&&e>t||i&&n||!r)return 1;if(!i&&e=i.length?s:"desc"===i[n]?-s:s}return e.index-r.index})),n.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var i=r(4728);function n(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(i){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,i)})})),t.getRefinedHierarchicalFacets().forEach((function(i){var n=t.getHierarchicalFacetByName(i),a=t.getHierarchicalRefinement(i),c=t._getHierarchicalFacetSeparator(n);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:n.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(i,a){var c=s._getDisjunctiveFacetSearchParams(t,i.attribute,0===a);function u(e){return n.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),l=o[a-1];a>0?c.facetFilters=h.concat(l.attribute+":"+l.value):h.length>0?c.facetFilters=h:delete c.facetFilters,r.push({indexName:e,params:c})}))}})),r},_getCompositionQueries:function(e){return[{compositionID:e.index,requestBody:{params:s._getCompositionHitsSearchParams(e)}}]},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),n(i({},e.getQueryParams(),o))},_getCompositionHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets.map((function(t){return e.disjunctiveFacetsRefinements&&e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].length>0?"disjunctive("+t+")":t}))).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a);var u=e.getQueryParams();return delete u.highlightPreTag,delete u.highlightPostTag,delete u.index,n(i({},u,o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),n(i({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(i){var n=e.numericRefinements[i]||{};Object.keys(n).forEach((function(e){var s=n[e]||[];t!==i&&s.forEach((function(t){if(Array.isArray(t)){var n=t.map((function(t){return i+e+t}));r.push(n)}else r.push(i+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var i=[],n=e.facetsRefinements||{};Object.keys(n).sort().forEach((function(e){(n[e]||[]).slice().sort().forEach((function(t){i.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){i.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var n=[];r.slice().sort().forEach((function(t){n.push(e+":"+t)})),i.push(n)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(n){var s=(c[n]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(n),h=e._getHierarchicalFacetSeparator(u),l=e._getHierarchicalRootPath(u);if(t===n){if(-1===s.indexOf(h)||!l&&!0===r||l&&l.split(h).length===s.split(h).length)return;l?(o=l.split(h).length-1,s=l):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&i.push([a+":"+s])}})),i},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var i=e.getHierarchicalRefinement(r.name)[0];if(!i)return t.push(r.attributes[0]),t;var n=e._getHierarchicalFacetSeparator(r),s=i.split(n).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var i=e._getHierarchicalFacetSeparator(t);if(!0===r){var n=e._getHierarchicalRootPath(t),s=0;return n&&(s=n.split(i).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(i).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),n(i({},s._getHitsSearchParams(c),o))}};e.exports=s},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},7749:(e,t,r)=>{"use strict";var i=r(849),n=r(8657);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(i){e[i].count<2&&(e[i].indexSum+=100),r.push({objectID:i,avgOfIndices:e[i].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=i(n(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},6938:e=>{"use strict";e.exports="3.24.3"},1430:(e,t,r)=>{"use strict";r.d(t,{W:()=>u});var i=r(6540),n=r(797);const s=["zero","one","two","few","many","other"];function a(e){return s.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,i.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const i=e.split("|");if(1===i.length)return i[0];i.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const n=r.select(t),s=r.pluralForms.indexOf(n);return i[Math.min(s,i.length-1)]}(r,t,e)}}},278:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>z});var i=r(6540);function n(e){var t,r,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;tPromise.resolve()})=>Promise.resolve().then((()=>(function(){const t=e.timeToLive?1e3*e.timeToLive:null,r=n(),i=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(s(i),!t)return;s(Object.fromEntries(Object.entries(i).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||i.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve().then((()=>{const s=n();return s[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},i().setItem(r,JSON.stringify(s)),t})),delete:e=>Promise.resolve().then((()=>{const t=n();delete t[JSON.stringify(e)],i().setItem(r,JSON.stringify(t))})),clear:()=>Promise.resolve().then((()=>{i().removeItem(r)}))}}function u(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,i,n={miss:()=>Promise.resolve()})=>r.get(e,i,n).catch((()=>u({caches:t}).get(e,i,n))),set:(e,i)=>r.set(e,i).catch((()=>u({caches:t}).set(e,i))),delete:e=>r.delete(e).catch((()=>u({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>u({caches:t}).clear()))}}function h(e={serializable:!0}){let t={};return{get(r,i,n={miss:()=>Promise.resolve()}){const s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);const a=i();return a.then((e=>n.miss(e))).then((()=>a))},set:(r,i)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(i):i,Promise.resolve(i)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function l({algoliaAgents:e,client:t,version:r}){const i=function(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}(r).add({segment:t,version:r});return e.forEach((e=>i.add(e))),i}var f=12e4;function m(e,t="up"){const r=Date.now();return{...e,status:t,lastUpdate:r,isUp:function(){return"up"===t||Date.now()-r>f},isTimedOut:function(){return"timed out"===t&&Date.now()-r<=f}}}var d=class extends Error{name="AlgoliaError";constructor(e,t){super(e),t&&(this.name=t)}},p=class extends d{stackTrace;constructor(e,t,r){super(e,r),this.stackTrace=t}},g=class extends p{constructor(e){super("Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",e,"RetryError")}},v=class extends p{status;constructor(e,t,r,i="ApiError"){super(e,r,i),this.status=t}},y=class extends d{response;constructor(e,t){super(e,"DeserializationError"),this.response=t}},R=class extends v{error;constructor(e,t,r,i){super(e,t,i,"DetailedApiError"),this.error=r}};function F(e,t,r){const i=(n=r,Object.keys(n).filter((e=>void 0!==n[e])).sort().map((e=>`${e}=${encodeURIComponent("[object Array]"===Object.prototype.toString.call(n[e])?n[e].join(","):n[e]).replace(/\+/g,"%20")}`)).join("&"));var n;let s=`${e.protocol}://${e.url}${e.port?`:${e.port}`:""}/${"/"===t.charAt(0)?t.substring(1):t}`;return i.length&&(s+=`?${i}`),s}function _(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function b({hosts:e,hostsCache:t,baseHeaders:r,logger:i,baseQueryParameters:n,algoliaAgent:s,timeouts:a,requester:c,requestsCache:o,responsesCache:u}){async function h(o,u,h=!0){const l=[],f=function(e,t){if("GET"===e.method||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(o,u),d=function(e,t,r){const i={Accept:"application/json",...e,...t,...r},n={};return Object.keys(i).forEach((e=>{const t=i[e];n[e.toLowerCase()]=t})),n}(r,o.headers,u.headers),p="GET"===o.method?{...o.data,...u.data}:{},b={...n,...o.queryParameters,...p};if(s.value&&(b["x-algolia-agent"]=s.value),u&&u.queryParameters)for(const e of Object.keys(u.queryParameters))u.queryParameters[e]&&"[object Object]"!==Object.prototype.toString.call(u.queryParameters[e])?b[e]=u.queryParameters[e].toString():b[e]=u.queryParameters[e];let P=0;const j=async(e,r)=>{const n=e.pop();if(void 0===n)throw new g(function(e){return e.map((e=>_(e)))}(l));const s={...a,...u.timeouts},p={data:f,headers:d,method:o.method,url:F(n,o.path,b),connectTimeout:r(P,s.connect),responseTimeout:r(P,h?s.read:s.write)},x=t=>{const r={request:p,response:t,host:n,triesLeft:e.length};return l.push(r),r},E=await c.send(p);if(function({isTimedOut:e,status:t}){return e||function({isTimedOut:e,status:t}){return!e&&!~~t}({isTimedOut:e,status:t})||2!=~~(t/100)&&4!=~~(t/100)}(E)){const s=x(E);return E.isTimedOut&&P++,i.info("Retryable failure",_(s)),await t.set(n,m(n,E.isTimedOut?"timed out":"down")),j(e,r)}if(function({status:e}){return 2==~~(e/100)}(E))return function(e){try{return JSON.parse(e.content)}catch(t){throw new y(t.message,e)}}(E);throw x(E),function({content:e,status:t},r){try{const i=JSON.parse(e);return"error"in i?new R(i.message,t,i.error,r):new v(i.message,t,r)}catch{}return new v(e,t,r)}(E,l)},x=e.filter((e=>"readWrite"===e.accept||(h?"read"===e.accept:"write"===e.accept))),E=await async function(e){const r=await Promise.all(e.map((e=>t.get(e,(()=>Promise.resolve(m(e))))))),i=r.filter((e=>e.isUp())),n=r.filter((e=>e.isTimedOut())),s=[...i,...n];return{hosts:s.length>0?s:e,getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t}}(x);return j([...E.hosts].reverse(),E.getTimeout)}return{hostsCache:t,requester:c,timeouts:a,logger:i,algoliaAgent:s,baseHeaders:r,baseQueryParameters:n,hosts:e,request:function(e,t={}){const i=e.useReadTransporter||"GET"===e.method;if(!i)return h(e,t,i);const s=()=>h(e,t);if(!0!==(t.cacheable||e.cacheable))return s();const a={request:e,requestOptions:t,transporter:{queryParameters:n,headers:r}};return u.get(a,(()=>o.get(a,(()=>o.set(a,s()).then((e=>Promise.all([o.delete(a),e])),(e=>Promise.all([o.delete(a),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>u.set(a,e)})},requestsCache:o,responsesCache:u}}var P="5.23.0";function j(e){return[{url:`${e}-dsn.algolia.net`,accept:"read",protocol:"https"},{url:`${e}.algolia.net`,accept:"write",protocol:"https"}].concat(function(e){const t=e;for(let r=e.length-1;r>0;r--){const i=Math.floor(Math.random()*(r+1)),n=e[r];t[r]=e[i],t[i]=n}return t}([{url:`${e}-1.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-2.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-3.algolianet.com`,accept:"readWrite",protocol:"https"}]))}function x(e,t,r){if(!e||"string"!=typeof e)throw new Error("`appId` is missing.");if(!t||"string"!=typeof t)throw new Error("`apiKey` is missing.");return function({appId:e,apiKey:t,authMode:r,algoliaAgents:i,...n}){const s=function(e,t,r="WithinHeaders"){const i={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers:()=>"WithinHeaders"===r?i:{},queryParameters:()=>"WithinQueryParameters"===r?i:{}}}(e,t,r),a=b({hosts:j(e),...n,algoliaAgent:l({algoliaAgents:i,client:"Lite",version:P}),baseHeaders:{"content-type":"text/plain",...s.headers(),...n.baseHeaders},baseQueryParameters:{...s.queryParameters(),...n.baseQueryParameters}});return{transporter:a,appId:e,apiKey:t,clearCache:()=>Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((()=>{})),get _ua(){return a.algoliaAgent.value},addAlgoliaAgent(e,t){a.algoliaAgent.add({segment:e,version:t})},setClientApiKey({apiKey:e}){r&&"WithinHeaders"!==r?a.baseQueryParameters["x-algolia-api-key"]=e:a.baseHeaders["x-algolia-api-key"]=e},searchForHits(e,t){return this.search(e,t)},searchForFacets(e,t){return this.search(e,t)},customPost({path:e,parameters:t,body:r},i){if(!e)throw new Error("Parameter `path` is required when calling `customPost`.");const n={method:"POST",path:"/{path}".replace("{path}",e),queryParameters:t||{},headers:{},data:r||{}};return a.request(n,i)},getRecommendations(e,t){if(e&&Array.isArray(e)&&(e={requests:e}),!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");const r={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return a.request(r,t)},search(e,t){if(e&&Array.isArray(e)){const t={requests:e.map((({params:e,...t})=>"facet"===t.type?{...t,...e,type:"facet"}:{...t,...e,facet:void 0,maxFacetHits:void 0,facetQuery:void 0}))};e=t}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");const r={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return a.request(r,t)}}}({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:(e,t)=>Promise.resolve(),info:(e,t)=>Promise.resolve(),error:(e,t)=>Promise.resolve()},requester:{send:function(e){return new Promise((t=>{let r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));let i,n=(e,i)=>setTimeout((()=>{r.abort(),t({status:0,content:i,isTimedOut:!0})}),e),s=n(e.connectTimeout,"Connection timeout");r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(s),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(s),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(s),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:h(),requestsCache:h({serializable:!1}),hostsCache:u({caches:[o({key:`${P}-${e}`}),h()]}),...r})}var E=r(1934),w=r(7143),O=r(6289),A=r(6942),S=r(1430),H=r(3592),Q=r(6849),T=r(9144),N=r(4159),C=r(539),I=r(797),D=r(1835),k=r(8455),q=r(7912),V=r(9303);const L={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var $=r(4848);function B(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,$.jsx)("div",{className:s("col","col--3","padding-left--none",L.searchVersionColumn),children:r.map((e=>{let[i,n]=e;const s=r.length>1?`${i}: `:"";return(0,$.jsx)("select",{onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:L.searchVersionInput,children:n.versions.map(((e,t)=>(0,$.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},i)}))})}function M(){const{i18n:{currentLocale:e}}=(0,I.A)(),{algolia:{appId:t,apiKey:r,indexName:n,contextualSearch:a}}=(0,D.c)(),o=(0,k.C)(),u=function(){const{selectMessage:e}=(0,S.W)();return t=>e(t,(0,C.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),h=function(){const e=(0,A.Gy)(),[t,r]=(0,i.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,i]=t;return{...e,[r]:i.versions[0].name}}),{}))),n=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:n,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[l,f]=(0,H.b)(),m={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[d,p]=(0,i.useReducer)(((e,t)=>{switch(t.type){case"reset":return m;case"loading":return{...e,loading:!0};case"update":return l!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),m),g=a?["language","docusaurus_tag"]:[],v=x(t,r),y=c()(v,n,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:g});y.on("result",(e=>{let{results:{query:t,hits:r,page:i,nbHits:n,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void p({type:"reset"});const a=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),c=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:i={}}=e;const n=Object.keys(r).map((e=>a(r[e].value)));return{title:n.pop(),url:o(t),summary:i.content?`${a(i.content.value)}...`:"",breadcrumbs:n}}));p({type:"update",value:{items:c,query:t,totalResults:n,totalPages:s,lastPage:i,hasMore:s>i+1,loading:!1}})}));const[R,F]=(0,i.useState)(null),_=(0,i.useRef)(0),b=(0,i.useRef)(E.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&_.current>r&&p({type:"advance"}),_.current=r}),{threshold:1})),P=()=>l?(0,C.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:l}):(0,C.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),j=(0,Q._q)((function(t){void 0===t&&(t=0),a&&(y.addDisjunctiveFacetRefinement("docusaurus_tag","default"),y.addDisjunctiveFacetRefinement("language",e),Object.entries(h.searchVersions).forEach((e=>{let[t,r]=e;y.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)}))),y.setQuery(l).setPage(t).search()}));return(0,i.useEffect)((()=>{if(!R)return;const e=b.current;return e?(e.observe(R),()=>e.unobserve(R)):()=>!0}),[R]),(0,i.useEffect)((()=>{p({type:"reset"}),l&&(p({type:"loading"}),setTimeout((()=>{j()}),300))}),[l,h.searchVersions,j]),(0,i.useEffect)((()=>{d.lastPage&&0!==d.lastPage&&j(d.lastPage)}),[j,d.lastPage]),(0,$.jsxs)(q.A,{children:[(0,$.jsxs)(w.A,{children:[(0,$.jsx)("title",{children:(0,N.s)(P())}),(0,$.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,$.jsxs)("div",{className:"container margin-vert--lg",children:[(0,$.jsx)(V.A,{as:"h1",children:P()}),(0,$.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,$.jsx)("div",{className:s("col",L.searchQueryColumn,{"col--9":h.versioningEnabled,"col--12":!h.versioningEnabled}),children:(0,$.jsx)("input",{type:"search",name:"q",className:L.searchQueryInput,placeholder:(0,C.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,C.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>f(e.target.value),value:l,autoComplete:"off",autoFocus:!0})}),a&&h.versioningEnabled&&(0,$.jsx)(B,{docsSearchVersionsHelpers:h})]}),(0,$.jsxs)("div",{className:"row",children:[(0,$.jsx)("div",{className:s("col","col--8",L.searchResultsColumn),children:!!d.totalResults&&u(d.totalResults)}),(0,$.jsx)("div",{className:s("col","col--4","text--right",L.searchLogoColumn),children:(0,$.jsx)(O.A,{to:"https://www.algolia.com/","aria-label":(0,C.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,$.jsx)("svg",{viewBox:"0 0 168 24",className:L.algoliaLogo,children:(0,$.jsxs)("g",{fill:"none",children:[(0,$.jsx)("path",{className:L.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,$.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,$.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),d.items.length>0?(0,$.jsx)("main",{children:d.items.map(((e,t)=>{let{title:r,url:i,summary:n,breadcrumbs:a}=e;return(0,$.jsxs)("article",{className:L.searchResultItem,children:[(0,$.jsx)(V.A,{as:"h2",className:L.searchResultItemHeading,children:(0,$.jsx)(O.A,{to:i,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,$.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,$.jsx)("ul",{className:s("breadcrumbs",L.searchResultItemPath),children:a.map(((e,t)=>(0,$.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),n&&(0,$.jsx)("p",{className:L.searchResultItemSummary,dangerouslySetInnerHTML:{__html:n}})]},t)}))}):[l&&!d.loading&&(0,$.jsx)("p",{children:(0,$.jsx)(C.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!d.loading&&(0,$.jsx)("div",{className:L.loadingSpinner},"spinner")],d.hasMore&&(0,$.jsx)("div",{className:L.loader,ref:F,children:(0,$.jsx)(C.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function z(){return(0,$.jsx)(T.e3,{className:"search-page-wrapper",children:(0,$.jsx)(M,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.b404fedf.js b/assets/js/1a4e3797.b404fedf.js deleted file mode 100644 index 4f9ec193..00000000 --- a/assets/js/1a4e3797.b404fedf.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.b404fedf.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var n=r(6571),i=r(9127),s=r(2223),a=r(3371),c=r(7691);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(6938),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},6732:(e,t,r)=>{"use strict";var n=r(2733);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(3014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},9127:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e,threshold:t.threshold||0});return delete r.$$id,r}))}},e.exports=t},2223:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},1673:(e,t,r)=>{"use strict";var n=r(9110),i=r(317),s=r(1383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},3371:(e,t,r)=>{"use strict";var n=r(9110),i=r(849),s=r(4843),a=r(4728),c=r(317),o=r(1383),u=r(7507),h=r(2208),f=r(1673);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m{"use strict";var n=r(8965),i=r(9110),s=r(2909),a=r(849),c=r(3917),o=r(7577),u=r(4728),h=r(8601),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=v[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=g[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=g[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var n,s=i({},t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=i.indexOf(t)>-1;a||void 0===s[t]?a||n.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,g.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=g},6571:(e,t,r)=>{"use strict";var n=r(2733),i=r(6732),s=r(2909).escapeFacetValue,a=r(3014),c=r(4728),o=r(317),u=r(1383),h=r(9127),f=r(2223),l=r(9228),m=r(3371),d=r(7691),p=r(7749),g=r(6938);function v(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,n),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},v.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues&&"function"!=typeof this.client.searchForFacets,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},7577:(e,t,r)=>{"use strict";var n=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var n=r(4728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];a>0?c.facetFilters=h.concat(f.attribute+":"+f.value):h.length>0?c.facetFilters=h:delete c.facetFilters,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},7749:(e,t,r)=>{"use strict";var n=r(849),i=r(8657);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},6938:e=>{"use strict";e.exports="3.22.5"},3643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,g=2,v=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===v&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support .",transporterStackTrace:O(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?v:g))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},N=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},T=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},H=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return N(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.24.0","-").concat(e)}),o()]}),userAgent:_("4.24.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:T,searchForFacetValues:H,multipleQueries:T,multipleSearchForFacetValues:H,customRequest:A,initIndex:function(e){return function(t){return N(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}},getRecommendations:L}}))}return V.version="4.24.0",V}()},5846:(e,t,r)=>{"use strict";r.d(t,{W:()=>u});var n=r(6540),i=r(4586);const s=["zero","one","two","few","many","other"];function a(e){return s.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,i.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}},673:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>S});var n=r(6540);function i(e){var t,r,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t{let[,t]=e;return t.versions.length>1}));return(0,E.jsx)("div",{className:s("col","col--3","padding-left--none",x.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,E.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:x.searchVersionInput,children:i.versions.map(((e,t)=>(0,E.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function w(){const{i18n:{currentLocale:e}}=(0,F.A)(),{algolia:{appId:t,apiKey:r,indexName:i,contextualSearch:a}}=(0,b.c)(),o=(0,j.C)(),v=function(){const{selectMessage:e}=(0,d.W)();return t=>e(t,(0,R.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),w=function(){const e=(0,m.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[S,A]=(0,p.b)(),N={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[T,H]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return N;case"loading":return{...e,loading:!0};case"update":return S!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),N),Q=a?["language","docusaurus_tag"]:[],C=u()(t,r),I=c()(C,i,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:Q});I.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void H({type:"reset"});const a=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),c=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>a(r[e].value)));return{title:i.pop(),url:o(t),summary:n.content?`${a(n.content.value)}...`:"",breadcrumbs:i}}));H({type:"update",value:{items:c,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[D,k]=(0,n.useState)(null),q=(0,n.useRef)(0),L=(0,n.useRef)(h.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&q.current>r&&H({type:"advance"}),q.current=r}),{threshold:1})),V=()=>S?(0,R.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:S}):(0,R.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),B=(0,g._q)((function(t){void 0===t&&(t=0),a&&(I.addDisjunctiveFacetRefinement("docusaurus_tag","default"),I.addDisjunctiveFacetRefinement("language",e),Object.entries(w.searchVersions).forEach((e=>{let[t,r]=e;I.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)}))),I.setQuery(S).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!D)return;const e=L.current;return e?(e.observe(D),()=>e.unobserve(D)):()=>!0}),[D]),(0,n.useEffect)((()=>{H({type:"reset"}),S&&(H({type:"loading"}),setTimeout((()=>{B()}),300))}),[S,w.searchVersions,B]),(0,n.useEffect)((()=>{T.lastPage&&0!==T.lastPage&&B(T.lastPage)}),[B,T.lastPage]),(0,E.jsxs)(P.A,{children:[(0,E.jsxs)(f.A,{children:[(0,E.jsx)("title",{children:(0,y.s)(V())}),(0,E.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,E.jsxs)("div",{className:"container margin-vert--lg",children:[(0,E.jsx)(_.A,{as:"h1",children:V()}),(0,E.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,E.jsx)("div",{className:s("col",x.searchQueryColumn,{"col--9":w.versioningEnabled,"col--12":!w.versioningEnabled}),children:(0,E.jsx)("input",{type:"search",name:"q",className:x.searchQueryInput,placeholder:(0,R.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,R.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>A(e.target.value),value:S,autoComplete:"off",autoFocus:!0})}),a&&w.versioningEnabled&&(0,E.jsx)(O,{docsSearchVersionsHelpers:w})]}),(0,E.jsxs)("div",{className:"row",children:[(0,E.jsx)("div",{className:s("col","col--8",x.searchResultsColumn),children:!!T.totalResults&&v(T.totalResults)}),(0,E.jsx)("div",{className:s("col","col--4","text--right",x.searchLogoColumn),children:(0,E.jsx)(l.A,{to:"https://www.algolia.com/","aria-label":(0,R.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,E.jsx)("svg",{viewBox:"0 0 168 24",className:x.algoliaLogo,children:(0,E.jsxs)("g",{fill:"none",children:[(0,E.jsx)("path",{className:x.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,E.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,E.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),T.items.length>0?(0,E.jsx)("main",{children:T.items.map(((e,t)=>{let{title:r,url:n,summary:i,breadcrumbs:a}=e;return(0,E.jsxs)("article",{className:x.searchResultItem,children:[(0,E.jsx)(_.A,{as:"h2",className:x.searchResultItemHeading,children:(0,E.jsx)(l.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,E.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,E.jsx)("ul",{className:s("breadcrumbs",x.searchResultItemPath),children:a.map(((e,t)=>(0,E.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),i&&(0,E.jsx)("p",{className:x.searchResultItemSummary,dangerouslySetInnerHTML:{__html:i}})]},t)}))}):[S&&!T.loading&&(0,E.jsx)("p",{children:(0,E.jsx)(R.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!T.loading&&(0,E.jsx)("div",{className:x.loadingSpinner},"spinner")],T.hasMore&&(0,E.jsx)("div",{className:x.loader,ref:k,children:(0,E.jsx)(R.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function S(){return(0,E.jsx)(v.e3,{className:"search-page-wrapper",children:(0,E.jsx)(w,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.b404fedf.js.LICENSE.txt b/assets/js/1a4e3797.b404fedf.js.LICENSE.txt deleted file mode 100644 index bfc7620f..00000000 --- a/assets/js/1a4e3797.b404fedf.js.LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -/*! algoliasearch-lite.umd.js | 4.24.0 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1ba5bc99.1ceac7e5.js b/assets/js/1ba5bc99.29713972.js similarity index 54% rename from assets/js/1ba5bc99.1ceac7e5.js rename to assets/js/1ba5bc99.29713972.js index 5e63816c..fff03a43 100644 --- a/assets/js/1ba5bc99.1ceac7e5.js +++ b/assets/js/1ba5bc99.29713972.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2759],{9411:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},3865:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>p,frontMatter:()=>d,metadata:()=>r,toc:()=>m});const r=JSON.parse('{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","source":"@site/../docs/guides/install/macos.mdx","sourceDirName":"guides/install","slug":"/guides/install/macos","permalink":"/docs/guides/install/macos","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/macos.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in macOS","sidebar_label":"macOS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/guides/install/linux"},"next":{"title":"Windows","permalink":"/docs/guides/install/windows"}}');var t=s(4848),o=s(8453),a=s(8151),i=s(595),l=s(1342),c=s(9411);const d={title:"Install zrok in macOS",sidebar_label:"macOS"},u=void 0,h={},m=[{value:"Homebrew",id:"homebrew",level:2},...c.RM,{value:"Darwin Binary",id:"darwin-binary",level:2}];function x(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"darwin-binary",children:"Darwin Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your macOS architecture. For Intel Macs use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Apple Silicon Macs use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd ~/Downloads && mkdir -p /tmp/zrok && tar -xf ./zrok*darwin*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},8151:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var r=s(6540),t=s(4848);const o=(0,r.createContext)([]),a=()=>(0,r.useContext)(o),i=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(o.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(8151),t=s(1342),o=s(5293),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),m.length>0&&(0,a.jsx)("ul",{children:m.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2759],{5294:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},795:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>p,frontMatter:()=>d,metadata:()=>r,toc:()=>m});const r=JSON.parse('{"id":"guides/install/macos","title":"Install zrok in macOS","description":"Homebrew","source":"@site/../docs/guides/install/macos.mdx","sourceDirName":"guides/install","slug":"/guides/install/macos","permalink":"/docs/guides/install/macos","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/macos.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in macOS","sidebar_label":"macOS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/guides/install/linux"},"next":{"title":"Windows","permalink":"/docs/guides/install/windows"}}');var t=s(4848),o=s(8453),a=s(3070),i=s(3484),l=s(3769),c=s(5294);const d={title:"Install zrok in macOS",sidebar_label:"macOS"},u=void 0,h={},m=[{value:"Homebrew",id:"homebrew",level:2},...c.RM,{value:"Darwin Binary",id:"darwin-binary",level:2}];function x(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"darwin-binary",children:"Darwin Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your macOS architecture. For Intel Macs use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Apple Silicon Macs use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd ~/Downloads && mkdir -p /tmp/zrok && tar -xf ./zrok*darwin*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},3070:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var r=s(6540),t=s(4848);const o=(0,r.createContext)([]),a=()=>(0,r.useContext)(o),i=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(o.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(3070),t=s(3769),o=s(8532),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),m.length>0&&(0,a.jsx)("ul",{children:m.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1dd31738.b424452b.js b/assets/js/1dd31738.f2361110.js similarity index 98% rename from assets/js/1dd31738.b424452b.js rename to assets/js/1dd31738.f2361110.js index 95221943..ceafe893 100644 --- a/assets/js/1dd31738.b424452b.js +++ b/assets/js/1dd31738.f2361110.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6878],{7394:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>c,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","source":"@site/versioned_docs/version-0.4/concepts/http.md","sourceDirName":"concepts","slug":"/concepts/http","permalink":"/docs/0.4/concepts/http","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/http.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Reserved Shares","permalink":"/docs/0.4/concepts/sharing-reserved"},"next":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/0.4/concepts/tunnels"}}');var o=s(4848),r=s(8453);const c={sidebar_position:22},i="Sharing HTTP Servers",d={},a=[];function h(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sharing-http-servers",children:"Sharing HTTP Servers"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command using the ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," flag."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," is the default backend mode, so if you do not specify a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," you will get the ",(0,o.jsx)(n.code,{children:"proxy"})," mode by default."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have a web server running on ",(0,o.jsx)(n.code,{children:"localhost"})," that you want to expose to other users using ",(0,o.jsx)(n.code,{children:"zrok"}),", you can execute a command like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["When you execute this command, you'll get a ",(0,o.jsx)(n.code,{children:"zrok"})," bridge like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 http://cht7gj4g5pjf.share.zrok.io \u2502\u2502[PUBLIC] [PROXY]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The URL shown at the top of the bridge shows the address where you can access your ",(0,o.jsx)(n.code,{children:"public"})," share."]}),"\n",(0,o.jsxs)(n.p,{children:["Hit ",(0,o.jsx)(n.code,{children:"CTRL-C"})," or ",(0,o.jsx)(n.code,{children:"q"})," in the bridge to exit it and delete the ",(0,o.jsx)(n.code,{children:"public"})," share."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function c(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6878],{1614:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>c,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","source":"@site/versioned_docs/version-0.4/concepts/http.md","sourceDirName":"concepts","slug":"/concepts/http","permalink":"/docs/0.4/concepts/http","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/http.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Reserved Shares","permalink":"/docs/0.4/concepts/sharing-reserved"},"next":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/0.4/concepts/tunnels"}}');var o=s(4848),r=s(8453);const c={sidebar_position:22},i="Sharing HTTP Servers",d={},a=[];function h(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"sharing-http-servers",children:"Sharing HTTP Servers"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command using the ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," flag."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"--backend-mode proxy"})," is the default backend mode, so if you do not specify a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," you will get the ",(0,o.jsx)(n.code,{children:"proxy"})," mode by default."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have a web server running on ",(0,o.jsx)(n.code,{children:"localhost"})," that you want to expose to other users using ",(0,o.jsx)(n.code,{children:"zrok"}),", you can execute a command like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["When you execute this command, you'll get a ",(0,o.jsx)(n.code,{children:"zrok"})," bridge like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 http://cht7gj4g5pjf.share.zrok.io \u2502\u2502[PUBLIC] [PROXY]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The URL shown at the top of the bridge shows the address where you can access your ",(0,o.jsx)(n.code,{children:"public"})," share."]}),"\n",(0,o.jsxs)(n.p,{children:["Hit ",(0,o.jsx)(n.code,{children:"CTRL-C"})," or ",(0,o.jsx)(n.code,{children:"q"})," in the bridge to exit it and delete the ",(0,o.jsx)(n.code,{children:"public"})," share."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function c(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ddd36f2.031ba1fd.js b/assets/js/1ddd36f2.031ba1fd.js deleted file mode 100644 index d46e1561..00000000 --- a/assets/js/1ddd36f2.031ba1fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1595],{8477:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),t=s(8453),r=s(8151),i=s(595),a=s(1342);const l=[];function d(e){return(0,o.jsx)(r.F,{children:(0,o.jsxs)("div",{className:a.A.downloadContainer,children:[(0,o.jsx)(i.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,o.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,o.jsx)(i.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d()}},6974:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"guides/install/index","title":"Install","description":"","source":"@site/versioned_docs/version-0.4/guides/install/index.mdx","sourceDirName":"guides/install","slug":"/guides/install/","permalink":"/docs/0.4/guides/install/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install"},"sidebar":"tutorialSidebar","previous":{"title":"Guides","permalink":"/docs/0.4/category/guides"},"next":{"title":"Linux","permalink":"/docs/0.4/guides/install/linux"}}');var t=s(4848),r=s(8453),i=(s(8151),s(595),s(1342),s(8477));const a={title:"Install"},l=void 0,d={},c=[...i.RM];function u(e){return(0,t.jsx)(i.Ay,{})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u()}},8151:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>i});var o=s(6540),t=s(4848);const r=(0,o.createContext)([]),i=()=>(0,o.useContext)(r),a=e=>{let{children:n}=e;const[s,i]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(r.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var o=s(8151),t=s(1342),r=s(5293),i=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,r.G)(),u=(0,o.d)();console.log("Assets in DownloadCard:",u);const m=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),x=u.filter((e=>e.name.includes(m)));return console.log("Filtered assets for",n,"in DownloadCard:",x),(0,i.jsxs)("div",{className:t.A.downloadCard,children:[(0,i.jsx)("div",{className:t.A.imgContainer,children:(0,i.jsx)("img",{src:s,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),x.length>0&&(0,i.jsx)("ul",{children:x.map(((e,n)=>(0,i.jsx)("li",{className:t.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:t.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>o});const o={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(6540);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ddd36f2.9d005e77.js b/assets/js/1ddd36f2.9d005e77.js new file mode 100644 index 00000000..1e97c4bd --- /dev/null +++ b/assets/js/1ddd36f2.9d005e77.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1595],{2390:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),t=s(8453),r=s(3070),i=s(3484),a=s(3769);const l=[];function d(e){return(0,o.jsx)(r.F,{children:(0,o.jsxs)("div",{className:a.A.downloadContainer,children:[(0,o.jsx)(i.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,o.jsx)(i.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,o.jsx)(i.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d()}},9854:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"guides/install/index","title":"Install","description":"","source":"@site/versioned_docs/version-0.4/guides/install/index.mdx","sourceDirName":"guides/install","slug":"/guides/install/","permalink":"/docs/0.4/guides/install/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install"},"sidebar":"tutorialSidebar","previous":{"title":"Guides","permalink":"/docs/0.4/category/guides"},"next":{"title":"Linux","permalink":"/docs/0.4/guides/install/linux"}}');var t=s(4848),r=s(8453),i=(s(3070),s(3484),s(3769),s(2390));const a={title:"Install"},l=void 0,d={},c=[...i.RM];function u(e){return(0,t.jsx)(i.Ay,{})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u()}},3070:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>i});var o=s(6540),t=s(4848);const r=(0,o.createContext)([]),i=()=>(0,o.useContext)(r),a=e=>{let{children:n}=e;const[s,i]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(r.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var o=s(3070),t=s(3769),r=s(8532),i=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,r.G)(),u=(0,o.d)();console.log("Assets in DownloadCard:",u);const m=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),x=u.filter((e=>e.name.includes(m)));return console.log("Filtered assets for",n,"in DownloadCard:",x),(0,i.jsxs)("div",{className:t.A.downloadCard,children:[(0,i.jsx)("div",{className:t.A.imgContainer,children:(0,i.jsx)("img",{src:s,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),x.length>0&&(0,i.jsx)("ul",{children:x.map(((e,n)=>(0,i.jsx)("li",{className:t.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:t.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>o});const o={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(6540);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/20595907.3e569479.js b/assets/js/20595907.d363fbd2.js similarity index 96% rename from assets/js/20595907.3e569479.js rename to assets/js/20595907.d363fbd2.js index 56dd49f2..a86c90cf 100644 --- a/assets/js/20595907.3e569479.js +++ b/assets/js/20595907.d363fbd2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8582],{7445:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","source":"@site/../docs/guides/self-hosting/kubernetes.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/kubernetes","permalink":"/docs/guides/self-hosting/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/kubernetes.mdx","tags":[],"version":"current","sidebarPosition":55,"frontMatter":{"title":"Self-host a zrok Instance in Kubernetes","sidebar_label":"Kubernetes","sidebar_position":55},"sidebar":"tutorialSidebar","previous":{"title":"Docker","permalink":"/docs/guides/self-hosting/docker"},"next":{"title":"Metrics and Limits","permalink":"/docs/category/metrics-and-limits"}}');var i=s(4848),r=s(8453);const o={title:"Self-host a zrok Instance in Kubernetes",sidebar_label:"Kubernetes",sidebar_position:55},a=void 0,c={},l=[];function u(e){const t={a:"a",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Helm chart for zrok is available from the main OpenZiti charts repo."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://github.com/openziti/helm-charts/tree/main/charts/zrok#readme",children:"Link to README in GitHub"})})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8582],{1785:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","source":"@site/../docs/guides/self-hosting/kubernetes.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/kubernetes","permalink":"/docs/guides/self-hosting/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/kubernetes.mdx","tags":[],"version":"current","sidebarPosition":55,"frontMatter":{"title":"Self-host a zrok Instance in Kubernetes","sidebar_label":"Kubernetes","sidebar_position":55},"sidebar":"tutorialSidebar","previous":{"title":"Docker","permalink":"/docs/guides/self-hosting/docker"},"next":{"title":"Metrics and Limits","permalink":"/docs/category/metrics-and-limits"}}');var i=s(4848),r=s(8453);const o={title:"Self-host a zrok Instance in Kubernetes",sidebar_label:"Kubernetes",sidebar_position:55},a=void 0,c={},l=[];function u(e){const t={a:"a",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Helm chart for zrok is available from the main OpenZiti charts repo."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://github.com/openziti/helm-charts/tree/main/charts/zrok#readme",children:"Link to README in GitHub"})})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21880a4d.2545a6d9.js b/assets/js/21880a4d.3fc237ab.js similarity index 99% rename from assets/js/21880a4d.2545a6d9.js rename to assets/js/21880a4d.3fc237ab.js index fbe1bee4..17ed094d 100644 --- a/assets/js/21880a4d.2545a6d9.js +++ b/assets/js/21880a4d.3fc237ab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[749],{7392:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","source":"@site/../docs/guides/vpn/vpn.md","sourceDirName":"guides/vpn","slug":"/guides/vpn/","permalink":"/docs/guides/vpn/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/vpn/vpn.md","tags":[],"version":"current","frontMatter":{"sidebar_label":"VPN"},"sidebar":"tutorialSidebar","previous":{"title":"Drives","permalink":"/docs/guides/drives"},"next":{"title":"myzrok","permalink":"/docs/category/myzrok"}}');var a=s(4848),o=s(8453);const t={sidebar_label:"VPN"},i="zrok VPN Guide",c={},d=[{value:"Operating System Requirements",id:"operating-system-requirements",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Start the VPN Server",id:"start-the-vpn-server",level:2},{value:"Reserve a VPN Share Token",id:"reserve-a-vpn-share-token",level:2},{value:"Access the VPN Share",id:"access-the-vpn-share",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"zrok-vpn-guide",children:"zrok VPN Guide"})}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN backend allows for simple host-to-host VPN setup."}),"\n",(0,a.jsx)(n.h2,{id:"operating-system-requirements",children:"Operating System Requirements"}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN requires elevated privileges to manage network devices."}),"\n",(0,a.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsxs)(n.p,{children:["On Windows, you must run zrok VPN commands as an administrator and install Wintun by placing ",(0,a.jsx)(n.code,{children:"wintun.dll"})," (",(0,a.jsx)(n.a,{href:"https://www.wintun.net/",children:"download link"}),") in the same directory as the ",(0,a.jsx)(n.code,{children:"zrok.exe"})," executable."]}),"\n",(0,a.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsxs)(n.p,{children:["On Linux, the simplest way to grant the necessary privileges is to run zrok VPN commands as root. You can enable a separate environment for root by also running ",(0,a.jsx)(n.code,{children:"zrok enable"})," as the root user, or you can prefix the commands like ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user. The minimum privilege is runing zrok VPN commands and the ",(0,a.jsx)(n.code,{children:"ip"})," command with the ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," kernel capability. The ",(0,a.jsx)(n.code,{children:"zrok-share.service"})," unit has a commented example to grant ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," as an Ambient Capability."]}),"\n",(0,a.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsxs)(n.p,{children:["On macOS, you must run zrok VPN commands as root. You can prefix the zrok command with ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user."]}),"\n",(0,a.jsx)(n.h2,{id:"start-the-vpn-server",children:"Start the VPN Server"}),"\n",(0,a.jsxs)(n.p,{children:["VPN is shared through the ",(0,a.jsx)(n.code,{children:"vpn"})," backend of ",(0,a.jsx)(n.code,{children:"zrok"})," command."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ sudo -E zrok share private --headless --backend-mode vpn\n[ 0.542] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[589d443c-f59d-4fc8-8c48-76609b7fb402]} new service session\n[ 0.705] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 3rq7torslq3n\n[ 0.705] INFO zrok/endpoints/vpn.(*Backend).Run: started\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"VPN share",src:s(1171).A+"",width:"1626",height:"1314"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"sudo"})," or equivalent invocation is required because VPN mode needs to create a virtual network device (",(0,a.jsx)(n.code,{children:"tun"}),")\n",(0,a.jsx)(n.code,{children:"-E"})," option allows ",(0,a.jsx)(n.code,{children:"zrok"})," to find your zrok configuration files (in your ",(0,a.jsx)(n.code,{children:"$HOME/.zrok"}),")"]}),"\n",(0,a.jsxs)(n.p,{children:["By default ",(0,a.jsx)(n.code,{children:"vpn"})," backend uses subnet ",(0,a.jsx)(n.code,{children:"10.122.0.0/16"})," and assigns ",(0,a.jsx)(n.code,{children:"10.122.0.1"})," to the host that stared VPN share."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"tun0: flags=4305 mtu 16384\n inet 10.122.0.1 netmask 255.255.0.0 destination 10.122.0.1\n inet6 fe80::705f:24e4:dcfc:a6b2 prefixlen 64 scopeid 0x20\n inet6 fd00:7a72:6f6b::1 prefixlen 64 scopeid 0x0\n unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 27 bytes 3236 (3.2 KB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Default IP/subnet setting can be overridden by adding ",(0,a.jsx)(n.code,{children:""})," parameter:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo -E zrok share private --headless --backend-mode vpn 192.168.42.12/24\n"})}),"\n",(0,a.jsx)(n.h2,{id:"reserve-a-vpn-share-token",children:"Reserve a VPN Share Token"}),"\n",(0,a.jsx)(n.p,{children:"As with all backend modes, you can reserve a share token for a VPN share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ zrok reserve private --backend-mode vpn\n[ 0.297] INFO main.(*reserveCommand).run: your reserved share token is 'k77y2cl7jmjl'\n\neugene@hermes $ sudo -E zrok share reserved k77y2cl7jmjl --headless\n[ 0.211] INFO main.(*shareReservedCommand).run: sharing target: '10.122.0.1/16'\n[ 0.211] INFO main.(*shareReservedCommand).run: using existing backend target: 10.122.0.1/16\n[ 0.463] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[22c5708d-e2f2-41aa-a507-454055f8bfcc]} new service session\n[ 0.641] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private k77y2cl7jmjl'\n[\n"})}),"\n",(0,a.jsx)(n.h2,{id:"access-the-vpn-share",children:"Access the VPN Share"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon % sudo -E zrok access private --headless k77y2cl7jmjl\n[ 0.201] INFO main.(*accessPrivateCommand).run: allocated frontend '50B5hloP1s1X'\n[ 0.662] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: VPN:\n[ 0.662] INFO main.(*accessPrivateCommand).run: 10.122.0.1 -> CONNECTED Welcome to zrok VPN\n[ 0.662] INFO zrok/endpoints/vpn.(*Frontend).Run: connected:Welcome to zrok VPN\n"})}),"\n",(0,a.jsxs)(n.p,{children:['zrok creates a virtual network device, i.e., a "tun" interface, when you run ',(0,a.jsx)(n.code,{children:"zrok access"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"})," run on a VPN client device:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"utun5: flags=8051 mtu 1500\n inet 10.122.0.3 --\x3e 10.122.0.1 netmask 0xff000000\n inet6 fe80::ce08:faff:fe8a:7b25%utun5 prefixlen 64 scopeid 0x14\n nd6 options=201\n"})}),"\n",(0,a.jsxs)(n.p,{children:["At this point a VPN tunnel is active between your server and client.\nIn the example above server is ",(0,a.jsx)(n.code,{children:"hermes(10.122.0.1)"})," and client is ",(0,a.jsx)(n.code,{children:"calculon(10.122.0.3)"}),".\nAll devices in the VPN can access one another by IP address."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon ~ % ssh eugene@10.122.0.1\nWelcome to Ubuntu 23.10 (GNU/Linux 6.5.0-27-generic x86_64)\n\n * Documentation: https://help.ubuntu.com\n * Management: https://landscape.canonical.com\n * Support: https://ubuntu.com/pro\n\n0 updates can be applied immediately.\n\nLast login: Tue Apr 16 09:27:13 2024 from 127.0.0.1\n\neugene@hermes:~$ who am i\neugene pts/8 2024-04-16 10:04 (10.122.0.3)\n\neugene@hermes:~$\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also make a reverse(server-to-client) connection:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes:~$ ssh 10.122.0.3\nLast login: Tue Apr 16 09:57:28 2024\n\neugene@calculon ~ % who am i\neugene ttys008 Apr 16 10:06 (10.122.0.1)\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1171:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/vpn-share-077094eabd79a2e072ee4c40f8e0fd31.png"},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>i});var r=s(6540);const a={},o=r.createContext(a);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[749],{1214:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","source":"@site/../docs/guides/vpn/vpn.md","sourceDirName":"guides/vpn","slug":"/guides/vpn/","permalink":"/docs/guides/vpn/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/vpn/vpn.md","tags":[],"version":"current","frontMatter":{"sidebar_label":"VPN"},"sidebar":"tutorialSidebar","previous":{"title":"Drives","permalink":"/docs/guides/drives"},"next":{"title":"myzrok","permalink":"/docs/category/myzrok"}}');var a=s(4848),o=s(8453);const t={sidebar_label:"VPN"},i="zrok VPN Guide",c={},d=[{value:"Operating System Requirements",id:"operating-system-requirements",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Start the VPN Server",id:"start-the-vpn-server",level:2},{value:"Reserve a VPN Share Token",id:"reserve-a-vpn-share-token",level:2},{value:"Access the VPN Share",id:"access-the-vpn-share",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"zrok-vpn-guide",children:"zrok VPN Guide"})}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN backend allows for simple host-to-host VPN setup."}),"\n",(0,a.jsx)(n.h2,{id:"operating-system-requirements",children:"Operating System Requirements"}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN requires elevated privileges to manage network devices."}),"\n",(0,a.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsxs)(n.p,{children:["On Windows, you must run zrok VPN commands as an administrator and install Wintun by placing ",(0,a.jsx)(n.code,{children:"wintun.dll"})," (",(0,a.jsx)(n.a,{href:"https://www.wintun.net/",children:"download link"}),") in the same directory as the ",(0,a.jsx)(n.code,{children:"zrok.exe"})," executable."]}),"\n",(0,a.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsxs)(n.p,{children:["On Linux, the simplest way to grant the necessary privileges is to run zrok VPN commands as root. You can enable a separate environment for root by also running ",(0,a.jsx)(n.code,{children:"zrok enable"})," as the root user, or you can prefix the commands like ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user. The minimum privilege is runing zrok VPN commands and the ",(0,a.jsx)(n.code,{children:"ip"})," command with the ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," kernel capability. The ",(0,a.jsx)(n.code,{children:"zrok-share.service"})," unit has a commented example to grant ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," as an Ambient Capability."]}),"\n",(0,a.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsxs)(n.p,{children:["On macOS, you must run zrok VPN commands as root. You can prefix the zrok command with ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user."]}),"\n",(0,a.jsx)(n.h2,{id:"start-the-vpn-server",children:"Start the VPN Server"}),"\n",(0,a.jsxs)(n.p,{children:["VPN is shared through the ",(0,a.jsx)(n.code,{children:"vpn"})," backend of ",(0,a.jsx)(n.code,{children:"zrok"})," command."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ sudo -E zrok share private --headless --backend-mode vpn\n[ 0.542] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[589d443c-f59d-4fc8-8c48-76609b7fb402]} new service session\n[ 0.705] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 3rq7torslq3n\n[ 0.705] INFO zrok/endpoints/vpn.(*Backend).Run: started\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"VPN share",src:s(1171).A+"",width:"1626",height:"1314"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"sudo"})," or equivalent invocation is required because VPN mode needs to create a virtual network device (",(0,a.jsx)(n.code,{children:"tun"}),")\n",(0,a.jsx)(n.code,{children:"-E"})," option allows ",(0,a.jsx)(n.code,{children:"zrok"})," to find your zrok configuration files (in your ",(0,a.jsx)(n.code,{children:"$HOME/.zrok"}),")"]}),"\n",(0,a.jsxs)(n.p,{children:["By default ",(0,a.jsx)(n.code,{children:"vpn"})," backend uses subnet ",(0,a.jsx)(n.code,{children:"10.122.0.0/16"})," and assigns ",(0,a.jsx)(n.code,{children:"10.122.0.1"})," to the host that stared VPN share."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"tun0: flags=4305 mtu 16384\n inet 10.122.0.1 netmask 255.255.0.0 destination 10.122.0.1\n inet6 fe80::705f:24e4:dcfc:a6b2 prefixlen 64 scopeid 0x20\n inet6 fd00:7a72:6f6b::1 prefixlen 64 scopeid 0x0\n unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 27 bytes 3236 (3.2 KB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Default IP/subnet setting can be overridden by adding ",(0,a.jsx)(n.code,{children:""})," parameter:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo -E zrok share private --headless --backend-mode vpn 192.168.42.12/24\n"})}),"\n",(0,a.jsx)(n.h2,{id:"reserve-a-vpn-share-token",children:"Reserve a VPN Share Token"}),"\n",(0,a.jsx)(n.p,{children:"As with all backend modes, you can reserve a share token for a VPN share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ zrok reserve private --backend-mode vpn\n[ 0.297] INFO main.(*reserveCommand).run: your reserved share token is 'k77y2cl7jmjl'\n\neugene@hermes $ sudo -E zrok share reserved k77y2cl7jmjl --headless\n[ 0.211] INFO main.(*shareReservedCommand).run: sharing target: '10.122.0.1/16'\n[ 0.211] INFO main.(*shareReservedCommand).run: using existing backend target: 10.122.0.1/16\n[ 0.463] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[22c5708d-e2f2-41aa-a507-454055f8bfcc]} new service session\n[ 0.641] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private k77y2cl7jmjl'\n[\n"})}),"\n",(0,a.jsx)(n.h2,{id:"access-the-vpn-share",children:"Access the VPN Share"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon % sudo -E zrok access private --headless k77y2cl7jmjl\n[ 0.201] INFO main.(*accessPrivateCommand).run: allocated frontend '50B5hloP1s1X'\n[ 0.662] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: VPN:\n[ 0.662] INFO main.(*accessPrivateCommand).run: 10.122.0.1 -> CONNECTED Welcome to zrok VPN\n[ 0.662] INFO zrok/endpoints/vpn.(*Frontend).Run: connected:Welcome to zrok VPN\n"})}),"\n",(0,a.jsxs)(n.p,{children:['zrok creates a virtual network device, i.e., a "tun" interface, when you run ',(0,a.jsx)(n.code,{children:"zrok access"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"})," run on a VPN client device:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"utun5: flags=8051 mtu 1500\n inet 10.122.0.3 --\x3e 10.122.0.1 netmask 0xff000000\n inet6 fe80::ce08:faff:fe8a:7b25%utun5 prefixlen 64 scopeid 0x14\n nd6 options=201\n"})}),"\n",(0,a.jsxs)(n.p,{children:["At this point a VPN tunnel is active between your server and client.\nIn the example above server is ",(0,a.jsx)(n.code,{children:"hermes(10.122.0.1)"})," and client is ",(0,a.jsx)(n.code,{children:"calculon(10.122.0.3)"}),".\nAll devices in the VPN can access one another by IP address."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon ~ % ssh eugene@10.122.0.1\nWelcome to Ubuntu 23.10 (GNU/Linux 6.5.0-27-generic x86_64)\n\n * Documentation: https://help.ubuntu.com\n * Management: https://landscape.canonical.com\n * Support: https://ubuntu.com/pro\n\n0 updates can be applied immediately.\n\nLast login: Tue Apr 16 09:27:13 2024 from 127.0.0.1\n\neugene@hermes:~$ who am i\neugene pts/8 2024-04-16 10:04 (10.122.0.3)\n\neugene@hermes:~$\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also make a reverse(server-to-client) connection:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes:~$ ssh 10.122.0.3\nLast login: Tue Apr 16 09:57:28 2024\n\neugene@calculon ~ % who am i\neugene ttys008 Apr 16 10:06 (10.122.0.1)\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1171:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/vpn-share-077094eabd79a2e072ee4c40f8e0fd31.png"},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>i});var r=s(6540);const a={},o=r.createContext(a);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2237.1d1b868c.js b/assets/js/2237.1d1b868c.js deleted file mode 100644 index c81c4635..00000000 --- a/assets/js/2237.1d1b868c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(8215),s=i(1312),o=i(1107),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(s.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(s.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(s.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>l});i(6540);var n=i(1312),s=i(9024),o=i(1957),r=i(3363),a=i(4848);function l(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.be,{title:e}),(0,a.jsx)(o.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/25ef1bb8.5af8d370.js b/assets/js/25ef1bb8.829f2dbc.js similarity index 99% rename from assets/js/25ef1bb8.5af8d370.js rename to assets/js/25ef1bb8.829f2dbc.js index 0578784f..b04acf20 100644 --- a/assets/js/25ef1bb8.5af8d370.js +++ b/assets/js/25ef1bb8.829f2dbc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8746],{4505:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","source":"@site/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_private_share_guide","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"title":"Docker Private Share","sidebar_position":20,"sidebar_label":"Private Share"},"sidebar":"tutorialSidebar","previous":{"title":"Public Share","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide"},"next":{"title":"Linux User Share","permalink":"/docs/0.4/guides/linux-user-share/"}}');var i=n(4848),o=n(8453);const t={title:"Docker Private Share",sidebar_position:20,sidebar_label:"Private Share"},a=void 0,c={},l=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Begin Sharing Privately with zrok in Docker",id:"begin-sharing-privately-with-zrok-in-docker",level:2},{value:"Access the Private Share",id:"access-the-private-share",level:2},{value:"Closed Permission Mode",id:"closed-permission-mode",level:2},{value:"Going Further with Private Access",id:"going-further-with-private-access",level:2},{value:"Cleaning Up",id:"cleaning-up",level:2}];function h(e){const r={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,i.jsx)(r.p,{children:"Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token."}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(r.p,{children:"With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel."}),"\n",(0,i.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,i.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-private",children:"private sharing with zrok"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/HxyvtFAvwUE",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,i.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a private share token and keep sharing the backend target."}),"\n",(0,i.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,i.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,i.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a private share token for the service unless ",(0,i.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,i.jsxs)(r.p,{children:["To follow this guide you will need ",(0,i.jsx)(r.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,i.jsx)(r.p,{children:"If you have installed Docker Desktop on macOS or Windows then you are all set."}),"\n",(0,i.jsx)(r.h2,{id:"begin-sharing-privately-with-zrok-in-docker",children:"Begin Sharing Privately with zrok in Docker"}),"\n",(0,i.jsx)(r.p,{children:"First, let's create the private share."}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private share."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Download ",(0,i.jsx)(r.a,{href:"pathname:///zrok-private-share/compose.yml",children:"the zrok-private-share Docker Compose project file"})," into your new project folder and make sure it's named ",(0,i.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,i.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"If you are self-hosting zrok then it's important to set your API endpoint URL too. If you're using the hosted zrok service then you can skip this step."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_API_ENDPOINT="https://zrok.example.com"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Run your Compose project to start sharing the built-in demo web server:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Read the private share token from the output. One of the last lines is like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"zrok-private-share-1 | zrok access private wr3hpf2z5fiy\n"})}),"\n",(0,i.jsx)(r.p,{children:"Keep track of this token so you can use it in your zrok private access project."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"access-the-private-share",children:"Access the Private Share"}),"\n",(0,i.jsx)(r.p,{children:"Now that we have a private share we can access it with the zrok command or by running a separate Docker Compose project."}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private access."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Download ",(0,i.jsx)(r.a,{href:"pathname:///zrok-private-access/compose.yml",children:"the zrok-private-access Docker Compose project file"})," into your new project folder and make sure it's named ",(0,i.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,i.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Now copy the zrok private access token from the zrok private share project's output to your clipboard and paste it in the same file named ",(0,i.jsx)(r.code,{children:".env"})," here in your private share project folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\nZROK_ACCESS_TOKEN="wr3hpf2z5fiy"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Run your Compose project to start accessing the private share:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up zrok-access\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Now your zrok private access proxy is ready on ",(0,i.jsx)(r.a,{href:"http://127.0.0.1:9191",children:"http://127.0.0.1:9191"}),". You can visit the demo web server in your browser."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"closed-permission-mode",children:"Closed Permission Mode"}),"\n",(0,i.jsx)(r.p,{children:'Normally, you need only the share token to access a private share. You can further restrict access with "closed" permission mode.'}),"\n",(0,i.jsx)(r.p,{children:"You must set the permission mode before you reserve the share."}),"\n",(0,i.jsx)(r.p,{children:"Only your own account can access the private share."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_PERMISSION_MODE="closed"\n'})}),"\n",(0,i.jsx)(r.p,{children:"Grant access to additional zrok accounts."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_ACCESS_GRANTS="bob@example.com alice@example.org"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["You can adjust the access grants by running the CLI inside the ",(0,i.jsx)(r.code,{children:"zrok-share"})," container."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose exec zrok-share zrok modify ${ZROK_UNIQUE_NAME} --remove-access-grant bob@example.com\n"})}),"\n",(0,i.jsx)(r.h2,{id:"going-further-with-private-access",children:"Going Further with Private Access"}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Try changing the demo web server used in the private share project. One alternative demo server is provided: ",(0,i.jsx)(r.code,{children:"httpbin"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Try accessing the private share from ",(0,i.jsx)(r.em,{children:"inside"})," a container running in the private access project. One demo client is provided: ",(0,i.jsx)(r.code,{children:"demo-client"}),". You can run it like this."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up demo-client\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["You'll see in the terminal output that the demo-client container is getting a response from the private share indicating the source IP of the request from the perspective of the demo server: ",(0,i.jsx)(r.code,{children:"httpbin"})," that's running in the private share project."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(r.p,{children:'Run the "down" command in both Compose projects to destroy them when you\'re all done. This will stop the running containers and delete zrok environments\' storage volumes. Then delete the selected zrok environment by clicking "Actions" in the web console.'}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose down --remove-orphans --volumes\n"})})]})}function d(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const i={},o=s.createContext(i);function t(e){const r=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8746],{8396:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","source":"@site/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_private_share_guide","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"title":"Docker Private Share","sidebar_position":20,"sidebar_label":"Private Share"},"sidebar":"tutorialSidebar","previous":{"title":"Public Share","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide"},"next":{"title":"Linux User Share","permalink":"/docs/0.4/guides/linux-user-share/"}}');var i=n(4848),o=n(8453);const t={title:"Docker Private Share",sidebar_position:20,sidebar_label:"Private Share"},a=void 0,c={},l=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Begin Sharing Privately with zrok in Docker",id:"begin-sharing-privately-with-zrok-in-docker",level:2},{value:"Access the Private Share",id:"access-the-private-share",level:2},{value:"Closed Permission Mode",id:"closed-permission-mode",level:2},{value:"Going Further with Private Access",id:"going-further-with-private-access",level:2},{value:"Cleaning Up",id:"cleaning-up",level:2}];function h(e){const r={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,i.jsx)(r.p,{children:"Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token."}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(r.p,{children:"With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel."}),"\n",(0,i.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,i.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-private",children:"private sharing with zrok"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/HxyvtFAvwUE",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,i.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a private share token and keep sharing the backend target."}),"\n",(0,i.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,i.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,i.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a private share token for the service unless ",(0,i.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,i.jsxs)(r.p,{children:["To follow this guide you will need ",(0,i.jsx)(r.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,i.jsx)(r.p,{children:"If you have installed Docker Desktop on macOS or Windows then you are all set."}),"\n",(0,i.jsx)(r.h2,{id:"begin-sharing-privately-with-zrok-in-docker",children:"Begin Sharing Privately with zrok in Docker"}),"\n",(0,i.jsx)(r.p,{children:"First, let's create the private share."}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private share."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Download ",(0,i.jsx)(r.a,{href:"pathname:///zrok-private-share/compose.yml",children:"the zrok-private-share Docker Compose project file"})," into your new project folder and make sure it's named ",(0,i.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,i.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"If you are self-hosting zrok then it's important to set your API endpoint URL too. If you're using the hosted zrok service then you can skip this step."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_API_ENDPOINT="https://zrok.example.com"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Run your Compose project to start sharing the built-in demo web server:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Read the private share token from the output. One of the last lines is like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"zrok-private-share-1 | zrok access private wr3hpf2z5fiy\n"})}),"\n",(0,i.jsx)(r.p,{children:"Keep track of this token so you can use it in your zrok private access project."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"access-the-private-share",children:"Access the Private Share"}),"\n",(0,i.jsx)(r.p,{children:"Now that we have a private share we can access it with the zrok command or by running a separate Docker Compose project."}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private access."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Download ",(0,i.jsx)(r.a,{href:"pathname:///zrok-private-access/compose.yml",children:"the zrok-private-access Docker Compose project file"})," into your new project folder and make sure it's named ",(0,i.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,i.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Now copy the zrok private access token from the zrok private share project's output to your clipboard and paste it in the same file named ",(0,i.jsx)(r.code,{children:".env"})," here in your private share project folder like this:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\nZROK_ACCESS_TOKEN="wr3hpf2z5fiy"\n'})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsx)(r.p,{children:"Run your Compose project to start accessing the private share:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up zrok-access\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Now your zrok private access proxy is ready on ",(0,i.jsx)(r.a,{href:"http://127.0.0.1:9191",children:"http://127.0.0.1:9191"}),". You can visit the demo web server in your browser."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"closed-permission-mode",children:"Closed Permission Mode"}),"\n",(0,i.jsx)(r.p,{children:'Normally, you need only the share token to access a private share. You can further restrict access with "closed" permission mode.'}),"\n",(0,i.jsx)(r.p,{children:"You must set the permission mode before you reserve the share."}),"\n",(0,i.jsx)(r.p,{children:"Only your own account can access the private share."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_PERMISSION_MODE="closed"\n'})}),"\n",(0,i.jsx)(r.p,{children:"Grant access to additional zrok accounts."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_ACCESS_GRANTS="bob@example.com alice@example.org"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["You can adjust the access grants by running the CLI inside the ",(0,i.jsx)(r.code,{children:"zrok-share"})," container."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose exec zrok-share zrok modify ${ZROK_UNIQUE_NAME} --remove-access-grant bob@example.com\n"})}),"\n",(0,i.jsx)(r.h2,{id:"going-further-with-private-access",children:"Going Further with Private Access"}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Try changing the demo web server used in the private share project. One alternative demo server is provided: ",(0,i.jsx)(r.code,{children:"httpbin"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Try accessing the private share from ",(0,i.jsx)(r.em,{children:"inside"})," a container running in the private access project. One demo client is provided: ",(0,i.jsx)(r.code,{children:"demo-client"}),". You can run it like this."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose up demo-client\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["You'll see in the terminal output that the demo-client container is getting a response from the private share indicating the source IP of the request from the perspective of the demo server: ",(0,i.jsx)(r.code,{children:"httpbin"})," that's running in the private share project."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(r.p,{children:'Run the "down" command in both Compose projects to destroy them when you\'re all done. This will stop the running containers and delete zrok environments\' storage volumes. Then delete the selected zrok environment by clicking "Actions" in the web console.'}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"docker compose down --remove-orphans --volumes\n"})})]})}function d(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const i={},o=s.createContext(i);function t(e){const r=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/27b0284c.24ca90bb.js b/assets/js/27b0284c.f6ce6473.js similarity index 98% rename from assets/js/27b0284c.24ca90bb.js rename to assets/js/27b0284c.f6ce6473.js index 2e6644fb..230c190c 100644 --- a/assets/js/27b0284c.24ca90bb.js +++ b/assets/js/27b0284c.f6ce6473.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4277],{5269:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","source":"@site/versioned_docs/version-0.4/concepts/sharing-reserved.md","sourceDirName":"concepts","slug":"/concepts/sharing-reserved","permalink":"/docs/0.4/concepts/sharing-reserved","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-reserved.md","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Public Shares","permalink":"/docs/0.4/concepts/sharing-public"},"next":{"title":"Sharing HTTP Servers","permalink":"/docs/0.4/concepts/http"}}');var o=s(4848),t=s(8453);const a={sidebar_position:10},i="Reserved Shares",d={},h=[{value:"Unique Names",id:"unique-names",level:2}];function c(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"reserved-shares",children:"Reserved Shares"})}),"\n",(0,o.jsxs)(r.p,{children:["By default, a ",(0,o.jsx)(r.code,{children:"public"})," or ",(0,o.jsx)(r.code,{children:"private"})," share is assigned a ",(0,o.jsx)(r.em,{children:"share token"})," when you create a share using the ",(0,o.jsx)(r.code,{children:"zrok share"})," command. The ",(0,o.jsx)(r.code,{children:"zrok share"})," command is the bridge between your local environment and the users you are sharing with. When you terminate the ",(0,o.jsx)(r.code,{children:"zrok share"}),", the bridge is eliminated and the ",(0,o.jsx)(r.em,{children:"share token"})," is deleted. If you run ",(0,o.jsx)(r.code,{children:"zrok share"})," again, you will be allocated a brand new ",(0,o.jsx)(r.em,{children:"share token"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["You can use a ",(0,o.jsx)(r.code,{children:"reserved"})," share to persist your ",(0,o.jsx)(r.em,{children:"share token"})," across multiple runs of the ",(0,o.jsx)(r.code,{children:"zrok share"})," bridge. When you use a ",(0,o.jsx)(r.code,{children:"reserved"})," share, the share token will not be deleted between multiple runs of ",(0,o.jsx)(r.code,{children:"zrok share"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["To use a ",(0,o.jsx)(r.code,{children:"reserved"})," share, you will first run the ",(0,o.jsx)(r.code,{children:"zrok reserve"})," command to create the reserved share (see ",(0,o.jsx)(r.code,{children:"zrok reserve --help"})," for details). Once you've created your ",(0,o.jsx)(r.code,{children:"reserved"})," share, you will use the ",(0,o.jsx)(r.code,{children:"zrok share reserved"})," command (see ",(0,o.jsx)(r.code,{children:"--help"})," for details) to run the bridge for the shared resource."]}),"\n",(0,o.jsxs)(r.p,{children:["This pattern works for both ",(0,o.jsx)(r.code,{children:"public"})," and ",(0,o.jsx)(r.code,{children:"private"})," shares, and for all resource types supported by ",(0,o.jsx)(r.code,{children:"zrok"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["To delete your ",(0,o.jsx)(r.code,{children:"reserved"})," share use the ",(0,o.jsx)(r.code,{children:"zrok release"})," command or click the delete button in the share's ",(0,o.jsx)(r.em,{children:"Actions"})," tab in the web console."]}),"\n",(0,o.jsx)(r.h2,{id:"unique-names",children:"Unique Names"}),"\n",(0,o.jsxs)(r.p,{children:["The default is to generate a random ",(0,o.jsx)(r.em,{children:"share token"})," and you may specify a ",(0,o.jsx)(r.em,{children:"unique name"}),"."]}),"\n",(0,o.jsx)(r.p,{children:'This reserves public share token "myshare."'}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title="Reserve with the Command Line"',children:'zrok reserve public 80 --unique-name "myshare"\n'})}),"\n",(0,o.jsxs)(r.p,{children:["This shares ",(0,o.jsx)(r.code,{children:"127.0.0.1:80"})," as ",(0,o.jsx)(r.code,{children:"https://myshare.zrok.example.com"})," where ",(0,o.jsx)(r.code,{children:"https://{token}.zrok.example.com"})," is the frontend's template."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title="Share a Reserved Token"',children:'zrok share reserved "myshare"\n'})})]})}function l(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>i});var n=s(6540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4277],{3043:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","source":"@site/versioned_docs/version-0.4/concepts/sharing-reserved.md","sourceDirName":"concepts","slug":"/concepts/sharing-reserved","permalink":"/docs/0.4/concepts/sharing-reserved","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-reserved.md","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Public Shares","permalink":"/docs/0.4/concepts/sharing-public"},"next":{"title":"Sharing HTTP Servers","permalink":"/docs/0.4/concepts/http"}}');var o=s(4848),t=s(8453);const a={sidebar_position:10},i="Reserved Shares",d={},h=[{value:"Unique Names",id:"unique-names",level:2}];function c(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"reserved-shares",children:"Reserved Shares"})}),"\n",(0,o.jsxs)(r.p,{children:["By default, a ",(0,o.jsx)(r.code,{children:"public"})," or ",(0,o.jsx)(r.code,{children:"private"})," share is assigned a ",(0,o.jsx)(r.em,{children:"share token"})," when you create a share using the ",(0,o.jsx)(r.code,{children:"zrok share"})," command. The ",(0,o.jsx)(r.code,{children:"zrok share"})," command is the bridge between your local environment and the users you are sharing with. When you terminate the ",(0,o.jsx)(r.code,{children:"zrok share"}),", the bridge is eliminated and the ",(0,o.jsx)(r.em,{children:"share token"})," is deleted. If you run ",(0,o.jsx)(r.code,{children:"zrok share"})," again, you will be allocated a brand new ",(0,o.jsx)(r.em,{children:"share token"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["You can use a ",(0,o.jsx)(r.code,{children:"reserved"})," share to persist your ",(0,o.jsx)(r.em,{children:"share token"})," across multiple runs of the ",(0,o.jsx)(r.code,{children:"zrok share"})," bridge. When you use a ",(0,o.jsx)(r.code,{children:"reserved"})," share, the share token will not be deleted between multiple runs of ",(0,o.jsx)(r.code,{children:"zrok share"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["To use a ",(0,o.jsx)(r.code,{children:"reserved"})," share, you will first run the ",(0,o.jsx)(r.code,{children:"zrok reserve"})," command to create the reserved share (see ",(0,o.jsx)(r.code,{children:"zrok reserve --help"})," for details). Once you've created your ",(0,o.jsx)(r.code,{children:"reserved"})," share, you will use the ",(0,o.jsx)(r.code,{children:"zrok share reserved"})," command (see ",(0,o.jsx)(r.code,{children:"--help"})," for details) to run the bridge for the shared resource."]}),"\n",(0,o.jsxs)(r.p,{children:["This pattern works for both ",(0,o.jsx)(r.code,{children:"public"})," and ",(0,o.jsx)(r.code,{children:"private"})," shares, and for all resource types supported by ",(0,o.jsx)(r.code,{children:"zrok"}),"."]}),"\n",(0,o.jsxs)(r.p,{children:["To delete your ",(0,o.jsx)(r.code,{children:"reserved"})," share use the ",(0,o.jsx)(r.code,{children:"zrok release"})," command or click the delete button in the share's ",(0,o.jsx)(r.em,{children:"Actions"})," tab in the web console."]}),"\n",(0,o.jsx)(r.h2,{id:"unique-names",children:"Unique Names"}),"\n",(0,o.jsxs)(r.p,{children:["The default is to generate a random ",(0,o.jsx)(r.em,{children:"share token"})," and you may specify a ",(0,o.jsx)(r.em,{children:"unique name"}),"."]}),"\n",(0,o.jsx)(r.p,{children:'This reserves public share token "myshare."'}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title="Reserve with the Command Line"',children:'zrok reserve public 80 --unique-name "myshare"\n'})}),"\n",(0,o.jsxs)(r.p,{children:["This shares ",(0,o.jsx)(r.code,{children:"127.0.0.1:80"})," as ",(0,o.jsx)(r.code,{children:"https://myshare.zrok.example.com"})," where ",(0,o.jsx)(r.code,{children:"https://{token}.zrok.example.com"})," is the frontend's template."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title="Share a Reserved Token"',children:'zrok share reserved "myshare"\n'})})]})}function l(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>i});var n=s(6540);const o={},t=n.createContext(o);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/288b1075.7fdf1033.js b/assets/js/288b1075.d8c0cc34.js similarity index 99% rename from assets/js/288b1075.7fdf1033.js rename to assets/js/288b1075.d8c0cc34.js index c5988cae..cbe1e4a5 100644 --- a/assets/js/288b1075.7fdf1033.js +++ b/assets/js/288b1075.d8c0cc34.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3588],{3998:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","source":"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-metrics","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Metrics and Limits","permalink":"/docs/category/metrics-and-limits"},"next":{"title":"Configuring Limits","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits"}}');var r=i(4848),o=i(8453);const s={sidebar_position:20},c="Configuring Metrics",l={},a=[{value:"Configuring the OpenZiti Controller",id:"configuring-the-openziti-controller",level:2},{value:"Configuring the zrok Metrics Bridge",id:"configuring-the-zrok-metrics-bridge",level:2},{value:"RabbitMQ",id:"rabbitmq",level:3},{value:"Configuring zrok Metrics",id:"configuring-zrok-metrics",level:2},{value:"Testing Metrics",id:"testing-metrics",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"configuring-metrics",children:"Configuring Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["A fully configured, production-scale ",(0,r.jsx)(n.code,{children:"zrok"})," service instance looks like this:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok Metrics Architecture",src:i(4923).A+"",width:"381",height:"492"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"})," metrics builds on top of the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller has several ways to consume ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events. Smaller installations could be configured in these ways:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok simplified metrics architecture",src:i(7292).A+"",width:"522",height:"322"})}),"\n",(0,r.jsxs)(n.p,{children:["Environments that horizontally scale the ",(0,r.jsx)(n.code,{children:"zrok"}),' control plane with multiple controllers should use an AMQP-based queue to "fan out" the metrics workload across the entire control plane. Simpler installations that use a single ',(0,r.jsx)(n.code,{children:"zrok"})," controller can collect ",(0,r.jsx)(n.code,{children:"fabric.usage"}),' events from the OpenZiti controller by "tailing" the events log file, or collecting them from the OpenZiti controller\'s websocket implementation.']}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-openziti-controller",children:"Configuring the OpenZiti Controller"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["This requires a version of OpenZiti with a ",(0,r.jsx)(n.code,{children:"fabric"})," dependency of ",(0,r.jsx)(n.code,{children:"v0.22.52"})," or newer, which is satisfed by the ",(0,r.jsx)(n.code,{children:"v0.27.6"})," release of OpenZiti Controller."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Emitting ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file is currently the most reliable mechanism to capture usage events into ",(0,r.jsx)(n.code,{children:"zrok"}),". We're going to configure the OpenZiti controller to append ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file, by adding this stanza to the OpenZiti controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"events:\n jsonLogger:\n subscriptions:\n - type: fabric.usage\n version: 3\n handler:\n type: file\n format: json\n path: /tmp/fabric-usage.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You'll want to adjust the ",(0,r.jsx)(n.code,{children:"events/jsonLogger/handler/path"})," to wherever you would like to send these events for ingestion into ",(0,r.jsx)(n.code,{children:"zrok"}),". There are additional OpenZiti options that control file rotation. Be sure to consult the OpenZiti docs to tune these settings to be appropriate for your environment."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the OpenZiti events infrastructure reports and batches events in 1 minute buckets. 1 minute is too large of an interval to provide a snappy ",(0,r.jsx)(n.code,{children:"zrok"})," metrics experience. So, let's increase the frequency to every 5 seconds. Add this to the ",(0,r.jsx)(n.code,{children:"network"})," stanza of your OpenZiti controller's configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"network:\n intervalAgeThreshold: 5s \n metricsReportInterval: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"And you'll want to add this stanza to the tail-end of the router configuration for every router on your OpenZiti network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"metrics:\n reportInterval: 5s\n intervalAgeThreshold: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"Be sure to restart all of the components of your OpenZiti network after making these configuration changes."}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-zrok-metrics-bridge",children:"Configuring the zrok Metrics Bridge"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"}),' currently uses a "metrics bridge" component (running as a separate process) to consume the ',(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the OpenZiti controller, and publish them onto an AMQP queue. Add a stanza like the following to your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"bridge:\n source:\n type: fileSource\n path: /tmp/fabric-usage.json\n sink:\n type: amqpSink\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This configuration consumes the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the file we previously specified in our OpenZiti controller configuration, and publishes them onto an AMQP queue."]}),"\n",(0,r.jsx)(n.h3,{id:"rabbitmq",children:"RabbitMQ"}),"\n",(0,r.jsxs)(n.p,{children:["For this example, we're going to use RabbitMQ as our AMQP implementation. The stock, default RabbitMQ configuration, launched as a ",(0,r.jsx)(n.code,{children:"docker"})," container will work just fine:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Once RabbitMQ is running, you can start the ",(0,r.jsx)(n.code,{children:"zrok"})," metrics bridge by pointing it at your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration, like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ zrok ctrl metrics bridge \n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-zrok-metrics",children:"Configuring zrok Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Configure the ",(0,r.jsx)(n.code,{children:"metrics"})," section of your ",(0,r.jsx)(n.code,{children:"zrok"})," controller. Here is an example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'metrics:\n agent:\n source:\n type: amqpSource\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n influx:\n url: "http://127.0.0.1:8086"\n bucket: zrok # the bucket and org must be\n org: zrok # created in advance in InfluxDB\n token: ""\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This configures the ",(0,r.jsx)(n.code,{children:"zrok"})," controller to consume usage events from the AMQP queue, and configures the InfluxDB metrics store. The InfluxDB organization and bucket must be created in advance. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller will not create these for you."]}),"\n",(0,r.jsx)(n.h2,{id:"testing-metrics",children:"Testing Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["With all of the components configured and running, either use ",(0,r.jsx)(n.code,{children:"zrok test loop"})," or manually create share(s) to generate traffic on the ",(0,r.jsx)(n.code,{children:"zrok"})," instance. If everything is working correctly, you should see log messages from the controller like the following, which indicate that that the controller is processing OpenZiti usage events, and generating ",(0,r.jsx)(n.code,{children:"zrok"})," metrics:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[5339.658] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 4.5 kB, tx: 4.6 kB} frontend {rx: 4.6 kB, tx: 4.5 kB}\n[5349.652] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 2.5 kB, tx: 2.6 kB} frontend {rx: 2.6 kB, tx: 2.5 kB}\n[5354.657] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 5a4u7lqxb7pa, circuit: iG1--6H4S backend {rx: 13.2 kB, tx: 13.3 kB} frontend {rx: 13.3 kB, tx: 13.2 kB}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"zrok"})," web console should also be showing activity for your share(s) like the following:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok web console activity",src:i(5472).A+"",width:"1920",height:"1230"})}),"\n",(0,r.jsxs)(n.p,{children:["With metrics configured, you might be interested in ",(0,r.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},7292:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-simple-15902678f75b6a41fc6d26c1b6165d48.png"},4923:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-abc07e1548198a0d2176bbfea70521fa.png"},5472:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zrok-console-activity-5e11ec1f9f3e58b54566c42a213e4ee5.png"},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3588],{8732:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","source":"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-metrics","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Metrics and Limits","permalink":"/docs/category/metrics-and-limits"},"next":{"title":"Configuring Limits","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits"}}');var r=i(4848),o=i(8453);const s={sidebar_position:20},c="Configuring Metrics",l={},a=[{value:"Configuring the OpenZiti Controller",id:"configuring-the-openziti-controller",level:2},{value:"Configuring the zrok Metrics Bridge",id:"configuring-the-zrok-metrics-bridge",level:2},{value:"RabbitMQ",id:"rabbitmq",level:3},{value:"Configuring zrok Metrics",id:"configuring-zrok-metrics",level:2},{value:"Testing Metrics",id:"testing-metrics",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"configuring-metrics",children:"Configuring Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["A fully configured, production-scale ",(0,r.jsx)(n.code,{children:"zrok"})," service instance looks like this:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok Metrics Architecture",src:i(4923).A+"",width:"381",height:"492"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"})," metrics builds on top of the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller has several ways to consume ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events. Smaller installations could be configured in these ways:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok simplified metrics architecture",src:i(7292).A+"",width:"522",height:"322"})}),"\n",(0,r.jsxs)(n.p,{children:["Environments that horizontally scale the ",(0,r.jsx)(n.code,{children:"zrok"}),' control plane with multiple controllers should use an AMQP-based queue to "fan out" the metrics workload across the entire control plane. Simpler installations that use a single ',(0,r.jsx)(n.code,{children:"zrok"})," controller can collect ",(0,r.jsx)(n.code,{children:"fabric.usage"}),' events from the OpenZiti controller by "tailing" the events log file, or collecting them from the OpenZiti controller\'s websocket implementation.']}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-openziti-controller",children:"Configuring the OpenZiti Controller"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["This requires a version of OpenZiti with a ",(0,r.jsx)(n.code,{children:"fabric"})," dependency of ",(0,r.jsx)(n.code,{children:"v0.22.52"})," or newer, which is satisfed by the ",(0,r.jsx)(n.code,{children:"v0.27.6"})," release of OpenZiti Controller."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Emitting ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file is currently the most reliable mechanism to capture usage events into ",(0,r.jsx)(n.code,{children:"zrok"}),". We're going to configure the OpenZiti controller to append ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file, by adding this stanza to the OpenZiti controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"events:\n jsonLogger:\n subscriptions:\n - type: fabric.usage\n version: 3\n handler:\n type: file\n format: json\n path: /tmp/fabric-usage.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You'll want to adjust the ",(0,r.jsx)(n.code,{children:"events/jsonLogger/handler/path"})," to wherever you would like to send these events for ingestion into ",(0,r.jsx)(n.code,{children:"zrok"}),". There are additional OpenZiti options that control file rotation. Be sure to consult the OpenZiti docs to tune these settings to be appropriate for your environment."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the OpenZiti events infrastructure reports and batches events in 1 minute buckets. 1 minute is too large of an interval to provide a snappy ",(0,r.jsx)(n.code,{children:"zrok"})," metrics experience. So, let's increase the frequency to every 5 seconds. Add this to the ",(0,r.jsx)(n.code,{children:"network"})," stanza of your OpenZiti controller's configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"network:\n intervalAgeThreshold: 5s \n metricsReportInterval: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"And you'll want to add this stanza to the tail-end of the router configuration for every router on your OpenZiti network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"metrics:\n reportInterval: 5s\n intervalAgeThreshold: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"Be sure to restart all of the components of your OpenZiti network after making these configuration changes."}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-zrok-metrics-bridge",children:"Configuring the zrok Metrics Bridge"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"}),' currently uses a "metrics bridge" component (running as a separate process) to consume the ',(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the OpenZiti controller, and publish them onto an AMQP queue. Add a stanza like the following to your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"bridge:\n source:\n type: fileSource\n path: /tmp/fabric-usage.json\n sink:\n type: amqpSink\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This configuration consumes the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the file we previously specified in our OpenZiti controller configuration, and publishes them onto an AMQP queue."]}),"\n",(0,r.jsx)(n.h3,{id:"rabbitmq",children:"RabbitMQ"}),"\n",(0,r.jsxs)(n.p,{children:["For this example, we're going to use RabbitMQ as our AMQP implementation. The stock, default RabbitMQ configuration, launched as a ",(0,r.jsx)(n.code,{children:"docker"})," container will work just fine:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Once RabbitMQ is running, you can start the ",(0,r.jsx)(n.code,{children:"zrok"})," metrics bridge by pointing it at your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration, like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ zrok ctrl metrics bridge \n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-zrok-metrics",children:"Configuring zrok Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Configure the ",(0,r.jsx)(n.code,{children:"metrics"})," section of your ",(0,r.jsx)(n.code,{children:"zrok"})," controller. Here is an example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'metrics:\n agent:\n source:\n type: amqpSource\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n influx:\n url: "http://127.0.0.1:8086"\n bucket: zrok # the bucket and org must be\n org: zrok # created in advance in InfluxDB\n token: ""\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This configures the ",(0,r.jsx)(n.code,{children:"zrok"})," controller to consume usage events from the AMQP queue, and configures the InfluxDB metrics store. The InfluxDB organization and bucket must be created in advance. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller will not create these for you."]}),"\n",(0,r.jsx)(n.h2,{id:"testing-metrics",children:"Testing Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["With all of the components configured and running, either use ",(0,r.jsx)(n.code,{children:"zrok test loop"})," or manually create share(s) to generate traffic on the ",(0,r.jsx)(n.code,{children:"zrok"})," instance. If everything is working correctly, you should see log messages from the controller like the following, which indicate that that the controller is processing OpenZiti usage events, and generating ",(0,r.jsx)(n.code,{children:"zrok"})," metrics:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[5339.658] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 4.5 kB, tx: 4.6 kB} frontend {rx: 4.6 kB, tx: 4.5 kB}\n[5349.652] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 2.5 kB, tx: 2.6 kB} frontend {rx: 2.6 kB, tx: 2.5 kB}\n[5354.657] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 5a4u7lqxb7pa, circuit: iG1--6H4S backend {rx: 13.2 kB, tx: 13.3 kB} frontend {rx: 13.3 kB, tx: 13.2 kB}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"zrok"})," web console should also be showing activity for your share(s) like the following:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok web console activity",src:i(5472).A+"",width:"1920",height:"1230"})}),"\n",(0,r.jsxs)(n.p,{children:["With metrics configured, you might be interested in ",(0,r.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},7292:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-simple-15902678f75b6a41fc6d26c1b6165d48.png"},4923:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-abc07e1548198a0d2176bbfea70521fa.png"},5472:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zrok-console-activity-5e11ec1f9f3e58b54566c42a213e4ee5.png"},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2913.952f279a.js b/assets/js/2913.952f279a.js new file mode 100644 index 00000000..70a3d993 --- /dev/null +++ b/assets/js/2913.952f279a.js @@ -0,0 +1 @@ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2913],{8069:(e,t,n)=>{"use strict";n.d(t,{A:()=>V});var o=n(6540),s=n(9136),c=n(8215),r=n(8532),a=n(3115);function l(){const{prism:e}=(0,a.p)(),{colorMode:t}=(0,r.G)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var i=n(204),u=n(8426),d=n.n(u);const m=/title=(?["'])(?.*?)\1/,p=/\{(?<range>[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},f={...b,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},h=Object.keys(b);function g(e,t){const n=e.map((e=>{const{start:n,end:o}=f[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function k(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:s,metastring:c}=t;if(c&&p.test(c)){const e=c.match(p).groups.range;if(0===s.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=s[0].className,o=d()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const r=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":return g(["lua"],t);case"sql":return g(["lua","jsBlock"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(h,t)}}(o,s),a=n.split("\n"),l=Object.fromEntries(s.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(s.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let d=0;d<a.length;){const e=a[d].match(r);if(!e){d+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?l[i[t]].range+=`${d},`:u[t]?l[u[t]].start=d:m[t]&&(l[m[t]].range+=`${l[m[t]].start}-${d-1},`),a.splice(d,1)}n=a.join("\n");const b={};return Object.entries(l).forEach((e=>{let[t,{range:n}]=e;d()(n).forEach((e=>{b[e]??=[],b[e].push(t)}))})),{lineClassNames:b,code:n}}const B={codeBlockContainer:"codeBlockContainer_Ckt0"};var x=n(4848);function j(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,s]=e;const c=t[o];c&&"string"==typeof s&&(n[c]=s)})),n}(l());return(0,x.jsx)(t,{...n,style:o,className:(0,c.A)(n.className,B.codeBlockContainer,i.G.common.codeBlock)})}const y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function v(e){let{children:t,className:n}=e;return(0,x.jsx)(j,{as:"pre",tabIndex:0,className:(0,c.A)(y.codeBlockStandalone,"thin-scrollbar",n),children:(0,x.jsx)("code",{className:y.codeBlockLines,children:t})})}var C=n(6849);const N={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,s]=(0,o.useState)(),c=(0,o.useCallback)((()=>{s(e.current?.closest("[role=tabpanel][hidden]"))}),[e,s]);(0,o.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=N);const s=(0,C._q)(t),c=(0,C.Be)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(s);return e&&t.observe(e,c),()=>t.disconnect()}),[e,s,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var E=n(4876);const L={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function A(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:s,getTokenProps:r}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=s({line:t,className:(0,c.A)(n,o&&L.codeLine)}),l=t.map(((e,t)=>(0,x.jsx)("span",{...r({token:e})},t)));return(0,x.jsxs)("span",{...a,children:[o?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)("span",{className:L.codeLineNumber}),(0,x.jsx)("span",{className:L.codeLineContent,children:l})]}):l,(0,x.jsx)("br",{})]})}var S=n(539);function T(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function _(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function $(e){let{code:t,className:n}=e;const[s,r]=(0,o.useState)(!1),a=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),s=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection(),r=c.rangeCount>0&&c.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let a=!1;try{a=document.execCommand("copy")}catch{}o.remove(),r&&(c.removeAllRanges(),c.addRange(r)),s&&s.focus()}(t),r(!0),a.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,x.jsx)("button",{type:"button","aria-label":s?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.A)("clean-btn",n,I.copyButton,s&&I.copyButtonCopied),onClick:l,children:(0,x.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,x.jsx)(T,{className:I.copyButtonIcon}),(0,x.jsx)(_,{className:I.copyButtonSuccessIcon})]})})}function W(e){return(0,x.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,x.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:o}=e;const s=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,x.jsx)("button",{type:"button",onClick:n,className:(0,c.A)("clean-btn",t,o&&M.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,x.jsx)(W,{className:M.wordWrapButtonIcon,"aria-hidden":"true"})})}function R(e){let{children:t,className:n="",metastring:s,title:r,showLineNumbers:i,language:u}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,a.p)(),b=function(e){return e?.toLowerCase()}(u??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d),f=l(),h=function(){const[e,t]=(0,o.useState)(!1),[n,s]=(0,o.useState)(!1),c=(0,o.useRef)(null),r=(0,o.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),a=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");s(n)}),[c]);return w(c,a),(0,o.useEffect)((()=>{a()}),[e,a]),(0,o.useEffect)((()=>(window.addEventListener("resize",a,{passive:!0}),()=>{window.removeEventListener("resize",a)})),[a]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:r}}(),g=function(e){return e?.match(m)?.groups.title??""}(s)||r,{lineClassNames:B,code:v}=k(t,{metastring:s,language:b,magicComments:p}),C=i??function(e){return Boolean(e?.includes("showLineNumbers"))}(s);return(0,x.jsxs)(j,{as:"div",className:(0,c.A)(n,b&&!n.includes(`language-${b}`)&&`language-${b}`),children:[g&&(0,x.jsx)("div",{className:y.codeBlockTitle,children:g}),(0,x.jsxs)("div",{className:y.codeBlockContent,children:[(0,x.jsx)(E.f4,{theme:f,code:v,language:b??"text",children:e=>{let{className:t,style:n,tokens:o,getLineProps:s,getTokenProps:r}=e;return(0,x.jsx)("pre",{tabIndex:0,ref:h.codeBlockRef,className:(0,c.A)(t,y.codeBlock,"thin-scrollbar"),style:n,children:(0,x.jsx)("code",{className:(0,c.A)(y.codeBlockLines,C&&y.codeBlockLinesWithNumbering),children:o.map(((e,t)=>(0,x.jsx)(A,{line:e,getLineProps:s,getTokenProps:r,classNames:B[t],showLineNumbers:C},t)))})})}}),(0,x.jsxs)("div",{className:y.buttonGroup,children:[(h.isEnabled||h.isCodeScrollable)&&(0,x.jsx)(H,{className:y.codeButton,onClick:()=>h.toggle(),isEnabled:h.isEnabled}),(0,x.jsx)($,{className:y.codeButton,code:v})]})]})]})}function V(e){let{children:t,...n}=e;const c=(0,s.A)(),r=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),a="string"==typeof r?R:v;return(0,x.jsx)(a,{...n,children:r},String(c))}},8426:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,s,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o<c?1:-1;"-"!==s&&".."!==s&&"\u2025"!==s||(c+=e);for(let t=o;t!==c;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>r,x:()=>a});var o=n(6540);const s={},c=o.createContext(s);function r(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2cc2e835.3f7ac032.js b/assets/js/2cc2e835.3f7ac032.js new file mode 100644 index 00000000..f4ba203b --- /dev/null +++ b/assets/js/2cc2e835.3f7ac032.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6946],{6526:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>w,frontMatter:()=>d,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","source":"@site/versioned_docs/version-0.4/guides/install/windows.mdx","sourceDirName":"guides/install","slug":"/guides/install/windows","permalink":"/docs/0.4/guides/install/windows","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/windows.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in Windows","sidebar_label":"Windows"},"sidebar":"tutorialSidebar","previous":{"title":"macOS","permalink":"/docs/0.4/guides/install/macos"},"next":{"title":"frontdoor","permalink":"/docs/0.4/guides/frontdoor"}}');var s=t(4848),o=t(8453),i=t(3070),a=t(3484),l=t(3769);const d={title:"Install zrok in Windows",sidebar_label:"Windows"},c=void 0,u={},h=[{value:"Windows Binary",id:"windows-binary",level:2},{value:"Wintun for zrok VPN",id:"wintun-for-zrok-vpn",level:2}];function m(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"windows-binary",children:"Windows Binary"}),"\n",(0,s.jsx)(i.F,{children:(0,s.jsx)("div",{className:l.A.downloadContainer,children:(0,s.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg"})})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"In PowerShell, change to the directory where you downloaded zrok."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:'cd "$env:USERPROFILE\\Downloads"\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In PowerShell, install zrok in your home directory (",(0,s.jsx)(n.code,{children:"bin\\zrok.exe"}),"), and permanently set the executable search path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:'$binDir = Join-Path -Path $env:USERPROFILE -ChildPath "bin"\nNew-Item -Path $binDir -ItemType Directory -ErrorAction SilentlyContinue\n$latest = Get-ChildItem -Path .\\zrok*windows*.tar.gz | Sort-Object LastWriteTime | Select-Object -Last 1\ntar -xf $latest.FullName -C $binDir zrok.exe\n$currentPath = [System.Environment]::GetEnvironmentVariable(\'PATH\', [System.EnvironmentVariableTarget]::User)\nif ($currentPath -notlike "*$binDir*") {\n $newPath = "$currentPath;$binDir"\n [System.Environment]::SetEnvironmentVariable(\'PATH\', $newPath, [System.EnvironmentVariableTarget]::User)\n $env:Path = $newPath\n}\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["With the ",(0,s.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,s.jsx)(n.code,{children:"zrok"})," directly."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"\n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | <\n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"wintun-for-zrok-vpn",children:"Wintun for zrok VPN"}),"\n",(0,s.jsxs)(n.p,{children:["On Windows, you must install Wintun to use zrok's VPN backend mode. See the ",(0,s.jsx)(n.a,{href:"/docs/0.4/guides/vpn/",children:"VPN guide"})," for more details."]})]})}function w(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}},3070:(e,n,t)=>{t.d(n,{F:()=>a,d:()=>i});var r=t(6540),s=t(4848);const o=(0,r.createContext)([]),i=()=>(0,r.useContext)(o),a=e=>{let{children:n}=e;const[t,i]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,s.jsx)(o.Provider,{value:t,children:n})}},3484:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var r=t(3070),s=t(3769),o=t(8532),i=t(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:t,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,i.jsxs)("div",{className:s.A.downloadCard,children:[(0,i.jsx)("div",{className:s.A.imgContainer,children:(0,i.jsx)("img",{src:t,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),m.length>0&&(0,i.jsx)("ul",{children:m.map(((e,n)=>(0,i.jsx)("li",{className:s.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:s.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:s.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},3769:(e,n,t)=>{t.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(6540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2cc2e835.42c85917.js b/assets/js/2cc2e835.42c85917.js deleted file mode 100644 index 82c56bfe..00000000 --- a/assets/js/2cc2e835.42c85917.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6946],{1613:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>w,frontMatter:()=>d,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","source":"@site/versioned_docs/version-0.4/guides/install/windows.mdx","sourceDirName":"guides/install","slug":"/guides/install/windows","permalink":"/docs/0.4/guides/install/windows","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/install/windows.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Install zrok in Windows","sidebar_label":"Windows"},"sidebar":"tutorialSidebar","previous":{"title":"macOS","permalink":"/docs/0.4/guides/install/macos"},"next":{"title":"frontdoor","permalink":"/docs/0.4/guides/frontdoor"}}');var s=t(4848),o=t(8453),i=t(8151),a=t(595),l=t(1342);const d={title:"Install zrok in Windows",sidebar_label:"Windows"},c=void 0,u={},h=[{value:"Windows Binary",id:"windows-binary",level:2},{value:"Wintun for zrok VPN",id:"wintun-for-zrok-vpn",level:2}];function m(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"windows-binary",children:"Windows Binary"}),"\n",(0,s.jsx)(i.F,{children:(0,s.jsx)("div",{className:l.A.downloadContainer,children:(0,s.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg"})})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"In PowerShell, change to the directory where you downloaded zrok."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:'cd "$env:USERPROFILE\\Downloads"\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In PowerShell, install zrok in your home directory (",(0,s.jsx)(n.code,{children:"bin\\zrok.exe"}),"), and permanently set the executable search path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:'$binDir = Join-Path -Path $env:USERPROFILE -ChildPath "bin"\nNew-Item -Path $binDir -ItemType Directory -ErrorAction SilentlyContinue\n$latest = Get-ChildItem -Path .\\zrok*windows*.tar.gz | Sort-Object LastWriteTime | Select-Object -Last 1\ntar -xf $latest.FullName -C $binDir zrok.exe\n$currentPath = [System.Environment]::GetEnvironmentVariable(\'PATH\', [System.EnvironmentVariableTarget]::User)\nif ($currentPath -notlike "*$binDir*") {\n $newPath = "$currentPath;$binDir"\n [System.Environment]::SetEnvironmentVariable(\'PATH\', $newPath, [System.EnvironmentVariableTarget]::User)\n $env:Path = $newPath\n}\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["With the ",(0,s.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,s.jsx)(n.code,{children:"zrok"})," directly."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"\n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | <\n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"wintun-for-zrok-vpn",children:"Wintun for zrok VPN"}),"\n",(0,s.jsxs)(n.p,{children:["On Windows, you must install Wintun to use zrok's VPN backend mode. See the ",(0,s.jsx)(n.a,{href:"/docs/0.4/guides/vpn/",children:"VPN guide"})," for more details."]})]})}function w(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}},8151:(e,n,t)=>{t.d(n,{F:()=>a,d:()=>i});var r=t(6540),s=t(4848);const o=(0,r.createContext)([]),i=()=>(0,r.useContext)(o),a=e=>{let{children:n}=e;const[t,i]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,s.jsx)(o.Provider,{value:t,children:n})}},595:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var r=t(8151),s=t(1342),o=t(5293),i=t(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:t,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,o.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,i.jsxs)("div",{className:s.A.downloadCard,children:[(0,i.jsx)("div",{className:s.A.imgContainer,children:(0,i.jsx)("img",{src:t,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),m.length>0&&(0,i.jsx)("ul",{children:m.map(((e,n)=>(0,i.jsx)("li",{className:s.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:s.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:s.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},1342:(e,n,t)=>{t.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(6540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2da89d45.50a9d468.js b/assets/js/2da89d45.50a9d468.js new file mode 100644 index 00000000..dec8f3bd --- /dev/null +++ b/assets/js/2da89d45.50a9d468.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6332],{968:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","source":"@site/../docs/guides/docker-share/index.mdx","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/","permalink":"/docs/guides/docker-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Getting Started with Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Permission Modes","permalink":"/docs/guides/permission-modes"},"next":{"title":"Public Share","permalink":"/docs/guides/docker-share/docker_public_share_guide"}}');var t=r(4848),o=r(8453),i=r(7763);const c={title:"Getting Started with Docker"},a=void 0,l={},d=[{value:"Overview",id:"overview",level:2},{value:"Permanent Public Share",id:"permanent-public-share",level:2},{value:"Temporary Public Share",id:"temporary-public-share",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["To follow the guides in this section you will need ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You have the option to enable a ",(0,t.jsx)(n.code,{children:"zrok"})," account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (",(0,t.jsx)(n.code,{children:"compose.yml"}),") to enable a separate ",(0,t.jsx)(n.code,{children:"zrok"})," environment for each project."]}),"\n",(0,t.jsxs)(n.p,{children:["This page provides ",(0,t.jsx)(n.code,{children:"docker"})," and ",(0,t.jsx)(n.code,{children:"docker compose"})," examples of mounting the host's ",(0,t.jsx)(n.code,{children:"zrok"})," environment on the container. You'll need to first ",(0,t.jsx)(n.a,{href:"/docs/getting-started/#installing-the-zrok-command",children:"enable zrok on the Docker host"})," to use this approach."]}),"\n",(0,t.jsx)(n.h2,{id:"permanent-public-share",children:"Permanent Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a ",(0,t.jsx)(n.code,{children:"compose.yml"})," file that defines a web app known within the project's bridge network as ",(0,t.jsx)(n.code,{children:"https://toaster:8080"})," and you want to publish it as a reliable, public site."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Reserve a subdomain by running ",(0,t.jsx)(n.code,{children:'zrok reserve public --unique-name "toaster" https:toasterpp:8080'})," on the Docker host."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Merge this YAML with ",(0,t.jsx)(n.code,{children:"compose.yml"})," or save it in the same directory as ",(0,t.jsx)(n.code,{children:"compose.override.yml"})," to let ",(0,t.jsx)(n.code,{children:"docker compose up"})," merge it for you."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n zrok:\n image: openziti/zrok\n restart: unless-stopped\n user: "${UID}"\n volumes:\n - ${HOME}/.zrok:/home/ziggy/.zrok\n environment:\n PFXLOG_NO_JSON: "true"\n command: share reserved "toaster" --headless\n'})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The reserved share will be available at ",(0,t.jsx)(n.code,{children:"https://toaster.share.zrok.io"})," each time the ",(0,t.jsx)(n.code,{children:"zrok"})," container starts up."]}),"\n",(0,t.jsx)(n.h2,{id:"temporary-public-share",children:"Temporary Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a web server running on the host's private network at ",(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"}),". With one additional ",(0,t.jsx)(n.code,{children:"docker"})," command, you can share the web server publicly as long as the ",(0,t.jsx)(n.code,{children:"zrok"})," container stays running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="BASH"',children:'docker run \\\n --rm \\\n --network=host \\\n --volume ~/.zrok:/home/ziggy/.zrok \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"PowerShell"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'docker.exe run `\n --rm `\n --network "host" `\n --volume "${env:USERPROFILE}\\.zrok:/.zrok" `\n --user "1000" `\n openziti/zrok share public `\n --headless `\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Command Prompt (batch)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'docker.exe run ^\n --rm ^\n --network "host" ^\n --volume "%USERPROFILE%\\.zrok:/.zrok" ^\n --user "1000" ^\n openziti/zrok share public ^\n --headless ^\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Windows Subsystem for Linux (WSL)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run \\\n --rm \\\n --network "host" \\\n --volume "/mnt/c/Users/$(powershell.exe -Command \'Write-Output $env:USERNAME\' | tr -d \'\\r\')/.zrok:/home/ziggy/.zrok" \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsx)(n.p,{children:"The public share URL appears near the beginning of the container's log."}),"\n",(0,t.jsx)(n.p,{children:"Let's break down those options and arguments."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--rm"})," don't save this container because it's providing a temporary public share that's destroyed when the container stops"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--network=host"})," shares the host's network with the container so that the container can reach the web server directly. This is always necessary when the web server is listening only on the host's loopback interface, e.g., ",(0,t.jsx)(n.code,{children:"https://::1:8080"}),", and may not be strictly necessary if the target is routeable from the default Docker bridge."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--volume ~/.zrok:/home/ziggy/.zrok"})," mounts the ",(0,t.jsx)(n.code,{children:"zrok"})," configuration from the Docker host into the container."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:'--user "${UID:-1000}:${GID:-1000}"'})," sets the container's user to the current user on the Docker host to avoid permission issues with reading the mounted ",(0,t.jsx)(n.code,{children:"zrok"})," configuration (defaults to ",(0,t.jsx)(n.code,{children:"1000:1000"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"openziti/zrok"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," Docker image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"share public"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," command to share the target publicly until zrok exits."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--headless"})," runs the ",(0,t.jsx)(n.code,{children:"zrok"})," command without the interactive terminal UI."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"})," is the target web server to share."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},7763:(e,n,r)=>{r.d(n,{A:()=>k});var s=r(6540),t=r(8215),o=r(5066),i=r(5246),c=r(9136),a=r(3535);const l={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=r(4848);function h(e){return!!e&&("SUMMARY"===e.tagName||h(e.parentElement))}function u(e,n){return!!e&&(e===n||u(e.parentElement,n))}function p(e){let{summary:n,children:r,...t}=e;(0,i.A)().collectAnchor(t.id);const p=(0,c.A)(),m=(0,s.useRef)(null),{collapsed:x,setCollapsed:j}=(0,a.u)({initialState:!t.open}),[k,g]=(0,s.useState)(t.open),b=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...t,ref:m,open:k,"data-collapsed":x,className:(0,o.A)(l.details,p&&l.isBrowser,t.className),onMouseDown:e=>{h(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;h(n)&&u(n,m.current)&&(e.preventDefault(),x?(j(!1),g(!0)):j(!0))},children:[b,(0,d.jsx)(a.N,{lazy:!1,collapsed:x,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{j(e),g(!e)},children:(0,d.jsx)("div",{className:l.collapsibleContent,children:r})})]})}const m={details:"details_b_Ee"},x="alert alert--info";function j(e){let{...n}=e;return(0,d.jsx)(p,{...n,className:(0,t.A)(x,m.details,n.className)})}function k(e){const n=s.Children.toArray(e.children),r=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),t=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==r))});return(0,d.jsx)(j,{...e,summary:r,children:t})}},8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>c});var s=r(6540);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2da89d45.c53388d7.js b/assets/js/2da89d45.c53388d7.js deleted file mode 100644 index b93c5d5e..00000000 --- a/assets/js/2da89d45.c53388d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6332],{2452:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","source":"@site/../docs/guides/docker-share/index.mdx","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/","permalink":"/docs/guides/docker-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Getting Started with Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Permission Modes","permalink":"/docs/guides/permission-modes"},"next":{"title":"Public Share","permalink":"/docs/guides/docker-share/docker_public_share_guide"}}');var t=r(4848),o=r(8453),i=r(4971);const c={title:"Getting Started with Docker"},a=void 0,l={},d=[{value:"Overview",id:"overview",level:2},{value:"Permanent Public Share",id:"permanent-public-share",level:2},{value:"Temporary Public Share",id:"temporary-public-share",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["To follow the guides in this section you will need ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You have the option to enable a ",(0,t.jsx)(n.code,{children:"zrok"})," account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (",(0,t.jsx)(n.code,{children:"compose.yml"}),") to enable a separate ",(0,t.jsx)(n.code,{children:"zrok"})," environment for each project."]}),"\n",(0,t.jsxs)(n.p,{children:["This page provides ",(0,t.jsx)(n.code,{children:"docker"})," and ",(0,t.jsx)(n.code,{children:"docker compose"})," examples of mounting the host's ",(0,t.jsx)(n.code,{children:"zrok"})," environment on the container. You'll need to first ",(0,t.jsx)(n.a,{href:"/docs/getting-started/#installing-the-zrok-command",children:"enable zrok on the Docker host"})," to use this approach."]}),"\n",(0,t.jsx)(n.h2,{id:"permanent-public-share",children:"Permanent Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a ",(0,t.jsx)(n.code,{children:"compose.yml"})," file that defines a web app known within the project's bridge network as ",(0,t.jsx)(n.code,{children:"https://toaster:8080"})," and you want to publish it as a reliable, public site."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Reserve a subdomain by running ",(0,t.jsx)(n.code,{children:'zrok reserve public --unique-name "toaster" https:toasterpp:8080'})," on the Docker host."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Merge this YAML with ",(0,t.jsx)(n.code,{children:"compose.yml"})," or save it in the same directory as ",(0,t.jsx)(n.code,{children:"compose.override.yml"})," to let ",(0,t.jsx)(n.code,{children:"docker compose up"})," merge it for you."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n zrok:\n image: openziti/zrok\n restart: unless-stopped\n user: "${UID}"\n volumes:\n - ${HOME}/.zrok:/home/ziggy/.zrok\n environment:\n PFXLOG_NO_JSON: "true"\n command: share reserved "toaster" --headless\n'})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The reserved share will be available at ",(0,t.jsx)(n.code,{children:"https://toaster.share.zrok.io"})," each time the ",(0,t.jsx)(n.code,{children:"zrok"})," container starts up."]}),"\n",(0,t.jsx)(n.h2,{id:"temporary-public-share",children:"Temporary Public Share"}),"\n",(0,t.jsxs)(n.p,{children:["Let's say you have a web server running on the host's private network at ",(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"}),". With one additional ",(0,t.jsx)(n.code,{children:"docker"})," command, you can share the web server publicly as long as the ",(0,t.jsx)(n.code,{children:"zrok"})," container stays running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="BASH"',children:'docker run \\\n --rm \\\n --network=host \\\n --volume ~/.zrok:/home/ziggy/.zrok \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"PowerShell"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'docker.exe run `\n --rm `\n --network "host" `\n --volume "${env:USERPROFILE}\\.zrok:/.zrok" `\n --user "1000" `\n openziti/zrok share public `\n --headless `\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Command Prompt (batch)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'docker.exe run ^\n --rm ^\n --network "host" ^\n --volume "%USERPROFILE%\\.zrok:/.zrok" ^\n --user "1000" ^\n openziti/zrok share public ^\n --headless ^\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)("summary",{children:"Windows Subsystem for Linux (WSL)"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run \\\n --rm \\\n --network "host" \\\n --volume "/mnt/c/Users/$(powershell.exe -Command \'Write-Output $env:USERNAME\' | tr -d \'\\r\')/.zrok:/home/ziggy/.zrok" \\\n --user "${UID:-1000}:${GID:-1000}" \\\n openziti/zrok share public \\\n --headless \\\n https://10.11.12.13:8080\n'})})]}),"\n",(0,t.jsx)(n.p,{children:"The public share URL appears near the beginning of the container's log."}),"\n",(0,t.jsx)(n.p,{children:"Let's break down those options and arguments."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--rm"})," don't save this container because it's providing a temporary public share that's destroyed when the container stops"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--network=host"})," shares the host's network with the container so that the container can reach the web server directly. This is always necessary when the web server is listening only on the host's loopback interface, e.g., ",(0,t.jsx)(n.code,{children:"https://::1:8080"}),", and may not be strictly necessary if the target is routeable from the default Docker bridge."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--volume ~/.zrok:/home/ziggy/.zrok"})," mounts the ",(0,t.jsx)(n.code,{children:"zrok"})," configuration from the Docker host into the container."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:'--user "${UID:-1000}:${GID:-1000}"'})," sets the container's user to the current user on the Docker host to avoid permission issues with reading the mounted ",(0,t.jsx)(n.code,{children:"zrok"})," configuration (defaults to ",(0,t.jsx)(n.code,{children:"1000:1000"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"openziti/zrok"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," Docker image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"share public"})," is the ",(0,t.jsx)(n.code,{children:"zrok"})," command to share the target publicly until zrok exits."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--headless"})," runs the ",(0,t.jsx)(n.code,{children:"zrok"})," command without the interactive terminal UI."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"https://10.11.12.13:8080"})," is the target web server to share."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},4971:(e,n,r)=>{r.d(n,{A:()=>k});var s=r(6540),t=r(8215),o=r(5066),i=r(3427),c=r(2303),a=r(1422);const l={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=r(4848);function h(e){return!!e&&("SUMMARY"===e.tagName||h(e.parentElement))}function u(e,n){return!!e&&(e===n||u(e.parentElement,n))}function p(e){let{summary:n,children:r,...t}=e;(0,i.A)().collectAnchor(t.id);const p=(0,c.A)(),m=(0,s.useRef)(null),{collapsed:x,setCollapsed:j}=(0,a.u)({initialState:!t.open}),[k,g]=(0,s.useState)(t.open),b=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...t,ref:m,open:k,"data-collapsed":x,className:(0,o.A)(l.details,p&&l.isBrowser,t.className),onMouseDown:e=>{h(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;h(n)&&u(n,m.current)&&(e.preventDefault(),x?(j(!1),g(!0)):j(!0))},children:[b,(0,d.jsx)(a.N,{lazy:!1,collapsed:x,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{j(e),g(!e)},children:(0,d.jsx)("div",{className:l.collapsibleContent,children:r})})]})}const m={details:"details_b_Ee"},x="alert alert--info";function j(e){let{...n}=e;return(0,d.jsx)(p,{...n,className:(0,t.A)(x,m.details,n.className)})}function k(e){const n=s.Children.toArray(e.children),r=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),t=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==r))});return(0,d.jsx)(j,{...e,summary:r,children:t})}},8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>c});var s=r(6540);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2e812224.6dc7f702.js b/assets/js/2e812224.1a40eb4c.js similarity index 99% rename from assets/js/2e812224.6dc7f702.js rename to assets/js/2e812224.1a40eb4c.js index ea87de1b..b1d407b9 100644 --- a/assets/js/2e812224.6dc7f702.js +++ b/assets/js/2e812224.1a40eb4c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8471],{8611:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","source":"@site/../docs/guides/docker-share/docker_public_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_public_share_guide","permalink":"/docs/guides/docker-share/docker_public_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/docker_public_share_guide.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Docker Compose Public Share","sidebar_position":10,"sidebar_label":"Public Share"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started with Docker","permalink":"/docs/guides/docker-share/"},"next":{"title":"Private Share","permalink":"/docs/guides/docker-share/docker_private_share_guide"}}');var o=n(4848),i=n(8453);const t={title:"Docker Compose Public Share",sidebar_position:10,sidebar_label:"Public Share"},a=void 0,c={},d=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Create the Docker Project",id:"create-the-docker-project",level:2},{value:"Proxy Any Web Server",id:"proxy-any-web-server",level:2},{value:"Require Authentication",id:"require-authentication",level:2},{value:"OAuth Email",id:"oauth-email",level:3},{value:"Caddy is Powerful",id:"caddy-is-powerful",level:2}];function l(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/concepts/sharing-public",children:"public sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/ycov--9ZtB4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a public subdomain and keep sharing the backend\ntarget."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"create-the-docker-project",children:"Create the Docker Project"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok public share with a reserved subdomain and switch to the new directory in your terminal."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsxs)(r.a,{href:"pathname:///zrok-public-reserved/compose.yml",children:["the reserved public share ",(0,o.jsx)(r.code,{children:"compose.yml"})," project file"]})," into the same directory."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok account's enable token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Name the Share"}),"\n",(0,o.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,o.jsx)(r.code,{children:"https://toaster.share.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_UNIQUE_NAME="toaster"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Run the Compose project to start sharing the built-in demo web server. Be sure to ",(0,o.jsx)(r.code,{children:"--detach"})," so the project runs in the background if you want it to auto-restart when your computer reboots."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Get the public share URL from the output of the ",(0,o.jsx)(r.code,{children:"zrok-share"})," service or by peeking in the zrok console where the share will appear in the graph."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"zrok-public-share-1 | https://w6r1vesearkj.share.zrok.io/\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"This concludes the minimum steps to begin sharing the demo web server. Read on to learn how to pivot to sharing any website or web service by leveraging additional zrok backend modes."}),"\n",(0,o.jsx)(r.h2,{id:"proxy-any-web-server",children:"Proxy Any Web Server"}),"\n",(0,o.jsxs)(r.p,{children:["The simplest way to share your existing HTTP server is to set ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (e.g. ",(0,o.jsx)(r.code,{children:"https://example.com"}),") in the environment of the ",(0,o.jsx)(r.code,{children:"docker compose up"})," command. When you restart the share will auto-configure for that URL."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_TARGET="http://example.com:8080"\n'})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down && docker compose up\n"})}),"\n",(0,o.jsx)(r.h2,{id:"require-authentication",children:"Require Authentication"}),"\n",(0,o.jsx)(r.p,{children:"You can require a password or an OAuth login with certain email addresses."}),"\n",(0,o.jsx)(r.h3,{id:"oauth-email",children:"OAuth Email"}),"\n",(0,o.jsxs)(r.p,{children:["You can allow specific email addresse patterns by setting ",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_PROVIDER"})," to ",(0,o.jsx)(r.code,{children:"github"})," or ",(0,o.jsx)(r.code,{children:"google"})," and\n",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_EMAILS"}),". Read more about the OAuth features in ",(0,o.jsx)(r.a,{href:"https://blog.openziti.io/the-zrok-oauth-public-frontend",children:"this blog\npost"}),"."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_OAUTH_PROVIDER="github"\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,o.jsx)(r.h2,{id:"caddy-is-powerful",children:"Caddy is Powerful"}),"\n",(0,o.jsxs)(r.p,{children:["The reserved public share project uses zrok's default backend mode, ",(0,o.jsx)(r.code,{children:"proxy"}),". Another backend mode, ",(0,o.jsx)(r.code,{children:"caddy"}),", accepts a path to ",(0,o.jsx)(r.a,{href:"https://caddyserver.com/docs/caddyfile",children:"a Caddyfile"})," as the value of ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (",(0,o.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/etc/caddy",children:"zrok Caddyfile examples"}),")."]}),"\n",(0,o.jsxs)(r.p,{children:["Caddy is the most powerful and flexible backend mode in zrok. You must reserve a new public subdomain whenever you switch the backend mode, so using ",(0,o.jsx)(r.code,{children:"caddy"})," reduces the risk that you'll have to share a new frontend URL with your users."]}),"\n",(0,o.jsx)(r.p,{children:"With Caddy, you can balance the workload for websites or web services or share static sites and files or all of the above at the same time. You can update the Caddyfile and restart the Docker Compose project to start sharing the new configuration with the same reserved public subdomain."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Create a Caddyfile. This example demonstrates proxying two HTTP servers with a weighted round-robin load balancer."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-console",metastring:'title="Caddyfile"',children:"http:// {\n # zrok requires this bind address template\n bind {{ .ZrokBindAddress }}\n reverse_proxy /* {\n to http://httpbin1:8080 http://httpbin2:8080\n lb_policy weighted_round_robin 3 2\n }\n}\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Create a file ",(0,o.jsx)(r.code,{children:"compose.override.yml"}),". This example adds two ",(0,o.jsx)(r.code,{children:"httpbin"})," containers for load balancing, and mounts the Caddyfile into the container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-yaml",metastring:'title="compose.override.yml"',children:"services:\n httpbin1:\n image: mccutchen/go-httpbin\n expose: 8080\n httpbin2:\n image: mccutchen/go-httpbin\n expose: 8080\n zrok-share:\n volumes:\n - ./Caddyfile:/mnt/.zrok/Caddyfile\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Start a new Docker Compose project or delete the existing state volume."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --volumes\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(r.p,{children:["If you prefer to keep using the same zrok environment with the new share then delete ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," instead of the entire volume."]}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run the project to load the new configuration."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Note the new reserved share URL from the log."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"INFO: zrok public URL: https://88s803f2qvao.share.zrok.io/\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8471],{8723:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","source":"@site/../docs/guides/docker-share/docker_public_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_public_share_guide","permalink":"/docs/guides/docker-share/docker_public_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/docker_public_share_guide.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Docker Compose Public Share","sidebar_position":10,"sidebar_label":"Public Share"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started with Docker","permalink":"/docs/guides/docker-share/"},"next":{"title":"Private Share","permalink":"/docs/guides/docker-share/docker_private_share_guide"}}');var o=n(4848),i=n(8453);const t={title:"Docker Compose Public Share",sidebar_position:10,sidebar_label:"Public Share"},a=void 0,c={},d=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Create the Docker Project",id:"create-the-docker-project",level:2},{value:"Proxy Any Web Server",id:"proxy-any-web-server",level:2},{value:"Require Authentication",id:"require-authentication",level:2},{value:"OAuth Email",id:"oauth-email",level:3},{value:"Caddy is Powerful",id:"caddy-is-powerful",level:2}];function l(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/concepts/sharing-public",children:"public sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/ycov--9ZtB4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a public subdomain and keep sharing the backend\ntarget."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"create-the-docker-project",children:"Create the Docker Project"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok public share with a reserved subdomain and switch to the new directory in your terminal."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsxs)(r.a,{href:"pathname:///zrok-public-reserved/compose.yml",children:["the reserved public share ",(0,o.jsx)(r.code,{children:"compose.yml"})," project file"]})," into the same directory."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok account's enable token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Name the Share"}),"\n",(0,o.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,o.jsx)(r.code,{children:"https://toaster.share.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_UNIQUE_NAME="toaster"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Run the Compose project to start sharing the built-in demo web server. Be sure to ",(0,o.jsx)(r.code,{children:"--detach"})," so the project runs in the background if you want it to auto-restart when your computer reboots."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Get the public share URL from the output of the ",(0,o.jsx)(r.code,{children:"zrok-share"})," service or by peeking in the zrok console where the share will appear in the graph."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"zrok-public-share-1 | https://w6r1vesearkj.share.zrok.io/\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"This concludes the minimum steps to begin sharing the demo web server. Read on to learn how to pivot to sharing any website or web service by leveraging additional zrok backend modes."}),"\n",(0,o.jsx)(r.h2,{id:"proxy-any-web-server",children:"Proxy Any Web Server"}),"\n",(0,o.jsxs)(r.p,{children:["The simplest way to share your existing HTTP server is to set ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (e.g. ",(0,o.jsx)(r.code,{children:"https://example.com"}),") in the environment of the ",(0,o.jsx)(r.code,{children:"docker compose up"})," command. When you restart the share will auto-configure for that URL."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_TARGET="http://example.com:8080"\n'})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down && docker compose up\n"})}),"\n",(0,o.jsx)(r.h2,{id:"require-authentication",children:"Require Authentication"}),"\n",(0,o.jsx)(r.p,{children:"You can require a password or an OAuth login with certain email addresses."}),"\n",(0,o.jsx)(r.h3,{id:"oauth-email",children:"OAuth Email"}),"\n",(0,o.jsxs)(r.p,{children:["You can allow specific email addresse patterns by setting ",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_PROVIDER"})," to ",(0,o.jsx)(r.code,{children:"github"})," or ",(0,o.jsx)(r.code,{children:"google"})," and\n",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_EMAILS"}),". Read more about the OAuth features in ",(0,o.jsx)(r.a,{href:"https://blog.openziti.io/the-zrok-oauth-public-frontend",children:"this blog\npost"}),"."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_OAUTH_PROVIDER="github"\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,o.jsx)(r.h2,{id:"caddy-is-powerful",children:"Caddy is Powerful"}),"\n",(0,o.jsxs)(r.p,{children:["The reserved public share project uses zrok's default backend mode, ",(0,o.jsx)(r.code,{children:"proxy"}),". Another backend mode, ",(0,o.jsx)(r.code,{children:"caddy"}),", accepts a path to ",(0,o.jsx)(r.a,{href:"https://caddyserver.com/docs/caddyfile",children:"a Caddyfile"})," as the value of ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (",(0,o.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/etc/caddy",children:"zrok Caddyfile examples"}),")."]}),"\n",(0,o.jsxs)(r.p,{children:["Caddy is the most powerful and flexible backend mode in zrok. You must reserve a new public subdomain whenever you switch the backend mode, so using ",(0,o.jsx)(r.code,{children:"caddy"})," reduces the risk that you'll have to share a new frontend URL with your users."]}),"\n",(0,o.jsx)(r.p,{children:"With Caddy, you can balance the workload for websites or web services or share static sites and files or all of the above at the same time. You can update the Caddyfile and restart the Docker Compose project to start sharing the new configuration with the same reserved public subdomain."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Create a Caddyfile. This example demonstrates proxying two HTTP servers with a weighted round-robin load balancer."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-console",metastring:'title="Caddyfile"',children:"http:// {\n # zrok requires this bind address template\n bind {{ .ZrokBindAddress }}\n reverse_proxy /* {\n to http://httpbin1:8080 http://httpbin2:8080\n lb_policy weighted_round_robin 3 2\n }\n}\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Create a file ",(0,o.jsx)(r.code,{children:"compose.override.yml"}),". This example adds two ",(0,o.jsx)(r.code,{children:"httpbin"})," containers for load balancing, and mounts the Caddyfile into the container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-yaml",metastring:'title="compose.override.yml"',children:"services:\n httpbin1:\n image: mccutchen/go-httpbin\n expose: 8080\n httpbin2:\n image: mccutchen/go-httpbin\n expose: 8080\n zrok-share:\n volumes:\n - ./Caddyfile:/mnt/.zrok/Caddyfile\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Start a new Docker Compose project or delete the existing state volume."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --volumes\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(r.p,{children:["If you prefer to keep using the same zrok environment with the new share then delete ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," instead of the entire volume."]}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run the project to load the new configuration."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Note the new reserved share URL from the log."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"INFO: zrok public URL: https://88s803f2qvao.share.zrok.io/\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2fede397.d7c9e9b3.js b/assets/js/2fede397.cf7aaa58.js similarity index 98% rename from assets/js/2fede397.d7c9e9b3.js rename to assets/js/2fede397.cf7aaa58.js index a5fa41f6..c82f6c85 100644 --- a/assets/js/2fede397.d7c9e9b3.js +++ b/assets/js/2fede397.cf7aaa58.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7120],{1308:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>a,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"guides/agent/linux-service","title":"Linux Agent Service","description":"Overview","source":"@site/../docs/guides/agent/linux-service.mdx","sourceDirName":"guides/agent","slug":"/guides/agent/linux-service","permalink":"/docs/guides/agent/linux-service","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/linux-service.mdx","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"Linux Agent Service","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Agent","permalink":"/docs/guides/agent/"},"next":{"title":"Windows Agent Service","permalink":"/docs/guides/agent/windows-service/"}}');var i=s(4848),r=s(8453);function o(e){const n={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Set up ",(0,i.jsx)(n.code,{children:"zrok"}),"'s Linux package repository by following ",(0,i.jsx)(n.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-agent\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you set up the repository by following the guide, then also install the ",(0,i.jsx)(n.code,{children:"zrok-agent"})," package. This package provides the systemd service."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-agent\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-agent\n"})}),"\n"]}),"\n"]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}const a={title:"Linux Agent Service",sidebar_position:40},l=void 0,d={},u=[{value:"Overview",id:"overview",level:2},{value:"Install the Package",id:"install-the-package",level:2},{value:"Enable your Account",id:"enable-your-account",level:2},{value:"Start the Service",id:"start-the-service",level:2},{value:"Use the agent",id:"use-the-agent",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Check the User Service Log",id:"check-the-user-service-log",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(n.p,{children:["Run the zrok agent as a ",(0,i.jsx)(n.code,{children:"systemd --user"})," service under your Linux user account."]}),"\n",(0,i.jsx)(n.h2,{id:"install-the-package",children:"Install the Package"}),"\n",(0,i.jsxs)(n.p,{children:["The package provides the ",(0,i.jsx)(n.code,{children:"zrok"})," executable and the ",(0,i.jsx)(n.code,{children:"zrok-agent.service"})," unit."]}),"\n",(0,i.jsx)(c,{}),"\n",(0,i.jsx)(n.h2,{id:"enable-your-account",children:"Enable your Account"}),"\n",(0,i.jsxs)(n.p,{children:["This creates a ",(0,i.jsx)(n.code,{children:"~/.zrok"})," directory enabled for your zrok account."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n",(0,i.jsx)(n.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"systemctl --user enable --now zrok-agent.service\n"})}),"\n",(0,i.jsx)(n.h2,{id:"use-the-agent",children:"Use the agent"}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about using the zrok agent in the ",(0,i.jsx)(n.a,{href:"/docs/guides/agent/",children:"agent guide"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(n.h3,{id:"check-the-user-service-log",children:"Check the User Service Log"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"journalctl --user -lfu zrok-agent.service\n"})})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var t=s(6540);const i={},r=t.createContext(i);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7120],{5470:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>a,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"guides/agent/linux-service","title":"Linux Agent Service","description":"Overview","source":"@site/../docs/guides/agent/linux-service.mdx","sourceDirName":"guides/agent","slug":"/guides/agent/linux-service","permalink":"/docs/guides/agent/linux-service","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/linux-service.mdx","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"Linux Agent Service","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Agent","permalink":"/docs/guides/agent/"},"next":{"title":"Windows Agent Service","permalink":"/docs/guides/agent/windows-service/"}}');var i=s(4848),r=s(8453);function o(e){const n={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Set up ",(0,i.jsx)(n.code,{children:"zrok"}),"'s Linux package repository by following ",(0,i.jsx)(n.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-agent\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you set up the repository by following the guide, then also install the ",(0,i.jsx)(n.code,{children:"zrok-agent"})," package. This package provides the systemd service."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-agent\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-agent\n"})}),"\n"]}),"\n"]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}const a={title:"Linux Agent Service",sidebar_position:40},l=void 0,d={},u=[{value:"Overview",id:"overview",level:2},{value:"Install the Package",id:"install-the-package",level:2},{value:"Enable your Account",id:"enable-your-account",level:2},{value:"Start the Service",id:"start-the-service",level:2},{value:"Use the agent",id:"use-the-agent",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Check the User Service Log",id:"check-the-user-service-log",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(n.p,{children:["Run the zrok agent as a ",(0,i.jsx)(n.code,{children:"systemd --user"})," service under your Linux user account."]}),"\n",(0,i.jsx)(n.h2,{id:"install-the-package",children:"Install the Package"}),"\n",(0,i.jsxs)(n.p,{children:["The package provides the ",(0,i.jsx)(n.code,{children:"zrok"})," executable and the ",(0,i.jsx)(n.code,{children:"zrok-agent.service"})," unit."]}),"\n",(0,i.jsx)(c,{}),"\n",(0,i.jsx)(n.h2,{id:"enable-your-account",children:"Enable your Account"}),"\n",(0,i.jsxs)(n.p,{children:["This creates a ",(0,i.jsx)(n.code,{children:"~/.zrok"})," directory enabled for your zrok account."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n",(0,i.jsx)(n.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"systemctl --user enable --now zrok-agent.service\n"})}),"\n",(0,i.jsx)(n.h2,{id:"use-the-agent",children:"Use the agent"}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about using the zrok agent in the ",(0,i.jsx)(n.a,{href:"/docs/guides/agent/",children:"agent guide"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(n.h3,{id:"check-the-user-service-log",children:"Check the User Service Log"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"journalctl --user -lfu zrok-agent.service\n"})})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var t=s(6540);const i={},r=t.createContext(i);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3042.616631a6.js b/assets/js/3042.616631a6.js new file mode 100644 index 00000000..8681ca7d --- /dev/null +++ b/assets/js/3042.616631a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3042],{5932:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(8215),s=i(539),o=i(9303),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(s.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(s.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(s.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},3042:(e,t,i)=>{i.r(t),i.d(t,{default:()=>l});i(6540);var n=i(539),s=i(9144),o=i(7912),r=i(5932),a=i(4848);function l(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.be,{title:e}),(0,a.jsx)(o.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/339d500a.749f941d.js b/assets/js/339d500a.749f941d.js deleted file mode 100644 index afe3a6f1..00000000 --- a/assets/js/339d500a.749f941d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7752],{82:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","source":"@site/../docs/concepts/tunnels.md","sourceDirName":"concepts","slug":"/concepts/tunnels","permalink":"/docs/concepts/tunnels","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/tunnels.md","tags":[],"version":"current","sidebarPosition":25,"frontMatter":{"sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Sharing HTTP Servers","permalink":"/docs/concepts/http"},"next":{"title":"Sharing Websites and Files","permalink":"/docs/concepts/files"}}');var c=s(4848),t=s(8453);const o={sidebar_position:25},i="Sharing TCP and UDP Servers",d={},a=[];function l(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"sharing-tcp-and-udp-servers",children:"Sharing TCP and UDP Servers"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.code,{children:"zrok"})," includes support for sharing low-level TCP and UDP network resources using the ",(0,c.jsx)(n.code,{children:"tcpTunnel"})," and ",(0,c.jsx)(n.code,{children:"udpTunnel"})," backend modes."]}),"\n",(0,c.jsxs)(n.p,{children:["As of version ",(0,c.jsx)(n.code,{children:"v0.4"}),", ",(0,c.jsx)(n.code,{children:"zrok"})," supports sharing TCP and UDP network resources using ",(0,c.jsx)(n.code,{children:"private"})," sharing."]}),"\n",(0,c.jsxs)(n.p,{children:["To share a raw network resource using ",(0,c.jsx)(n.code,{children:"zrok"}),", you'll want to use the ",(0,c.jsx)(n.code,{children:"zrok share private"})," command from your ",(0,c.jsx)(n.code,{children:"enable"}),"-d environment, like this:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok share private --backend-mode tcpTunnel 192.168.9.1:22\n"})}),"\n",(0,c.jsx)(n.p,{children:"This will result in a share client starting, which looks like this:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE][TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an ",(0,c.jsx)(n.code,{children:"enable"}),"-d ",(0,c.jsx)(n.code,{children:"zrok"})," environment. Run the following command (shown in the banner at the top of the ",(0,c.jsx)(n.code,{children:"zrok share"})," client above):"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok access private 5adagwfl888k\n"})}),"\n",(0,c.jsxs)(n.p,{children:["This will start an ",(0,c.jsx)(n.code,{children:"access"})," client on this system:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"access"})," client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to ",(0,c.jsx)(n.code,{children:"127.0.0.1:9191"}),". We'll just use ",(0,c.jsx)(n.code,{children:"nc"})," (netcat) to access the shared TCP port:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ nc 127.0.0.1 9191\nSSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1\n"})}),"\n",(0,c.jsxs)(n.p,{children:["And both the ",(0,c.jsx)(n.code,{children:"share"})," client and the ",(0,c.jsx)(n.code,{children:"access"})," client show the traffic:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE] [TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router \u2502\n\u2502connId=2147483648, logical=ziti- \u2502\n\u2502sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Exit the ",(0,c.jsx)(n.code,{children:"access"})," client to remove the local access to the shared TCP port. Exit the ",(0,c.jsx)(n.code,{children:"share"})," client to disable further accesses to the shared resource."]}),"\n",(0,c.jsxs)(n.p,{children:["For UDP network resources just use the ",(0,c.jsx)(n.code,{children:"zrok share private --backend-mode udpTunnel"})," instead of ",(0,c.jsx)(n.code,{children:"tcpTunnel"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const c={},t=r.createContext(c);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/339d500a.f2d81bcd.js b/assets/js/339d500a.f2d81bcd.js new file mode 100644 index 00000000..f9debf59 --- /dev/null +++ b/assets/js/339d500a.f2d81bcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7752],{9e3:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","source":"@site/../docs/concepts/tunnels.md","sourceDirName":"concepts","slug":"/concepts/tunnels","permalink":"/docs/concepts/tunnels","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/tunnels.md","tags":[],"version":"current","sidebarPosition":25,"frontMatter":{"sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Sharing HTTP Servers","permalink":"/docs/concepts/http"},"next":{"title":"Sharing Websites and Files","permalink":"/docs/concepts/files"}}');var c=s(4848),t=s(8453);const o={sidebar_position:25},i="Sharing TCP and UDP Servers",d={},a=[];function l(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"sharing-tcp-and-udp-servers",children:"Sharing TCP and UDP Servers"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.code,{children:"zrok"})," includes support for sharing low-level TCP and UDP network resources using the ",(0,c.jsx)(n.code,{children:"tcpTunnel"})," and ",(0,c.jsx)(n.code,{children:"udpTunnel"})," backend modes."]}),"\n",(0,c.jsxs)(n.p,{children:["As of version ",(0,c.jsx)(n.code,{children:"v0.4"}),", ",(0,c.jsx)(n.code,{children:"zrok"})," supports sharing TCP and UDP network resources using ",(0,c.jsx)(n.code,{children:"private"})," sharing."]}),"\n",(0,c.jsxs)(n.p,{children:["To share a raw network resource using ",(0,c.jsx)(n.code,{children:"zrok"}),", you'll want to use the ",(0,c.jsx)(n.code,{children:"zrok share private"})," command from your ",(0,c.jsx)(n.code,{children:"enable"}),"-d environment, like this:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok share private --backend-mode tcpTunnel 192.168.9.1:22\n"})}),"\n",(0,c.jsx)(n.p,{children:"This will result in a share client starting, which looks like this:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE][TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an ",(0,c.jsx)(n.code,{children:"enable"}),"-d ",(0,c.jsx)(n.code,{children:"zrok"})," environment. Run the following command (shown in the banner at the top of the ",(0,c.jsx)(n.code,{children:"zrok share"})," client above):"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok access private 5adagwfl888k\n"})}),"\n",(0,c.jsxs)(n.p,{children:["This will start an ",(0,c.jsx)(n.code,{children:"access"})," client on this system:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"access"})," client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to ",(0,c.jsx)(n.code,{children:"127.0.0.1:9191"}),". We'll just use ",(0,c.jsx)(n.code,{children:"nc"})," (netcat) to access the shared TCP port:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ nc 127.0.0.1 9191\nSSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1\n"})}),"\n",(0,c.jsxs)(n.p,{children:["And both the ",(0,c.jsx)(n.code,{children:"share"})," client and the ",(0,c.jsx)(n.code,{children:"access"})," client show the traffic:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE] [TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router \u2502\n\u2502connId=2147483648, logical=ziti- \u2502\n\u2502sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Exit the ",(0,c.jsx)(n.code,{children:"access"})," client to remove the local access to the shared TCP port. Exit the ",(0,c.jsx)(n.code,{children:"share"})," client to disable further accesses to the shared resource."]}),"\n",(0,c.jsxs)(n.p,{children:["For UDP network resources just use the ",(0,c.jsx)(n.code,{children:"zrok share private --backend-mode udpTunnel"})," instead of ",(0,c.jsx)(n.code,{children:"tcpTunnel"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const c={},t=r.createContext(c);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35a60099.7bc9aad5.js b/assets/js/35a60099.e9f86877.js similarity index 96% rename from assets/js/35a60099.7bc9aad5.js rename to assets/js/35a60099.e9f86877.js index 03323b92..9062c21c 100644 --- a/assets/js/35a60099.7bc9aad5.js +++ b/assets/js/35a60099.e9f86877.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9148],{9429:(e,s,r)=>{r.d(s,{Ay:()=>t,RM:()=>i});var n=r(4848),c=r(8453);const i=[];function o(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,c.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function t(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},8808:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>t,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","source":"@site/versioned_docs/version-0.4/concepts/sharing-public.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-public","permalink":"/docs/0.4/concepts/sharing-public","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-public.mdx","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Private Shares","permalink":"/docs/0.4/concepts/sharing-private"},"next":{"title":"Reserved Shares","permalink":"/docs/0.4/concepts/sharing-reserved"}}');var c=r(4848),i=r(8453),o=r(9429);const t={sidebar_position:10},d="Public Shares",a={},l=[{value:"Peer to Public",id:"peer-to-public",level:2},{value:"Public Backend Modes",id:"public-backend-modes",level:2},...o.RM];function h(e){const s={code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.header,{children:(0,c.jsx)(s.h1,{id:"public-shares",children:"Public Shares"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"zrok"})," supports ",(0,c.jsx)(s.code,{children:"public"})," sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points."]}),"\n",(0,c.jsx)(s.h2,{id:"peer-to-public",children:"Peer to Public"}),"\n",(0,c.jsx)(s.p,{children:(0,c.jsx)(s.img,{alt:"zrok_public_share",src:r(2935).A+"",width:"2200",height:"916"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"public"})," sharing is most useful when the person or service accessing your resources does not have ",(0,c.jsx)(s.code,{children:"zrok"})," running locally and cannot make use of the ",(0,c.jsx)(s.code,{children:"private"})," sharing mode built into ",(0,c.jsx)(s.code,{children:"zrok"}),". Many users share development web servers, webhooks, and other HTTP/HTTPS resources."]}),"\n",(0,c.jsxs)(s.p,{children:["As with ",(0,c.jsx)(s.code,{children:"private"})," sharing, ",(0,c.jsx)(s.code,{children:"public"})," sharing does not require you to open any firewall ports or otherwise compromise the security of your local environments. A ",(0,c.jsx)(s.code,{children:"public"})," share goes away as soon as you terminate the ",(0,c.jsx)(s.code,{children:"zrok share"})," command."]}),"\n",(0,c.jsxs)(s.p,{children:["Using ",(0,c.jsx)(s.code,{children:"public"})," shares is easy and is accomplished using the ",(0,c.jsx)(s.code,{children:"zrok share public"})," command. Run ",(0,c.jsx)(s.code,{children:"zrok share public"})," to see the command-line help and to learn how to use ",(0,c.jsx)(s.code,{children:"public"})," shares."]}),"\n",(0,c.jsx)(s.h2,{id:"public-backend-modes",children:"Public Backend Modes"}),"\n",(0,c.jsxs)(s.p,{children:["The default backend mode is ",(0,c.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,c.jsx)(s.pre,{children:(0,c.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share public 80\n"})}),"\n",(0,c.jsx)(o.Ay,{})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,c.jsx)(s,{...e,children:(0,c.jsx)(h,{...e})}):h(e)}},2935:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_public_share-1eec22cb798395c2bcd3ac10465f62ca.png"},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>t});var n=r(6540);const c={},i=n.createContext(c);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9148],{9216:(e,s,r)=>{r.d(s,{Ay:()=>t,RM:()=>i});var n=r(4848),c=r(8453);const i=[];function o(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,c.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function t(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},2397:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>t,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","source":"@site/versioned_docs/version-0.4/concepts/sharing-public.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-public","permalink":"/docs/0.4/concepts/sharing-public","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-public.mdx","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Private Shares","permalink":"/docs/0.4/concepts/sharing-private"},"next":{"title":"Reserved Shares","permalink":"/docs/0.4/concepts/sharing-reserved"}}');var c=r(4848),i=r(8453),o=r(9216);const t={sidebar_position:10},d="Public Shares",a={},l=[{value:"Peer to Public",id:"peer-to-public",level:2},{value:"Public Backend Modes",id:"public-backend-modes",level:2},...o.RM];function h(e){const s={code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.header,{children:(0,c.jsx)(s.h1,{id:"public-shares",children:"Public Shares"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"zrok"})," supports ",(0,c.jsx)(s.code,{children:"public"})," sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points."]}),"\n",(0,c.jsx)(s.h2,{id:"peer-to-public",children:"Peer to Public"}),"\n",(0,c.jsx)(s.p,{children:(0,c.jsx)(s.img,{alt:"zrok_public_share",src:r(2935).A+"",width:"2200",height:"916"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"public"})," sharing is most useful when the person or service accessing your resources does not have ",(0,c.jsx)(s.code,{children:"zrok"})," running locally and cannot make use of the ",(0,c.jsx)(s.code,{children:"private"})," sharing mode built into ",(0,c.jsx)(s.code,{children:"zrok"}),". Many users share development web servers, webhooks, and other HTTP/HTTPS resources."]}),"\n",(0,c.jsxs)(s.p,{children:["As with ",(0,c.jsx)(s.code,{children:"private"})," sharing, ",(0,c.jsx)(s.code,{children:"public"})," sharing does not require you to open any firewall ports or otherwise compromise the security of your local environments. A ",(0,c.jsx)(s.code,{children:"public"})," share goes away as soon as you terminate the ",(0,c.jsx)(s.code,{children:"zrok share"})," command."]}),"\n",(0,c.jsxs)(s.p,{children:["Using ",(0,c.jsx)(s.code,{children:"public"})," shares is easy and is accomplished using the ",(0,c.jsx)(s.code,{children:"zrok share public"})," command. Run ",(0,c.jsx)(s.code,{children:"zrok share public"})," to see the command-line help and to learn how to use ",(0,c.jsx)(s.code,{children:"public"})," shares."]}),"\n",(0,c.jsx)(s.h2,{id:"public-backend-modes",children:"Public Backend Modes"}),"\n",(0,c.jsxs)(s.p,{children:["The default backend mode is ",(0,c.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,c.jsx)(s.pre,{children:(0,c.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share public 80\n"})}),"\n",(0,c.jsx)(o.Ay,{})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,c.jsx)(s,{...e,children:(0,c.jsx)(h,{...e})}):h(e)}},2935:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_public_share-1eec22cb798395c2bcd3ac10465f62ca.png"},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>t});var n=r(6540);const c={},i=n.createContext(c);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36b94792.799856c4.js b/assets/js/36b94792.4fa1b781.js similarity index 99% rename from assets/js/36b94792.799856c4.js rename to assets/js/36b94792.4fa1b781.js index 2299e35b..e6f3d637 100644 --- a/assets/js/36b94792.799856c4.js +++ b/assets/js/36b94792.4fa1b781.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3921],{3160:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","source":"@site/../docs/guides/drives.mdx","sourceDirName":"guides","slug":"/guides/drives","permalink":"/docs/guides/drives","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/drives.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Invitations","permalink":"/docs/guides/self-hosting/self-service-invite"},"next":{"title":"VPN","permalink":"/docs/guides/vpn/"}}');var s=r(4848),o=r(8453);const t={},c="Drives",a={},d=[{value:"Sharing a Drive",id:"sharing-a-drive",level:2},{value:"Working with a Private Drive Share",id:"working-with-a-private-drive-share",level:2},{value:"Working with Public Shares",id:"working-with-public-shares",level:2},{value:"One-way Synchronization",id:"one-way-synchronization",level:2},{value:"Drive-to-Drive Copies and Synchronization",id:"drive-to-drive-copies-and-synchronization",level:2},{value:"Copying from Drives to the Local Filesystem",id:"copying-from-drives-to-the-local-filesystem",level:2},{value:"Unique Names and Reserved Shares",id:"unique-names-and-reserved-shares",level:2},{value:"Future Enhancements",id:"future-enhancements",level:2}];function l(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"drives",children:"Drives"})}),"\n",(0,s.jsx)(n.p,{children:"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files."}),"\n",(0,s.jsx)(n.h2,{id:"sharing-a-drive",children:"Sharing a Drive"}),"\n",(0,s.jsxs)(n.p,{children:["Virtual drives are shared through the ",(0,s.jsx)(n.code,{children:"zrok"})," CLI using the ",(0,s.jsx)(n.code,{children:"--backend-mode drive"})," flag through the ",(0,s.jsx)(n.code,{children:"zrok share"})," command, using either the ",(0,s.jsx)(n.code,{children:"public"})," or ",(0,s.jsx)(n.code,{children:"private"})," sharing modes. We'll use the ",(0,s.jsx)(n.code,{children:"private"})," sharing mode for this example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ mkdir /tmp/junk\n$ zrok share private --headless --backend-mode drive /tmp/junk\n[ 0.124] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[cf640aac-2706-49ae-9cc9-9a497d67d9c5]} new service session\n[ 0.145] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private wkcfb58vj51l\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The command shown above creates an ephemeral, ",(0,s.jsx)(n.code,{children:"private"})," drive share pointed at the local ",(0,s.jsx)(n.code,{children:"/tmp/junk"})," folder."]}),"\n",(0,s.jsxs)(n.p,{children:["Notice that the share token allocated by ",(0,s.jsx)(n.code,{children:"zrok"})," is ",(0,s.jsx)(n.code,{children:"wkcfb58vj51l"}),". We'll use that share token to identify our virtual drive in the following operations."]}),"\n",(0,s.jsx)(n.h2,{id:"working-with-a-private-drive-share",children:"Working with a Private Drive Share"}),"\n",(0,s.jsxs)(n.p,{children:["First, let's copy a file into our virtual drive using the ",(0,s.jsx)(n.code,{children:"zrok copy"})," command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy LICENSE zrok://wkcfb58vj51l\n[ 0.119] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We used the URL scheme ",(0,s.jsx)(n.code,{children:"zrok://<shareToken>"})," to refer to the private virtual drive we allocated above using the ",(0,s.jsx)(n.code,{children:"zrok share private"})," command. Use ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs with the drives CLI tools to refer to contents of private virtual drives."]}),"\n",(0,s.jsx)(n.p,{children:"Next, let's get a directory listing of the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can make directories on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok mkdir zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can copy the contents of a local directory into the new directory on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ ls -l util/\ntotal 20\n-rw-rw-r-- 1 michael michael 329 Jul 21 13:17 email.go\n-rw-rw-r-- 1 michael michael 456 Jul 21 13:17 headers.go\n-rw-rw-r-- 1 michael michael 609 Jul 21 13:17 proxy.go\n-rw-rw-r-- 1 michael michael 361 Jul 21 13:17 size.go\n-rw-rw-r-- 1 michael michael 423 Jan 2 11:57 uniqueName.go\n$ zrok copy util/ zrok://wkcfb58vj51l/stuff\n[ 0.123] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.194] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.267] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.337] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.408] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\n$ zrok ls zrok://wkcfb58vj51l/stuff\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"And we can remove files and directories from the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm zrok://wkcfb58vj51l/LICENSE\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok rm zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"working-with-public-shares",children:"Working with Public Shares"}),"\n",(0,s.jsx)(n.p,{children:"Public shares work very similarly to private shares, they just use a different URL scheme:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok share public --headless --backend-mode drive /tmp/junk\n[ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session\n[ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:\n https://6kiww4bn7iok.share.zrok.io\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The same commands, with a different URL scheme work with the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy util/ https://6kiww4bn7iok.share.zrok.io\n[ 0.268] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.655] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\nmichael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok \n$ zrok ls https://6kiww4bn7iok.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-02 11:57:14 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For basic authentication provided by public shares, the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI offers the ",(0,s.jsx)(n.code,{children:"--basic-auth"})," flag, which accepts a ",(0,s.jsx)(n.code,{children:"<username>:<password>"})," parameter to specify the authentication for the public virtual drive (if it's required)."]}),"\n",(0,s.jsxs)(n.p,{children:["Alternatively, the authentication can be set using the ",(0,s.jsx)(n.code,{children:"ZROK_DRIVES_BASIC_AUTH"})," environment variable:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ export ZROK_DRIVES_BASIC_AUTH=username:password\n"})}),"\n",(0,s.jsx)(n.h2,{id:"one-way-synchronization",children:"One-way Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," command includes a ",(0,s.jsx)(n.code,{children:"--sync"})," flag, which only copies files detected as ",(0,s.jsx)(n.em,{children:"modified"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," considers a file with the same modification timestamp and size to be the same. Of course, this is not a strong guarantee that the files are equivalent. Future ",(0,s.jsx)(n.code,{children:"zrok"})," drives versions will provide a cryptographically strong mechanism (a-la ",(0,s.jsx)(n.code,{children:"rsync"})," and friends) to guarantee that files and trees of files are synchronized."]}),"\n",(0,s.jsxs)(n.p,{children:["For now, the ",(0,s.jsx)(n.code,{children:"--sync"})," flag provides a convenience mechanism to allow resuming copies of large file trees and provide a reasonable guarantee that the trees are in sync."]}),"\n",(0,s.jsxs)(n.p,{children:["Let's take a look at ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," in action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.636] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 0.760] INFO zrok/drives/sync.OneWay: => /_attic/network/\n[ 0.816] INFO zrok/drives/sync.OneWay: => /_attic/network/_category_.json\n[ 0.928] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/\n[ 0.987] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.service\n[ 1.048] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.yml\n[ 1.107] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.service\n[ 1.167] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.yml\n[ 1.218] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-access-public.service\n[ 1.273] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.service\n[ 1.328] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.yml\n[ 1.382] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok.io-network-skeleton.md\n[ 1.447] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 1.572] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n[ 1.622] INFO zrok/drives/sync.OneWay: => /_attic/sharing/_category_.json\n[ 1.673] INFO zrok/drives/sync.OneWay: => /_attic/sharing/reserved_services.md\n[ 1.737] INFO zrok/drives/sync.OneWay: => /_attic/sharing/sharing_modes.md\n[ 1.793] INFO zrok/drives/sync.OneWay: => /_attic/v0.2_account_requests.md\n[ 1.902] INFO zrok/drives/sync.OneWay: => /_attic/v0.4_limits.md\n...\n[ 9.691] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 9.812] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 9.870] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because the target drive was empty, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," copied the entire contents of the local ",(0,s.jsx)(n.code,{children:"docs/"})," tree into the virtual drive. However, if we run that command again, we get:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.p,{children:"The virtual drive contents are already in sync with the local filesystem tree, so there is nothing for it to copy."}),"\n",(0,s.jsxs)(n.p,{children:["Let's alter the contents of the drive and run the ",(0,s.jsx)(n.code,{children:"--sync"})," again:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm https://glmv049c62p7.share.zrok.io/images\n$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.364] INFO zrok/drives/sync.OneWay: => /images/\n[ 0.456] INFO zrok/drives/sync.OneWay: => /images/zrok.png\n[ 0.795] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 0.866] INFO zrok/drives/sync.OneWay: => /images/zrok_deployment.drawio\n...\n[ 2.254] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 2.340] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 2.391] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because we removed the ",(0,s.jsx)(n.code,{children:"images/"})," tree from the virtual drive, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," detected this and copied the local ",(0,s.jsx)(n.code,{children:"images/"})," tree back onto the virtual drive."]}),"\n",(0,s.jsx)(n.h2,{id:"drive-to-drive-copies-and-synchronization",children:"Drive-to-Drive Copies and Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," CLI can operate on pairs of virtual drives remotely, without ever having to store files locally. This allow for drive-to-drive copies and synchronization."]}),"\n",(0,s.jsx)(n.p,{children:"Here are a couple of examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Specifying the same URL for both the source and the target of a ",(0,s.jsx)(n.code,{children:"--sync"})," operation should always result in nothing being copied... they are the same drive with the same state."]}),"\n",(0,s.jsx)(n.p,{children:"We can copy files between two virtual drives with a single command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\n[ 1.396] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 2.083] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 2.704] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n...\n[ 118.240] INFO zrok/drives/sync.OneWay: => /images/zrok_web_console_empty.png\n[ 118.920] INFO zrok/drives/sync.OneWay: => /images/zrok_enable_modal.png\n[ 119.589] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 120.214] INFO zrok/drives/sync.OneWay: => /getting-started.mdx\ncopy complete!\n$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.h2,{id:"copying-from-drives-to-the-local-filesystem",children:"Copying from Drives to the Local Filesystem"}),"\n",(0,s.jsxs)(n.p,{children:["In the current version of the drives CLI, ",(0,s.jsx)(n.code,{children:"zrok copy"})," always assumes the destination is a directory. There is currently no way to do:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy somefile someotherfile\n"})}),"\n",(0,s.jsx)(n.p,{children:"What you'll end up with on the local filesystem is:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"somefile\nsomeotherfile/somefile\n"})}),"\n",(0,s.jsxs)(n.p,{children:["It's in the backlog to support file destinations in a future release of ",(0,s.jsx)(n.code,{children:"zrok"}),". So, when using ",(0,s.jsx)(n.code,{children:"zrok copy"}),", always take note of the destination."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"zrok copy"})," supports a default destination of ",(0,s.jsx)(n.code,{children:"file://."}),", so you can do single parameter ",(0,s.jsx)(n.code,{children:"zrok copy"})," commands like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls https://azc47r3cwjds.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE\n[ 0.260] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n$ ls -l\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:29 LICENSE\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can also specify a local folder as the destination for your copy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE /tmp/inbox\n[ 0.221] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete! \n$ l /tmp/inbox\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:30 LICENSE\n"})}),"\n",(0,s.jsx)(n.h2,{id:"unique-names-and-reserved-shares",children:"Unique Names and Reserved Shares"}),"\n",(0,s.jsx)(n.p,{children:"Private reserved shares with unque names can be particularly useful with the drives CLI:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok reserve private -b drive --unique-name mydrive /tmp/junk\n[ 0.315] INFO main.(*reserveCommand).run: your reserved share token is 'mydrive'\n$ zrok share reserved --headless mydrive\n[ 0.289] INFO main.(*shareReservedCommand).run: sharing target: '/tmp/junk'\n[ 0.289] INFO main.(*shareReservedCommand).run: using existing backend target: /tmp/junk\n[ 0.767] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[d519a436-9fb5-4207-afd5-7cbc28fb779a]} new service session\n[ 0.927] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private mydrive'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This makes working with ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs particularly convenient:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://mydrive\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"future-enhancements",children:"Future Enhancements"}),"\n",(0,s.jsxs)(n.p,{children:["Coming in a future release of ",(0,s.jsx)(n.code,{children:"zrok"})," drives are features like:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'two-way synchronization between multiple hosts... allowing for shared "dropbox-like" usage scenarios between multiple environments'}),"\n",(0,s.jsx)(n.li,{children:"better ergonomics for single-file destinations"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>c});var i=r(6540);const s={},o=i.createContext(s);function t(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3921],{4123:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","source":"@site/../docs/guides/drives.mdx","sourceDirName":"guides","slug":"/guides/drives","permalink":"/docs/guides/drives","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/drives.mdx","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Invitations","permalink":"/docs/guides/self-hosting/self-service-invite"},"next":{"title":"VPN","permalink":"/docs/guides/vpn/"}}');var s=r(4848),o=r(8453);const t={},c="Drives",a={},d=[{value:"Sharing a Drive",id:"sharing-a-drive",level:2},{value:"Working with a Private Drive Share",id:"working-with-a-private-drive-share",level:2},{value:"Working with Public Shares",id:"working-with-public-shares",level:2},{value:"One-way Synchronization",id:"one-way-synchronization",level:2},{value:"Drive-to-Drive Copies and Synchronization",id:"drive-to-drive-copies-and-synchronization",level:2},{value:"Copying from Drives to the Local Filesystem",id:"copying-from-drives-to-the-local-filesystem",level:2},{value:"Unique Names and Reserved Shares",id:"unique-names-and-reserved-shares",level:2},{value:"Future Enhancements",id:"future-enhancements",level:2}];function l(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"drives",children:"Drives"})}),"\n",(0,s.jsx)(n.p,{children:"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files."}),"\n",(0,s.jsx)(n.h2,{id:"sharing-a-drive",children:"Sharing a Drive"}),"\n",(0,s.jsxs)(n.p,{children:["Virtual drives are shared through the ",(0,s.jsx)(n.code,{children:"zrok"})," CLI using the ",(0,s.jsx)(n.code,{children:"--backend-mode drive"})," flag through the ",(0,s.jsx)(n.code,{children:"zrok share"})," command, using either the ",(0,s.jsx)(n.code,{children:"public"})," or ",(0,s.jsx)(n.code,{children:"private"})," sharing modes. We'll use the ",(0,s.jsx)(n.code,{children:"private"})," sharing mode for this example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ mkdir /tmp/junk\n$ zrok share private --headless --backend-mode drive /tmp/junk\n[ 0.124] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[cf640aac-2706-49ae-9cc9-9a497d67d9c5]} new service session\n[ 0.145] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private wkcfb58vj51l\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The command shown above creates an ephemeral, ",(0,s.jsx)(n.code,{children:"private"})," drive share pointed at the local ",(0,s.jsx)(n.code,{children:"/tmp/junk"})," folder."]}),"\n",(0,s.jsxs)(n.p,{children:["Notice that the share token allocated by ",(0,s.jsx)(n.code,{children:"zrok"})," is ",(0,s.jsx)(n.code,{children:"wkcfb58vj51l"}),". We'll use that share token to identify our virtual drive in the following operations."]}),"\n",(0,s.jsx)(n.h2,{id:"working-with-a-private-drive-share",children:"Working with a Private Drive Share"}),"\n",(0,s.jsxs)(n.p,{children:["First, let's copy a file into our virtual drive using the ",(0,s.jsx)(n.code,{children:"zrok copy"})," command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy LICENSE zrok://wkcfb58vj51l\n[ 0.119] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We used the URL scheme ",(0,s.jsx)(n.code,{children:"zrok://<shareToken>"})," to refer to the private virtual drive we allocated above using the ",(0,s.jsx)(n.code,{children:"zrok share private"})," command. Use ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs with the drives CLI tools to refer to contents of private virtual drives."]}),"\n",(0,s.jsx)(n.p,{children:"Next, let's get a directory listing of the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can make directories on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok mkdir zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can copy the contents of a local directory into the new directory on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ ls -l util/\ntotal 20\n-rw-rw-r-- 1 michael michael 329 Jul 21 13:17 email.go\n-rw-rw-r-- 1 michael michael 456 Jul 21 13:17 headers.go\n-rw-rw-r-- 1 michael michael 609 Jul 21 13:17 proxy.go\n-rw-rw-r-- 1 michael michael 361 Jul 21 13:17 size.go\n-rw-rw-r-- 1 michael michael 423 Jan 2 11:57 uniqueName.go\n$ zrok copy util/ zrok://wkcfb58vj51l/stuff\n[ 0.123] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.194] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.267] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.337] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.408] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\n$ zrok ls zrok://wkcfb58vj51l/stuff\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"And we can remove files and directories from the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm zrok://wkcfb58vj51l/LICENSE\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok rm zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"working-with-public-shares",children:"Working with Public Shares"}),"\n",(0,s.jsx)(n.p,{children:"Public shares work very similarly to private shares, they just use a different URL scheme:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok share public --headless --backend-mode drive /tmp/junk\n[ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session\n[ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:\n https://6kiww4bn7iok.share.zrok.io\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The same commands, with a different URL scheme work with the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy util/ https://6kiww4bn7iok.share.zrok.io\n[ 0.268] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.655] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\nmichael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok \n$ zrok ls https://6kiww4bn7iok.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-02 11:57:14 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For basic authentication provided by public shares, the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI offers the ",(0,s.jsx)(n.code,{children:"--basic-auth"})," flag, which accepts a ",(0,s.jsx)(n.code,{children:"<username>:<password>"})," parameter to specify the authentication for the public virtual drive (if it's required)."]}),"\n",(0,s.jsxs)(n.p,{children:["Alternatively, the authentication can be set using the ",(0,s.jsx)(n.code,{children:"ZROK_DRIVES_BASIC_AUTH"})," environment variable:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ export ZROK_DRIVES_BASIC_AUTH=username:password\n"})}),"\n",(0,s.jsx)(n.h2,{id:"one-way-synchronization",children:"One-way Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," command includes a ",(0,s.jsx)(n.code,{children:"--sync"})," flag, which only copies files detected as ",(0,s.jsx)(n.em,{children:"modified"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," considers a file with the same modification timestamp and size to be the same. Of course, this is not a strong guarantee that the files are equivalent. Future ",(0,s.jsx)(n.code,{children:"zrok"})," drives versions will provide a cryptographically strong mechanism (a-la ",(0,s.jsx)(n.code,{children:"rsync"})," and friends) to guarantee that files and trees of files are synchronized."]}),"\n",(0,s.jsxs)(n.p,{children:["For now, the ",(0,s.jsx)(n.code,{children:"--sync"})," flag provides a convenience mechanism to allow resuming copies of large file trees and provide a reasonable guarantee that the trees are in sync."]}),"\n",(0,s.jsxs)(n.p,{children:["Let's take a look at ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," in action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.636] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 0.760] INFO zrok/drives/sync.OneWay: => /_attic/network/\n[ 0.816] INFO zrok/drives/sync.OneWay: => /_attic/network/_category_.json\n[ 0.928] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/\n[ 0.987] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.service\n[ 1.048] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.yml\n[ 1.107] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.service\n[ 1.167] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.yml\n[ 1.218] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-access-public.service\n[ 1.273] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.service\n[ 1.328] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.yml\n[ 1.382] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok.io-network-skeleton.md\n[ 1.447] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 1.572] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n[ 1.622] INFO zrok/drives/sync.OneWay: => /_attic/sharing/_category_.json\n[ 1.673] INFO zrok/drives/sync.OneWay: => /_attic/sharing/reserved_services.md\n[ 1.737] INFO zrok/drives/sync.OneWay: => /_attic/sharing/sharing_modes.md\n[ 1.793] INFO zrok/drives/sync.OneWay: => /_attic/v0.2_account_requests.md\n[ 1.902] INFO zrok/drives/sync.OneWay: => /_attic/v0.4_limits.md\n...\n[ 9.691] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 9.812] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 9.870] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because the target drive was empty, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," copied the entire contents of the local ",(0,s.jsx)(n.code,{children:"docs/"})," tree into the virtual drive. However, if we run that command again, we get:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.p,{children:"The virtual drive contents are already in sync with the local filesystem tree, so there is nothing for it to copy."}),"\n",(0,s.jsxs)(n.p,{children:["Let's alter the contents of the drive and run the ",(0,s.jsx)(n.code,{children:"--sync"})," again:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm https://glmv049c62p7.share.zrok.io/images\n$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.364] INFO zrok/drives/sync.OneWay: => /images/\n[ 0.456] INFO zrok/drives/sync.OneWay: => /images/zrok.png\n[ 0.795] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 0.866] INFO zrok/drives/sync.OneWay: => /images/zrok_deployment.drawio\n...\n[ 2.254] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 2.340] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 2.391] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because we removed the ",(0,s.jsx)(n.code,{children:"images/"})," tree from the virtual drive, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," detected this and copied the local ",(0,s.jsx)(n.code,{children:"images/"})," tree back onto the virtual drive."]}),"\n",(0,s.jsx)(n.h2,{id:"drive-to-drive-copies-and-synchronization",children:"Drive-to-Drive Copies and Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," CLI can operate on pairs of virtual drives remotely, without ever having to store files locally. This allow for drive-to-drive copies and synchronization."]}),"\n",(0,s.jsx)(n.p,{children:"Here are a couple of examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Specifying the same URL for both the source and the target of a ",(0,s.jsx)(n.code,{children:"--sync"})," operation should always result in nothing being copied... they are the same drive with the same state."]}),"\n",(0,s.jsx)(n.p,{children:"We can copy files between two virtual drives with a single command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\n[ 1.396] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 2.083] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 2.704] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n...\n[ 118.240] INFO zrok/drives/sync.OneWay: => /images/zrok_web_console_empty.png\n[ 118.920] INFO zrok/drives/sync.OneWay: => /images/zrok_enable_modal.png\n[ 119.589] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 120.214] INFO zrok/drives/sync.OneWay: => /getting-started.mdx\ncopy complete!\n$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.h2,{id:"copying-from-drives-to-the-local-filesystem",children:"Copying from Drives to the Local Filesystem"}),"\n",(0,s.jsxs)(n.p,{children:["In the current version of the drives CLI, ",(0,s.jsx)(n.code,{children:"zrok copy"})," always assumes the destination is a directory. There is currently no way to do:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy somefile someotherfile\n"})}),"\n",(0,s.jsx)(n.p,{children:"What you'll end up with on the local filesystem is:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"somefile\nsomeotherfile/somefile\n"})}),"\n",(0,s.jsxs)(n.p,{children:["It's in the backlog to support file destinations in a future release of ",(0,s.jsx)(n.code,{children:"zrok"}),". So, when using ",(0,s.jsx)(n.code,{children:"zrok copy"}),", always take note of the destination."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"zrok copy"})," supports a default destination of ",(0,s.jsx)(n.code,{children:"file://."}),", so you can do single parameter ",(0,s.jsx)(n.code,{children:"zrok copy"})," commands like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls https://azc47r3cwjds.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE\n[ 0.260] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n$ ls -l\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:29 LICENSE\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can also specify a local folder as the destination for your copy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE /tmp/inbox\n[ 0.221] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete! \n$ l /tmp/inbox\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:30 LICENSE\n"})}),"\n",(0,s.jsx)(n.h2,{id:"unique-names-and-reserved-shares",children:"Unique Names and Reserved Shares"}),"\n",(0,s.jsx)(n.p,{children:"Private reserved shares with unque names can be particularly useful with the drives CLI:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok reserve private -b drive --unique-name mydrive /tmp/junk\n[ 0.315] INFO main.(*reserveCommand).run: your reserved share token is 'mydrive'\n$ zrok share reserved --headless mydrive\n[ 0.289] INFO main.(*shareReservedCommand).run: sharing target: '/tmp/junk'\n[ 0.289] INFO main.(*shareReservedCommand).run: using existing backend target: /tmp/junk\n[ 0.767] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[d519a436-9fb5-4207-afd5-7cbc28fb779a]} new service session\n[ 0.927] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private mydrive'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This makes working with ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs particularly convenient:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://mydrive\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"future-enhancements",children:"Future Enhancements"}),"\n",(0,s.jsxs)(n.p,{children:["Coming in a future release of ",(0,s.jsx)(n.code,{children:"zrok"})," drives are features like:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'two-way synchronization between multiple hosts... allowing for shared "dropbox-like" usage scenarios between multiple environments'}),"\n",(0,s.jsx)(n.li,{children:"better ergonomics for single-file destinations"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>c});var i=r(6540);const s={},o=i.createContext(s);function t(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/392083ed.30911eae.js b/assets/js/392083ed.44e8edfb.js similarity index 99% rename from assets/js/392083ed.30911eae.js rename to assets/js/392083ed.44e8edfb.js index b8b32d68..7d95c62a 100644 --- a/assets/js/392083ed.30911eae.js +++ b/assets/js/392083ed.44e8edfb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4717],{9471:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","source":"@site/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/","permalink":"/docs/0.4/guides/self-hosting/linux/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx","tags":[],"version":"0.4","sidebarPosition":40,"frontMatter":{"sidebar_position":40,"title":"Self-Hosting Guide for Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Self Hosting","permalink":"/docs/0.4/category/self-hosting"},"next":{"title":"NGINX TLS","permalink":"/docs/0.4/guides/self-hosting/linux/nginx"}}');var t=r(4848),i=r(8453);const s={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},l=void 0,c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,t.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,t.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,t.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,t.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the controller service (",(0,t.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p <password>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the router service (",(0,t.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,t.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,t.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Follow ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,t.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"store"})," section defines the local ",(0,t.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,t.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,t.jsx)(n.code,{children:"password"})," in the ",(0,t.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsxs)(n.p,{children:["Be sure to see the ",(0,t.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(9873).A+"",children:["reference configuration at ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,t.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,t.jsxs)(n.p,{children:["See the separate guides on ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,t.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,t.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,t.jsx)(n.code,{children:"api.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,t.jsxs)(n.p,{children:["To work with a self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,t.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,t.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,t.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,t.jsxs)(n.p,{children:["Use the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,t.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,t.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,t.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,t.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,t.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,t.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,t.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,t.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,t.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,t.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,t.jsxs)(n.p,{children:["Nice work! The ",(0,t.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,t.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,t.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This frontend config file has a ",(0,t.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,t.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,t.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. The reverse proxy must forward the ",(0,t.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,t.jsxs)(n.p,{children:["You can also specify an ",(0,t.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,t.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,t.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,t.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,t.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok admin create account <email> <password>\n"})}),"\n",(0,t.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,t.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you look at the console output from your ",(0,t.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can access your ",(0,t.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,t.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,t.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,t.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,t.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,t.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,t.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,t.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},9873:(e,n,r)=>{r.d(n,{A:()=>o});const o=r.p+"assets/files/ctrl-11e5352ac4fe52a7c8e6d2d290c7c29c.yml"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var o=r(6540);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4717],{2698:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","source":"@site/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/","permalink":"/docs/0.4/guides/self-hosting/linux/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx","tags":[],"version":"0.4","sidebarPosition":40,"frontMatter":{"sidebar_position":40,"title":"Self-Hosting Guide for Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Self Hosting","permalink":"/docs/0.4/category/self-hosting"},"next":{"title":"NGINX TLS","permalink":"/docs/0.4/guides/self-hosting/linux/nginx"}}');var t=r(4848),i=r(8453);const s={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},l=void 0,c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,t.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,t.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,t.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,t.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the controller service (",(0,t.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p <password>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the router service (",(0,t.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,t.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,t.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Follow ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,t.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"store"})," section defines the local ",(0,t.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,t.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,t.jsx)(n.code,{children:"password"})," in the ",(0,t.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsxs)(n.p,{children:["Be sure to see the ",(0,t.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(9873).A+"",children:["reference configuration at ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,t.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,t.jsxs)(n.p,{children:["See the separate guides on ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,t.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,t.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,t.jsx)(n.code,{children:"api.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,t.jsxs)(n.p,{children:["To work with a self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,t.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,t.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,t.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,t.jsxs)(n.p,{children:["Use the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,t.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,t.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,t.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,t.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,t.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,t.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,t.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,t.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,t.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,t.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,t.jsxs)(n.p,{children:["Nice work! The ",(0,t.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,t.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,t.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This frontend config file has a ",(0,t.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,t.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,t.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. The reverse proxy must forward the ",(0,t.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,t.jsxs)(n.p,{children:["You can also specify an ",(0,t.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,t.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,t.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,t.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,t.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,t.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok admin create account <email> <password>\n"})}),"\n",(0,t.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,t.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you look at the console output from your ",(0,t.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can access your ",(0,t.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,t.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,t.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,t.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,t.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,t.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,t.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,t.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},9873:(e,n,r)=>{r.d(n,{A:()=>o});const o=r.p+"assets/files/ctrl-11e5352ac4fe52a7c8e6d2d290c7c29c.yml"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var o=r(6540);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3fab0acb.d2be5705.js b/assets/js/3fab0acb.42090723.js similarity index 99% rename from assets/js/3fab0acb.d2be5705.js rename to assets/js/3fab0acb.42090723.js index c84c8fa3..6c092d1a 100644 --- a/assets/js/3fab0acb.d2be5705.js +++ b/assets/js/3fab0acb.42090723.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[351],{3822:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","source":"@site/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx","sourceDirName":"myzrok/custom-domains","slug":"/myzrok/custom-domains/","permalink":"/docs/0.4/myzrok/custom-domains/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Custom Domains"},"sidebar":"tutorialSidebar","previous":{"title":"myzrok","permalink":"/docs/0.4/category/myzrok"}}');var r=n(4848),i=n(8453);const s={title:"Custom Domains"},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create Your Custom Domain",id:"create-your-custom-domain",level:3},{value:"Creating DNS Records",id:"creating-dns-records",level:3},{value:"Finalizing Your Custom Domain",id:"finalizing-your-custom-domain",level:3},{value:"Start Sharing!",id:"start-sharing",level:3}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares.\nFor example, let's say you own the domain ",(0,r.jsx)(o.code,{children:"foo.example.io"}),", you can leverage zrok custom domains to\ncreate ephemeral shares such as: ",(0,r.jsx)(o.code,{children:"https://vw8jbg4ijz5g.foo.example.io"}),"\nor ",(0,r.jsx)(o.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"reserved shares"})," such as ",(0,r.jsx)(o.code,{children:"https://myshare.foo.example.io"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Custom domains require a Pro subscription with ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"}),".\nIf you don't already have an account, you can sign up for one ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"here"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," provides a guided setup with just a few easy steps!"]}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsx)(o.li,{children:"Bring your own custom domain name"}),"\n",(0,r.jsx)(o.li,{children:"Create DNS records for certificate validation and traffic routing"}),"\n",(0,r.jsx)(o.li,{children:"Wait for zrok to validate your records and finalize configuration"}),"\n",(0,r.jsx)(o.li,{children:"Start sharing!"}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:"Detailed setup instructions are documented below."}),"\n",(0,r.jsx)(o.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsxs)(o.p,{children:["In order to create a custom domain in zrok, ",(0,r.jsx)(o.strong,{children:"you must already own the domain you want to use."})]})}),"\n",(0,r.jsx)(o.p,{children:"During the setup process you will need to create DNS records to validate ownership and to allow a certificate to be issued\non behalf of your domain. Once you have your domain registered, you can begin the process of setting up your custom\ndomain with zrok."}),"\n",(0,r.jsx)(o.h3,{id:"create-your-custom-domain",children:"Create Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"Log into the myzrok console and access the domains page by clicking on the globe icon in the left navigation menu."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_domains_page",src:n(1364).A+"",width:"1022",height:"581"})}),"\n",(0,r.jsx)(o.p,{children:"Click the CREATE button on the top right of the page to get started.\nWhen you click the create button you\u2019ll be presented with a form to allow you to enable your custom domain.\nEnter your domain into the form field and click CREATE. This will begin the process for setting up your custom domain.\nA new managed TLS certificate will be created to host traffic on your domain's behalf."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_domain",src:n(3691).A+"",width:"844",height:"344"})}),"\n",(0,r.jsxs)(o.p,{children:["This may take a few minutes.\nYou may close the form at this time and come back when your domain is ",(0,r.jsx)(o.em,{children:"pending validation."}),"\nOnce your certificate is ready, you\u2019ll be presented with instructions on how to set up your DNS records."]}),"\n",(0,r.jsx)(o.h3,{id:"creating-dns-records",children:"Creating DNS Records"}),"\n",(0,r.jsx)(o.p,{children:"zrok will host and manage a TLS certificate for the custom domain on your behalf.\nThis process requires a DNS validation record to be created in order to prove ownership of the domain.\nFollow the prompts in the UI to create a CNAME DNS record with the name and value specified in the UI."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_cname",src:n(3001).A+"",width:"847",height:"402"})}),"\n",(0,r.jsx)(o.p,{children:"Next, create an A record to direct all DNS requests for your domain to a set of static IPs that are hosted by zrok."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_a_record",src:n(3516).A+"",width:"830",height:"527"})}),"\n",(0,r.jsx)(o.p,{children:"After you\u2019ve created your records, you can verify that they are configured properly using the instructions provided in the form."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_verify_dns",src:n(96).A+"",width:"829",height:"528"})}),"\n",(0,r.jsxs)(o.p,{children:["If the ",(0,r.jsx)(o.code,{children:"nslookup"})," command returns the IP addresses supplied for the A-record entry, then DNS for your domain is resolving properly."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"nslookup test.foo.example.io\nServer:\t\t192.168.86.194\nAddress:\t192.168.86.194#53\n\nNon-authoritative answer:\nName:\ttest.foo.example.io\nAddress: 99.83.220.186\nName:\ttest.foo.example.io\nAddress: 52.223.6.108\n"})}),"\n",(0,r.jsx)(o.p,{children:"Once you have created your DNS records, it will take zrok a few minutes to validate that they exist.\nYou can safely close the form until your certificate has been issued."}),"\n",(0,r.jsx)(o.h3,{id:"finalizing-your-custom-domain",children:"Finalizing Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"After your records have been validated and your certificate has been issued, click the FINALIZE button within 72 hours to complete your custom domain setup."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_finalize",src:n(9461).A+"",width:"818",height:"224"})}),"\n",(0,r.jsx)(o.p,{children:"From here, myzrok.io will complete the last few steps of creating your custom domain.\nThis should only take a minute, but if you need to close the form you can find the instructions on how to share your frontend when you return."}),"\n",(0,r.jsx)(o.h3,{id:"start-sharing",children:"Start Sharing!"}),"\n",(0,r.jsx)(o.p,{children:"Once the Finalize stage has completed, you can start sharing with your custom DNS."}),"\n",(0,r.jsxs)(o.p,{children:["In order to create shares that utilize your custom DNS, you will need to specify the ",(0,r.jsx)(o.code,{children:"--frontend"})," flag when creating a share,\nor update your environment configuration to use this new frontend by default."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok share public --frontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsx)(o.p,{children:"You can set the custom frontend as the environment default by running:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok config set defaultFrontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsxs)(o.p,{children:["To validate which frontend is being used, use the ",(0,r.jsx)(o.code,{children:"zrok status"})," command, which will identify the default frontend being used:"]}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"zrok_status",src:n(1679).A+"",width:"404",height:"220"})})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},3516:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_a_record-550b91f870f6e1df4903220bfa78ae25.png"},3001:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_cname-3cbbf4526443142174bab2d22224764a.png"},3691:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_domain-bcf860ac29b46cfe5981db391bcbc521.png"},1364:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_domains_page-6d92a9076e1bca9640eb301eb6716e5f.png"},9461:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_finalize-71899efbaf429d9be596363607550730.png"},96:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_verify_dns-2f721e1a96f56f4f09f3b0b16ea8c1c5.png"},1679:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/zrok_status-0ce131c6d8bba0df50b0f2a577707f0a.png"},8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const r={},i=t.createContext(r);function s(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[351],{5359:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"myzrok/custom-domains/index","title":"Custom Domains","description":"Overview","source":"@site/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx","sourceDirName":"myzrok/custom-domains","slug":"/myzrok/custom-domains/","permalink":"/docs/0.4/myzrok/custom-domains/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Custom Domains"},"sidebar":"tutorialSidebar","previous":{"title":"myzrok","permalink":"/docs/0.4/category/myzrok"}}');var r=n(4848),i=n(8453);const s={title:"Custom Domains"},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create Your Custom Domain",id:"create-your-custom-domain",level:3},{value:"Creating DNS Records",id:"creating-dns-records",level:3},{value:"Finalizing Your Custom Domain",id:"finalizing-your-custom-domain",level:3},{value:"Start Sharing!",id:"start-sharing",level:3}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares.\nFor example, let's say you own the domain ",(0,r.jsx)(o.code,{children:"foo.example.io"}),", you can leverage zrok custom domains to\ncreate ephemeral shares such as: ",(0,r.jsx)(o.code,{children:"https://vw8jbg4ijz5g.foo.example.io"}),"\nor ",(0,r.jsx)(o.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"reserved shares"})," such as ",(0,r.jsx)(o.code,{children:"https://myshare.foo.example.io"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Custom domains require a Pro subscription with ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"}),".\nIf you don't already have an account, you can sign up for one ",(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"here"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"https://myzrok.io",children:"myzrok.io"})," provides a guided setup with just a few easy steps!"]}),"\n",(0,r.jsxs)(o.ol,{children:["\n",(0,r.jsx)(o.li,{children:"Bring your own custom domain name"}),"\n",(0,r.jsx)(o.li,{children:"Create DNS records for certificate validation and traffic routing"}),"\n",(0,r.jsx)(o.li,{children:"Wait for zrok to validate your records and finalize configuration"}),"\n",(0,r.jsx)(o.li,{children:"Start sharing!"}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:"Detailed setup instructions are documented below."}),"\n",(0,r.jsx)(o.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsxs)(o.p,{children:["In order to create a custom domain in zrok, ",(0,r.jsx)(o.strong,{children:"you must already own the domain you want to use."})]})}),"\n",(0,r.jsx)(o.p,{children:"During the setup process you will need to create DNS records to validate ownership and to allow a certificate to be issued\non behalf of your domain. Once you have your domain registered, you can begin the process of setting up your custom\ndomain with zrok."}),"\n",(0,r.jsx)(o.h3,{id:"create-your-custom-domain",children:"Create Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"Log into the myzrok console and access the domains page by clicking on the globe icon in the left navigation menu."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_domains_page",src:n(1364).A+"",width:"1022",height:"581"})}),"\n",(0,r.jsx)(o.p,{children:"Click the CREATE button on the top right of the page to get started.\nWhen you click the create button you\u2019ll be presented with a form to allow you to enable your custom domain.\nEnter your domain into the form field and click CREATE. This will begin the process for setting up your custom domain.\nA new managed TLS certificate will be created to host traffic on your domain's behalf."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_domain",src:n(3691).A+"",width:"844",height:"344"})}),"\n",(0,r.jsxs)(o.p,{children:["This may take a few minutes.\nYou may close the form at this time and come back when your domain is ",(0,r.jsx)(o.em,{children:"pending validation."}),"\nOnce your certificate is ready, you\u2019ll be presented with instructions on how to set up your DNS records."]}),"\n",(0,r.jsx)(o.h3,{id:"creating-dns-records",children:"Creating DNS Records"}),"\n",(0,r.jsx)(o.p,{children:"zrok will host and manage a TLS certificate for the custom domain on your behalf.\nThis process requires a DNS validation record to be created in order to prove ownership of the domain.\nFollow the prompts in the UI to create a CNAME DNS record with the name and value specified in the UI."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_cname",src:n(3001).A+"",width:"847",height:"402"})}),"\n",(0,r.jsx)(o.p,{children:"Next, create an A record to direct all DNS requests for your domain to a set of static IPs that are hosted by zrok."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_add_a_record",src:n(3516).A+"",width:"830",height:"527"})}),"\n",(0,r.jsx)(o.p,{children:"After you\u2019ve created your records, you can verify that they are configured properly using the instructions provided in the form."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_verify_dns",src:n(96).A+"",width:"829",height:"528"})}),"\n",(0,r.jsxs)(o.p,{children:["If the ",(0,r.jsx)(o.code,{children:"nslookup"})," command returns the IP addresses supplied for the A-record entry, then DNS for your domain is resolving properly."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"nslookup test.foo.example.io\nServer:\t\t192.168.86.194\nAddress:\t192.168.86.194#53\n\nNon-authoritative answer:\nName:\ttest.foo.example.io\nAddress: 99.83.220.186\nName:\ttest.foo.example.io\nAddress: 52.223.6.108\n"})}),"\n",(0,r.jsx)(o.p,{children:"Once you have created your DNS records, it will take zrok a few minutes to validate that they exist.\nYou can safely close the form until your certificate has been issued."}),"\n",(0,r.jsx)(o.h3,{id:"finalizing-your-custom-domain",children:"Finalizing Your Custom Domain"}),"\n",(0,r.jsx)(o.p,{children:"After your records have been validated and your certificate has been issued, click the FINALIZE button within 72 hours to complete your custom domain setup."}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"myzrok_finalize",src:n(9461).A+"",width:"818",height:"224"})}),"\n",(0,r.jsx)(o.p,{children:"From here, myzrok.io will complete the last few steps of creating your custom domain.\nThis should only take a minute, but if you need to close the form you can find the instructions on how to share your frontend when you return."}),"\n",(0,r.jsx)(o.h3,{id:"start-sharing",children:"Start Sharing!"}),"\n",(0,r.jsx)(o.p,{children:"Once the Finalize stage has completed, you can start sharing with your custom DNS."}),"\n",(0,r.jsxs)(o.p,{children:["In order to create shares that utilize your custom DNS, you will need to specify the ",(0,r.jsx)(o.code,{children:"--frontend"})," flag when creating a share,\nor update your environment configuration to use this new frontend by default."]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok share public --frontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsx)(o.p,{children:"You can set the custom frontend as the environment default by running:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"zrok config set defaultFrontend foo-example--goPIhgtJtz\n"})}),"\n",(0,r.jsxs)(o.p,{children:["To validate which frontend is being used, use the ",(0,r.jsx)(o.code,{children:"zrok status"})," command, which will identify the default frontend being used:"]}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"zrok_status",src:n(1679).A+"",width:"404",height:"220"})})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},3516:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_a_record-550b91f870f6e1df4903220bfa78ae25.png"},3001:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_cname-3cbbf4526443142174bab2d22224764a.png"},3691:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_add_domain-bcf860ac29b46cfe5981db391bcbc521.png"},1364:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_domains_page-6d92a9076e1bca9640eb301eb6716e5f.png"},9461:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_finalize-71899efbaf429d9be596363607550730.png"},96:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/myzrok_verify_dns-2f721e1a96f56f4f09f3b0b16ea8c1c5.png"},1679:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/zrok_status-0ce131c6d8bba0df50b0f2a577707f0a.png"},8453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(6540);const r={},i=t.createContext(r);function s(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4017.7e97479c.js b/assets/js/4017.7e97479c.js new file mode 100644 index 00000000..44d805a6 --- /dev/null +++ b/assets/js/4017.7e97479c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4017],{2362:(e,n,t)=>{t.d(n,{A:()=>B});var s=t(6540),i=t(4848);function a(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=s.Children.toArray(e),t=n.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=n.filter((e=>e!==t)),l=t?.props.children;return{mdxAdmonitionTitle:l,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??n;return{...e,...a&&{title:a},children:t}}var l=t(8215),o=t(539),r=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",m="admonitionContent_BuS1";function h(e){let{type:n,className:t,children:s}=e;return(0,i.jsx)("div",{className:(0,l.A)(r.G.common.admonition,r.G.common.admonitionType(n),c,t),children:s})}function x(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function f(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:m,children:n}):null}function p(e){const{type:n,icon:t,title:s,children:a,className:l}=e;return(0,i.jsxs)(h,{type:n,className:l,children:[s||t?(0,i.jsx)(x,{title:s,icon:t}):null,(0,i.jsx)(f,{children:a})]})}function v(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,i.jsx)(v,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,i.jsx)(p,{...j,...e,className:(0,l.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const A={icon:(0,i.jsx)(b,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function N(e){return(0,i.jsx)(p,{...A,...e,className:(0,l.A)("alert alert--success",e.className),children:e.children})}function C(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const L={icon:(0,i.jsx)(C,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function _(e){return(0,i.jsx)(p,{...L,...e,className:(0,l.A)("alert alert--info",e.className),children:e.children})}function y(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const T={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const H={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const M={...{note:g,tip:N,info:_,warning:function(e){return(0,i.jsx)(p,{...T,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(p,{...w,...e,className:(0,l.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(g,{title:"secondary",...e}),important:e=>(0,i.jsx)(_,{title:"important",...e}),success:e=>(0,i.jsx)(N,{title:"success",...e}),caution:function(e){return(0,i.jsx)(p,{...H,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})}}};function B(e){const n=a(e),t=(s=n.type,M[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),M.info));var s;return(0,i.jsx)(t,{...n})}},7519:(e,n,t)=>{t.d(n,{A:()=>v});t(6540);var s=t(8215),i=t(204),a=t(3751),l=t(214),o=t(6289),r=t(539),c=t(9030),d=t(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(o.A,{"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const x={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function f(e){let{children:n,href:t,isLast:s}=e;const i="breadcrumbs__link";return s?(0,d.jsx)("span",{className:i,itemProp:"name",children:n}):t?(0,d.jsx)(o.A,{className:i,href:t,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:i,children:n})}function p(e){let{children:n,active:t,index:i,addMicrodata:a}=e;return(0,d.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(i+1)})]})}function v(){const e=(0,a.OF)(),n=(0,l.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(i.G.docs.docBreadcrumbs,x.breadcrumbsContainer),"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map(((n,t)=>{const s=t===e.length-1,i="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(p,{active:s,index:t,addMicrodata:!!i,children:(0,d.jsx)(f,{href:i,isLast:s,children:n.label})},t)}))]})}):null}},1973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>Ne});var s=t(6540),i=t(9144),a=t(6849),l=t(4848);const o=s.createContext(null);function r(e){let{children:n,content:t}=e;const i=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(t);return(0,l.jsx)(o.Provider,{value:i,children:n})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new a.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(i.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(8215),m=t(6682),h=t(807);function x(){const{metadata:e}=c();return(0,l.jsx)(h.A,{previous:e.previous,next:e.next})}var f=t(5833),p=t(5730),v=t(204),j=t(539),g=t(6289);const b={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function A(e){let{permalink:n,label:t,count:s,description:i}=e;return(0,l.jsxs)(g.A,{href:n,title:i,className:(0,u.A)(b.tag,s?b.tagWithCount:b.tagRegular),children:[t,s&&(0,l.jsx)("span",{children:s})]})}const N={tags:"tags_jXut",tag:"tag_QGVx"};function C(e){let{tags:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(j.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.A)(N.tags,"padding--none","margin-left--sm"),children:n.map((e=>(0,l.jsx)("li",{className:N.tag,children:(0,l.jsx)(A,{...e})},e.permalink)))})]})}const L={iconEdit:"iconEdit_Z9Sw"};function _(e){let{className:n,...t}=e;return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(L.iconEdit,n),"aria-hidden":"true",...t,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function y(e){let{editUrl:n}=e;return(0,l.jsxs)(g.A,{to:n,className:v.G.common.editThisPage,children:[(0,l.jsx)(_,{}),(0,l.jsx)(j.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var T=t(797);function k(e){void 0===e&&(e={});const{i18n:{currentLocale:n}}=(0,T.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:n}}=(0,T.A)();return n[e].calendar}();return new Intl.DateTimeFormat(n,{calendar:t,...e})}function w(e){let{lastUpdatedAt:n}=e;const t=new Date(n),s=k({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,l.jsx)(j.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function H(e){let{lastUpdatedBy:n}=e;return(0,l.jsx)(j.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:n})},children:" by {user}"})}function M(e){let{lastUpdatedAt:n,lastUpdatedBy:t}=e;return(0,l.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,l.jsx)(j.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:n?(0,l.jsx)(w,{lastUpdatedAt:n}):"",byUser:t?(0,l.jsx)(H,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const B={lastUpdated:"lastUpdated_JAkA"};function U(e){let{className:n,editUrl:t,lastUpdatedAt:s,lastUpdatedBy:i}=e;return(0,l.jsxs)("div",{className:(0,u.A)("row",n),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(y,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.A)("col",B.lastUpdated),children:(s||i)&&(0,l.jsx)(M,{lastUpdatedAt:s,lastUpdatedBy:i})})]})}function E(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:i}=e,a=i.length>0,o=!!(n||t||s);return a||o?(0,l.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[a&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",v.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(C,{tags:i})})}),o&&(0,l.jsx)(U,{className:(0,u.A)("margin-top--sm",v.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var I=t(3535),V=t(3115);function z(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):s.push(i)})),s}function S(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=S({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(e)?[{...e,children:n}]:n}))}function R(e){const n=e.getBoundingClientRect();return n.top===n.bottom?R(e.parentNode):n}function D(e,n){let{anchorTopOffset:t}=n;const s=e.find((e=>R(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(R(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function G(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:n}}=(0,V.p)();return(0,s.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function O(e){const n=(0,s.useRef)(void 0),t=G();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let i=n;i<=t;i+=1)s.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:a,maxHeadingLevel:l}),r=D(o,{anchorTopOffset:t.current}),c=e.find((e=>r&&r.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===c)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}function F(e){let{toc:n,className:t,linkClassName:s,isChild:i}=e;return n.length?(0,l.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,l.jsxs)("li",{children:[(0,l.jsx)(g.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,l.jsx)(F,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const P=s.memo(F);function q(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r,...c}=e;const d=(0,V.p)(),u=o??d.tableOfContents.minHeadingLevel,m=r??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,s.useMemo)((()=>S({toc:z(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:u,maxHeadingLevel:m});return O((0,s.useMemo)((()=>{if(i&&a)return{linkClassName:i,linkActiveClassName:a,minHeadingLevel:u,maxHeadingLevel:m}}),[i,a,u,m])),(0,l.jsx)(P,{toc:h,className:t,linkClassName:i,...c})}const W={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function $(e){let{collapsed:n,...t}=e;return(0,l.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",W.tocCollapsibleButton,!n&&W.tocCollapsibleButtonExpanded,t.className),children:(0,l.jsx)(j.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const Z={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function J(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:i}=e;const{collapsed:a,toggleCollapsed:o}=(0,I.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(Z.tocCollapsible,!a&&Z.tocCollapsibleExpanded,t),children:[(0,l.jsx)($,{collapsed:a,onClick:o}),(0,l.jsx)(I.N,{lazy:!0,className:Z.tocCollapsibleContent,collapsed:a,children:(0,l.jsx)(q,{toc:n,minHeadingLevel:s,maxHeadingLevel:i})})]})}const Y={tocMobile:"tocMobile_ITEo"};function Q(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(J,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,Y.tocMobile)})}const X={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},K="table-of-contents__link toc-highlight",ee="table-of-contents__link--active";function ne(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,u.A)(X.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(q,{...t,linkClassName:K,linkActiveClassName:ee})})}function te(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(ne,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var se=t(9303),ie=t(8453),ae=t(8419);function le(e){let{children:n}=e;return(0,l.jsx)(ie.x,{components:ae.A,children:n})}function oe(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(se.A,{as:"h1",children:t})}),(0,l.jsx)(le,{children:n})]})}var re=t(7519),ce=t(7143);function de(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function ue(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function me(){return(0,l.jsx)(ce.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function he(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function xe(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var fe=t(2362);function pe(e){let{className:n}=e;return(0,l.jsx)(fe.A,{type:"caution",title:(0,l.jsx)(he,{}),className:(0,u.A)(n,v.G.common.draftBanner),children:(0,l.jsx)(xe,{})})}function ve(e){let{className:n}=e;return(0,l.jsx)(fe.A,{type:"caution",title:(0,l.jsx)(de,{}),className:(0,u.A)(n,v.G.common.unlistedBanner),children:(0,l.jsx)(ue,{})})}function je(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(me,{}),(0,l.jsx)(ve,{...e})]})}function ge(e){let{metadata:n}=e;const{unlisted:t,frontMatter:s}=n;return(0,l.jsxs)(l.Fragment,{children:[(t||s.unlisted)&&(0,l.jsx)(je,{}),s.draft&&(0,l.jsx)(pe,{})]})}const be={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ae(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,i=!s&&n.length>0;return{hidden:s,mobile:i?(0,l.jsx)(Q,{}):void 0,desktop:!i||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(te,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&be.docItemCol),children:[(0,l.jsx)(ge,{metadata:s}),(0,l.jsx)(f.A,{}),(0,l.jsxs)("div",{className:be.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(re.A,{}),(0,l.jsx)(p.A,{}),t.mobile,(0,l.jsx)(oe,{children:n}),(0,l.jsx)(E,{})]}),(0,l.jsx)(x,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function Ne(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(i.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(Ae,{children:(0,l.jsx)(t,{})})]})})}},807:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(539),i=t(8215),a=t(6289),l=t(4848);function o(e){const{permalink:n,title:t,subLabel:s,isNext:o}=e;return(0,l.jsxs)(a.A,{className:(0,i.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[s&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,l.jsx)("div",{className:"pagination-nav__label",children:t})]})}function r(e){const{previous:n,next:t}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(o,{...n,subLabel:(0,l.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,l.jsx)(o,{...t,subLabel:(0,l.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},5730:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(8215),i=t(539),a=t(204),l=t(1858),o=t(4848);function r(e){let{className:n}=e;const t=(0,l.r)();return t.badge?(0,o.jsx)("span",{className:(0,s.A)(n,a.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(i.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},5833:(e,n,t)=>{t.d(n,{A:()=>p});t(6540);var s=t(8215),i=t(797),a=t(6289),l=t(539),o=t(6942),r=t(204),c=t(6351),d=t(1858),u=t(4848);const m={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const n=m[e.versionMetadata.banner];return(0,u.jsx)(n,{...e})}function x(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(a.A,{to:t,onClick:s,children:(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function f(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:a}}=(0,i.A)(),{pluginId:l}=(0,o.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(l),{latestDocSuggestion:m,latestVersionSuggestion:f}=(0,o.HW)(l),p=m??(v=f).docs.find((e=>e.id===v.mainDocId));var v;return(0,u.jsxs)("div",{className:(0,s.A)(n,r.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:a,versionMetadata:t})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(x,{versionLabel:f.label,to:p.path,onClick:()=>d(f.name)})})]})}function p(e){let{className:n}=e;const t=(0,d.r)();return t.banner?(0,u.jsx)(f,{className:n,versionMetadata:t}):null}},7763:(e,n,t)=>{t.d(n,{A:()=>v});var s=t(6540),i=t(8215),a=t(5066),l=t(5246),o=t(9136),r=t(3535);const c={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=t(4848);function u(e){return!!e&&("SUMMARY"===e.tagName||u(e.parentElement))}function m(e,n){return!!e&&(e===n||m(e.parentElement,n))}function h(e){let{summary:n,children:t,...i}=e;(0,l.A)().collectAnchor(i.id);const h=(0,o.A)(),x=(0,s.useRef)(null),{collapsed:f,setCollapsed:p}=(0,r.u)({initialState:!i.open}),[v,j]=(0,s.useState)(i.open),g=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...i,ref:x,open:v,"data-collapsed":f,className:(0,a.A)(c.details,h&&c.isBrowser,i.className),onMouseDown:e=>{u(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;u(n)&&m(n,x.current)&&(e.preventDefault(),f?(p(!1),j(!0)):p(!0))},children:[g,(0,d.jsx)(r.N,{lazy:!1,collapsed:f,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{p(e),j(!e)},children:(0,d.jsx)("div",{className:c.collapsibleContent,children:t})})]})}const x={details:"details_b_Ee"},f="alert alert--info";function p(e){let{...n}=e;return(0,d.jsx)(h,{...n,className:(0,i.A)(f,x.details,n.className)})}function v(e){const n=s.Children.toArray(e.children),t=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),i=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==t))});return(0,d.jsx)(p,{...e,summary:t,children:i})}},3425:(e,n,t)=>{t.d(n,{A:()=>j});var s=t(6540),i=t(7143),a=t(8069),l=t(4848);function o(e){return(0,l.jsx)("code",{...e})}var r=t(6289);var c=t(7763),d=t(9303);function u(e){return(0,l.jsx)(d.A,{...e})}var m=t(8215);const h="containsTaskList_mC6p";function x(e){if(void 0!==e)return(0,m.A)(e,e?.includes("contains-task-list")&&h)}var f=t(5246);const p="img_ev3q";var v=t(2362);const j={Head:i.A,details:c.A,Details:c.A,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,l.jsx)(o,{...e}):(0,l.jsx)(a.A,{...e})},a:function(e){return(0,l.jsx)(r.A,{...e})},pre:function(e){return(0,l.jsx)(l.Fragment,{children:e.children})},ul:function(e){return(0,l.jsx)("ul",{...e,className:x(e.className)})},li:function(e){return(0,f.A)().collectAnchor(e.id),(0,l.jsx)("li",{...e})},img:function(e){return(0,l.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(n=e.className,(0,m.A)(n,p))});var n},h1:e=>(0,l.jsx)(u,{as:"h1",...e}),h2:e=>(0,l.jsx)(u,{as:"h2",...e}),h3:e=>(0,l.jsx)(u,{as:"h3",...e}),h4:e=>(0,l.jsx)(u,{as:"h4",...e}),h5:e=>(0,l.jsx)(u,{as:"h5",...e}),h6:e=>(0,l.jsx)(u,{as:"h6",...e}),admonition:v.A,mermaid:()=>null}},53:(e,n,t)=>{function s(e){var n,t,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e))for(n=0;n<e.length;n++)e[n]&&(t=s(e[n]))&&(i&&(i+=" "),i+=t);else for(n in e)e[n]&&(i&&(i+=" "),i+=n);return i}t.d(n,{A:()=>i});const i=function(){for(var e,n,t=0,i="";t<arguments.length;)(e=arguments[t++])&&(n=s(e))&&(i&&(i+=" "),i+=n);return i}}}]); \ No newline at end of file diff --git a/assets/js/4277b6a0.4bd27697.js b/assets/js/4277b6a0.0e01d84b.js similarity index 99% rename from assets/js/4277b6a0.4bd27697.js rename to assets/js/4277b6a0.0e01d84b.js index d58454ca..a1fba7e4 100644 --- a/assets/js/4277b6a0.4bd27697.js +++ b/assets/js/4277b6a0.0e01d84b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8436],{7552:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","source":"@site/versioned_docs/version-0.4/guides/permission-modes.md","sourceDirName":"guides","slug":"/guides/permission-modes","permalink":"/docs/0.4/guides/permission-modes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/permission-modes.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"sidebar_position":22,"sidebar_label":"Permission Modes"},"sidebar":"tutorialSidebar","previous":{"title":"frontdoor","permalink":"/docs/0.4/guides/frontdoor"},"next":{"title":"Getting Started with Docker","permalink":"/docs/0.4/guides/docker-share/"}}');var o=n(4848),i=n(8453);const a={sidebar_position:22,sidebar_label:"Permission Modes"},t="Permission Modes",c={},d=[{value:"Creating a Share with Closed Permission Mode",id:"creating-a-share-with-closed-permission-mode",level:2},{value:"Adding and Removing Access Grants for Existing Shares",id:"adding-and-removing-access-grants-for-existing-shares",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const s={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"permission-modes",children:"Permission Modes"})}),"\n",(0,o.jsxs)(s.p,{children:["Shares created in zrok ",(0,o.jsx)(s.code,{children:"v0.4.26"})," and newer now include a choice of ",(0,o.jsx)(s.em,{children:"permission mode"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Shares created with zrok ",(0,o.jsx)(s.code,{children:"v0.4.25"})," and older were created using what is now called the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". Whether ",(0,o.jsx)(s.em,{children:"public"})," or ",(0,o.jsx)(s.em,{children:"private"}),", these shares can be accessed by any user of the zrok service instance, as long as they know the ",(0,o.jsx)(s.em,{children:"share token"})," of the share. Effectively shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"})," are accessible by any user of the zrok service instance."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok now supports a ",(0,o.jsx)(s.em,{children:"closed permission mode"}),", which allows for more fine-grained control over which zrok users are allowed to privately access your shares using ",(0,o.jsx)(s.code,{children:"zrok access private"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok defaults to continuing to create shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". This will likely change in a future release. We're leaving the default behavior in place to allow users a period of time to get comfortable with the new permission modes."]}),"\n",(0,o.jsx)(s.h2,{id:"creating-a-share-with-closed-permission-mode",children:"Creating a Share with Closed Permission Mode"}),"\n",(0,o.jsxs)(s.p,{children:["Adding the ",(0,o.jsx)(s.code,{children:"--closed"})," flag to the ",(0,o.jsx)(s.code,{children:"zrok share"})," or ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands will create shares using the ",(0,o.jsx)(s.em,{children:"closed permission mode"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.066] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 0vzwzodf0c7g\n"})}),"\n",(0,o.jsxs)(s.p,{children:["By default any environment owned by the account that created the share is ",(0,o.jsx)(s.em,{children:"allowed"})," to access the new share. But a user trying to access the share from an environment owned by a different account will enounter the following error message:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private 0vzwzodf0c7g\n[ERROR]: unable to access ([POST /access][401] accessUnauthorized)\n"})}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"zrok share"})," and ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands now include an ",(0,o.jsx)(s.code,{children:"--access-grant"})," flag, which allows you to specify additional zrok accounts that are allowed to access your shares:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed --access-grant anotheruser@test.com -b web .\n[ 0.062] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private y6h4at5xvn6o\n"})}),"\n",(0,o.jsxs)(s.p,{children:["And now ",(0,o.jsx)(s.code,{children:"anotheruser@test.com"})," will be allowed to access the share:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private --headless y6h4at5xvn6o\n[ 0.049] INFO main.(*accessPrivateCommand).run: allocated frontend 'VyvrJihAOEHD'\n[ 0.051] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: http://127.0.0.1:9191\n"})}),"\n",(0,o.jsx)(s.h2,{id:"adding-and-removing-access-grants-for-existing-shares",children:"Adding and Removing Access Grants for Existing Shares"}),"\n",(0,o.jsxs)(s.p,{children:["If you've created a share (either reserved or ephemeral) and you forgot to include an access grant, or want to remove an access grant that was mistakenly added, you can use the ",(0,o.jsx)(s.code,{children:"zrok modify share"})," command to make the adjustments:"]}),"\n",(0,o.jsx)(s.p,{children:"Create a share:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.064] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private s4czjylwk7wa\n"})}),"\n",(0,o.jsx)(s.p,{children:"In another shell in the same environment you can execute:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --add-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.p,{children:"And to remove the grant:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --remove-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(s.p,{children:["As of ",(0,o.jsx)(s.code,{children:"v0.4.26"})," there is currently no way to ",(0,o.jsx)(s.em,{children:"list"})," the current access grants. This will be addressed shortly in a subsequent update."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>t});var r=n(6540);const o={},i=r.createContext(o);function a(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8436],{6676:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/permission-modes","title":"Permission Modes","description":"Shares created in zrok v0.4.26 and newer now include a choice of permission mode.","source":"@site/versioned_docs/version-0.4/guides/permission-modes.md","sourceDirName":"guides","slug":"/guides/permission-modes","permalink":"/docs/0.4/guides/permission-modes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/permission-modes.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"sidebar_position":22,"sidebar_label":"Permission Modes"},"sidebar":"tutorialSidebar","previous":{"title":"frontdoor","permalink":"/docs/0.4/guides/frontdoor"},"next":{"title":"Getting Started with Docker","permalink":"/docs/0.4/guides/docker-share/"}}');var o=n(4848),i=n(8453);const a={sidebar_position:22,sidebar_label:"Permission Modes"},t="Permission Modes",c={},d=[{value:"Creating a Share with Closed Permission Mode",id:"creating-a-share-with-closed-permission-mode",level:2},{value:"Adding and Removing Access Grants for Existing Shares",id:"adding-and-removing-access-grants-for-existing-shares",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const s={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"permission-modes",children:"Permission Modes"})}),"\n",(0,o.jsxs)(s.p,{children:["Shares created in zrok ",(0,o.jsx)(s.code,{children:"v0.4.26"})," and newer now include a choice of ",(0,o.jsx)(s.em,{children:"permission mode"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Shares created with zrok ",(0,o.jsx)(s.code,{children:"v0.4.25"})," and older were created using what is now called the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". Whether ",(0,o.jsx)(s.em,{children:"public"})," or ",(0,o.jsx)(s.em,{children:"private"}),", these shares can be accessed by any user of the zrok service instance, as long as they know the ",(0,o.jsx)(s.em,{children:"share token"})," of the share. Effectively shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"})," are accessible by any user of the zrok service instance."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok now supports a ",(0,o.jsx)(s.em,{children:"closed permission mode"}),", which allows for more fine-grained control over which zrok users are allowed to privately access your shares using ",(0,o.jsx)(s.code,{children:"zrok access private"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["zrok defaults to continuing to create shares with the ",(0,o.jsx)(s.em,{children:"open permission mode"}),". This will likely change in a future release. We're leaving the default behavior in place to allow users a period of time to get comfortable with the new permission modes."]}),"\n",(0,o.jsx)(s.h2,{id:"creating-a-share-with-closed-permission-mode",children:"Creating a Share with Closed Permission Mode"}),"\n",(0,o.jsxs)(s.p,{children:["Adding the ",(0,o.jsx)(s.code,{children:"--closed"})," flag to the ",(0,o.jsx)(s.code,{children:"zrok share"})," or ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands will create shares using the ",(0,o.jsx)(s.em,{children:"closed permission mode"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.066] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 0vzwzodf0c7g\n"})}),"\n",(0,o.jsxs)(s.p,{children:["By default any environment owned by the account that created the share is ",(0,o.jsx)(s.em,{children:"allowed"})," to access the new share. But a user trying to access the share from an environment owned by a different account will enounter the following error message:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private 0vzwzodf0c7g\n[ERROR]: unable to access ([POST /access][401] accessUnauthorized)\n"})}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"zrok share"})," and ",(0,o.jsx)(s.code,{children:"zrok reserve"})," commands now include an ",(0,o.jsx)(s.code,{children:"--access-grant"})," flag, which allows you to specify additional zrok accounts that are allowed to access your shares:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed --access-grant anotheruser@test.com -b web .\n[ 0.062] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private y6h4at5xvn6o\n"})}),"\n",(0,o.jsxs)(s.p,{children:["And now ",(0,o.jsx)(s.code,{children:"anotheruser@test.com"})," will be allowed to access the share:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok access private --headless y6h4at5xvn6o\n[ 0.049] INFO main.(*accessPrivateCommand).run: allocated frontend 'VyvrJihAOEHD'\n[ 0.051] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: http://127.0.0.1:9191\n"})}),"\n",(0,o.jsx)(s.h2,{id:"adding-and-removing-access-grants-for-existing-shares",children:"Adding and Removing Access Grants for Existing Shares"}),"\n",(0,o.jsxs)(s.p,{children:["If you've created a share (either reserved or ephemeral) and you forgot to include an access grant, or want to remove an access grant that was mistakenly added, you can use the ",(0,o.jsx)(s.code,{children:"zrok modify share"})," command to make the adjustments:"]}),"\n",(0,o.jsx)(s.p,{children:"Create a share:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok share private --headless --closed -b web .\n[ 0.064] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private s4czjylwk7wa\n"})}),"\n",(0,o.jsx)(s.p,{children:"In another shell in the same environment you can execute:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --add-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.p,{children:"And to remove the grant:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{children:"$ zrok modify share s4czjylwk7wa --remove-access-grant anotheruser@test.com\nupdated\n"})}),"\n",(0,o.jsx)(s.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(s.p,{children:["As of ",(0,o.jsx)(s.code,{children:"v0.4.26"})," there is currently no way to ",(0,o.jsx)(s.em,{children:"list"})," the current access grants. This will be addressed shortly in a subsequent update."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>t});var r=n(6540);const o={},i=r.createContext(o);function a(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43e1c8e4.444957a7.js b/assets/js/43e1c8e4.968e1006.js similarity index 99% rename from assets/js/43e1c8e4.444957a7.js rename to assets/js/43e1c8e4.968e1006.js index e22e00ef..48a9fd4d 100644 --- a/assets/js/43e1c8e4.444957a7.js +++ b/assets/js/43e1c8e4.968e1006.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8528],{7994:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>A,contentTitle:()=>d,default:()=>a,frontMatter:()=>c,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/agent/windows-service/index","title":"Configuring a Windows Service","description":"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.","source":"@site/../docs/guides/agent/windows-service/index.mdx","sourceDirName":"guides/agent/windows-service","slug":"/guides/agent/windows-service/","permalink":"/docs/guides/agent/windows-service/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/windows-service/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Configuring a Windows Service","sidebar_label":"Windows Agent Service"},"sidebar":"tutorialSidebar","previous":{"title":"Linux Agent Service","permalink":"/docs/guides/agent/linux-service"},"next":{"title":"frontdoor","permalink":"/docs/guides/frontdoor"}}');var t=r(4848),i=r(8453);const c={title:"Configuring a Windows Service",sidebar_label:"Windows Agent Service"},d=void 0,A={},l=[{value:"Enabling the Service Environment",id:"enabling-the-service-environment",level:2},{value:"Installing the Service",id:"installing-the-service",level:2},{value:"Non-interactive Service Installation",id:"non-interactive-service-installation",level:2},{value:"Removing the zrok Agent Service",id:"removing-the-zrok-agent-service",level:2}];function o(e){const n={a:"a",code:"code",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system."}),"\n",(0,t.jsxs)(n.p,{children:["Support for running the zrok Agent as a Windows service is handled through a third party utility, ",(0,t.jsx)(n.code,{children:"nssm"}),", which is available here:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://nssm.cc/download",children:"https://nssm.cc/download"})}),"\n",(0,t.jsxs)(n.p,{children:["Give the ",(0,t.jsx)(n.code,{children:"nssm"})," documentation a quick review, here:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://nssm.cc/usage",children:"https://nssm.cc/usage"})}),"\n",(0,t.jsxs)(n.p,{children:["You'll want to install both the ",(0,t.jsx)(n.code,{children:"zrok.exe"})," and ",(0,t.jsx)(n.code,{children:"nssm.exe"})," in a convenient, protected location. In this example, we'll put them in ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok"}),", as ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\zrok.exe"})," and ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\nssm.exe"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"C:\\Program Files\\zrok",src:r(785).A+"",width:"922",height:"453"})}),"\n",(0,t.jsxs)(n.p,{children:["We're going to use a command prompt to install and configure our Agent service. Open a new command prompt and ",(0,t.jsx)(n.code,{children:'cd "\\Program Files\\zrok"'}),":"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Empty Command Prompt",src:r(6045).A+"",width:"1051",height:"552"})}),"\n",(0,t.jsx)(n.h2,{id:"enabling-the-service-environment",children:"Enabling the Service Environment"}),"\n",(0,t.jsxs)(n.p,{children:["On Windows, the ",(0,t.jsx)(n.code,{children:"USERPROFILE"}),' environment variable controls the "home" where zrok will look for the enabled environment. When running as a service on Windows, the process will be running as the ',(0,t.jsx)(n.code,{children:"Local System"})," user, which uses the directory ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),' directory as the user\'s "home" directory.']}),"\n",(0,t.jsx)(n.p,{children:"We're going to want to enable a zrok environment for our new Agent service in this directory. First, we'll run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>set USERPROFILE=c:\\Windows\\System32\\config\\systemprofile\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And with that environment variable set, we'll use the ",(0,t.jsx)(n.code,{children:"zrok enable"})," command to enable an environment for our new Agent service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok enable <accountToken>\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Enabling the Service Environment",src:r(18).A+"",width:"1051",height:"552"})}),"\n",(0,t.jsx)(n.p,{children:"Now we've got a new, enabled environment to use with our Agent running as a Windows service."}),"\n",(0,t.jsx)(n.h2,{id:"installing-the-service",children:"Installing the Service"}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok"})," directory, execute this command to invoke ",(0,t.jsx)(n.code,{children:"nssm"})," to create the new Windows service for our zrok Agent:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm install zrokAgent\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Windows might ask you for elevated Administrator privileges and will then show the main ",(0,t.jsx)(n.code,{children:"nssm"})," installation dialog, which we'll use to configure the new Windows service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"nssm install",src:r(3464).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:['We\'ll set "Path" to ',(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\zrok.exe"}),' (the zrok executable). We\'ll set the "Startup directory" to ',(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),' (the "home" directory for the ',(0,t.jsx)(n.code,{children:"Local System"}),' user). The "Arguments" are the command-line parameters that will get added to the command-line when starting the service, in this case, we want the service to start with the command ',(0,t.jsx)(n.code,{children:"zrok agent start"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['We\'ll set the "Service name" to ',(0,t.jsx)(n.code,{children:"zrokAgent"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['Next, scroll over to the "I/O" tab in the ',(0,t.jsx)(n.code,{children:"nssm"})," installer:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"I/O Tab",src:r(6509).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:['Set the "Output (stdout)" to log the standard output from the ',(0,t.jsx)(n.code,{children:"zrok agent start"})," process to the file ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stdout.log"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['Set the "Error (stderr)" to log the standard error to the file ',(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stderr.log"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Setting the I/O redirection in this way will produce logs from the ",(0,t.jsx)(n.code,{children:"zrok agent start"})," process that could be useful for future troubleshooting."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"nssm"})," also provides options for automatically rotating these log files:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"File rotation",src:r(7972).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:["We'll leave these unset in this example, but if your configuration needs this kind of log file rotation ",(0,t.jsx)(n.code,{children:"nssm"})," makes it available."]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, click the ",(0,t.jsx)(n.code,{children:"Install service"})," button to create the service."]}),"\n",(0,t.jsxs)(n.p,{children:['If we open the "Services" utility in Windows, we can see our new ',(0,t.jsx)(n.code,{children:"zrokAgent"})," service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Service Manager",src:r(6447).A+"",width:"1337",height:"688"})}),"\n",(0,t.jsx)(n.p,{children:'If we click the start button in the toolbar, or right-click on the service and select "start", our new zrok Agent service will start:'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Service Running",src:r(3549).A+"",width:"1337",height:"688"})}),"\n",(0,t.jsxs)(n.p,{children:["If we open a Windows Explorer in the folder ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok"})," we can see our logs, and the ",(0,t.jsx)(n.code,{children:"agent.socket"})," which is used by the zrok command-line to interact with our Agent service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zrokdir",src:r(16).A+"",width:"922",height:"453"})}),"\n",(0,t.jsxs)(n.p,{children:["This zrok Agent service is now available for use. Whenever a Windows Command Prompt wants to interact with this environment, it is important that the ",(0,t.jsx)(n.code,{children:"USERPROFILE"})," environment variable is properly set to ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),", otherwise the zrok commands will attempt to interact with the environment that would be created in the user's default profile directory."]}),"\n",(0,t.jsx)(n.p,{children:"We can access the Agent console using this command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok agent console\n"})}),"\n",(0,t.jsx)(n.p,{children:"And this will open a web interface which allows the Agent to be managed:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zrok agent console",src:r(1465).A+"",width:"959",height:"700"})}),"\n",(0,t.jsx)(n.p,{children:"The Agent console can be used to directly create shares and accesses, and the zrok command-line can also be used."}),"\n",(0,t.jsx)(n.h2,{id:"non-interactive-service-installation",children:"Non-interactive Service Installation"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"nssm"})," provides a command-line that can do this configuration without interacting with the ",(0,t.jsx)(n.code,{children:"nssm"})," GUI. We would create our service like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'C:\\Program Files\\zrok>nssm install zrokAgent "C:\\Program Files\\zrok\\zrok.exe" agent start\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppDirectory C:\\Windows\\System32\\config\\systemprofile\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppStdout C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stdout.log\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppStderr C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stderr.log\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And we can start our new service using the standard Windows service control utility, ",(0,t.jsx)(n.code,{children:"sc"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>sc start zrokAgent\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"nssm CLI installation",src:r(8562).A+"",width:"979",height:"512"})}),"\n",(0,t.jsx)(n.h2,{id:"removing-the-zrok-agent-service",children:"Removing the zrok Agent Service"}),"\n",(0,t.jsx)(n.p,{children:"The following commands (in a Command Prompt running as Administrator) can be used to remove the service from your system:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\>sc stop zrokAgent\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\>sc delete zrokAgent\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And if you have your ",(0,t.jsx)(n.code,{children:"USERPROFILE"})," environment variable properly set to ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),", you can use this command to remove the environment from your system and from the zrok service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok disable\n"})})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},6045:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/empty-command-prompt-b2bd6d54e13724b3e9d46ff0a51ff5da.png"},18:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/enable-21629193bbef3c2d120e685baef71bd1.png"},8562:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/nssm-cli-installation-1b01c278e11a00043e457c02963c797f.png"},7972:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEzOjA3OjQ4LjA2NTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMzowNzo0OC4wNjU8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4ouiEEAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTM6MDc6NDj93D1XAAAf8UlEQVR4Xu3dbYwcx3ng8WfWpASKXO1IsM+wxUTU8ew4DrmxAgIC4ThOtBIDxIm8NBjhAH1YkCBAmIltMWFoca2VHK2PchTBS58CBooJMosLP5xMiRMgLzbJxYHSGbxN+CEWEcBfCFLA6iQEMLTrsc6iZHnug1ijmmeruqvfZrp7/j+gMTtPV1VXV7880zOzPY37Hv37jkhHjIb54/1QNp2UDTmqdfsWwFG9cEn6FyXtkPVDR3Jc0QJ1Mg3iIFYwS3+roP/r1+mISKff27LT390n034u2fb1DFUT8axj4/5HW50Xvjqh4wAAlNLnv3FWRnQQAICyI3kBAKql0yF5AQCqZ2QAn6MCAJBah7cNAQBV5E1eT/zRH8nTd9wh/3N0VB6fmJClpSX52c9+1p3/l48+Kn95xx0yPzoqhz/xCXn5hz+UN998s6cNAACK4E1eB775Tdn6N38j/0lE7v+Xf5FvfPnL8sorr8j169dFROSLjzwi/+Vb35Kf3nKLfGT/fll69VX56U9/qpsBAAy58V//lLz40ks63PXiSy/Jr3/qbh2O5E1eN910k2z51Kfkyi23yL+PjsofnDsn/+PZZ+X111+Xn//857J27Vq545d/Wf7vhg3S6XRk/fr1smHDBt1M1/j4uBw4cKAndu3aNRkfH+8+v3jxooyOjnYn2/j4eDd++vRpkRv17efa6OioHD16VIcLE9WXJPJqJ4o9vnqsASBPf/VXz8iePXucCezFl16SPXv2yDPP/Hc9y6shIiO+f5K++eab5aMf/aj8x223yZU//EN5V0T+89/9nfyvc+fkjTfekJtuuknu3rZNRtaskY985CPy4Q9/WNavX6+b6XH8+HG5ePGiDovcSET79u2Tdrst7XZbLl++3D2B79y5U5599tnuvKWlpZ66TzzxRM9zESn85O/Sbrdl165dOpxYlnbGx8fl2rVrOgwAA/Nbn/mMnDhxYlUCM4nrxIkT8luf+UxPnTjeKy8RkUajIT8TkV/7jd+Qv//d35WPvvWW/Ogv/kJ+9KMfyZtvvilr1qyRTqMha9eulUbDlwbfd/LkSdm3b58Oi4jIa6+9JhMT79/pY9OmTd0T+JUrV2T79u3deQ8//HD377vuuks2b968KimeOnVK9u7d2xMDAAyGTmBZEpfEJS8REWk05NZbb5WH9u+X72/bJp99/XX528cfl6tXr8rbb78tjUZDRkbimxER2bZtm0xMTDjfytu+fbscP37cOW9iYqLn7UXtoYcekueee6773CSyO++80yrVy3570lypnD59uhuzlzc+Pi5Hjx6V0dFROXDgQM/bn+atS1POtGXiehk7d+7sxlzrKqod8xaiqWNfUer2x8fH5erVq7J161bZuXNnty1TxsSihIyBfqEAACHsBJYlcUlQ8hKRkZER+dCHPiRTTz8t/+eXfkm+8K//Kn/7zDPy6quvem+a6DM3NyczMzPOt7ba7bZcuHBh1Qlybm5OHnvsMRm9kTy0Xbt2yfHjx7vPn3vuOTl06FBPGduBAwfk5MmT3bchN23aJBcvXpRTp051Y4899lhPcnnllVek3W7L3Nxcz7JarZbMzs52n8uNxLV161a5fPlyzzIOHDggDz30UDd24cIF5zhoP/jBD6TdbsvZs2e7b5G61uHll1+Wu+66Sy5fvixnzpwREZGXX365W0asxO4SOgb2VTAADEJQ8pIbX+D4lV/9Vdk6MyOvr1snv3bmjPxzqyVr331XfvGLX+jikU6ePOlMQiIiZ86ckXa7LTt27Oi5yti1a1f3BOy6gpidnZWjR4/KtWvXZGFhIfIE++lPf1p2797dcyJfXFyU8+fPd686du/eLRcuXOjO/8pXvtL9e+/evd2+nThxQiYnJ7vzREQuXboke/fulU2bNvXEFxYWZPfu3d1lnD9/Xi5dutRTxmVubk7kxtXp1atXRTzr4GJfSZ0/f17P7pFkDAAgKfutQtdnYKGC/knZLrBu3Tq5//d+T17bs0c+/NZbsuZb35Kb3n478VfkzWdZr732mp7VdfbsWTl16pQOy9zcnFy5cmXVFcvk5KScOHFCWq2W7Nmzp2eeZhLhU0891X3LTW4kQHPV0W63u1cv2oMPPiinTp2SixcvysTExKokFcW+Gmtn+GKGbx1sp0+f7rmSuu+++3SRVULHAACS0J9x6c/AkopNXs2lJXn3xtVVo9GQ0dFR2fvww/K9z31OfmVlReSdd+THP/6xrhbr0KFDPV/eOH369KorIZMU9GdMV69eXZUwNm3aJJs3b5aZmZmeL3REOXPmjOzdu1cuXbok99xzj8zMzOgiTtu3b5crV67IU089JQ8++KCeLdu2bZPjx4+vSigTExPy7W9/uyeWlb0OIiKbN2/ueVFgxunatWuxV15JxgAAQunEZWRJYJHJa+WNN+RDInL9+nV59913RW58/vXBD35Q/vSb35R/+MQn5P+JyFtvvaWrxtq+fXvPtwt37dol+/bt675ldeHChe7bZXfeeWc3bj5Lcjl06FDQNwwPHDjQbe/atWuya9cu2b59u8zOznbjozH/a7Vnz55V34I0Nm3aJGfPnpWtW7f2LGdubk4WFhZ6lpGWax1ERD772c/Kjh07ZOfOnd3PAkdHR+WBBx6IvfJKOgYAEKfT6ciXvvTlVYnLMAnsj//4S3pWpMaOr7U6zz+y+scoX1xYkP89NSV3rKzIv912m9zz5JPy+5//vKxfv14ajYZcv35dLv/wh/LXX/yibNu7VyYmJuTjH/+4bgYAMOQ6nU7Qv1OFemD2+/4rr3t+8zflv774oqw/eVLuOnhQNoyNyU9+8pPulzNuvvlm+eSWLfLlEyfkk5/8ZOw/KAMAhlOeicvwJq81a9bI7bffLnfffbfce++9smXLFrn11lt7/qdr3bp18rGPfUzGx8fl9ttv76kPAEBRvL/n9YEPfECazaZs3rxZtmzZIps2bZINGzb0ZNBGoyG33HKL3HbbbbJu3bqe+gAAFMWbvAAAKCvv24YAAJQVyQsAUDkkLwBA5TR2HG51nvvqb+s4AAClNPnfznHlBQCoHpIXAKBySF4AgMoZee+XUQAAqA6uvAAAlUPyAgBUDskLAFA5JC8AQOVwY14AQLV0uPICAFRQY8cjZzrPPfI7Og6gBMbGxnRoKK2srOgQhtjkN86TvICyGhsbk6WlJR0eSkeOHJEnn3xSh5FSu93WoUSOHDki09PTOpxIlm2aS/Kq6itD/UququsRatjW16dK47C0tCSjo6M6PJRarZYsLi7KsWPH9KyhpfflJNrttmzcuFGHg8zPz8vi4qJMT09nbmNgyavKrwztrF/l9Qg1bOvrU5Vx2LhxI8nLYpJX1lf7dZLlysUkrzQJ0N4WWdtI2/9Mycsc+FU9uOxXclVej1DDtr4+VRmHqh9fect6squjLGNSh+TFtw2Bimo2m6smE7cfB2XQy0e9kbyAClteXu6ZTKwIIcnILlNUP1C8kG0dJWv9EIUkL/1qsB8rUhTfOujnWeTZVhZ6m8X1K25+FkW2Hce3bDueZJxQLL0tsmyPLHXrIq8xyKsdn0KSlzheERa9IkVoNpu5rUOWuv2kt1sUMz+vdbPbiVv2IOn9Iuu+kTdXX+JO7Hqer3ySMnFl7XK6jaT09kgrS92iZB2bJPJeVt7t2QpLXnVUxh0bw82VFLRm4Isw+8WIr7x9DISUkZj27Hm+fqE/ihr/otrte/LSB5rv4Esbj4vlTS9DL883L249dNmov+1H3V5eopar/7a51icubj+av3VZu5yrDR3LqnnjJFs2dlKI4hrDrPJoM67fWfn2E91nu5x51OVdsZCyer6rjInZ82z6eRGK2hZFtVtY8rI3TlMd+OZvE9evvLLEo2JJmbpm0pIuY9mz3oaOh7RpJO2LT9T6RrHXw+Zan6j11O1ElXWtsyuG3u2gxzgNvV0GLWq/TbtPmPXS6xq3D5q6Jqbnp22vH/JeTt7t2QpLXvbGyboCdn3XTmpvaFPWFUvDXge942dpNw2zY+t+SI598W0zs1zTh1Cu7aUlac/mqpfXdrclXeeyi9oWVeXbb808zd5PsmzftPV8x0Xa9vKUVx/yasensORVFHsntQfH3hmjYugfc1LQ26pobPdeZjzMFLctfOXtcdVldF2bLhu3/GFgHxdlHI+sfcpaP0Qlkpc+GAwT1weUL5ZU2npG1vqGWQd9EunHDmKY5WUZT58828tju9v6Pc5J+Ppl7yd2zEwuOu4r72tTx6PK6nK+50VbHsBx5JLHfjqMBpq8zM5jJnunTxuPiiXlW14U33JNXJcxMVc8ZHl5s5dv9y2KvW6uuG5Lx/U2s/nK+vjGP0+6T0UuC2H09siT3t5Zt3XS9lzHxbBrZPk9r6rfe60q97jLy7Ctr09VxqHqx1fest4Lr46yjEm73ZaFhQUdDmbubZi1jTR9FxHZyb0NAWD4HDlyRBYXF1NPebWRBVdeJX8FnpdhW1+fqoxD1Y+vvGW5yqirYR6TydlzXHkBAKqncf9XX+h89/C9Ou5V5l+eBeqEK6/32VfMqIf9+/envmqcnD2XLnktlfTXZ4G6IGm5tdttHUIFLSwsZHrLM1Py4uACAKSR9fM6PvMCAFQSyQsAUDkkLwBA5ZC8AACVMyIdHQIAoNxGyF0AgKrhbUMAQOWQvAAAlUPyAgBUDskLAFApDZIXAKCKSF4AgMopXfJqNpurJhO3Hwdl0MsHAJQweYmILC8v90wmVoSQZGSXKaofAIBwpUxeAABEqUzycl0h6bcWNT3PVz5JmbiydjndBgAgH437Dr3QOT1d/I9RtlotHeqanJzs/q1P+OZtumazKcvLy6seDf1cx/R8Xzs2VxlXTMfF0W+JGQMAqKqpqSlZWVnRYa+sP0a5c/Zcf5PX1NSUDouI9Ky0Tgo6rpOETddzJR09zxW36TJR9aLicmPsAKBO5ufnhyN5xa2gPvnruH6M4ko6el7aMiFl7TgA1FHoud2WNXlNPnGuOp95xWk6rsQAAPU00pCGjlWCucoxU9zVja+8ibvK6Lo2XTZu+QCA/JTuysuXBOxkY8fM5KLjvvK+NnU8qqwu53sOAMhupMNPKQMAKqZ0V14AAEThrvIAgMoheQEAKonkBQCoHJIXAKBySpW8Wq1WoonbLQHAcBrplOyb8ouLi0HTxMSErgoAGBKluvIyjh07FjvFse9+oe+YkUbW+nkJ7UdouTh5juEgufruioXQY5K2nTimXf0IoKTJKy/6bhl1OPij7thhr19UuVDNG7e9SjqGIWV8stTtJz0ueTNjLzltS6Buap28AAD1NCJDfHso19s+dsx3FeCbnzRuc5Vx/a1juk1dzn50lXUtN5Suo/tmHl3LCKmrRbWj43ZMx808+4rGVVY/D2HX0fWTLsNuR3O1ZceBuqt18rIP8KbjZOV7O8wXj5rva88Xt4WU0ew6uu+aq6xeZt7sNpOum68/vnayrp8uGzeeEpE8xLHuknIZvrivLdc4AHVV67cN7QPcdUBHnYCihNSzTzwh5V1lTJ/NSclmr4+ep8XNrwrXGEmK9XONZ1L2fjUIrrFIsk8AVVfr5BXHPgGFHuzmxJekTshyQspoy46EXFdpxr3OfPvLMO0TGG4j793iEHkf8L72fHGbKWOfsHU9+xW2njcIWfqQpW5SZkzrxN5fpET7BFCkoU1e5gA3k31C88Vd9XxxU88Xt4WU0ew6elkh9DJddBndN1cf7Ljhqh9aV8ej+mtLUl6XtfvjY5ePa19SLsPH15ZvTIE6akz82Qud5792r457jY2NydLSkoyOjupZkVqtlkxNTcnKyoqe1dVqtRLdOWPjxo2R7aUxrAd+UetdVLsAyiHk3K61Wi1ZXFyUJ598Us8K8oUnzpXr24ZTU1OycePG4Anp6SsHEgyAKinVFzZWVlYST3kblpP4sucD/7wV2TaA4VWq5AUAQAiSFwCgckheAIDKIXkBACqH5AUAqBySFwCgWjodkhcAoHpIXgCAyiF5AQAqpzHxZ893nv9a+P0Ei763YRJx7eF9jC2AIoSc27XM9zb887Plu6v84uJi0JTkBr54jx5D38TYAii70t1VfnFxUY4dO6ZnrbK0tBR5V3nXz1QM8j575ua3+rFfkrzSabfbkWPruoqbnJzUoVJotVrOvpm4b34/5LHsPNpIa5DLRnmEnNu1JOcjly/8+VkZ6ZTnpvK50zefdSU0La8yNjtR9TNhFWlqaqpnciU0La8ySY2NjemQTE5OduOu+f1g9yGtPNpIa5DLBvjCBlLTd/cPOZHlVSYPSV4pFiWPPuTRRlqDXDaG21AnL/v3rHQ8jzI2M89VxlffFauKVqvVnWzz8/O5lDHsuO9v8zxqvonpcpprvque/dxVXsddbUTFDVcbLkn6o9sJibvm2zHXPCCtTt3/SdlOCk31GZN57npL0S4XVyaqHZvv7UJffTvua3OQ5ufne05K9mcf5rnrLcWpqanulVVcmah2bPaVmuvv+fn5bjt2G3bZkGXZZcz8qHr2uuqrSTvua8MX13QbvnIh/fG144tH1dP9t8sDWdU6edlJIW0SsJOfT0iZKK76dn99iW+QzAnJPrHabyGNjY1531I0sVarJfPz890rraRlbOZEaV+1Geak7eqLLW5Zkze+4LGysiKT1uc9UfVMWTPP9FOzxyu0bZuvb1rc23y+sfLF4+rZ6wXkqdbJKyt9VeSjk2RSvvppE26/mJOSPmGFcL0qd9FJMop9wtRCTp4hyzJJQqw2Q+qJ44QeJWnb4ulbGr66vrgRNx/IE8krZ1mTjalvX3VlbbOsQl+VmzLz8/OrypqrGnM1o58nFbUskxjsJGFE1ZOE/UratsT0LUqSskCZjEiNvyofxSQFM5krHjtZ6DK6rqtM0isvX307nrTNQTMn6pb6PMzEXWV0XVeZyYi3w/TVjH4eJ2RZJjHY80Pq2Vz98rXhi7u4+uZjtzsZkEzT0v0H8tSY+NMXOs/PlOeflJPc3SHqH2nRK++xdZ2Edcw+geq4ea5PsnbcVUYv03At29WW/Vw/mnlG1LLEsU6Gb7muWMiyfXHD1UZcOfNcbpR1jYVdJy7um2/+lhtfnIk7B6B6Qs7tWivjPynv/Pr3y5W87IM0VFR7eB9ji37TV1vmipD9ql5Czu1a1uQ1+fXvl+szrxXrCwChE8LocQuZgCwmJyd7JuEFEXJUquQFAEAIkhcAoHJIXgCAyiF5AQAqh+QFAKgckhcAoFo6nXL9nxcwjPT/Q5UZxzC0NOf2zP/n9fj3SF7AoJkDueymp6dj77yC4ZPm3E7yAmog64HcL+12m+SFVdKc27Pu85OPf4/PvAAA1UPyAgBUzojU9DdR7J8Z0T9pkpci2kxrUH0xy9WPefO164snkUcbeZuZmelOiFfGbYhi1frKy/514iw/6uirF/c7W756IULq2mXi+hIiZJm2pvr9sSpJuq79NDMzI7Ozs92JBAasVuvkBQCop6FOXk3PW4q+mJ5nl4lqS9PlQurGlYkra5fTbdh0ndDyrjK++q6YzVfP8M13xfVzm467yvratOfBPRausUsajxprV3k7jnqrdfKyd+6m9RaXmed6S9GO2weAXVe/ReZry1XWMPHQuiFlJKY937rZQvpl08s3fPXj+uCr55vvi0eNkeGrr+u64r7yw8g1Fr7tkTSu5/nKR5VFPY10OvX8woYEfObVdLxys8vZB0USaetFcfU1qSL6FcXV5zzG18e1vFC+vvja9JUfRr5t6hs7W8g4hpQxfH1B/dT6yiuOSWpmsuNRB1y/NT2vMsuu3+PrW15aVR33QXBt07y3RyhXX1A/Q528bGZnt1+1pT0A0tarszzHN0SRbaNXyDZNGk8rpC+oh6FNXmbnNpN5ZWjHdcwnrq0oIXV1GV3Xpsua9kJELTNJOxJR34672vTV8833xXU9zTV2mm6zX8zX4800Ozuri5SKa5vqsUsb99HlXfG4NlBtjXv/5HTnhcfu03Ev7m0I5Cvrfd76hXsbwiXNuT3rPv957m0IAKgikhcAoHJIXgCAyiF5ASUwPT0t7Xa71BNQJnxhAxiwsbExHSo1jmHY0pzb+cIGUAMrKyuVmoAyIHkBACqHtw2BAWu1WjoEhXNHeaU5t+fxtiHJCxgwcyDDbXp6mn+OLrE053aSF1ADWQ/kumtzZ49SS3Nuz7rP84UNAEAlkbwAANXS6ZC8gDKy7yoPYLWRho7UhP1zCfpnE/JSRJtpDaovZrn6MS1ffV+8SINYptxIXLOzs92JBOY2qO2Dcqj1ldey+iXXtDu7r17c7wX56oUIqWuXietLiJBl2prq95iKVHT7RtIxQDWwXeun1skLAFBPQ528mp63FH0xPc8uE9WWpsuF1I0rE1fWLqfbsOk6oeVdZXz1XTGbq57+21cmLq5jLjruKutr056H4kVth7i/dT07jvKrdfKyd9Cm+llw81y/pWjH7Z3YrqvfwvK15SprmHho3ZAyEtOeb91sIf2y6eUbvvqhffCV0e0mjUeNneGrr+u64r7yKIZvO7iY7erbJ9h21TLS6ehQfdg7qGuHbDpefdnlzM6eVNp6UVx9TaqIfkVx9TmP8U3K1Y9Qvj762vSVR7m4tt8g9k2kV+srrzg6udlxfVIapKbnqqLsyjK+vn6kVdXtgff59ol+75tIb6iTl83ssPYrr7Q7cdp6dZbn+GYxiGUmZb4eb6bZ2VldBBHMvmVeZMQpy76JZIY2edk7uL2Tu3b8uJ05rq0oIXV1GV3XpsuGHLxG1DKTtCMR9e24r01XPUO3mzSu29NcY6rpNotg/58X/KK2rf08ZN8O2TdRHrVNXq6dT8eWHW8b2HEdsx9df0fVi4qF1LXL6HhUWV3O99zQdXQ7Nl3WFXPVd8UMu45uy1XGliSuy9jMPF1G19ftRpVH/lzbIIpv++kyOoZyqu0dNlBP9itm+xWyL47hwvYfHrW98kI9+V5t++IYLmz/4dDhxrxAOUxPT0u73WZyTIBLY+LA6c7zj/NjlMCgjI2N6RAcOHeUU5pze9Yfo3xg5p9IXgCA9NKc2/NIXrxtCACoHJIXAKBySF4AgMoheQEAKqVD8gIAVFFfv20IAKiffn/b8A8e7eNX5flfFgCor9omLwAAJJfk9c985gUAqB6SFwCgckheAIDKIXkBACon1Rc25ufndRgAgGBZv7CROHkdPnxYhwAASKyvyQsAgEHiq/IAgEoieQEAKofkBQCoHJIXAKBySF4AgMoheQEAKqcx8fB3O89//X4dRx/xW2fIQ9LfVNIOHjyoQxiAp59+Woe66vbTUvv370/1v17v/Z8XyWvgzM8DAGlNT0/Lxo0bMyev73znOzqMPtm/f7+88847sclraWlJhytpYWEh9V02SF4lYZLXsWPH9CwgyNLSUm7Jqy4nxyoxJ/LQ5FWH31PM8pte/JMyAKfR0VGmPk5IqkPyAuDXbDZ57MMjkhvp6EigZrPZnfKSZ1vDqNFo6FCPuPmArdlsyvLysogIjwU/IrlUV15mpzZTXkmHDVldJMb6SXs85nU+cOnnFUsdlmFfZBS9LFs/lpUqeWlpd3L0T6PRkE6nQ5JBsH6cgGz9Xl6cfpzXilyGvsjI80KjDHJJXpor09vP9QC64q42ouKG3ZYu46qrY3q+q4yJFaXRaPRMdsxVxsUXd3EtT8ftmD3Ppp+j2oo8seI9RZ5HXOq0TUekk/xTL5PB9QldHNnenh86cL42fHHNLqeXHxV31fMtczlwXdLodDrdScfFuooyk04aZr7ruS6v2/LFfXXsuO4vqs13fCVhH0e6PV9Mz9dlorjKu9qxn7vK67irjah4qCLPI3FcfbfXXa+Tq3xUvGipr7xcJ3QjbmVcySGKPT+ubYnYIULquqStl5VOQiHS1PExV1c6OebVPsrNdxwlZY5x13Gvzx/2MqPOMS6uNu2Ybid0/Xxt+OJJpKmTF1/fk4yjL94PqZNXFHtllgN3kFBp29aDnETaZWaRNgnpqyHDl4ii2FdeafqCasvrROQ6ZpYD3sVoJnzR6Gszrh27njlPREnSdpy4ZRXJ1/eQPuU5Bmml+qp8kk76ypodJmSgfG344kXqxzLTJi7DTmD67T8zJUliwudZQynk2MzCThqaOTeYKZSrTbudJG2FyNq27mu/pB1fl6xjkEbnvSuv5Ccls4OYye5w1LxQvjZ88RC6bihdzywzSRtpRF0pmeRjJleiC01Qui1f3LUMW+jyUB1F7uOmbXN85SGkTV/c1Ak5p/ja8MWjhCwvT2n66OJrxxcvwoikPOEsR2Ra1zxfOd9zVxtRcUPHfW2auJ7v+1svUy8nT/oqycR8ZeyYq4yLrucq64q7yrj+RvUVuY8vWy8K7WNRJyAzhYhqU8eT8LXhiycRum5p6P5F9T2OLu9rJ80YpFXIZ16oDvvqKuQKC8Mj5KTmYp/A9MlMzwuZb5fTj5qvTR3XZVwxXV63ERUPlbZeKLt/elmuea4y9t9x7dixopG8hpx9dUXigq0fJ6Bhl/YFAkheADw4sRaPFwjpNX7n4dOdM1+/T8fRR61WSyYmJnQYSCTP3/MyP9NhPsfgsdhH89tW/J5XmN9/9J9IXmVQt5/2xuDknbzQHySvZEheALpM8pqfn9ez0Ackr3AkLwBdBw8elLVr1+ow+igkedXpxQXJC0BmBw8e1CEMQFTyOnz4sA5VHskLADAUPve1f+Sr8gCA6iF5AQAqh+QFAKgckhcAoHJIXgCAyiF5AQAqZ4Q7iQMAqoYrLwBA5ZC8AACVQ/ICAFQOyQsAUDkkLwBA5TR++yvfHcjXDZ3fcnTFEtC1G+q5j64XxdnvGxqN0CW+L6q9MMmXmV6/+5p1edXQGZL1TCP78dE/FepqrPhT2eBX9v8DJ0X0PKsBMtkAAAAASUVORK5CYII="},3464:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEyOjU0OjI3LjY4MTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMjo1NDoyNy42ODE8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz6+SnPIAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTI6NTQ6MjdHG6xqAAAeRklEQVR4Xu3dbYxT15nA8edOgYjAZJyo3aoNbSbL9h2mTYUUob5tcUKlZtNCRaOV8gGBkFBpm2RaSjOTkLShgjSNMnSzYpUWQUdbPiwZwCtt34DRimQrlpYP26CV+gVBJGcTrVRlqJttSJre/ZA57vEz59w3X9v32v+fZI39nHPPOffaPo/PtccObn+gFsoC8yFHyQJBoCNNrpIwDEVCd1nRhGGSAxClU3sZNa60fUa1FS37ln5JjnkQ8ZjrB/FHIGftdJjg/nIJTafdvCuzDdXSzcFm9eb8WoqhZmTuxuD2B2rh8furqhgAgGL6/J5fyJAOAgBQdCQvAEDpkLwAAKVD8gIAlA7JCwBQKmFU8nrky1+Wx2+8Uf5leFgerlalXq/LH//4x2b59x58UL53440yPTwsE+9/vzz3m9/IK6+80tIGAACd4E1e448+Kqt/8AP5KxG5/Ve/ku/cc488//zzcvXqVRER+dL998vfPPGE/OHaa+UdO3ZI/YUX5A9/+INuBgAw4MY+/BF55tlndbjpmWeflQ9/5BYdjuRNXkuWLJFVH/mIXLz2Wvnv4WG589Qp+eennpKXXnpJ/vSnP8nixYvlxne/W/5n+XIJw1CWLVsmy5cv1800jY2Nyfj4eEvs8uXLMjY21rx99uxZGR4ebl5sY2NjzfjMzIzI/Pb2bW14eFj279+vwx0TNZY08monin189bEGgDz94z8+KVu3bnUmsGeefVa2bt0qTz75D7ookjd5XXPNNfLOd75T/vf66+XiF78ob4jIX//4x/Lvp07Jyy+/LEuWLJFb1qyRoUWL5B3veIe8/e1vl2XLlulmWhw8eFDOnj2rwyLziWj79u3SaDSk0WjIhQsXmhP4xo0b5amnnmqW1ev1lm0feeSRltsi0vHJ36XRaMimTZt0OLV22hkbG5PLly/rMAD0zCc/8Qk5dOjQggRmEtehQ4fkk5/4RMs2cYaivkUkCAL5o4h86KMflX/9zGfkna++Kr/97nflt7/9rbzyyiuyaNEiCYNAFi9enOgrew4fPizbt2/XYRERefHFF6Va/cs3fYyOjjYn8IsXL8ratWubZffdd1/z+s033ywrV65ckBSPHDki27Zta4kBAHpDJ7B2EpdErbyagkCuu+46uXvHDvnFmjXyqZdekh89/LBcunRJXnvtNQmCQIaG4psREVmzZo1Uq1Xnqby1a9fKwYMHnWXVarXl9KJ29913y9GjR5u3TSK76aabrFqt7NOTZqUyMzPTjNn9jY2Nyf79+2V4eFjGx8dbTn+aU5emnmnLxHUfGzdubMZc+yqqHXMK0Wxjryh1+2NjY3Lp0iVZvXq1bNy4sdmWqWNiUZIcA/1CAQCSsBNYO4lLRGQoyRdrDg0Nydve9jbZ/Pjj8p/vepd84de/lh89+aS88MILqb+Yc2pqSnbv3u08tdVoNOTMmTMLJsipqSl56KGHZHg+eWibNm2SgwcPNm8fPXpUdu3a1VLHNj4+LocPH26ehhwdHZWzZ8/KkSNHmrGHHnqoJbk8//zz0mg0ZGpqqqWvWq0me/bsad6W+cS1evVquXDhQksf4+PjcvfddzdjZ86ccR4H7Ze//KU0Gg05efJk8xSpax+ee+45ufnmm+XChQty4sQJERF57rnnmnXESuwuSY+BvQoGgG4LQ5GhpN+0vGTJEnnfBz4gq3fvlpeWLpUPnTghP6vVZPEbb8if//xnXT3S4cOHnUlIROTEiRPSaDRk/fr1LauMTZs2NSdg1wpiz549sn//frl8+bLMzs5GTrAf+9jHZMuWLS0T+blz5+T06dPNVceWLVvkzJkzzfJ77723eX3btm3NsR06dEg2bNjQLBMROX/+vGzbtk1GR0db4rOzs7Jly5ZmH6dPn5bz58+31HGZmpoSmV+dXrp0ScSzDy72Sur06dO6uEWaYwAAadmnCl3vgaURe77PrrB06VK5/bOflRe3bpW3v/qqLHriCVny2mupPyJv3st68cUXdVHTyZMn5ciRIzosU1NTcvHixQUrlg0bNsihQ4ekVqvJ1q1bW8o0kwgfe+yx5ik3mU+AZtXRaDSaqxftrrvukiNHjsjZs2elWq0uSFJR7NVYo40PZvj2wTYzM9Oykrrtttt0lQWSHgMASEO/x6XfA0srNnlV6nV5Y351FQSBDA8Py7b77pOf33GHvO/KFZHXX5ff/e53erNYu3btavnwxszMzIKVkEkK+j2mS5cuLUgYo6OjsnLlStm9e3fLBzqinDhxQrZt2ybnz5+XW2+9VXbv3q2rOK1du1YuXrwojz32mNx11126WNasWSMHDx5ckFCq1ap8//vfb4m1y94HEZGVK1e2vCgwx+ny5cuxK680xwAAktKJy2gngUUmrysvvyxvE5GrV6/KG2+8ITL//tdb3/pW+fqjj8q/vf/98n8i8uqrr+pNY61du7bl04WbNm2S7du3N09ZnTlzpnm67KabbmrGzXtJLrt27Ur0CcPx8fFme5cvX5ZNmzbJ2rVrZc+ePc34cMz/Wm3dunXBpyCN0dFROXnypKxevbqln6mpKZmdnW3pIyvXPoiIfOpTn5L169fLxo0bm+8FDg8Py+c+97nYlVfaYwAAccIwlK9+9Z4FicswCewrX/mqLooUrJ84ER6bXDipPTM7K/+xebPceOWK/Nf118ut+/bJ333+87Js2TIJgkCuXr0qF37zG/mnL31J1mzbJtVqVd773vfqZgAAAy4Mw0T/TpXUnY/83L/yuvXjH5e/f+YZWXb4sNy8c6csHxmR3//+980PZ1xzzTXywVWr5J5Dh+SDH/xg7D8oAwAGU56Jy/Amr0WLFskNN9wgt9xyi6xbt05WrVol1113Xcv/dC1dulTe8573yNjYmNxwww0t2wMA0Cne5PWWt7xFKpWKrFy5UlatWiWjo6OyfPnylgwaBIFce+21cv3118vSpUtbtgcAoFO8yQsAgKIieQEASofkBQAoHZIXAKB0gvUTJ8Kj3/y0jgMAUEgbvnOKlRcAoGwCkhcAoHwS/yQKAABFwcoLAFA6JC8AQOmQvAAApUPyAgCUDskLAFA6JC8AQOkM8Ul5AEDZBLfffyJ8+v70Xw81MjKiQwPlypUrOgQA6IIN3zmdLXmNjIxIvV7X4YGyd+9e2bdvnw4DQOE1Gg0dSmXv3r0yOTmpw6m0M4dmSl4mcQ0PD+uigVKr1eTcuXNy4MABXVQoeoVYhhVzGcdcNP1yDPtlP5Lq1v7W63VZsWKFDicyPT0t586dk8nJybbbIHn1gEle7b766DT71U1ZVsxlHHPR9Msx7Jf9SKqb+7tixYoFyTIJe+5rtw2SVw+0e/C7xV4hluV+K+OYi6ZfjmG/7EdS3drfRqPRduLpdfLq6EflK5WKDqVm2sizLQBAuXU0eeVpbm5OhxKxE1bWNgBgkLT7Qr/d7ZPoWPKqVCoyNzfXlZ0omkql0nLJU54rUSPPtrqlk8c4i7zHkHd7LvoYdqPPTvHtg77djjzbaoe+z+LGFVeupa3vk1c7LkEnk5eP76D74na5fd1VLypu/zXXdV27nm4jrbm5ueYlaVtJ6rF6/Issx7gsunU/28ewrMexMv9COY99aGfbbtL3WxRTnmTfktRJI+/2msIOJS/zYJL5A6d3wPdA88VtUQ/UqLgtqg27zDeGtPJsC24cYxj6+Y5kOvX86VS7Q1Lyn1K2H6gVx2oqrW498H1j1YlU19H1TcwVz4NrDDquywxXubmu453g698V12V2zC6zuer74mnb0dd1uR3vBN123BjSxuNiedN96P58ZXH7oetGXbf/6vbyEtWvvq51au7rRLuhhJ1ZeYnnzu2kilpNFZkeq32M7LH76tjstnx1svKNU8dddB39BHLF8xTVvyseVd81Xl3fVTdLO/p4+MpdbWVRsZ6npk3DXE8yhrTxqFhaZltz0dL2MefZb0PHk7RppB2LT9T+RrH3wyWuPK2827Plnrz0HZvHHRWlU+12WpIHX5I69rHt5AMlT90aZ5LjZ/PVTzvedtpx1XG1l9f9rp+n7bC3TzpmVywLex+yHPc8VebnQD0OyXEsvvvM9GvGkEXW7bS82vHJPXklYT+w7R30xW32nWPX03Fd36br+vrqJPvB5+rfjMtXbnPtI+KPsZa2vk9e7Ri+9uYKfL+nGbMrht5q93Hb7vZJDOX9lpdv0PoBrB/Uvri5rmO6no7r+vZfXVfX893OKi5BtvPENdvODfgEkPcxTlvfJ207cfVNeRHvd984osbsiqWVdTuj3e0Nsw/2fGPf7gbTXzvHsyx6svIaBJWIlZ15YOly+wGn6/jY9XQ/adh9+cagxxk1Nl2nnbH5RLUf1b8rHlXfRdf3xdO2o+v7yu243iZvScaQNh4VS8vXXxRfvyau65iYK56kv7zZ/dtji2LvWz8Ibv/m8fDpiXU67sV3G76p3e/m6pZufFda3k/gTo4577EWVSePYTf1y34k1a39bTQaMjs7q8OJme82bLeNrPPnhj2nWHkhPf2qbxCSAdBP9u7dK+fOnct8yauNdrDyyoiVV+eUccxF0y/HsF/2I6lB29+sNuw5JUNhzh/YAACg04Lbdh0PZyZZeaVlv0ICAKSzY8eOzGeuNuw5RfJqV6PR0CEAQITZ2dm23nYheQEAuq7dzwzwaUMAQCmRvAAApdKTH6MEAKBdJC8AQOmQvAAApUPyAgCUDskLAFA6JC8AQOmQvAAApUPyAgCUDskLAFAqYUjyAgCUUGGTV6VS0aHUTBt5tgUA6L3CJq88Zf2ZejthZW0DAJC/QiavSqUic3NzrHYAAE6FTF4+lUql5RIXt8vt6656UXH7r7mu69r1dBsAgPwEIt37McparaZDTRs2bGher8yvuly3fWVxcf1X19Nc9V0xHRfr9KJdL2rfAaDsNm/eLFeuXNFhr3Z/jPILj3Txl5RrtZps3rxZh0VEWnbalxz0dft2XFz/dTHJx9D1fW3ExWX+mAFAP5qenh6M5BW3gzqJiGc1Y9+Oi+u/mo676rtiSeIA0M+Szu22PJJXod7zMhO+vlQcCS0PnWoXANBZhUpeSVSsD0volY4rbjOJUNfTcV3fpuv6+gIAdE6hkpcvEdhxe0Wm6+i4nZyi6um4rm//1XV1Pd9tAEB+CpW8AABIYigMdai4fKsZXxwABtHIyEhHLhMTE7qrnmHlBQB9qF6v53qZnp7WXfRUUP3GsfDYA1Ud9xrp8EflkS/+QRrof3puzTpPR/F9vD3L3O5rK6kvPHJKguo3ZsJjD9ymy7yyHpQsO4j2mQcJgP40OTkpK1asIHnFyXpQsuwg2mceJAcOHNBFAPpAvV4fyOTFe14AgNIZevP7eQEAKI/CJS/72yv0N14kkbb+IAqCoOXi4orr7Vx1ikCP0YxT/00jyzY+vrZ88SzybAsookKeNtTfdhGXkOLK8RdBEEgYhi2XNBNdO9t2kx6niQHoD0MiPKEHHZM6gLIp5Moriu90ouu2HdPlWMheRaVdVdmn5+zbug07bsp0PV3uiunyJFz1dbs6briOh72tb1y6XOt2H5pr26jrui7QK4VMXvo9L/0FuK7TiXYds41dh6+QipdkBWZPYMH8KUjDXDdxfWpRx226Hb2tHbfb8U2kSSZaPR7XOKO2j9sXX/uGPn4unewjbltbmrpANxQyeen3vGy+lZdNb4NsXJOUPYH5JsV2BQkST5ykY3T1Ze+3vb3reEhMgvDxbdONPmxR+6+3d9UFeqWQycvHXlGRoPqTmTCTJJ482H0lSVSanuCTStq+dLgP3/67pKkLdFQYlit5oTOiJrgkE2C/MPtp/rr23Y5lTSqGq30d71QfLrrPqG19cZSD7/MAUWe0iqZUycu8h6VPG+r3v1ziygeFmZDsi5kc85qQdB+mfR13SVInL7ov1zjjEkfUWH3tu+pEybMPu40k2xpp6qL47DNXvutFV7jkFXfwfO+Hmet6e198kIWe0z++CcnEfeXiKHO174tH1XH17bseFRPPfuh+dNzFbkdvr7fR5b46Wqf6cMWjttXXdV2gVwqXvNC/7FfuvHoH0A6SF7rGfuVO4gLQDpIXAKB0+CXlPler1aRaTX7/Aiifgfs9r2+flKD6jePhsQfW6TKvrAclyw6ifSMjIzoEoA/p5DU9Pd1SngdXwskyt5O8AAALTExM6FBudMLJMreTvAAAPZVlbs8jefGBDQBA6QzxkWUAQJmEfLchAPSfkZGRjlw6+V5aWiQvAOhD9Xo910snPr3YjmDdzmPh8QeT/x/QCB/YKJVaraZDAPqMnluzztNRfB+yyDK3+9pKauO3fkHy6nfmQQKgP01OTg7cPym/mby+fiw8vpvk1a/Mg+TAgQO6CEAfqNfrA5m8hhb+QhAAAMU2JEL6AgCUR1jUTxu6fi25SMy4ijq+OPp3tVx0XN/2MfWS1jfS1k/C12bcvneLbxyuuK6Tt6T3W1x5Gel978d97EeFS16VSqXll5LtBJE2WaStn1Yev87c6TFqwfyPQNqXTjxZi/rP73r/s+x7lm003zh88U4yfUoP7rdu7F+UXu472lO45KXlkSAQLcmT1jWRum4naatIejVeX7++OIBWhU9eml6J6dOLrtv2X1fc1Y7mqqPbiKobF4+qY9/WcR1rh52MXMkqDXslYf7q9kwsSTzp9Xb2QbdlX9ftuMqjYro8Ld++6H6i4lFjscvsmG4nbhz2bd91vb2rPCoWVe6K69t2zMTtv7rMtQ16r3DJy5wq1BO4XW5fd51e1HXi+NoxKupUpouJ67p2gnHFk2xr13GJKkujU6/6A+tUmD1RmJjdr44nnTRcfbiY8qQTkq9dM+ao8doxV7nZ3pRrvrjh69sX12V6rDbdRhRfm5qvnmlf96nrmFhUuSsuCdp2idoGvTf05uc2isU3gWtRSa6Xkowrr4TTSfoJa982T2x928UXz0L3a9gxuz9f3aQTkq9dW5AiGWq+cbiOp6ueTdd3SVInjh5HkmMkCeu1cyw7oWjjwV8UbuWVlF6lFIk9rqKNrZ/pSTUvce2aBGQu7XIlrqKLO0ZGXL28j2W7ijYezCvit8pHrVby0o0+DF9fvngcsxo1yTsPcZOJ61W2eSLr252i+9G3zRj1eHVMl9lMvaTtuiSpIxH14o5l1Dh88U5wHVM71s1j2S1FG0877PnHd73oCpe87MlZT9D2aURdz8VXX0/6vv6MJH0Zuq5pLy4eVcfFLosbk82eVHyTSzfocfjiURO5zTVZuiRp34652vVN0r72XKK2s+OmHxdfG754GrqNKK5jZJdF1cvjWIo6Zq7tsrSdZZuy0POq63rRFS55iTrtpukDrevqbVz1fXG9rS2qL72drpckHlVH19fiyrXQcyrE9+TU8bjbdkyX6f5849AxE4+7rWNGkvZ9XHXj2kt63bWdvmi++rqOjrvq6Li+rtuwuerGcdVztaNjSa5HbZekjrmuY3obFEMhkxfckqzIkE0/vrpuh73iSHtcsmwDpDXwyatMiUCvyJAfXl23slccaY9Llm3a0c2+UBwDn7wAAOUTVL9+LDzG73n1rVqtJtVq8vsXQPkM2u95bXj45ySvfjcyMqJDAPqQTl7T09Mt5XlwJZwsczvJCwCwwMTEhA7lRiecLHM7yQsA0FNZ5vY8ktcQn9QBAJQNnzYEAJQOyQsAUDokLwBA6QTrvjYTHn/oNh334gMb5VKr1XQIAFLzzd9Z5vZ2P7Dx+Yd/TvLqd+ZBAgBZTU5OLvhHaCPL3E7yQizzIDlw4IAuAoBE6vV64ZIX73mhdIKY35cC0P9IXgCA0ils8krz68AAgAESFjh5FR3J1S3NKb00dSVDfQD9q5DJy/xaMAkCAOBSyOTlU6lUWhKauW3HdcKz47qeq66Ox9W3r+vbRWX/vLsvbpf5YnaZTd824ur6+tG3AaBwyasyv+qS+Z+910nAlJl65pKEqWtvaycnuz2diFxx11hMedIx9YL98+52EnL97LuO60Tiiru+7DlJXV8/ug4AFC559ZJZPfkSpk9ZkpbhWuFE8dVPk0jshOTbztcPAGiFTF6+JNJp9sorbRLSq7KisldAviSi2fWTbuOiV1S2LOMCMLgKlbz0qTt9Ki6trNtJym3tVVea7crIl3zi2KuurG0AgIiIhGGxklcaJlHoFZodT7N60u3FbWsnKlefRU1iJnno03NJ43GrIl9ystsxbdh1dT8uvrYBDJ6hIk0FvoRh4rrcXp254ua6/Tfuum7P1bbvur5dVPbpOTsZuWK+uKuO67pNt2FiutyuF1UfwOAq7crLXiUlWSkhmr3qSbLCAoBeKm3ysldJJK72uVY9RVX08QHovNImLwDA4AqqX5sJj/F7Xn2rVqtJtVrVYQBIpVC/57X7ZxKsG58Jjz9M8upXIyMjOgQAmbjm7yxzO8kLANBTWeb2PJIX73kBAEqH5AUAKB2SFwCgdEheAIDSKdTXQwEAECeUEn8xLwBgcJG8AAClQ/ICAJQOyQsAUDokLwBA6ZC8AAClM8RvIwEAyiQMWXkBAEqI5AUAKB2SFwCgdIaCgC+IAgCUScDKCwBQPiQvAEDpkLwAAKVD8gIAlA7JCwBQOkF1fCY89vBtOu41MjIi9XpdhoeHdVGkWq2mQwCAPrB582a5cuWKDnvVajU5d+6c7Nu3TxclcueDP+te8hoZGdEhAECf6NvkBQCA5JS8eM8LAFA6JC8AQOmQvAAApUPyAgCUTJjtAxvT09M6DABAYu19YOOn6ZPXxMSEDgEAkFpXkxcAAL1054M/5T0vAED5DIVhqGMAABQaKy8AQOmQvAAApUPyAgCUDskLAFA6wbr7ng6Pf+t2HUcX8VtnyEPa31TSdu7cqUPogccff1yHmvrtp6V27NiR6X+97nzwpxJ8+t6j4Ylvr9dl6CLz8wBAVpOTk7JixYq2k9cPf/hDHUaX7NixQ15//fXY5FWv13W4lGZnZzN/ywbJqyBM8jpw4IAuAhKp1+u5Ja9+mRzLxEzkSZNXP/yeYju/6cU/KQNwGh4e5tLFC9IjeQEASiV8M3kFOp5IpVJpXvKSZ1uDKAii78u4cgAoi0wrr0qlInNzc81LXklnbm5Oh1ASJEYYec0HLqbtTvZhdKOPTrMXGd3cn270lSl5aSSd4guCQMIwJMmgsLox4aVR9nlNLzLyXGgUQS7JS3Nlevu2PoCuuKuNqLhht6XruLbVMV3uqmNinRIEQcvFjrnquPjiLq7+dNyO2WU2fRtAsZQ9IdsyJS+TwfWELo5sb5cnPXC+Nnxxza6n+4+Ku7bz9TmXcF+yCMOwedFxsVZR5qKThil33db1dVu+uG8bO67HC9jPI/189cV0ua4TxVXf1Y5921Vfx11tRMXLwDV2e9/1PrnqR8U7LVPykohEIAl2xpUcotjlcW1LRGJJsq1L1u3apZNQElm28TGrK50c82ofg8E8x13Pez1/2M/dqDnGxdWmHdPt+OYJzdeGL14WvrGnOY6+eDdkTl5R7J2ZS/gASSpr2/ogp5G1z3ZkTUJ6NWT4ElEUe+WVZSyAeJLEXIKzGJWULxp9bca1Y29n5okoadouMt/Y4/ZfCnIMMn1UPs0gfXXNAybJgfK14Yt3Ujf6zJq4DDuB6dN/5pImiQnvZ6ED7KShmbkh7QtGV5t2O2naSqKTbXdS1uPr0qtjkGnlZR4g5mIPOKosKV8bvngSetuk9HamzzRtZBG1UjLJx1xciS5pgtJt+eKuPmxJ+wPEev6Y51cekrTpi5ttkswpvjZ88SLJa4y+dnzxTsiUvERlW81V5qvnu+1qIypu6LivTRPX5b7ruk/dT570KsnEfHXsmKuOi97OVdcVd9VxXQeizFkvCu3nok5A5pJEVJs6noavDV+8KPT4osYeR9f3tdPNY5A5eaE/2KurJCssII49genJTJclKbfr6b+ar00d13VcMV1ftxEVLwp7fHqMrjJXHft6XDt2rJPCMCR5DTp7dUXiAlAWJC8AQOkEn753Jjzx7dt0HF1Uq9WkWq3qMJBKnr/nxc90dJf5bSt+zyuZOx74CcmrCPrtp73ROySvciJ5pUPyAtBkktf09LQuQheQvJIjeQFo2rlzpyxevFiH0UVJklc/vbggeQFo286dO3UIPRCVvCYmJnSo9EheAICBcMcDP5GhUPjfHgBAufB/XgCA0iF5AQBKh+QFACidId7yAgCUDSsvAEDpDAlLLwBAyQzxKxgAgLLhtCEAoHRIXgCAcglJXgCAEhoKgkDHAAAorEBEgr+95+lQcs5fYdSnQKLKuqC3vceLPHboukG4O3rzmJvvM+e5p0h6clh7JOj6XRnK/wMYlVaH+W/MbAAAAABJRU5ErkJggg=="},6509:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEzOjE3OjIxLjI2NTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMzoxNzoyMS4yNjU8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz6HzNIHAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTM6MTc6MjHvOgvFAAAfoklEQVR4Xu3df4xU13nw8Wc2gIVhPWMraZSY1uvSpGkK27hCslCa5i1jO1LzCypqVfIfCISEQpvYvKXEuwG7MX1x6lpZUldUbhB01fJHnbWZSG2aYFYVdiNKyx9vjF4p/yCwNK6tV4q8ZOI3xo5z3z+yZ3zm4Zz7+87ce+f7kUZ75znnPOfeOzP3mXt3dqfRPvjtQCwN+06kd4f2xw1kyyBImcgxLMk2OYYXLsn6hUm7y4YhkBw3tEBBpp04ig3Msr5VMPztCwIRCYb9WAbDffpkep5Ltud6hqG2xj0Hvx2c/vIWHQcAoJQ+f/h7MqGDAACUHcULAFA5FC8AQOVQvAAAlUPxAgBUzoTvo6iP/fEfy5O33y7/NDkpj7bb0u125ac//Wm//a8OHpS/uv12mZ+clJmPfERe+sEP5I033hjIAQBAEbxnXvu+9jXZ+Hd/J78kIvf+53/KX3zpS/Lyyy/L9evXRUTkCw8/LL/29a/LT26+WT6wd690X3lFfvKTn+g0AIAxN/1bH5MXXnxRh/teePFF+a2P3aXDoSZ8fy+2atUq2fCxj8nlm2+W/zM5KZ99/nn5h6efltdee01+9rOfycqVK+X2X/kV+e+1ayUIAlmzZo2sXbtWp+mbnp6Wffv2DcSuXr0q09PT/fvnz5+XycnJ/s02PT3djy8sLIgsj7fva5OTk3L06FEdLkzYuiSRV54w9v7V+xoA8vQ3f/OU7Nq1y1nAXnjxRdm1a5c89dRf66ZQ3jOvm266ST74wQ/K/731Vrn8h38o74jIr/7jP8q/Pf+8vP7667Jq1Sq5a9MmmVixQj7wgQ/I+9//flmzZo1OM+D48eNy/vx5HRZZLkR79uyRXq8nvV5PLl261D+Ab9u2TZ5++ul+W7fbHRj72GOPDdwXkcIP/i69Xk+2b9+uw4llyTM9PS1Xr17VYQAYmd/9xCfkxIkTNxQwU7hOnDghv/uJTwyMieItXiIijUZDfioiv/nbvy3f/tSn5INvvik//Mu/lB/+8IfyxhtvyIoVKyRoNGTlypXSaPjO4d518uRJ2bNnjw6LiMirr74q7Xa7f39qaqp/AL98+bJs3ry53/bQQw/1l++8805Zv379DUXx1KlTsnv37oEYAGA0dAHLUrgkqniJiEijIbfccos8sHevfG/TJvnka6/J3z/6qFy5ckXeeustaTQaMjERnUZEZNOmTdJut52X8jZv3izHjx93trXb7YHLi9oDDzwgzzzzTP++KWR33HGH1WuQfXnSnKksLCz0Y/Z809PTcvToUZmcnJR9+/YNXP40ly5NP5PLxPUc27Zt68dc2yoqj7mEaMbYZ5Q6//T0tFy5ckU2btwo27Zt6+cyfUwsTJx9oN8oAEAcdgHLUrgkVvESkYmJCXnf+94nO558Uv7jl39Z/uC//kv+/qmn5JVXXkn8Dx7n5ubk0KFDzktbvV5Pzp07d8MBcm5uTh555BGZXC4e2vbt2+X48eP9+88884wcOHBgoI9t3759cvLkyf5lyKmpKTl//rycOnWqH3vkkUcGisvLL78svV5P5ubmBubqdDpy+PDh/n1ZLlwbN26US5cuDcyxb98+eeCBB/qxc+fOOfeD9v3vf196vZ6cOXOmf4nUtQ0vvfSS3HnnnXLp0iU5ffq0iIi89NJL/T5iFXaXuPvAPgsGgFGY8HxS/garVq2SX/+N35CNhw7Ja6tXy2+ePi3/2unIynfekZ///Oe6e6iTJ086i5CIyOnTp6XX68l99903cJaxffv2/gHYdQZx+PBhOXr0qFy9elUWFxdDD7Af//jHZefOnQMH8gsXLsjZs2f7Zx07d+6Uc+fO9dsffPDB/vLu3bv763bixAnZunVrv01E5OLFi7J7926ZmpoaiC8uLsrOnTv7c5w9e1YuXrw40Mdlbm5OZPns9MqVKyKebXCxz6TOnj2rmwck2QcAkJR9qdD1O7C4gjhnXnaH1atXy72///vy6q5d8v4335QVX/+6rHrrrcQfkTe/y3r11Vd1U9+ZM2fk1KlTOixzc3Ny+fLlG85Ytm7dKidOnJBOpyO7du0aaNNMIXziiSf6l9xkuQCas45er9c/e9Huv/9+OXXqlJw/f17a7fYNRSqMfTbWy/DBDN822BYWFgbOpO655x7d5QZx9wEAJKF/x6V/B5ZUZPFqdbvyzvLZVaPRkMnJSdn90EPy3U9/Wn792jWRt9+WH/3oR3pYpAMHDgx8eGNhYeGGMyFTFPTvmK5cuXJDwZiampL169fLoUOHBj7QEeb06dOye/duuXjxotx9991y6NAh3cVp8+bNcvnyZXniiSfk/vvv182yadMmOX78+A0Fpd1uyze+8Y2BWFb2NoiIrF+/fuBNgdlPV69ejTzzSrIPACAuXbiMLAUstHhde/11eZ+IXL9+Xd555x2R5d9/vfe975U//drX5J8/8hH5fyLy5ptv6qGRNm/ePPDpwu3bt8uePXv6l6zOnTvXv1x2xx139OPmd0kuBw4ciPUJw3379vXzXb16VbZv3y6bN2+Ww4cP9+OTEX9rtWvXrhs+BWlMTU3JmTNnZOPGjQPzzM3NyeLi4sAcabm2QUTkk5/8pNx3332ybdu2/u8CJycn5XOf+1zkmVfSfQAAUYIgkC9+8Us3FC7DFLA/+ZMv6qZQjXu/0gmee/jdImK8sLgo/75jh9x+7Zr871tvlbsff1w+8/nPy5o1a6TRaMj169fl0g9+IH/7hS/Ipt27pd1uy4c//GGdBgAw5oIgiPXnVHF9LuzLKO/+nd+RP3rhBVlz8qTcuX+/rG025cc//nH/wxk33XSTfHTDBvnSiRPy0Y9+NPIPlAEA4ynPwmV4i9eKFSvktttuk7vuuku2bNkiGzZskFtuuWXgb7pWr14tH/rQh2R6elpuu+22gfEAABTFW7ze8573SKvVkvXr18uGDRtkampK1q5dO1BBG42G3HzzzXLrrbfK6tWrB8YDAFCEIAgpXgAAlJX3v8oDAFBWnHkBACon9r+HAgCgLBqfmu0E/3Tgf+g4AACltPV/neWyIQCgeiaChF9pAgDASPFReQBAFVG8AACVQ/ECAFQOxQsAUDkULwBA5VC8AAAV06B4AQCqJqB4AQCqp3HfTCd45sv8eygA9ddsNnWolK5du6ZDsGz9i7Ppilez2WTnAqiUZrMp3W5Xh0vpyJEj8vjjj+twbnq9ng4lcuTIEZmdndXhRLJsY6riZZ4Ak5OT/ftlpwttFda5bOqyD+uyHXGN2/aGsY9bZdfpdOTChQty7Ngx3ZSLbrcr69at0+FY5ufn5cKFCzI7O5s5x8iKV1XeydgVvirrXDZ12Yd12Y64xm17fdatW1fJ4pX17CbMunXrbnhzE4e9bllzZCxep4Nnvvx7us3LvACq9GSw38VUZZ3Lpi77sC7bEde4ba+PvmJUdlkP7lF6vV7mwjPq4sWnDQFARFqtlg6JqHir1Rq4YXQoXgAQQ6vVkqWlpYFbXQtY1u3KOj6OQorXMFY8b2V7R5X3OuSdz0Xvw2HMWRTfNuj7WeSZKwv9mEWtV1R7FkXmrgv9WJl9pn+mlXW8kVcel0ZRxauq6vyOamlpSYcKUYd3pi31DjvLNmQZO0z6cQtj2vPaNjtP1NzDZp4LZeN6vPJYz7weUyPvfDaKl0fWgxbqI4+DAlB2RR3viso79OLV8lyasOO6zXC1m2UdL4Jvfldct9kxu83m6u+LJ82jl3W7HS+Czh21DknjUbG86Tn0fL62qO3QfcOW7Z86X17C5tXLNtf2RMXtn2ZZ97X7uXLoWBatkp51+bi23bUPfYra1qLyDrV4mSeDudlPRH0KrOk++gntiucpbH5XPKy/a311f1ffNHn0/vC1u3Kl0bJeLCanYZbjrEPSeFgsKTPW3LSkcyx5ttvQ8Tg5jaTr4hO2vWHs7bC5tidsO3WesL6ubXbF6izO4xW2D33045BV3vlsQy1eRSlyB9niPGFsvv5J1zdLHlcfVz77ye0aE5f9YsmSR9R6xF1nVywNexvS7Pc8tZYPQno9JMd18T1mZl6zDnG5Hi8tST6ba1xej7uRdHuHzfd4aXEeBy0qZ1x55fGpRfEaFvsJE+eBSdrfJ688hi/fkucAWQZJ1tkVw/CYA79+rIpW9ONu8tu3YW5fGr7XTZQkfV2yjo+D4uUR9cRM+iJJ2t8naZ6o/qbd/Cz6AJCEbz3C1tkVSyrtOCPreMNsg3ke6vvDYObLsj998syXx+Nu71ffPjb7wtyqJO1+KavCildLvUMRxzsX/aK0+2q6TxFPnLD8YfO74mH9XXR/XzxpHt3f127H9Zi8xVmHpPGwWFK++cL45jVx3cfEXPE48+XNnt9etzD2trniOpeO68fM5uvr49v/4yzpPqyaxr0Pnw6+9XC5/rdh3ju6yP/vlve6llWR+3CY6rIdcY3b9vrwvw0H9Xo9WVxc1OHYzP82zJoj7fZtO1yS/21ovzsYl2IAAKNy5MgRuXDhQupbXjmyKOWZV95495ldXfZhXbYjrnHbXh/OvOpl2+Hny3HmBQBAEpnOvACgKqp45lXUNymXwd69e1OfWW47/Hz64gUAVVGVoqX1ej0dqoXFxcVMl0UzFa+qPhkAAKOV9Xd6/M4LAFBJEyKBjgEAUGqceQEAKofiBQConAmuGgIAqiT4xZlXQ8cBACg1LhsCACqH4gUAqByKFwCgciheAIBKaVC8AABVRPECAFRO6YpXq9XSIREV19+8nCeTr6i8AIDsKvdHyq1WS5aWlgZuRRSGpaUlHUrMXq888gEAfqF0Z14AAESpRPEyZ1tJ6cuKvkuNrrh9+VDHdSwqbv80y7qvbz4AwI0a9x44HXxrtvgvo+x0OjrUt3Xr1v5yy1Go7FhUuy+u+5j7UfE8cvhiOi7W5UW7X9i+A4BR27Fjh1y7dk2HvfL4MsqhFq8dO3bosIjIwEb7Du6++76YjpviYIsqJro9bg5Dj3X1jYrL8j4HgDKan58fTfG658BzwcLsFt3mlbV4RW1g2EHcdd8X0/E4fez7+qerrx6jucbqvlFxACizuMd2W9bitfWx58v9O68iD+Atx1lUUr4cvjgAIB+lLl4u5izFvsUpcHqcGaPjYXRfXw4dj5MDABBf6YqXfTD3HdiX1N95+eg23xhXPv3T1Tdu3P5plnVf3zgAwI1KV7wAAIhC8QKAmmk2m4XcZmZm9FQjwX+VB4Ca6na7ud7m5+f1FCPTECnfR+WRL/7AGag/fWxNe5wO4/t4e5pjuy9XXH/wWAn/zgv5Mk8SAPU0Ozsr69ato3hFSbtT0mwgsjNPkmPHjukmADXQ7XbHsnjxOy8AQOVQvAAAlVO64qX/I0XR0s5nxkWNj2oHACRXuuJVBF8Bifr3TL5xtrDxstweJw8AIL6xKF4AgHopdfGyL83ZZy/2P7bVcVtYm4vOZ2K6Xcf0T53D8MUBAMmUuniJdWlPX36z/7ltnKIQdXkvbB7d7svly2H4xgEAkil98RrWAd8uOGnnTDsOABAf/9tQ8Z0xAQDKI6hz8UpahOyzrqRjAaBK7GOcb7nsJoJAh6qh5fg2YlN47JgdD+Maqy8l2nOmkXYcAORJHx9dy2VXujOvsB2p28xN97GLjx2P4sun211zhI0LiwEAkitd8RqmpRhnZFnps0AAQHaVLF55FoM8c7kUnR8AxlElixcAYLw12n/2XPDsV/g+r7rqdDrSbrd1GECNjOP3eVG8aq7ZbOoQgBrSxWt+fn6gPQ+ugpPm2J65eH31DMULAOpmZmZGh3KjC06aYzvFCwAwUmmO7XkUr4lf/KMNAACqg08bAgAqh+IFADXTbDYLuRX5u7SkKF4AUEPdbjfXWxGfXsyi0f6zZ4NnvxL/74CafGCjUjqdjg4BqBl9bE17nA7j+5BFmmO7L1dcy582pHjVmXmSAKin2dnZ8fsjZYpX/ZknybFjx3QTgBrodrtjWbz4nRcAoHIoXgCAyill8bK/sbjo79uKknb+tONseeQYlUaj0b9FxXWfvJn8UfNEtVeR3vaobYxqT8uX1xevgrzXPe98dRYEQfmKl/nyRvsW5yAep4+Pb2zUF0n6xmVh54y77XnK4wXUaDQkCIL+zT5wuuJFMnPK8hN+mIaxfWFGue1lluRxSdI3riJyjqPSFS9Un+9A6YsDQFKVK176TMS+b5bN5UZz0+2u+7rNReczMd3u6qPjrj6u5bBYWvY7v4bn0p5uD4vp9qR8Z2F6nrB42LrYbXZM54laD/u+b1mPd7WHxcLaXXF9346ZuP1Tt+kxvn1guNZH59DtWpz5fDlc8+u4HbPbbPq+EdXXNY8v7urjWnZx5dNx3TZuKle8wtiX+JJedgy7PCjLxcOVz4yz2+1cOp52XVyxrBrWZTz7hWDOkOx2Vx8Tc7Wb8aZd88UN39y+uG7T62rTOcL4cmq+fia/nlP3MbGwdldcYuR2CRsTxh6j4xIjr2mP4sqhcxs6bs8Ztk+1qL56Htc4PdbHNb/hy6fj426Cfyofj114iigko2C/MHwvhkaGd3n6xWeYF6HN1c+m+7vE6RNFr0ecfSQx+2XZl0XwrY/eBy6uxzCKb4xrPt+6+fj6u+az2WPiPIYojwmReE8OjOYDFEVzHThsgfVOL48XtO8AVmZR+8iI6pf3vswq7fqkfQyj9o9h8idZr7TbovvHXUeM3kSVH6YshSTpWPusK+nYKHnn8zHvMs2L1fWOM0ycPhLSL+qgF7YevngR7PVw7SOzPIx9OSx6fXzbEfUYRvHl9cXTSJsn6WOYRN75svL9jn1Yx6KsgjL+zssUB/tmX6az211xwzU+7lgX11h9KdGe0zXONTbuurhiabjeZdoHJN9BOslBK2ycHQ97Qfty+OJJ6BxhXPvIbgvrl8e+FLXPXOPS5E4yxmyDfd/ctDh57f3ionMkjbvmtPnmt/OYHHZfPY9rnGusXic7Z9R6+PK5xiWhjzmu5bIrXfGS5R1o3zQ77tvxvvFxxvr48ul23c8Vs+Nm2Y5rrlgeAsdlFv1C033iLrvG6Zvm66/76Lirj47rZZ3D5uobxdXPlUfH4iyHjYvTxyzrmB5jixrjatd97Jjuo+n+vjw65ou7+riWbTqHiel23c8Vs+Nm2Y77YmY5LJ+Oj6NSFq+yWPKcBQ2LPivLiif8L9jvXvW74ihpxiAfWR63Ohj37ddqWbzyPODnmSupUc5dZ/a716QHgDRjshjmXGWX5XGrg3Hffq2WxQsAUG+N9p8+Fzx7aIuOe6X9npg03/mC7DqdjrTb8b+vDUD1jNv3eW398+9RvOqu2WzqEIAa0sVrfn5+oD0ProKT5tieuXg9+l2KFwDUzczMjA7lRhecNMd2ihcAYKTSHNvzKF58YAMAUDkULwBA5VC8AKBmms1mIbcif5eWFMULAGqo2+3meivi04tZ8IGNmut0OjoEoGb0sTXtcTqM70MWaY7tvlxx8WnDMWCeJADqaXZ2dvz+SJniVX/mSXLs2DHdBKAGut3uWBYvfucFABWT9fu86oDiBQConNIVL/tbh/W3Eucpbd5hj6sD+zuIouK6T95M/qh5otqrSG971DZGtafly+uLV0Ee655HjnFSuuIlId9InJeoL3ksotCM+ost08jjxdRY/tI8c7MPnK54kcycMoLvyRrG9oUZ5baXWZLHJUlfFK+UxQv14TtQ+uIAEMeESHUOIvZlRH1J0XWZUd/3cfVz5XH10XH7vm6z+4yS/Q5SL+t3l672sJhuT8p3FqbnCYuHrYvdZsd0nqj1sO/7lvV4V3tYLKzdFdf37ZiJ2z91mx7j2weGa310Dt2uxZnPl8M1v47bMbvNpu8bUX1d8/ji9n3d5uLKYcd9+2pcBGU983IVBcO+3GeWW8uXAc3NHhd2eVDUWNc4nds1zjdWL4fFRs28IPSLwpwh2e2uPibmajfjTbvmixu+uX1x3abX1aZzhPHl1Hz9TH49p+5jYmHtrrjEyO0SNiaMPUbHJUZe0x7FlUPnNnTcnjNsn2pRffU8rnG+sXpZ8+XwrdO4KmXxchWLotiFJ+l8YUW2auwXhO+F1fC8G4zD96IzL0ibq59N93eJ0yeKXo84+0hi9suyL4vgWx+9D1xcj2EU3xjXfL518/H1d81ns8fEeQx9fPMjX6UsXsOmz5zisots0sJXRq4Dhy2w3g0mfUG7+A5gZRa1j4yofnnvy6zSrk/axzBq/xgmf5L1Srstun/cddTSzo9kxr542WddaQqYkWXssJkXpX3gcb3jDBOnj4T0izroha2HL14Eez1c+2iY+3JY9Pr4tiPqMYziy+uLp5E2T9LH0CfL2CLZxyvfctlNSIYnX1Hsy3FxdqYpPOaW5CzIHmvG6UuJrnXR8SRzxtmmYbAPPK6DsO8gneSgFTbOjoe9yH05fPEkdI4wrn1kt4X1y2NfitpnrnFpcicZY7bBvm9uWpy89n5x0TmSxl1z2nzz23lMDruvnsc1Ls78UXO75o+TN4p9vPItl1pQwjMvfSnOt2P1To7qH0aPMzHdrvv5Yq5lmy8+aoHjMod937TrWJxl1zh903z9dR8dd/XRcb2sc9hcfaO4+rny6Fic5bBxcfqYZR3TY2xRY1ztuo8d03003d+XR8d8cVcf17JN5zAx3a77+WJJl3UOO+4qeuOmdMVrGJYyXiJMI+nZWVHyeudWF/Y73KT7Jc0Y5CPL41ZVenvHYZv9GuNZvGQEZz/Dns+HJ/0g+x1u0v2SZkwWw5yr7LI8blU1btsbZWyLFwCguhrt/7kQPPvIPTrulfZ7YtJ85wuy63Q60m63dRhAjYzb93l9/pHvUbzqrtls6hCAGtLFa35+fqA9D66Ck+bYTvECANxgZmZGh3KjC06aY3vm4nXouxQvAEB6aY7teRQvPrABAKgcihcAoHIoXgCAyqF4AQAqh+IFAKgcihcAoHIoXgCAypkQ4V/rAwCqhTMvAEDlTIjw7/UBANXCmRcAoHIoXgCASgkoXgCAKqJ4AQAqh+IFAKgcihcAoHImAj4pDwCoGM68AACVQ/ECAFRKEAQULwBA9TS27FsInnv0Hh33ajab0u12ZXJyUjeF6nQ6OgQAqIEdO3bItWvXdNir0+nIhQsX5PHHH9dNsXz24L8Or3g1m00dAgDURG2LFwAAklPx4ndeAIDKoXgBACqH4gUAqByKFwCgclJ9YGN+fl6HAQCILesHNhIXr5mZGR0CACCxoRYvAABGiY/KAwAqieIFAKgcihcAoHIoXgCAyqF4AQAqhu/zAgBUEB+VLwG+6wx5SPqdStr+/ft1CCPw5JNP6lBf3b5aau/evan+1uuzB79D8SoD8/UAQFqzs7Oybt26zMXrm9/8pg5jSPbu3Stvv/12ZPHqdrs6XEmLi4up/8sGxaskTPE6duyYbgJi6Xa7uRWvuhwcq8QcyOMWrzp8n2KW7/T67MHv8DsvADeanJzkNsQbkqN4AQAqJ3XxarVa/Vte8sw1jhqNhg4NiGoHgKpIVbxarZYsLS31b3kVnaWlJR1CRVAYYeR1PHAxuYucwxjGHEWzTzKGuT3DmCtV8dIoOuXXaDQkCAKKDEprGAe8JKp+XNMnGXmeaJRBLsVLc1V6+77ega64K0dY3LBz6T6usTqm2119TKwojUZj4GbHXH1cfHEX13w6bsfsNpu+D6Bcql6QbamKl6ng+oAujmpvt8fdcb4cvrhm99Pzh8Vd43xzLsXcljSCIOjfdFyssyhz00XDtLvu6/46ly/uG2PH9foC9utIv159Md2u+4Rx9Xflse+7+uu4K0dYvApc625vu94mV/+weNFSFS8JKQQSY2NcxSGM3R6VW0IKS5yxLmnHZaWLUBxpxviYsytdHPPKj/FgXuOu170+ftiv3bBjjIsrpx3TeXzHCc2XwxevCt+6J9mPvvgwpC5eYeyNWYr5BIkrbW69k5NIO2cWaYuQPhsyfIUojH3mlWZdAPEUiaUYVzFaCd80+nJG5bHHmeNEmCS5y8y37lHbLyXZBxOS4piUZCV9fc0TJs6O8uXwxYs0jDnTFi7DLmD68p+5JSliwu+zUAC7aGjm2JD0DaMrp50nSa44isxdpLT712UU+yAQkYk0hyTzBDE3e4XD2uLy5fDF49Bj49LjzJxJcqQRdqZkio+5uQpd3AKlc/nirjlscecDxHr9mNdXHuLk9MXNmDjHFF8OX7xM8lpHXx5fvAipLxsuhVRaV5uvn+++K0dY3NBxX04T1+2+ZT2nnidP+izJxHx97Jirj4se5+rrirv6uJaBMEvWm0L7tagLkLnFEZZTx5Pw5fDFy0KvX9i6R9H9fXmGuQ9SFy/Ug312FecMC4hiH8D0wUy3xWm3++mfmi+njus+rpjur3OExcvCXj+9jq42Vx97OSqPHSsaxWvM2WdXFC4AVUHxAgBUTqP90ELw7J/zfV6j1Ol0pN1u6zCQSJ7f58XXdAyX+W4rvs8rns8c/A7Fqwzq9tXeGB2KVzVRvJL5zMHvSGPLgwvBc1+leAHjzhSv+fl53YQhoHjFR/EC0Ld//35ZuXKlDmOI4hSvOr25oHgByGz//v06hBEIK14zMzM6VHkZite3gue+eq9uAwCglD79lX/ho/IAgOqheAEAKofiBQCoHIoXAKByKF4AgMqZEOE7mAAA1cKZFwCgciheAIDKoXgBACqH4gUAqByKFwCgciheAIDKaWx5cCEQCfqB4N3Fd2NmoQSfqg+cK+iIJaBHx91MPS6Mc72XNRpxZ3xXWL54ks+Z3rDXNet81RCMyXamkf31MTwVWtVI0Yey/Db2/wMVfBi32J1lIgAAAABJRU5ErkJggg=="},785:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/program-files-f8cdc10a7b849ad9cab9898d0c3d991b.png"},3549:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/services-running-118fd895ca7944d053c33c08b47ff5b2.png"},6447:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/services-da895d107e06f4263e7146d321203bdf.png"},1465:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/zrok-agent-console-a1978cfd25a50a66a951fc71c388210d.png"},16:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/zrokdir-87b5820aa464dc4dadffbd6e9d098681.png"},8453:(e,n,r)=>{r.d(n,{R:()=>c,x:()=>d});var s=r(6540);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8528],{1469:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>A,contentTitle:()=>d,default:()=>a,frontMatter:()=>c,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/agent/windows-service/index","title":"Configuring a Windows Service","description":"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.","source":"@site/../docs/guides/agent/windows-service/index.mdx","sourceDirName":"guides/agent/windows-service","slug":"/guides/agent/windows-service/","permalink":"/docs/guides/agent/windows-service/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/windows-service/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Configuring a Windows Service","sidebar_label":"Windows Agent Service"},"sidebar":"tutorialSidebar","previous":{"title":"Linux Agent Service","permalink":"/docs/guides/agent/linux-service"},"next":{"title":"frontdoor","permalink":"/docs/guides/frontdoor"}}');var t=r(4848),i=r(8453);const c={title:"Configuring a Windows Service",sidebar_label:"Windows Agent Service"},d=void 0,A={},l=[{value:"Enabling the Service Environment",id:"enabling-the-service-environment",level:2},{value:"Installing the Service",id:"installing-the-service",level:2},{value:"Non-interactive Service Installation",id:"non-interactive-service-installation",level:2},{value:"Removing the zrok Agent Service",id:"removing-the-zrok-agent-service",level:2}];function o(e){const n={a:"a",code:"code",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system."}),"\n",(0,t.jsxs)(n.p,{children:["Support for running the zrok Agent as a Windows service is handled through a third party utility, ",(0,t.jsx)(n.code,{children:"nssm"}),", which is available here:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://nssm.cc/download",children:"https://nssm.cc/download"})}),"\n",(0,t.jsxs)(n.p,{children:["Give the ",(0,t.jsx)(n.code,{children:"nssm"})," documentation a quick review, here:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://nssm.cc/usage",children:"https://nssm.cc/usage"})}),"\n",(0,t.jsxs)(n.p,{children:["You'll want to install both the ",(0,t.jsx)(n.code,{children:"zrok.exe"})," and ",(0,t.jsx)(n.code,{children:"nssm.exe"})," in a convenient, protected location. In this example, we'll put them in ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok"}),", as ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\zrok.exe"})," and ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\nssm.exe"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"C:\\Program Files\\zrok",src:r(785).A+"",width:"922",height:"453"})}),"\n",(0,t.jsxs)(n.p,{children:["We're going to use a command prompt to install and configure our Agent service. Open a new command prompt and ",(0,t.jsx)(n.code,{children:'cd "\\Program Files\\zrok"'}),":"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Empty Command Prompt",src:r(6045).A+"",width:"1051",height:"552"})}),"\n",(0,t.jsx)(n.h2,{id:"enabling-the-service-environment",children:"Enabling the Service Environment"}),"\n",(0,t.jsxs)(n.p,{children:["On Windows, the ",(0,t.jsx)(n.code,{children:"USERPROFILE"}),' environment variable controls the "home" where zrok will look for the enabled environment. When running as a service on Windows, the process will be running as the ',(0,t.jsx)(n.code,{children:"Local System"})," user, which uses the directory ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),' directory as the user\'s "home" directory.']}),"\n",(0,t.jsx)(n.p,{children:"We're going to want to enable a zrok environment for our new Agent service in this directory. First, we'll run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>set USERPROFILE=c:\\Windows\\System32\\config\\systemprofile\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And with that environment variable set, we'll use the ",(0,t.jsx)(n.code,{children:"zrok enable"})," command to enable an environment for our new Agent service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok enable <accountToken>\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Enabling the Service Environment",src:r(18).A+"",width:"1051",height:"552"})}),"\n",(0,t.jsx)(n.p,{children:"Now we've got a new, enabled environment to use with our Agent running as a Windows service."}),"\n",(0,t.jsx)(n.h2,{id:"installing-the-service",children:"Installing the Service"}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok"})," directory, execute this command to invoke ",(0,t.jsx)(n.code,{children:"nssm"})," to create the new Windows service for our zrok Agent:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm install zrokAgent\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Windows might ask you for elevated Administrator privileges and will then show the main ",(0,t.jsx)(n.code,{children:"nssm"})," installation dialog, which we'll use to configure the new Windows service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"nssm install",src:r(3464).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:['We\'ll set "Path" to ',(0,t.jsx)(n.code,{children:"C:\\Program Files\\zrok\\zrok.exe"}),' (the zrok executable). We\'ll set the "Startup directory" to ',(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),' (the "home" directory for the ',(0,t.jsx)(n.code,{children:"Local System"}),' user). The "Arguments" are the command-line parameters that will get added to the command-line when starting the service, in this case, we want the service to start with the command ',(0,t.jsx)(n.code,{children:"zrok agent start"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['We\'ll set the "Service name" to ',(0,t.jsx)(n.code,{children:"zrokAgent"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['Next, scroll over to the "I/O" tab in the ',(0,t.jsx)(n.code,{children:"nssm"})," installer:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"I/O Tab",src:r(6509).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:['Set the "Output (stdout)" to log the standard output from the ',(0,t.jsx)(n.code,{children:"zrok agent start"})," process to the file ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stdout.log"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:['Set the "Error (stderr)" to log the standard error to the file ',(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stderr.log"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Setting the I/O redirection in this way will produce logs from the ",(0,t.jsx)(n.code,{children:"zrok agent start"})," process that could be useful for future troubleshooting."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"nssm"})," also provides options for automatically rotating these log files:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"File rotation",src:r(7972).A+"",width:"431",height:"232"})}),"\n",(0,t.jsxs)(n.p,{children:["We'll leave these unset in this example, but if your configuration needs this kind of log file rotation ",(0,t.jsx)(n.code,{children:"nssm"})," makes it available."]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, click the ",(0,t.jsx)(n.code,{children:"Install service"})," button to create the service."]}),"\n",(0,t.jsxs)(n.p,{children:['If we open the "Services" utility in Windows, we can see our new ',(0,t.jsx)(n.code,{children:"zrokAgent"})," service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Service Manager",src:r(6447).A+"",width:"1337",height:"688"})}),"\n",(0,t.jsx)(n.p,{children:'If we click the start button in the toolbar, or right-click on the service and select "start", our new zrok Agent service will start:'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Service Running",src:r(3549).A+"",width:"1337",height:"688"})}),"\n",(0,t.jsxs)(n.p,{children:["If we open a Windows Explorer in the folder ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile\\.zrok"})," we can see our logs, and the ",(0,t.jsx)(n.code,{children:"agent.socket"})," which is used by the zrok command-line to interact with our Agent service:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zrokdir",src:r(16).A+"",width:"922",height:"453"})}),"\n",(0,t.jsxs)(n.p,{children:["This zrok Agent service is now available for use. Whenever a Windows Command Prompt wants to interact with this environment, it is important that the ",(0,t.jsx)(n.code,{children:"USERPROFILE"})," environment variable is properly set to ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),", otherwise the zrok commands will attempt to interact with the environment that would be created in the user's default profile directory."]}),"\n",(0,t.jsx)(n.p,{children:"We can access the Agent console using this command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok agent console\n"})}),"\n",(0,t.jsx)(n.p,{children:"And this will open a web interface which allows the Agent to be managed:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zrok agent console",src:r(1465).A+"",width:"959",height:"700"})}),"\n",(0,t.jsx)(n.p,{children:"The Agent console can be used to directly create shares and accesses, and the zrok command-line can also be used."}),"\n",(0,t.jsx)(n.h2,{id:"non-interactive-service-installation",children:"Non-interactive Service Installation"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"nssm"})," provides a command-line that can do this configuration without interacting with the ",(0,t.jsx)(n.code,{children:"nssm"})," GUI. We would create our service like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:'C:\\Program Files\\zrok>nssm install zrokAgent "C:\\Program Files\\zrok\\zrok.exe" agent start\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppDirectory C:\\Windows\\System32\\config\\systemprofile\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppStdout C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stdout.log\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>nssm set zrokAgent AppStderr C:\\Windows\\System32\\config\\systemprofile\\.zrok\\agent-stderr.log\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And we can start our new service using the standard Windows service control utility, ",(0,t.jsx)(n.code,{children:"sc"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>sc start zrokAgent\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"nssm CLI installation",src:r(8562).A+"",width:"979",height:"512"})}),"\n",(0,t.jsx)(n.h2,{id:"removing-the-zrok-agent-service",children:"Removing the zrok Agent Service"}),"\n",(0,t.jsx)(n.p,{children:"The following commands (in a Command Prompt running as Administrator) can be used to remove the service from your system:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\>sc stop zrokAgent\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\>sc delete zrokAgent\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And if you have your ",(0,t.jsx)(n.code,{children:"USERPROFILE"})," environment variable properly set to ",(0,t.jsx)(n.code,{children:"C:\\Windows\\System32\\config\\systemprofile"}),", you can use this command to remove the environment from your system and from the zrok service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"C:\\Program Files\\zrok>zrok disable\n"})})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},6045:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/empty-command-prompt-b2bd6d54e13724b3e9d46ff0a51ff5da.png"},18:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/enable-21629193bbef3c2d120e685baef71bd1.png"},8562:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/nssm-cli-installation-1b01c278e11a00043e457c02963c797f.png"},7972:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEzOjA3OjQ4LjA2NTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMzowNzo0OC4wNjU8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4ouiEEAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTM6MDc6NDj93D1XAAAf8UlEQVR4Xu3dbYwcx3ng8WfWpASKXO1IsM+wxUTU8ew4DrmxAgIC4ThOtBIDxIm8NBjhAH1YkCBAmIltMWFoca2VHK2PchTBS58CBooJMosLP5xMiRMgLzbJxYHSGbxN+CEWEcBfCFLA6iQEMLTrsc6iZHnug1ijmmeruqvfZrp7/j+gMTtPV1VXV7880zOzPY37Hv37jkhHjIb54/1QNp2UDTmqdfsWwFG9cEn6FyXtkPVDR3Jc0QJ1Mg3iIFYwS3+roP/r1+mISKff27LT390n034u2fb1DFUT8axj4/5HW50Xvjqh4wAAlNLnv3FWRnQQAICyI3kBAKql0yF5AQCqZ2QAn6MCAJBah7cNAQBV5E1eT/zRH8nTd9wh/3N0VB6fmJClpSX52c9+1p3/l48+Kn95xx0yPzoqhz/xCXn5hz+UN998s6cNAACK4E1eB775Tdn6N38j/0lE7v+Xf5FvfPnL8sorr8j169dFROSLjzwi/+Vb35Kf3nKLfGT/fll69VX56U9/qpsBAAy58V//lLz40ks63PXiSy/Jr3/qbh2O5E1eN910k2z51Kfkyi23yL+PjsofnDsn/+PZZ+X111+Xn//857J27Vq545d/Wf7vhg3S6XRk/fr1smHDBt1M1/j4uBw4cKAndu3aNRkfH+8+v3jxooyOjnYn2/j4eDd++vRpkRv17efa6OioHD16VIcLE9WXJPJqJ4o9vnqsASBPf/VXz8iePXucCezFl16SPXv2yDPP/Hc9y6shIiO+f5K++eab5aMf/aj8x223yZU//EN5V0T+89/9nfyvc+fkjTfekJtuuknu3rZNRtaskY985CPy4Q9/WNavX6+b6XH8+HG5ePGiDovcSET79u2Tdrst7XZbLl++3D2B79y5U5599tnuvKWlpZ66TzzxRM9zESn85O/Sbrdl165dOpxYlnbGx8fl2rVrOgwAA/Nbn/mMnDhxYlUCM4nrxIkT8luf+UxPnTjeKy8RkUajIT8TkV/7jd+Qv//d35WPvvWW/Ogv/kJ+9KMfyZtvvilr1qyRTqMha9eulUbDlwbfd/LkSdm3b58Oi4jIa6+9JhMT79/pY9OmTd0T+JUrV2T79u3deQ8//HD377vuuks2b968KimeOnVK9u7d2xMDAAyGTmBZEpfEJS8REWk05NZbb5WH9u+X72/bJp99/XX528cfl6tXr8rbb78tjUZDRkbimxER2bZtm0xMTDjfytu+fbscP37cOW9iYqLn7UXtoYcekueee6773CSyO++80yrVy3570lypnD59uhuzlzc+Pi5Hjx6V0dFROXDgQM/bn+atS1POtGXiehk7d+7sxlzrKqod8xaiqWNfUer2x8fH5erVq7J161bZuXNnty1TxsSihIyBfqEAACHsBJYlcUlQ8hKRkZER+dCHPiRTTz8t/+eXfkm+8K//Kn/7zDPy6quvem+a6DM3NyczMzPOt7ba7bZcuHBh1Qlybm5OHnvsMRm9kTy0Xbt2yfHjx7vPn3vuOTl06FBPGduBAwfk5MmT3bchN23aJBcvXpRTp051Y4899lhPcnnllVek3W7L3Nxcz7JarZbMzs52n8uNxLV161a5fPlyzzIOHDggDz30UDd24cIF5zhoP/jBD6TdbsvZs2e7b5G61uHll1+Wu+66Sy5fvixnzpwREZGXX365W0asxO4SOgb2VTAADEJQ8pIbX+D4lV/9Vdk6MyOvr1snv3bmjPxzqyVr331XfvGLX+jikU6ePOlMQiIiZ86ckXa7LTt27Oi5yti1a1f3BOy6gpidnZWjR4/KtWvXZGFhIfIE++lPf1p2797dcyJfXFyU8+fPd686du/eLRcuXOjO/8pXvtL9e+/evd2+nThxQiYnJ7vzREQuXboke/fulU2bNvXEFxYWZPfu3d1lnD9/Xi5dutRTxmVubk7kxtXp1atXRTzr4GJfSZ0/f17P7pFkDAAgKfutQtdnYKGC/knZLrBu3Tq5//d+T17bs0c+/NZbsuZb35Kb3n478VfkzWdZr732mp7VdfbsWTl16pQOy9zcnFy5cmXVFcvk5KScOHFCWq2W7Nmzp2eeZhLhU0891X3LTW4kQHPV0W63u1cv2oMPPiinTp2SixcvysTExKokFcW+Gmtn+GKGbx1sp0+f7rmSuu+++3SRVULHAACS0J9x6c/AkopNXs2lJXn3xtVVo9GQ0dFR2fvww/K9z31OfmVlReSdd+THP/6xrhbr0KFDPV/eOH369KorIZMU9GdMV69eXZUwNm3aJJs3b5aZmZmeL3REOXPmjOzdu1cuXbok99xzj8zMzOgiTtu3b5crV67IU089JQ8++KCeLdu2bZPjx4+vSigTExPy7W9/uyeWlb0OIiKbN2/ueVFgxunatWuxV15JxgAAQunEZWRJYJHJa+WNN+RDInL9+nV59913RW58/vXBD35Q/vSb35R/+MQn5P+JyFtvvaWrxtq+fXvPtwt37dol+/bt675ldeHChe7bZXfeeWc3bj5Lcjl06FDQNwwPHDjQbe/atWuya9cu2b59u8zOznbjozH/a7Vnz55V34I0Nm3aJGfPnpWtW7f2LGdubk4WFhZ6lpGWax1ERD772c/Kjh07ZOfOnd3PAkdHR+WBBx6IvfJKOgYAEKfT6ciXvvTlVYnLMAnsj//4S3pWpMaOr7U6zz+y+scoX1xYkP89NSV3rKzIv912m9zz5JPy+5//vKxfv14ajYZcv35dLv/wh/LXX/yibNu7VyYmJuTjH/+4bgYAMOQ6nU7Qv1OFemD2+/4rr3t+8zflv774oqw/eVLuOnhQNoyNyU9+8pPulzNuvvlm+eSWLfLlEyfkk5/8ZOw/KAMAhlOeicvwJq81a9bI7bffLnfffbfce++9smXLFrn11lt7/qdr3bp18rGPfUzGx8fl9ttv76kPAEBRvL/n9YEPfECazaZs3rxZtmzZIps2bZINGzb0ZNBGoyG33HKL3HbbbbJu3bqe+gAAFMWbvAAAKCvv24YAAJQVyQsAUDkkLwBA5TR2HG51nvvqb+s4AAClNPnfznHlBQCoHpIXAKBySF4AgMoZee+XUQAAqA6uvAAAlUPyAgBUDskLAFA5JC8AQOVwY14AQLV0uPICAFRQY8cjZzrPPfI7Og6gBMbGxnRoKK2srOgQhtjkN86TvICyGhsbk6WlJR0eSkeOHJEnn3xSh5FSu93WoUSOHDki09PTOpxIlm2aS/Kq6itD/UququsRatjW16dK47C0tCSjo6M6PJRarZYsLi7KsWPH9KyhpfflJNrttmzcuFGHg8zPz8vi4qJMT09nbmNgyavKrwztrF/l9Qg1bOvrU5Vx2LhxI8nLYpJX1lf7dZLlysUkrzQJ0N4WWdtI2/9Mycsc+FU9uOxXclVej1DDtr4+VRmHqh9fect6squjLGNSh+TFtw2Bimo2m6smE7cfB2XQy0e9kbyAClteXu6ZTKwIIcnILlNUP1C8kG0dJWv9EIUkL/1qsB8rUhTfOujnWeTZVhZ6m8X1K25+FkW2Hce3bDueZJxQLL0tsmyPLHXrIq8xyKsdn0KSlzheERa9IkVoNpu5rUOWuv2kt1sUMz+vdbPbiVv2IOn9Iuu+kTdXX+JO7Hqer3ySMnFl7XK6jaT09kgrS92iZB2bJPJeVt7t2QpLXnVUxh0bw82VFLRm4Isw+8WIr7x9DISUkZj27Hm+fqE/ihr/otrte/LSB5rv4Esbj4vlTS9DL883L249dNmov+1H3V5eopar/7a51icubj+av3VZu5yrDR3LqnnjJFs2dlKI4hrDrPJoM67fWfn2E91nu5x51OVdsZCyer6rjInZ82z6eRGK2hZFtVtY8rI3TlMd+OZvE9evvLLEo2JJmbpm0pIuY9mz3oaOh7RpJO2LT9T6RrHXw+Zan6j11O1ElXWtsyuG3u2gxzgNvV0GLWq/TbtPmPXS6xq3D5q6Jqbnp22vH/JeTt7t2QpLXvbGyboCdn3XTmpvaFPWFUvDXge942dpNw2zY+t+SI598W0zs1zTh1Cu7aUlac/mqpfXdrclXeeyi9oWVeXbb808zd5PsmzftPV8x0Xa9vKUVx/yasensORVFHsntQfH3hmjYugfc1LQ26pobPdeZjzMFLctfOXtcdVldF2bLhu3/GFgHxdlHI+sfcpaP0Qlkpc+GAwT1weUL5ZU2npG1vqGWQd9EunHDmKY5WUZT58828tju9v6Pc5J+Ppl7yd2zEwuOu4r72tTx6PK6nK+50VbHsBx5JLHfjqMBpq8zM5jJnunTxuPiiXlW14U33JNXJcxMVc8ZHl5s5dv9y2KvW6uuG5Lx/U2s/nK+vjGP0+6T0UuC2H09siT3t5Zt3XS9lzHxbBrZPk9r6rfe60q97jLy7Ctr09VxqHqx1fest4Lr46yjEm73ZaFhQUdDmbubZi1jTR9FxHZyb0NAWD4HDlyRBYXF1NPebWRBVdeJX8FnpdhW1+fqoxD1Y+vvGW5yqirYR6TydlzXHkBAKqncf9XX+h89/C9Ou5V5l+eBeqEK6/32VfMqIf9+/envmqcnD2XLnktlfTXZ4G6IGm5tdttHUIFLSwsZHrLM1Py4uACAKSR9fM6PvMCAFQSyQsAUDkkLwBA5ZC8AACVMyIdHQIAoNxGyF0AgKrhbUMAQOWQvAAAlUPyAgBUDskLAFApDZIXAKCKSF4AgMopXfJqNpurJhO3Hwdl0MsHAJQweYmILC8v90wmVoSQZGSXKaofAIBwpUxeAABEqUzycl0h6bcWNT3PVz5JmbiydjndBgAgH437Dr3QOT1d/I9RtlotHeqanJzs/q1P+OZtumazKcvLy6seDf1cx/R8Xzs2VxlXTMfF0W+JGQMAqKqpqSlZWVnRYa+sP0a5c/Zcf5PX1NSUDouI9Ky0Tgo6rpOETddzJR09zxW36TJR9aLicmPsAKBO5ufnhyN5xa2gPvnruH6M4ko6el7aMiFl7TgA1FHoud2WNXlNPnGuOp95xWk6rsQAAPU00pCGjlWCucoxU9zVja+8ibvK6Lo2XTZu+QCA/JTuysuXBOxkY8fM5KLjvvK+NnU8qqwu53sOAMhupMNPKQMAKqZ0V14AAEThrvIAgMoheQEAKonkBQCoHJIXAKBySpW8Wq1WoonbLQHAcBrplOyb8ouLi0HTxMSErgoAGBKluvIyjh07FjvFse9+oe+YkUbW+nkJ7UdouTh5juEgufruioXQY5K2nTimXf0IoKTJKy/6bhl1OPij7thhr19UuVDNG7e9SjqGIWV8stTtJz0ueTNjLzltS6Buap28AAD1NCJDfHso19s+dsx3FeCbnzRuc5Vx/a1juk1dzn50lXUtN5Suo/tmHl3LCKmrRbWj43ZMx808+4rGVVY/D2HX0fWTLsNuR3O1ZceBuqt18rIP8KbjZOV7O8wXj5rva88Xt4WU0ew6uu+aq6xeZt7sNpOum68/vnayrp8uGzeeEpE8xLHuknIZvrivLdc4AHVV67cN7QPcdUBHnYCihNSzTzwh5V1lTJ/NSclmr4+ep8XNrwrXGEmK9XONZ1L2fjUIrrFIsk8AVVfr5BXHPgGFHuzmxJekTshyQspoy46EXFdpxr3OfPvLMO0TGG4j793iEHkf8L72fHGbKWOfsHU9+xW2njcIWfqQpW5SZkzrxN5fpET7BFCkoU1e5gA3k31C88Vd9XxxU88Xt4WU0ew6elkh9DJddBndN1cf7Ljhqh9aV8ej+mtLUl6XtfvjY5ePa19SLsPH15ZvTIE6akz82Qud5792r457jY2NydLSkoyOjupZkVqtlkxNTcnKyoqe1dVqtRLdOWPjxo2R7aUxrAd+UetdVLsAyiHk3K61Wi1ZXFyUJ598Us8K8oUnzpXr24ZTU1OycePG4Anp6SsHEgyAKinVFzZWVlYST3kblpP4sucD/7wV2TaA4VWq5AUAQAiSFwCgckheAIDKIXkBACqH5AUAqBySFwCgWjodkhcAoHpIXgCAyiF5AQAqpzHxZ893nv9a+P0Ei763YRJx7eF9jC2AIoSc27XM9zb887Plu6v84uJi0JTkBr54jx5D38TYAii70t1VfnFxUY4dO6ZnrbK0tBR5V3nXz1QM8j575ua3+rFfkrzSabfbkWPruoqbnJzUoVJotVrOvpm4b34/5LHsPNpIa5DLRnmEnNu1JOcjly/8+VkZ6ZTnpvK50zefdSU0La8yNjtR9TNhFWlqaqpnciU0La8ySY2NjemQTE5OduOu+f1g9yGtPNpIa5DLBvjCBlLTd/cPOZHlVSYPSV4pFiWPPuTRRlqDXDaG21AnL/v3rHQ8jzI2M89VxlffFauKVqvVnWzz8/O5lDHsuO9v8zxqvonpcpprvque/dxVXsddbUTFDVcbLkn6o9sJibvm2zHXPCCtTt3/SdlOCk31GZN57npL0S4XVyaqHZvv7UJffTvua3OQ5ufne05K9mcf5rnrLcWpqanulVVcmah2bPaVmuvv+fn5bjt2G3bZkGXZZcz8qHr2uuqrSTvua8MX13QbvnIh/fG144tH1dP9t8sDWdU6edlJIW0SsJOfT0iZKK76dn99iW+QzAnJPrHabyGNjY1531I0sVarJfPz890rraRlbOZEaV+1Geak7eqLLW5Zkze+4LGysiKT1uc9UfVMWTPP9FOzxyu0bZuvb1rc23y+sfLF4+rZ6wXkqdbJKyt9VeSjk2RSvvppE26/mJOSPmGFcL0qd9FJMop9wtRCTp4hyzJJQqw2Q+qJ44QeJWnb4ulbGr66vrgRNx/IE8krZ1mTjalvX3VlbbOsQl+VmzLz8/OrypqrGnM1o58nFbUskxjsJGFE1ZOE/UratsT0LUqSskCZjEiNvyofxSQFM5krHjtZ6DK6rqtM0isvX307nrTNQTMn6pb6PMzEXWV0XVeZyYi3w/TVjH4eJ2RZJjHY80Pq2Vz98rXhi7u4+uZjtzsZkEzT0v0H8tSY+NMXOs/PlOeflJPc3SHqH2nRK++xdZ2Edcw+geq4ea5PsnbcVUYv03At29WW/Vw/mnlG1LLEsU6Gb7muWMiyfXHD1UZcOfNcbpR1jYVdJy7um2/+lhtfnIk7B6B6Qs7tWivjPynv/Pr3y5W87IM0VFR7eB9ji37TV1vmipD9ql5Czu1a1uQ1+fXvl+szrxXrCwChE8LocQuZgCwmJyd7JuEFEXJUquQFAEAIkhcAoHJIXgCAyiF5AQAqh+QFAKgckhcAoFo6nXL9nxcwjPT/Q5UZxzC0NOf2zP/n9fj3SF7AoJkDueymp6dj77yC4ZPm3E7yAmog64HcL+12m+SFVdKc27Pu85OPf4/PvAAA1UPyAgBUzojU9DdR7J8Z0T9pkpci2kxrUH0xy9WPefO164snkUcbeZuZmelOiFfGbYhi1frKy/514iw/6uirF/c7W756IULq2mXi+hIiZJm2pvr9sSpJuq79NDMzI7Ozs92JBAasVuvkBQCop6FOXk3PW4q+mJ5nl4lqS9PlQurGlYkra5fTbdh0ndDyrjK++q6YzVfP8M13xfVzm467yvratOfBPRausUsajxprV3k7jnqrdfKyd+6m9RaXmed6S9GO2weAXVe/ReZry1XWMPHQuiFlJKY937rZQvpl08s3fPXj+uCr55vvi0eNkeGrr+u64r7yw8g1Fr7tkTSu5/nKR5VFPY10OvX8woYEfObVdLxys8vZB0USaetFcfU1qSL6FcXV5zzG18e1vFC+vvja9JUfRr5t6hs7W8g4hpQxfH1B/dT6yiuOSWpmsuNRB1y/NT2vMsuu3+PrW15aVR33QXBt07y3RyhXX1A/Q528bGZnt1+1pT0A0tarszzHN0SRbaNXyDZNGk8rpC+oh6FNXmbnNpN5ZWjHdcwnrq0oIXV1GV3Xpsua9kJELTNJOxJR34672vTV8833xXU9zTV2mm6zX8zX4800Ozuri5SKa5vqsUsb99HlXfG4NlBtjXv/5HTnhcfu03Ev7m0I5Cvrfd76hXsbwiXNuT3rPv957m0IAKgikhcAoHJIXgCAyiF5ASUwPT0t7Xa71BNQJnxhAxiwsbExHSo1jmHY0pzb+cIGUAMrKyuVmoAyIHkBACqHtw2BAWu1WjoEhXNHeaU5t+fxtiHJCxgwcyDDbXp6mn+OLrE053aSF1ADWQ/kumtzZ49SS3Nuz7rP84UNAEAlkbwAANXS6ZC8gDKy7yoPYLWRho7UhP1zCfpnE/JSRJtpDaovZrn6MS1ffV+8SINYptxIXLOzs92JBOY2qO2Dcqj1ldey+iXXtDu7r17c7wX56oUIqWuXietLiJBl2prq95iKVHT7RtIxQDWwXeun1skLAFBPQ528mp63FH0xPc8uE9WWpsuF1I0rE1fWLqfbsOk6oeVdZXz1XTGbq57+21cmLq5jLjruKutr056H4kVth7i/dT07jvKrdfKyd9Cm+llw81y/pWjH7Z3YrqvfwvK15SprmHho3ZAyEtOeb91sIf2y6eUbvvqhffCV0e0mjUeNneGrr+u64r7yKIZvO7iY7erbJ9h21TLS6ehQfdg7qGuHbDpefdnlzM6eVNp6UVx9TaqIfkVx9TmP8U3K1Y9Qvj762vSVR7m4tt8g9k2kV+srrzg6udlxfVIapKbnqqLsyjK+vn6kVdXtgff59ol+75tIb6iTl83ssPYrr7Q7cdp6dZbn+GYxiGUmZb4eb6bZ2VldBBHMvmVeZMQpy76JZIY2edk7uL2Tu3b8uJ05rq0oIXV1GV3XpsuGHLxG1DKTtCMR9e24r01XPUO3mzSu29NcY6rpNotg/58X/KK2rf08ZN8O2TdRHrVNXq6dT8eWHW8b2HEdsx9df0fVi4qF1LXL6HhUWV3O99zQdXQ7Nl3WFXPVd8UMu45uy1XGliSuy9jMPF1G19ftRpVH/lzbIIpv++kyOoZyqu0dNlBP9itm+xWyL47hwvYfHrW98kI9+V5t++IYLmz/4dDhxrxAOUxPT0u73WZyTIBLY+LA6c7zj/NjlMCgjI2N6RAcOHeUU5pze9Yfo3xg5p9IXgCA9NKc2/NIXrxtCACoHJIXAKBySF4AgMoheQEAKqVD8gIAVFFfv20IAKiffn/b8A8e7eNX5flfFgCor9omLwAAJJfk9c985gUAqB6SFwCgckheAIDKIXkBACon1Rc25ufndRgAgGBZv7CROHkdPnxYhwAASKyvyQsAgEHiq/IAgEoieQEAKofkBQCoHJIXAKBySF4AgMoheQEAKqcx8fB3O89//X4dRx/xW2fIQ9LfVNIOHjyoQxiAp59+Woe66vbTUvv370/1v17v/Z8XyWvgzM8DAGlNT0/Lxo0bMyev73znOzqMPtm/f7+88847sclraWlJhytpYWEh9V02SF4lYZLXsWPH9CwgyNLSUm7Jqy4nxyoxJ/LQ5FWH31PM8pte/JMyAKfR0VGmPk5IqkPyAuDXbDZ57MMjkhvp6EigZrPZnfKSZ1vDqNFo6FCPuPmArdlsyvLysogIjwU/IrlUV15mpzZTXkmHDVldJMb6SXs85nU+cOnnFUsdlmFfZBS9LFs/lpUqeWlpd3L0T6PRkE6nQ5JBsH6cgGz9Xl6cfpzXilyGvsjI80KjDHJJXpor09vP9QC64q42ouKG3ZYu46qrY3q+q4yJFaXRaPRMdsxVxsUXd3EtT8ftmD3Ppp+j2oo8seI9RZ5HXOq0TUekk/xTL5PB9QldHNnenh86cL42fHHNLqeXHxV31fMtczlwXdLodDrdScfFuooyk04aZr7ruS6v2/LFfXXsuO4vqs13fCVhH0e6PV9Mz9dlorjKu9qxn7vK67irjah4qCLPI3FcfbfXXa+Tq3xUvGipr7xcJ3QjbmVcySGKPT+ubYnYIULquqStl5VOQiHS1PExV1c6OebVPsrNdxwlZY5x13Gvzx/2MqPOMS6uNu2Ybid0/Xxt+OJJpKmTF1/fk4yjL94PqZNXFHtllgN3kFBp29aDnETaZWaRNgnpqyHDl4ii2FdeafqCasvrROQ6ZpYD3sVoJnzR6Gszrh27njlPREnSdpy4ZRXJ1/eQPuU5Bmml+qp8kk76ypodJmSgfG344kXqxzLTJi7DTmD67T8zJUliwudZQynk2MzCThqaOTeYKZSrTbudJG2FyNq27mu/pB1fl6xjkEbnvSuv5Ccls4OYye5w1LxQvjZ88RC6bihdzywzSRtpRF0pmeRjJleiC01Qui1f3LUMW+jyUB1F7uOmbXN85SGkTV/c1Ak5p/ja8MWjhCwvT2n66OJrxxcvwoikPOEsR2Ra1zxfOd9zVxtRcUPHfW2auJ7v+1svUy8nT/oqycR8ZeyYq4yLrucq64q7yrj+RvUVuY8vWy8K7WNRJyAzhYhqU8eT8LXhiycRum5p6P5F9T2OLu9rJ80YpFXIZ16oDvvqKuQKC8Mj5KTmYp/A9MlMzwuZb5fTj5qvTR3XZVwxXV63ERUPlbZeKLt/elmuea4y9t9x7dixopG8hpx9dUXigq0fJ6Bhl/YFAkheADw4sRaPFwjpNX7n4dOdM1+/T8fRR61WSyYmJnQYSCTP3/MyP9NhPsfgsdhH89tW/J5XmN9/9J9IXmVQt5/2xuDknbzQHySvZEheALpM8pqfn9ez0Ackr3AkLwBdBw8elLVr1+ow+igkedXpxQXJC0BmBw8e1CEMQFTyOnz4sA5VHskLADAUPve1f+Sr8gCA6iF5AQAqh+QFAKgckhcAoHJIXgCAyiF5AQAqZ4Q7iQMAqoYrLwBA5ZC8AACVQ/ICAFQOyQsAUDkkLwBA5TR++yvfHcjXDZ3fcnTFEtC1G+q5j64XxdnvGxqN0CW+L6q9MMmXmV6/+5p1edXQGZL1TCP78dE/FepqrPhT2eBX9v8DJ0X0PKsBMtkAAAAASUVORK5CYII="},3464:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEyOjU0OjI3LjY4MTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMjo1NDoyNy42ODE8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz6+SnPIAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTI6NTQ6MjdHG6xqAAAeRklEQVR4Xu3dbYxT15nA8edOgYjAZJyo3aoNbSbL9h2mTYUUob5tcUKlZtNCRaOV8gGBkFBpm2RaSjOTkLShgjSNMnSzYpUWQUdbPiwZwCtt34DRimQrlpYP26CV+gVBJGcTrVRlqJttSJre/ZA57vEz59w3X9v32v+fZI39nHPPOffaPo/PtccObn+gFsoC8yFHyQJBoCNNrpIwDEVCd1nRhGGSAxClU3sZNa60fUa1FS37ln5JjnkQ8ZjrB/FHIGftdJjg/nIJTafdvCuzDdXSzcFm9eb8WoqhZmTuxuD2B2rh8furqhgAgGL6/J5fyJAOAgBQdCQvAEDpkLwAAKVD8gIAlA7JCwBQKmFU8nrky1+Wx2+8Uf5leFgerlalXq/LH//4x2b59x58UL53440yPTwsE+9/vzz3m9/IK6+80tIGAACd4E1e448+Kqt/8AP5KxG5/Ve/ku/cc488//zzcvXqVRER+dL998vfPPGE/OHaa+UdO3ZI/YUX5A9/+INuBgAw4MY+/BF55tlndbjpmWeflQ9/5BYdjuRNXkuWLJFVH/mIXLz2Wvnv4WG589Qp+eennpKXXnpJ/vSnP8nixYvlxne/W/5n+XIJw1CWLVsmy5cv1800jY2Nyfj4eEvs8uXLMjY21rx99uxZGR4ebl5sY2NjzfjMzIzI/Pb2bW14eFj279+vwx0TNZY08monin189bEGgDz94z8+KVu3bnUmsGeefVa2bt0qTz75D7ookjd5XXPNNfLOd75T/vf66+XiF78ob4jIX//4x/Lvp07Jyy+/LEuWLJFb1qyRoUWL5B3veIe8/e1vl2XLlulmWhw8eFDOnj2rwyLziWj79u3SaDSk0WjIhQsXmhP4xo0b5amnnmqW1ev1lm0feeSRltsi0vHJ36XRaMimTZt0OLV22hkbG5PLly/rMAD0zCc/8Qk5dOjQggRmEtehQ4fkk5/4RMs2cYaivkUkCAL5o4h86KMflX/9zGfkna++Kr/97nflt7/9rbzyyiuyaNEiCYNAFi9enOgrew4fPizbt2/XYRERefHFF6Va/cs3fYyOjjYn8IsXL8ratWubZffdd1/z+s033ywrV65ckBSPHDki27Zta4kBAHpDJ7B2EpdErbyagkCuu+46uXvHDvnFmjXyqZdekh89/LBcunRJXnvtNQmCQIaG4psREVmzZo1Uq1Xnqby1a9fKwYMHnWXVarXl9KJ29913y9GjR5u3TSK76aabrFqt7NOTZqUyMzPTjNn9jY2Nyf79+2V4eFjGx8dbTn+aU5emnmnLxHUfGzdubMZc+yqqHXMK0Wxjryh1+2NjY3Lp0iVZvXq1bNy4sdmWqWNiUZIcA/1CAQCSsBNYO4lLRGQoyRdrDg0Nydve9jbZ/Pjj8p/vepd84de/lh89+aS88MILqb+Yc2pqSnbv3u08tdVoNOTMmTMLJsipqSl56KGHZHg+eWibNm2SgwcPNm8fPXpUdu3a1VLHNj4+LocPH26ehhwdHZWzZ8/KkSNHmrGHHnqoJbk8//zz0mg0ZGpqqqWvWq0me/bsad6W+cS1evVquXDhQksf4+PjcvfddzdjZ86ccR4H7Ze//KU0Gg05efJk8xSpax+ee+45ufnmm+XChQty4sQJERF57rnnmnXESuwuSY+BvQoGgG4LQ5GhpN+0vGTJEnnfBz4gq3fvlpeWLpUPnTghP6vVZPEbb8if//xnXT3S4cOHnUlIROTEiRPSaDRk/fr1LauMTZs2NSdg1wpiz549sn//frl8+bLMzs5GTrAf+9jHZMuWLS0T+blz5+T06dPNVceWLVvkzJkzzfJ77723eX3btm3NsR06dEg2bNjQLBMROX/+vGzbtk1GR0db4rOzs7Jly5ZmH6dPn5bz58+31HGZmpoSmV+dXrp0ScSzDy72Sur06dO6uEWaYwAAadmnCl3vgaURe77PrrB06VK5/bOflRe3bpW3v/qqLHriCVny2mupPyJv3st68cUXdVHTyZMn5ciRIzosU1NTcvHixQUrlg0bNsihQ4ekVqvJ1q1bW8o0kwgfe+yx5ik3mU+AZtXRaDSaqxftrrvukiNHjsjZs2elWq0uSFJR7NVYo40PZvj2wTYzM9Oykrrtttt0lQWSHgMASEO/x6XfA0srNnlV6nV5Y351FQSBDA8Py7b77pOf33GHvO/KFZHXX5ff/e53erNYu3btavnwxszMzIKVkEkK+j2mS5cuLUgYo6OjsnLlStm9e3fLBzqinDhxQrZt2ybnz5+XW2+9VXbv3q2rOK1du1YuXrwojz32mNx11126WNasWSMHDx5ckFCq1ap8//vfb4m1y94HEZGVK1e2vCgwx+ny5cuxK680xwAAktKJy2gngUUmrysvvyxvE5GrV6/KG2+8ITL//tdb3/pW+fqjj8q/vf/98n8i8uqrr+pNY61du7bl04WbNm2S7du3N09ZnTlzpnm67KabbmrGzXtJLrt27Ur0CcPx8fFme5cvX5ZNmzbJ2rVrZc+ePc34cMz/Wm3dunXBpyCN0dFROXnypKxevbqln6mpKZmdnW3pIyvXPoiIfOpTn5L169fLxo0bm+8FDg8Py+c+97nYlVfaYwAAccIwlK9+9Z4FicswCewrX/mqLooUrJ84ER6bXDipPTM7K/+xebPceOWK/Nf118ut+/bJ333+87Js2TIJgkCuXr0qF37zG/mnL31J1mzbJtVqVd773vfqZgAAAy4Mw0T/TpXUnY/83L/yuvXjH5e/f+YZWXb4sNy8c6csHxmR3//+980PZ1xzzTXywVWr5J5Dh+SDH/xg7D8oAwAGU56Jy/Amr0WLFskNN9wgt9xyi6xbt05WrVol1113Xcv/dC1dulTe8573yNjYmNxwww0t2wMA0Cne5PWWt7xFKpWKrFy5UlatWiWjo6OyfPnylgwaBIFce+21cv3118vSpUtbtgcAoFO8yQsAgKIieQEASofkBQAoHZIXAKB0gvUTJ8Kj3/y0jgMAUEgbvnOKlRcAoGwCkhcAoHwS/yQKAABFwcoLAFA6JC8AQOmQvAAApUPyAgCUDskLAFA6JC8AQOkM8Ul5AEDZBLfffyJ8+v70Xw81MjKiQwPlypUrOgQA6IIN3zmdLXmNjIxIvV7X4YGyd+9e2bdvnw4DQOE1Gg0dSmXv3r0yOTmpw6m0M4dmSl4mcQ0PD+uigVKr1eTcuXNy4MABXVQoeoVYhhVzGcdcNP1yDPtlP5Lq1v7W63VZsWKFDicyPT0t586dk8nJybbbIHn1gEle7b766DT71U1ZVsxlHHPR9Msx7Jf9SKqb+7tixYoFyTIJe+5rtw2SVw+0e/C7xV4hluV+K+OYi6ZfjmG/7EdS3drfRqPRduLpdfLq6EflK5WKDqVm2sizLQBAuXU0eeVpbm5OhxKxE1bWNgBgkLT7Qr/d7ZPoWPKqVCoyNzfXlZ0omkql0nLJU54rUSPPtrqlk8c4i7zHkHd7LvoYdqPPTvHtg77djjzbaoe+z+LGFVeupa3vk1c7LkEnk5eP76D74na5fd1VLypu/zXXdV27nm4jrbm5ueYlaVtJ6rF6/Issx7gsunU/28ewrMexMv9COY99aGfbbtL3WxRTnmTfktRJI+/2msIOJS/zYJL5A6d3wPdA88VtUQ/UqLgtqg27zDeGtPJsC24cYxj6+Y5kOvX86VS7Q1Lyn1K2H6gVx2oqrW498H1j1YlU19H1TcwVz4NrDDquywxXubmu453g698V12V2zC6zuer74mnb0dd1uR3vBN123BjSxuNiedN96P58ZXH7oetGXbf/6vbyEtWvvq51au7rRLuhhJ1ZeYnnzu2kilpNFZkeq32M7LH76tjstnx1svKNU8dddB39BHLF8xTVvyseVd81Xl3fVTdLO/p4+MpdbWVRsZ6npk3DXE8yhrTxqFhaZltz0dL2MefZb0PHk7RppB2LT9T+RrH3wyWuPK2827Plnrz0HZvHHRWlU+12WpIHX5I69rHt5AMlT90aZ5LjZ/PVTzvedtpx1XG1l9f9rp+n7bC3TzpmVywLex+yHPc8VebnQD0OyXEsvvvM9GvGkEXW7bS82vHJPXklYT+w7R30xW32nWPX03Fd36br+vrqJPvB5+rfjMtXbnPtI+KPsZa2vk9e7Ri+9uYKfL+nGbMrht5q93Hb7vZJDOX9lpdv0PoBrB/Uvri5rmO6no7r+vZfXVfX893OKi5BtvPENdvODfgEkPcxTlvfJ207cfVNeRHvd984osbsiqWVdTuj3e0Nsw/2fGPf7gbTXzvHsyx6svIaBJWIlZ15YOly+wGn6/jY9XQ/adh9+cagxxk1Nl2nnbH5RLUf1b8rHlXfRdf3xdO2o+v7yu243iZvScaQNh4VS8vXXxRfvyau65iYK56kv7zZ/dtji2LvWz8Ibv/m8fDpiXU67sV3G76p3e/m6pZufFda3k/gTo4577EWVSePYTf1y34k1a39bTQaMjs7q8OJme82bLeNrPPnhj2nWHkhPf2qbxCSAdBP9u7dK+fOnct8yauNdrDyyoiVV+eUccxF0y/HsF/2I6lB29+sNuw5JUNhzh/YAACg04Lbdh0PZyZZeaVlv0ICAKSzY8eOzGeuNuw5RfJqV6PR0CEAQITZ2dm23nYheQEAuq7dzwzwaUMAQCmRvAAApdKTH6MEAKBdJC8AQOmQvAAApUPyAgCUDskLAFA6JC8AQOmQvAAApUPyAgCUDskLAFAqYUjyAgCUUGGTV6VS0aHUTBt5tgUA6L3CJq88Zf2ZejthZW0DAJC/QiavSqUic3NzrHYAAE6FTF4+lUql5RIXt8vt6656UXH7r7mu69r1dBsAgPwEIt37McparaZDTRs2bGher8yvuly3fWVxcf1X19Nc9V0xHRfr9KJdL2rfAaDsNm/eLFeuXNFhr3Z/jPILj3Txl5RrtZps3rxZh0VEWnbalxz0dft2XFz/dTHJx9D1fW3ExWX+mAFAP5qenh6M5BW3gzqJiGc1Y9+Oi+u/mo676rtiSeIA0M+Szu22PJJXod7zMhO+vlQcCS0PnWoXANBZhUpeSVSsD0volY4rbjOJUNfTcV3fpuv6+gIAdE6hkpcvEdhxe0Wm6+i4nZyi6um4rm//1XV1Pd9tAEB+CpW8AABIYigMdai4fKsZXxwABtHIyEhHLhMTE7qrnmHlBQB9qF6v53qZnp7WXfRUUP3GsfDYA1Ud9xrp8EflkS/+QRrof3puzTpPR/F9vD3L3O5rK6kvPHJKguo3ZsJjD9ymy7yyHpQsO4j2mQcJgP40OTkpK1asIHnFyXpQsuwg2mceJAcOHNBFAPpAvV4fyOTFe14AgNIZevP7eQEAKI/CJS/72yv0N14kkbb+IAqCoOXi4orr7Vx1ikCP0YxT/00jyzY+vrZ88SzybAsookKeNtTfdhGXkOLK8RdBEEgYhi2XNBNdO9t2kx6niQHoD0MiPKEHHZM6gLIp5Moriu90ouu2HdPlWMheRaVdVdmn5+zbug07bsp0PV3uiunyJFz1dbs6briOh72tb1y6XOt2H5pr26jrui7QK4VMXvo9L/0FuK7TiXYds41dh6+QipdkBWZPYMH8KUjDXDdxfWpRx226Hb2tHbfb8U2kSSZaPR7XOKO2j9sXX/uGPn4unewjbltbmrpANxQyeen3vGy+lZdNb4NsXJOUPYH5JsV2BQkST5ykY3T1Ze+3vb3reEhMgvDxbdONPmxR+6+3d9UFeqWQycvHXlGRoPqTmTCTJJ482H0lSVSanuCTStq+dLgP3/67pKkLdFQYlit5oTOiJrgkE2C/MPtp/rr23Y5lTSqGq30d71QfLrrPqG19cZSD7/MAUWe0iqZUycu8h6VPG+r3v1ziygeFmZDsi5kc85qQdB+mfR13SVInL7ov1zjjEkfUWH3tu+pEybMPu40k2xpp6qL47DNXvutFV7jkFXfwfO+Hmet6e198kIWe0z++CcnEfeXiKHO174tH1XH17bseFRPPfuh+dNzFbkdvr7fR5b46Wqf6cMWjttXXdV2gVwqXvNC/7FfuvHoH0A6SF7rGfuVO4gLQDpIXAKB0+CXlPler1aRaTX7/Aiifgfs9r2+flKD6jePhsQfW6TKvrAclyw6ifSMjIzoEoA/p5DU9Pd1SngdXwskyt5O8AAALTExM6FBudMLJMreTvAAAPZVlbs8jefGBDQBA6QzxkWUAQJmEfLchAPSfkZGRjlw6+V5aWiQvAOhD9Xo910snPr3YjmDdzmPh8QeT/x/QCB/YKJVaraZDAPqMnluzztNRfB+yyDK3+9pKauO3fkHy6nfmQQKgP01OTg7cPym/mby+fiw8vpvk1a/Mg+TAgQO6CEAfqNfrA5m8hhb+QhAAAMU2JEL6AgCUR1jUTxu6fi25SMy4ijq+OPp3tVx0XN/2MfWS1jfS1k/C12bcvneLbxyuuK6Tt6T3W1x5Gel978d97EeFS16VSqXll5LtBJE2WaStn1Yev87c6TFqwfyPQNqXTjxZi/rP73r/s+x7lm003zh88U4yfUoP7rdu7F+UXu472lO45KXlkSAQLcmT1jWRum4naatIejVeX7++OIBWhU9eml6J6dOLrtv2X1fc1Y7mqqPbiKobF4+qY9/WcR1rh52MXMkqDXslYf7q9kwsSTzp9Xb2QbdlX9ftuMqjYro8Ld++6H6i4lFjscvsmG4nbhz2bd91vb2rPCoWVe6K69t2zMTtv7rMtQ16r3DJy5wq1BO4XW5fd51e1HXi+NoxKupUpouJ67p2gnHFk2xr13GJKkujU6/6A+tUmD1RmJjdr44nnTRcfbiY8qQTkq9dM+ao8doxV7nZ3pRrvrjh69sX12V6rDbdRhRfm5qvnmlf96nrmFhUuSsuCdp2idoGvTf05uc2isU3gWtRSa6Xkowrr4TTSfoJa982T2x928UXz0L3a9gxuz9f3aQTkq9dW5AiGWq+cbiOp6ueTdd3SVInjh5HkmMkCeu1cyw7oWjjwV8UbuWVlF6lFIk9rqKNrZ/pSTUvce2aBGQu7XIlrqKLO0ZGXL28j2W7ijYezCvit8pHrVby0o0+DF9fvngcsxo1yTsPcZOJ61W2eSLr252i+9G3zRj1eHVMl9lMvaTtuiSpIxH14o5l1Dh88U5wHVM71s1j2S1FG0877PnHd73oCpe87MlZT9D2aURdz8VXX0/6vv6MJH0Zuq5pLy4eVcfFLosbk82eVHyTSzfocfjiURO5zTVZuiRp34652vVN0r72XKK2s+OmHxdfG754GrqNKK5jZJdF1cvjWIo6Zq7tsrSdZZuy0POq63rRFS55iTrtpukDrevqbVz1fXG9rS2qL72drpckHlVH19fiyrXQcyrE9+TU8bjbdkyX6f5849AxE4+7rWNGkvZ9XHXj2kt63bWdvmi++rqOjrvq6Li+rtuwuerGcdVztaNjSa5HbZekjrmuY3obFEMhkxfckqzIkE0/vrpuh73iSHtcsmwDpDXwyatMiUCvyJAfXl23slccaY9Llm3a0c2+UBwDn7wAAOUTVL9+LDzG73n1rVqtJtVq8vsXQPkM2u95bXj45ySvfjcyMqJDAPqQTl7T09Mt5XlwJZwsczvJCwCwwMTEhA7lRiecLHM7yQsA0FNZ5vY8ktcQn9QBAJQNnzYEAJQOyQsAUDokLwBA6QTrvjYTHn/oNh334gMb5VKr1XQIAFLzzd9Z5vZ2P7Dx+Yd/TvLqd+ZBAgBZTU5OLvhHaCPL3E7yQizzIDlw4IAuAoBE6vV64ZIX73mhdIKY35cC0P9IXgCA0ils8krz68AAgAESFjh5FR3J1S3NKb00dSVDfQD9q5DJy/xaMAkCAOBSyOTlU6lUWhKauW3HdcKz47qeq66Ox9W3r+vbRWX/vLsvbpf5YnaZTd824ur6+tG3AaBwyasyv+qS+Z+910nAlJl65pKEqWtvaycnuz2diFxx11hMedIx9YL98+52EnL97LuO60Tiiru+7DlJXV8/ug4AFC559ZJZPfkSpk9ZkpbhWuFE8dVPk0jshOTbztcPAGiFTF6+JNJp9sorbRLSq7KisldAviSi2fWTbuOiV1S2LOMCMLgKlbz0qTt9Ki6trNtJym3tVVea7crIl3zi2KuurG0AgIiIhGGxklcaJlHoFZodT7N60u3FbWsnKlefRU1iJnno03NJ43GrIl9ystsxbdh1dT8uvrYBDJ6hIk0FvoRh4rrcXp254ua6/Tfuum7P1bbvur5dVPbpOTsZuWK+uKuO67pNt2FiutyuF1UfwOAq7crLXiUlWSkhmr3qSbLCAoBeKm3ysldJJK72uVY9RVX08QHovNImLwDA4AqqX5sJj/F7Xn2rVqtJtVrVYQBIpVC/57X7ZxKsG58Jjz9M8upXIyMjOgQAmbjm7yxzO8kLANBTWeb2PJIX73kBAEqH5AUAKB2SFwCgdEheAIDSKdTXQwEAECeUEn8xLwBgcJG8AAClQ/ICAJQOyQsAUDokLwBA6ZC8AAClM8RvIwEAyiQMWXkBAEqI5AUAKB2SFwCgdIaCgC+IAgCUScDKCwBQPiQvAEDpkLwAAKVD8gIAlA7JCwBQOkF1fCY89vBtOu41MjIi9XpdhoeHdVGkWq2mQwCAPrB582a5cuWKDnvVajU5d+6c7Nu3TxclcueDP+te8hoZGdEhAECf6NvkBQCA5JS8eM8LAFA6JC8AQOmQvAAApUPyAgCUTJjtAxvT09M6DABAYu19YOOn6ZPXxMSEDgEAkFpXkxcAAL1054M/5T0vAED5DIVhqGMAABQaKy8AQOmQvAAApUPyAgCUDskLAFA6wbr7ng6Pf+t2HUcX8VtnyEPa31TSdu7cqUPogccff1yHmvrtp6V27NiR6X+97nzwpxJ8+t6j4Ylvr9dl6CLz8wBAVpOTk7JixYq2k9cPf/hDHUaX7NixQ15//fXY5FWv13W4lGZnZzN/ywbJqyBM8jpw4IAuAhKp1+u5Ja9+mRzLxEzkSZNXP/yeYju/6cU/KQNwGh4e5tLFC9IjeQEASiV8M3kFOp5IpVJpXvKSZ1uDKAii78u4cgAoi0wrr0qlInNzc81LXklnbm5Oh1ASJEYYec0HLqbtTvZhdKOPTrMXGd3cn270lSl5aSSd4guCQMIwJMmgsLox4aVR9nlNLzLyXGgUQS7JS3Nlevu2PoCuuKuNqLhht6XruLbVMV3uqmNinRIEQcvFjrnquPjiLq7+dNyO2WU2fRtAsZQ9IdsyJS+TwfWELo5sb5cnPXC+Nnxxza6n+4+Ku7bz9TmXcF+yCMOwedFxsVZR5qKThil33db1dVu+uG8bO67HC9jPI/189cV0ua4TxVXf1Y5921Vfx11tRMXLwDV2e9/1PrnqR8U7LVPykohEIAl2xpUcotjlcW1LRGJJsq1L1u3apZNQElm28TGrK50c82ofg8E8x13Pez1/2M/dqDnGxdWmHdPt+OYJzdeGL14WvrGnOY6+eDdkTl5R7J2ZS/gASSpr2/ogp5G1z3ZkTUJ6NWT4ElEUe+WVZSyAeJLEXIKzGJWULxp9bca1Y29n5okoadouMt/Y4/ZfCnIMMn1UPs0gfXXNAybJgfK14Yt3Ujf6zJq4DDuB6dN/5pImiQnvZ6ED7KShmbkh7QtGV5t2O2naSqKTbXdS1uPr0qtjkGnlZR4g5mIPOKosKV8bvngSetuk9HamzzRtZBG1UjLJx1xciS5pgtJt+eKuPmxJ+wPEev6Y51cekrTpi5ttkswpvjZ88SLJa4y+dnzxTsiUvERlW81V5qvnu+1qIypu6LivTRPX5b7ruk/dT570KsnEfHXsmKuOi97OVdcVd9VxXQeizFkvCu3nok5A5pJEVJs6noavDV+8KPT4osYeR9f3tdPNY5A5eaE/2KurJCssII49genJTJclKbfr6b+ar00d13VcMV1ftxEVLwp7fHqMrjJXHft6XDt2rJPCMCR5DTp7dUXiAlAWJC8AQOkEn753Jjzx7dt0HF1Uq9WkWq3qMJBKnr/nxc90dJf5bSt+zyuZOx74CcmrCPrtp73ROySvciJ5pUPyAtBkktf09LQuQheQvJIjeQFo2rlzpyxevFiH0UVJklc/vbggeQFo286dO3UIPRCVvCYmJnSo9EheAICBcMcDP5GhUPjfHgBAufB/XgCA0iF5AQBKh+QFACidId7yAgCUDSsvAEDpDAlLLwBAyQzxKxgAgLLhtCEAoHRIXgCAcglJXgCAEhoKgkDHAAAorEBEgr+95+lQcs5fYdSnQKLKuqC3vceLPHboukG4O3rzmJvvM+e5p0h6clh7JOj6XRnK/wMYlVaH+W/MbAAAAABJRU5ErkJggg=="},6509:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAADoCAYAAABYQWthAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANnaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPm1pY2hhZWw8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTI2VDEzOjE3OjIxLjI2NTwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0yNlQxMzoxNzoyMS4yNjU8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz6HzNIHAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjU6MDM6MjYgMTM6MTc6MjHvOgvFAAAfoklEQVR4Xu3df4xU13nw8Wc2gIVhPWMraZSY1uvSpGkK27hCslCa5i1jO1LzCypqVfIfCISEQpvYvKXEuwG7MX1x6lpZUldUbhB01fJHnbWZSG2aYFYVdiNKyx9vjF4p/yCwNK6tV4q8ZOI3xo5z3z+yZ3zm4Zz7+87ce+f7kUZ75znnPOfeOzP3mXt3dqfRPvjtQCwN+06kd4f2xw1kyyBImcgxLMk2OYYXLsn6hUm7y4YhkBw3tEBBpp04ig3Msr5VMPztCwIRCYb9WAbDffpkep5Ltud6hqG2xj0Hvx2c/vIWHQcAoJQ+f/h7MqGDAACUHcULAFA5FC8AQOVQvAAAlUPxAgBUzoTvo6iP/fEfy5O33y7/NDkpj7bb0u125ac//Wm//a8OHpS/uv12mZ+clJmPfERe+sEP5I033hjIAQBAEbxnXvu+9jXZ+Hd/J78kIvf+53/KX3zpS/Lyyy/L9evXRUTkCw8/LL/29a/LT26+WT6wd690X3lFfvKTn+g0AIAxN/1bH5MXXnxRh/teePFF+a2P3aXDoSZ8fy+2atUq2fCxj8nlm2+W/zM5KZ99/nn5h6efltdee01+9rOfycqVK+X2X/kV+e+1ayUIAlmzZo2sXbtWp+mbnp6Wffv2DcSuXr0q09PT/fvnz5+XycnJ/s02PT3djy8sLIgsj7fva5OTk3L06FEdLkzYuiSRV54w9v7V+xoA8vQ3f/OU7Nq1y1nAXnjxRdm1a5c89dRf66ZQ3jOvm266ST74wQ/K/731Vrn8h38o74jIr/7jP8q/Pf+8vP7667Jq1Sq5a9MmmVixQj7wgQ/I+9//flmzZo1OM+D48eNy/vx5HRZZLkR79uyRXq8nvV5PLl261D+Ab9u2TZ5++ul+W7fbHRj72GOPDdwXkcIP/i69Xk+2b9+uw4llyTM9PS1Xr17VYQAYmd/9xCfkxIkTNxQwU7hOnDghv/uJTwyMieItXiIijUZDfioiv/nbvy3f/tSn5INvvik//Mu/lB/+8IfyxhtvyIoVKyRoNGTlypXSaPjO4d518uRJ2bNnjw6LiMirr74q7Xa7f39qaqp/AL98+bJs3ry53/bQQw/1l++8805Zv379DUXx1KlTsnv37oEYAGA0dAHLUrgkqniJiEijIbfccos8sHevfG/TJvnka6/J3z/6qFy5ckXeeustaTQaMjERnUZEZNOmTdJut52X8jZv3izHjx93trXb7YHLi9oDDzwgzzzzTP++KWR33HGH1WuQfXnSnKksLCz0Y/Z809PTcvToUZmcnJR9+/YNXP40ly5NP5PLxPUc27Zt68dc2yoqj7mEaMbYZ5Q6//T0tFy5ckU2btwo27Zt6+cyfUwsTJx9oN8oAEAcdgHLUrgkVvESkYmJCXnf+94nO558Uv7jl39Z/uC//kv+/qmn5JVXXkn8Dx7n5ubk0KFDzktbvV5Pzp07d8MBcm5uTh555BGZXC4e2vbt2+X48eP9+88884wcOHBgoI9t3759cvLkyf5lyKmpKTl//rycOnWqH3vkkUcGisvLL78svV5P5ubmBubqdDpy+PDh/n1ZLlwbN26US5cuDcyxb98+eeCBB/qxc+fOOfeD9v3vf196vZ6cOXOmf4nUtQ0vvfSS3HnnnXLp0iU5ffq0iIi89NJL/T5iFXaXuPvAPgsGgFGY8HxS/garVq2SX/+N35CNhw7Ja6tXy2+ePi3/2unIynfekZ///Oe6e6iTJ086i5CIyOnTp6XX68l99903cJaxffv2/gHYdQZx+PBhOXr0qFy9elUWFxdDD7Af//jHZefOnQMH8gsXLsjZs2f7Zx07d+6Uc+fO9dsffPDB/vLu3bv763bixAnZunVrv01E5OLFi7J7926ZmpoaiC8uLsrOnTv7c5w9e1YuXrw40Mdlbm5OZPns9MqVKyKebXCxz6TOnj2rmwck2QcAkJR9qdD1O7C4gjhnXnaH1atXy72///vy6q5d8v4335QVX/+6rHrrrcQfkTe/y3r11Vd1U9+ZM2fk1KlTOixzc3Ny+fLlG85Ytm7dKidOnJBOpyO7du0aaNNMIXziiSf6l9xkuQCas45er9c/e9Huv/9+OXXqlJw/f17a7fYNRSqMfTbWy/DBDN822BYWFgbOpO655x7d5QZx9wEAJKF/x6V/B5ZUZPFqdbvyzvLZVaPRkMnJSdn90EPy3U9/Wn792jWRt9+WH/3oR3pYpAMHDgx8eGNhYeGGMyFTFPTvmK5cuXJDwZiampL169fLoUOHBj7QEeb06dOye/duuXjxotx9991y6NAh3cVp8+bNcvnyZXniiSfk/vvv182yadMmOX78+A0Fpd1uyze+8Y2BWFb2NoiIrF+/fuBNgdlPV69ejTzzSrIPACAuXbiMLAUstHhde/11eZ+IXL9+Xd555x2R5d9/vfe975U//drX5J8/8hH5fyLy5ptv6qGRNm/ePPDpwu3bt8uePXv6l6zOnTvXv1x2xx139OPmd0kuBw4ciPUJw3379vXzXb16VbZv3y6bN2+Ww4cP9+OTEX9rtWvXrhs+BWlMTU3JmTNnZOPGjQPzzM3NyeLi4sAcabm2QUTkk5/8pNx3332ybdu2/u8CJycn5XOf+1zkmVfSfQAAUYIgkC9+8Us3FC7DFLA/+ZMv6qZQjXu/0gmee/jdImK8sLgo/75jh9x+7Zr871tvlbsff1w+8/nPy5o1a6TRaMj169fl0g9+IH/7hS/Ipt27pd1uy4c//GGdBgAw5oIgiPXnVHF9LuzLKO/+nd+RP3rhBVlz8qTcuX+/rG025cc//nH/wxk33XSTfHTDBvnSiRPy0Y9+NPIPlAEA4ynPwmV4i9eKFSvktttuk7vuuku2bNkiGzZskFtuuWXgb7pWr14tH/rQh2R6elpuu+22gfEAABTFW7ze8573SKvVkvXr18uGDRtkampK1q5dO1BBG42G3HzzzXLrrbfK6tWrB8YDAFCEIAgpXgAAlJX3v8oDAFBWnHkBACon9r+HAgCgLBqfmu0E/3Tgf+g4AACltPV/neWyIQCgeiaChF9pAgDASPFReQBAFVG8AACVQ/ECAFQOxQsAUDkULwBA5VC8AAAV06B4AQCqJqB4AQCqp3HfTCd45sv8eygA9ddsNnWolK5du6ZDsGz9i7Ppilez2WTnAqiUZrMp3W5Xh0vpyJEj8vjjj+twbnq9ng4lcuTIEZmdndXhRLJsY6riZZ4Ak5OT/ftlpwttFda5bOqyD+uyHXGN2/aGsY9bZdfpdOTChQty7Ngx3ZSLbrcr69at0+FY5ufn5cKFCzI7O5s5x8iKV1XeydgVvirrXDZ12Yd12Y64xm17fdatW1fJ4pX17CbMunXrbnhzE4e9bllzZCxep4Nnvvx7us3LvACq9GSw38VUZZ3Lpi77sC7bEde4ba+PvmJUdlkP7lF6vV7mwjPq4sWnDQFARFqtlg6JqHir1Rq4YXQoXgAQQ6vVkqWlpYFbXQtY1u3KOj6OQorXMFY8b2V7R5X3OuSdz0Xvw2HMWRTfNuj7WeSZKwv9mEWtV1R7FkXmrgv9WJl9pn+mlXW8kVcel0ZRxauq6vyOamlpSYcKUYd3pi31DjvLNmQZO0z6cQtj2vPaNjtP1NzDZp4LZeN6vPJYz7weUyPvfDaKl0fWgxbqI4+DAlB2RR3viso79OLV8lyasOO6zXC1m2UdL4Jvfldct9kxu83m6u+LJ82jl3W7HS+Czh21DknjUbG86Tn0fL62qO3QfcOW7Z86X17C5tXLNtf2RMXtn2ZZ97X7uXLoWBatkp51+bi23bUPfYra1qLyDrV4mSeDudlPRH0KrOk++gntiucpbH5XPKy/a311f1ffNHn0/vC1u3Kl0bJeLCanYZbjrEPSeFgsKTPW3LSkcyx5ttvQ8Tg5jaTr4hO2vWHs7bC5tidsO3WesL6ubXbF6izO4xW2D33045BV3vlsQy1eRSlyB9niPGFsvv5J1zdLHlcfVz77ye0aE5f9YsmSR9R6xF1nVywNexvS7Pc8tZYPQno9JMd18T1mZl6zDnG5Hi8tST6ba1xej7uRdHuHzfd4aXEeBy0qZ1x55fGpRfEaFvsJE+eBSdrfJ688hi/fkucAWQZJ1tkVw/CYA79+rIpW9ONu8tu3YW5fGr7XTZQkfV2yjo+D4uUR9cRM+iJJ2t8naZ6o/qbd/Cz6AJCEbz3C1tkVSyrtOCPreMNsg3ke6vvDYObLsj998syXx+Nu71ffPjb7wtyqJO1+KavCildLvUMRxzsX/aK0+2q6TxFPnLD8YfO74mH9XXR/XzxpHt3f127H9Zi8xVmHpPGwWFK++cL45jVx3cfEXPE48+XNnt9etzD2trniOpeO68fM5uvr49v/4yzpPqyaxr0Pnw6+9XC5/rdh3ju6yP/vlve6llWR+3CY6rIdcY3b9vrwvw0H9Xo9WVxc1OHYzP82zJoj7fZtO1yS/21ovzsYl2IAAKNy5MgRuXDhQupbXjmyKOWZV95495ldXfZhXbYjrnHbXh/OvOpl2+Hny3HmBQBAEpnOvACgKqp45lXUNymXwd69e1OfWW47/Hz64gUAVVGVoqX1ej0dqoXFxcVMl0UzFa+qPhkAAKOV9Xd6/M4LAFBJEyKBjgEAUGqceQEAKofiBQConAmuGgIAqiT4xZlXQ8cBACg1LhsCACqH4gUAqByKFwCgciheAIBKaVC8AABVRPECAFRO6YpXq9XSIREV19+8nCeTr6i8AIDsKvdHyq1WS5aWlgZuRRSGpaUlHUrMXq888gEAfqF0Z14AAESpRPEyZ1tJ6cuKvkuNrrh9+VDHdSwqbv80y7qvbz4AwI0a9x44HXxrtvgvo+x0OjrUt3Xr1v5yy1Go7FhUuy+u+5j7UfE8cvhiOi7W5UW7X9i+A4BR27Fjh1y7dk2HvfL4MsqhFq8dO3bosIjIwEb7Du6++76YjpviYIsqJro9bg5Dj3X1jYrL8j4HgDKan58fTfG658BzwcLsFt3mlbV4RW1g2EHcdd8X0/E4fez7+qerrx6jucbqvlFxACizuMd2W9bitfWx58v9O68iD+Atx1lUUr4cvjgAIB+lLl4u5izFvsUpcHqcGaPjYXRfXw4dj5MDABBf6YqXfTD3HdiX1N95+eg23xhXPv3T1Tdu3P5plnVf3zgAwI1KV7wAAIhC8QKAmmk2m4XcZmZm9FQjwX+VB4Ca6na7ud7m5+f1FCPTECnfR+WRL/7AGag/fWxNe5wO4/t4e5pjuy9XXH/wWAn/zgv5Mk8SAPU0Ozsr69ato3hFSbtT0mwgsjNPkmPHjukmADXQ7XbHsnjxOy8AQOVQvAAAlVO64qX/I0XR0s5nxkWNj2oHACRXuuJVBF8Bifr3TL5xtrDxstweJw8AIL6xKF4AgHopdfGyL83ZZy/2P7bVcVtYm4vOZ2K6Xcf0T53D8MUBAMmUuniJdWlPX36z/7ltnKIQdXkvbB7d7svly2H4xgEAkil98RrWAd8uOGnnTDsOABAf/9tQ8Z0xAQDKI6hz8UpahOyzrqRjAaBK7GOcb7nsJoJAh6qh5fg2YlN47JgdD+Maqy8l2nOmkXYcAORJHx9dy2VXujOvsB2p28xN97GLjx2P4sun211zhI0LiwEAkitd8RqmpRhnZFnps0AAQHaVLF55FoM8c7kUnR8AxlElixcAYLw12n/2XPDsV/g+r7rqdDrSbrd1GECNjOP3eVG8aq7ZbOoQgBrSxWt+fn6gPQ+ugpPm2J65eH31DMULAOpmZmZGh3KjC06aYzvFCwAwUmmO7XkUr4lf/KMNAACqg08bAgAqh+IFADXTbDYLuRX5u7SkKF4AUEPdbjfXWxGfXsyi0f6zZ4NnvxL/74CafGCjUjqdjg4BqBl9bE17nA7j+5BFmmO7L1dcy582pHjVmXmSAKin2dnZ8fsjZYpX/ZknybFjx3QTgBrodrtjWbz4nRcAoHIoXgCAyill8bK/sbjo79uKknb+tONseeQYlUaj0b9FxXWfvJn8UfNEtVeR3vaobYxqT8uX1xevgrzXPe98dRYEQfmKl/nyRvsW5yAep4+Pb2zUF0n6xmVh54y77XnK4wXUaDQkCIL+zT5wuuJFMnPK8hN+mIaxfWFGue1lluRxSdI3riJyjqPSFS9Un+9A6YsDQFKVK176TMS+b5bN5UZz0+2u+7rNReczMd3u6qPjrj6u5bBYWvY7v4bn0p5uD4vp9qR8Z2F6nrB42LrYbXZM54laD/u+b1mPd7WHxcLaXXF9346ZuP1Tt+kxvn1guNZH59DtWpz5fDlc8+u4HbPbbPq+EdXXNY8v7urjWnZx5dNx3TZuKle8wtiX+JJedgy7PCjLxcOVz4yz2+1cOp52XVyxrBrWZTz7hWDOkOx2Vx8Tc7Wb8aZd88UN39y+uG7T62rTOcL4cmq+fia/nlP3MbGwdldcYuR2CRsTxh6j4xIjr2mP4sqhcxs6bs8Ztk+1qL56Htc4PdbHNb/hy6fj426Cfyofj114iigko2C/MHwvhkaGd3n6xWeYF6HN1c+m+7vE6RNFr0ecfSQx+2XZl0XwrY/eBy6uxzCKb4xrPt+6+fj6u+az2WPiPIYojwmReE8OjOYDFEVzHThsgfVOL48XtO8AVmZR+8iI6pf3vswq7fqkfQyj9o9h8idZr7TbovvHXUeM3kSVH6YshSTpWPusK+nYKHnn8zHvMs2L1fWOM0ycPhLSL+qgF7YevngR7PVw7SOzPIx9OSx6fXzbEfUYRvHl9cXTSJsn6WOYRN75svL9jn1Yx6KsgjL+zssUB/tmX6az211xwzU+7lgX11h9KdGe0zXONTbuurhiabjeZdoHJN9BOslBK2ycHQ97Qfty+OJJ6BxhXPvIbgvrl8e+FLXPXOPS5E4yxmyDfd/ctDh57f3ionMkjbvmtPnmt/OYHHZfPY9rnGusXic7Z9R6+PK5xiWhjzmu5bIrXfGS5R1o3zQ77tvxvvFxxvr48ul23c8Vs+Nm2Y5rrlgeAsdlFv1C033iLrvG6Zvm66/76Lirj47rZZ3D5uobxdXPlUfH4iyHjYvTxyzrmB5jixrjatd97Jjuo+n+vjw65ou7+riWbTqHiel23c8Vs+Nm2Y77YmY5LJ+Oj6NSFq+yWPKcBQ2LPivLiif8L9jvXvW74ihpxiAfWR63Ohj37ddqWbzyPODnmSupUc5dZ/a716QHgDRjshjmXGWX5XGrg3Hffq2WxQsAUG+N9p8+Fzx7aIuOe6X9npg03/mC7DqdjrTb8b+vDUD1jNv3eW398+9RvOqu2WzqEIAa0sVrfn5+oD0ProKT5tieuXg9+l2KFwDUzczMjA7lRhecNMd2ihcAYKTSHNvzKF58YAMAUDkULwBA5VC8AKBmms1mIbcif5eWFMULAGqo2+3meivi04tZ8IGNmut0OjoEoGb0sTXtcTqM70MWaY7tvlxx8WnDMWCeJADqaXZ2dvz+SJniVX/mSXLs2DHdBKAGut3uWBYvfucFABWT9fu86oDiBQConNIVL/tbh/W3Eucpbd5hj6sD+zuIouK6T95M/qh5otqrSG971DZGtafly+uLV0Ee655HjnFSuuIlId9InJeoL3ksotCM+ost08jjxdRY/tI8c7MPnK54kcycMoLvyRrG9oUZ5baXWZLHJUlfFK+UxQv14TtQ+uIAEMeESHUOIvZlRH1J0XWZUd/3cfVz5XH10XH7vm6z+4yS/Q5SL+t3l672sJhuT8p3FqbnCYuHrYvdZsd0nqj1sO/7lvV4V3tYLKzdFdf37ZiJ2z91mx7j2weGa310Dt2uxZnPl8M1v47bMbvNpu8bUX1d8/ji9n3d5uLKYcd9+2pcBGU983IVBcO+3GeWW8uXAc3NHhd2eVDUWNc4nds1zjdWL4fFRs28IPSLwpwh2e2uPibmajfjTbvmixu+uX1x3abX1aZzhPHl1Hz9TH49p+5jYmHtrrjEyO0SNiaMPUbHJUZe0x7FlUPnNnTcnjNsn2pRffU8rnG+sXpZ8+XwrdO4KmXxchWLotiFJ+l8YUW2auwXhO+F1fC8G4zD96IzL0ibq59N93eJ0yeKXo84+0hi9suyL4vgWx+9D1xcj2EU3xjXfL518/H1d81ns8fEeQx9fPMjX6UsXsOmz5zisots0sJXRq4Dhy2w3g0mfUG7+A5gZRa1j4yofnnvy6zSrk/axzBq/xgmf5L1Srstun/cddTSzo9kxr542WddaQqYkWXssJkXpX3gcb3jDBOnj4T0izroha2HL14Eez1c+2iY+3JY9Pr4tiPqMYziy+uLp5E2T9LH0CfL2CLZxyvfctlNSIYnX1Hsy3FxdqYpPOaW5CzIHmvG6UuJrnXR8SRzxtmmYbAPPK6DsO8gneSgFTbOjoe9yH05fPEkdI4wrn1kt4X1y2NfitpnrnFpcicZY7bBvm9uWpy89n5x0TmSxl1z2nzz23lMDruvnsc1Ls78UXO75o+TN4p9vPItl1pQwjMvfSnOt2P1To7qH0aPMzHdrvv5Yq5lmy8+aoHjMod937TrWJxl1zh903z9dR8dd/XRcb2sc9hcfaO4+rny6Fic5bBxcfqYZR3TY2xRY1ztuo8d03003d+XR8d8cVcf17JN5zAx3a77+WJJl3UOO+4qeuOmdMVrGJYyXiJMI+nZWVHyeudWF/Y73KT7Jc0Y5CPL41ZVenvHYZv9GuNZvGQEZz/Dns+HJ/0g+x1u0v2SZkwWw5yr7LI8blU1btsbZWyLFwCguhrt/7kQPPvIPTrulfZ7YtJ85wuy63Q60m63dRhAjYzb93l9/pHvUbzqrtls6hCAGtLFa35+fqA9D66Ck+bYTvECANxgZmZGh3KjC06aY3vm4nXouxQvAEB6aY7teRQvPrABAKgcihcAoHIoXgCAyqF4AQAqh+IFAKgcihcAoHIoXgCAypkQ4V/rAwCqhTMvAEDlTIjw7/UBANXCmRcAoHIoXgCASgkoXgCAKqJ4AQAqh+IFAKgcihcAoHImAj4pDwCoGM68AACVQ/ECAFRKEAQULwBA9TS27FsInnv0Hh33ajab0u12ZXJyUjeF6nQ6OgQAqIEdO3bItWvXdNir0+nIhQsX5PHHH9dNsXz24L8Or3g1m00dAgDURG2LFwAAklPx4ndeAIDKoXgBACqH4gUAqByKFwCgclJ9YGN+fl6HAQCILesHNhIXr5mZGR0CACCxoRYvAABGiY/KAwAqieIFAKgcihcAoHIoXgCAyqF4AQAqhu/zAgBUEB+VLwG+6wx5SPqdStr+/ft1CCPw5JNP6lBf3b5aau/evan+1uuzB79D8SoD8/UAQFqzs7Oybt26zMXrm9/8pg5jSPbu3Stvv/12ZPHqdrs6XEmLi4up/8sGxaskTPE6duyYbgJi6Xa7uRWvuhwcq8QcyOMWrzp8n2KW7/T67MHv8DsvADeanJzkNsQbkqN4AQAqJ3XxarVa/Vte8sw1jhqNhg4NiGoHgKpIVbxarZYsLS31b3kVnaWlJR1CRVAYYeR1PHAxuYucwxjGHEWzTzKGuT3DmCtV8dIoOuXXaDQkCAKKDEprGAe8JKp+XNMnGXmeaJRBLsVLc1V6+77ega64K0dY3LBz6T6usTqm2119TKwojUZj4GbHXH1cfHEX13w6bsfsNpu+D6Bcql6QbamKl6ng+oAujmpvt8fdcb4cvrhm99Pzh8Vd43xzLsXcljSCIOjfdFyssyhz00XDtLvu6/46ly/uG2PH9foC9utIv159Md2u+4Rx9Xflse+7+uu4K0dYvApc625vu94mV/+weNFSFS8JKQQSY2NcxSGM3R6VW0IKS5yxLmnHZaWLUBxpxviYsytdHPPKj/FgXuOu170+ftiv3bBjjIsrpx3TeXzHCc2XwxevCt+6J9mPvvgwpC5eYeyNWYr5BIkrbW69k5NIO2cWaYuQPhsyfIUojH3mlWZdAPEUiaUYVzFaCd80+nJG5bHHmeNEmCS5y8y37lHbLyXZBxOS4piUZCV9fc0TJs6O8uXwxYs0jDnTFi7DLmD68p+5JSliwu+zUAC7aGjm2JD0DaMrp50nSa44isxdpLT712UU+yAQkYk0hyTzBDE3e4XD2uLy5fDF49Bj49LjzJxJcqQRdqZkio+5uQpd3AKlc/nirjlscecDxHr9mNdXHuLk9MXNmDjHFF8OX7xM8lpHXx5fvAipLxsuhVRaV5uvn+++K0dY3NBxX04T1+2+ZT2nnidP+izJxHx97Jirj4se5+rrirv6uJaBMEvWm0L7tagLkLnFEZZTx5Pw5fDFy0KvX9i6R9H9fXmGuQ9SFy/Ug312FecMC4hiH8D0wUy3xWm3++mfmi+njus+rpjur3OExcvCXj+9jq42Vx97OSqPHSsaxWvM2WdXFC4AVUHxAgBUTqP90ELw7J/zfV6j1Ol0pN1u6zCQSJ7f58XXdAyX+W4rvs8rns8c/A7Fqwzq9tXeGB2KVzVRvJL5zMHvSGPLgwvBc1+leAHjzhSv+fl53YQhoHjFR/EC0Ld//35ZuXKlDmOI4hSvOr25oHgByGz//v06hBEIK14zMzM6VHkZite3gue+eq9uAwCglD79lX/ho/IAgOqheAEAKofiBQCoHIoXAKByKF4AgMqZEOE7mAAA1cKZFwCgciheAIDKoXgBACqH4gUAqByKFwCgciheAIDKaWx5cCEQCfqB4N3Fd2NmoQSfqg+cK+iIJaBHx91MPS6Mc72XNRpxZ3xXWL54ks+Z3rDXNet81RCMyXamkf31MTwVWtVI0Yey/Db2/wMVfBi32J1lIgAAAABJRU5ErkJggg=="},785:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/program-files-f8cdc10a7b849ad9cab9898d0c3d991b.png"},3549:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/services-running-118fd895ca7944d053c33c08b47ff5b2.png"},6447:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/services-da895d107e06f4263e7146d321203bdf.png"},1465:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/zrok-agent-console-a1978cfd25a50a66a951fc71c388210d.png"},16:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/zrokdir-87b5820aa464dc4dadffbd6e9d098681.png"},8453:(e,n,r)=>{r.d(n,{R:()=>c,x:()=>d});var s=r(6540);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/47881d5c.207612b2.js b/assets/js/47881d5c.207612b2.js new file mode 100644 index 00000000..b39e9954 --- /dev/null +++ b/assets/js/47881d5c.207612b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4927],{5294:(e,n,s)=>{s.d(n,{Ay:()=>o,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4774:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>b,frontMatter:()=>h,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","source":"@site/../docs/guides/install/linux.mdx","sourceDirName":"guides/install","slug":"/guides/install/linux","permalink":"/docs/guides/install/linux","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/linux.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Install","permalink":"/docs/guides/install/"},"next":{"title":"macOS","permalink":"/docs/guides/install/macos"}}');var t=s(4848),i=s(8453),a=s(3070),o=s(3484),l=s(3769),c=s(397),d=s(4119),u=s(5294);const h={title:"Install zrok in Linux",sidebar_label:"Linux"},p=void 0,m={},x=[{value:"Install <code>zrok</code> from the Repository",id:"install-zrok-from-the-repository",level:2},{value:"Homebrew",id:"homebrew",level:2},...u.RM,{value:"Linux Binary",id:"linux-binary",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.h2,{id:"install-zrok-from-the-repository",children:["Install ",(0,t.jsx)(n.code,{children:"zrok"})," from the Repository"]}),"\n",(0,t.jsx)(n.p,{children:"This will configure the system to receive DEB or RPM package updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Check out ",(0,t.jsx)(n.a,{href:"/docs/guides/frontdoor?os=Linux",children:"zrok frontdoor"})," for running ",(0,t.jsx)(n.code,{children:"zrok"})," as an always-on service."]})}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Ansible Playbook"}),(0,t.jsxs)(d.A,{title:"Set up package repository and install zrok",children:[c.A,"\n- name: Install zrok package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok\n ansible.builtin.package:\n name: zrok\n state: present\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(u.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"linux-binary",children:"Linux Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(o.A,{osName:"Linux",osLogo:"/img/logo-linux.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your Linux distribution's architecture or run the install script below to pick the correct CPU architecture automatically. For Intel and AMD 64-bit machines use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Raspberry Pi use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Manually install in ",(0,t.jsx)(n.code,{children:"~/bin/zrok"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir /tmp/zrok && tar -xf ./zrok*linux*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Script to install binary in ",(0,t.jsx)(n.code,{children:"/usr/local/bin/zrok"})]}),(0,t.jsx)(n.p,{children:"This script auto-selects the correct architecture and may be helpful for Raspberry Pi users."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd $(mktemp -d);\n\nZROK_VERSION=$(\n curl -sSf https://api.github.com/repos/openziti/zrok/releases/latest \\\n | jq -r '.tag_name'\n);\n\ncase $(uname -m) in\n x86_64) GOXARCH=amd64\n ;;\n aarch64|arm64) GOXARCH=arm64\n ;;\n arm*) GOXARCH=armv7\n ;;\n *) echo \"ERROR: unknown arch '$(uname -m)'\" >&2\n exit 1\n ;;\nesac;\n\ncurl -sSfL \\\n \"https://github.com/openziti/zrok/releases/download/${ZROK_VERSION}/zrok_${ZROK_VERSION#v}_linux_${GOXARCH}.tar.gz\" \\\n | tar -xz -f -;\n\nsudo install -o root -g root ./zrok /usr/local/bin/;\n\nzrok version;\n"})})]})]})}function b(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},3070:(e,n,s)=>{s.d(n,{F:()=>o,d:()=>a});var r=s(6540),t=s(4848);const i=(0,r.createContext)([]),a=()=>(0,r.useContext)(i),o=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(i.Provider,{value:s,children:n})}},4119:(e,n,s)=>{s.d(n,{A:()=>a});s(6540);var r=s(382),t=s(8069),i=s(4848);const a=e=>{let{title:n,children:s}=e;const a=s.map((e=>"string"==typeof e?e.trim():r.Ay.dump(e).trim())).join("\n\n");return(0,i.jsx)("div",{children:(0,i.jsx)(t.A,{language:"yaml",title:n,children:a})})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(3070),t=s(3769),i=s(8532),a=s(4848);const o=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,i.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),p=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",p),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),p.length>0&&(0,a.jsx)("ul",{children:p.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:o(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},397:(e,n,s)=>{s.d(n,{A:()=>r});const r=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/47881d5c.beaba6e5.js b/assets/js/47881d5c.beaba6e5.js deleted file mode 100644 index c472574c..00000000 --- a/assets/js/47881d5c.beaba6e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4927],{9411:(e,n,s)=>{s.d(n,{Ay:()=>o,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function a(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"brew install zrok\n"})})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1574:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>b,frontMatter:()=>h,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"guides/install/linux","title":"Install zrok in Linux","description":"Install zrok from the Repository","source":"@site/../docs/guides/install/linux.mdx","sourceDirName":"guides/install","slug":"/guides/install/linux","permalink":"/docs/guides/install/linux","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/linux.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Install","permalink":"/docs/guides/install/"},"next":{"title":"macOS","permalink":"/docs/guides/install/macos"}}');var t=s(4848),i=s(8453),a=s(8151),o=s(595),l=s(1342),c=s(397),d=s(3902),u=s(9411);const h={title:"Install zrok in Linux",sidebar_label:"Linux"},p=void 0,m={},x=[{value:"Install <code>zrok</code> from the Repository",id:"install-zrok-from-the-repository",level:2},{value:"Homebrew",id:"homebrew",level:2},...u.RM,{value:"Linux Binary",id:"linux-binary",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.h2,{id:"install-zrok-from-the-repository",children:["Install ",(0,t.jsx)(n.code,{children:"zrok"})," from the Repository"]}),"\n",(0,t.jsx)(n.p,{children:"This will configure the system to receive DEB or RPM package updates."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Check out ",(0,t.jsx)(n.a,{href:"/docs/guides/frontdoor?os=Linux",children:"zrok frontdoor"})," for running ",(0,t.jsx)(n.code,{children:"zrok"})," as an always-on service."]})}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Ansible Playbook"}),(0,t.jsxs)(d.A,{title:"Set up package repository and install zrok",children:[c.A,"\n- name: Install zrok package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok\n ansible.builtin.package:\n name: zrok\n state: present\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"homebrew",children:"Homebrew"}),"\n",(0,t.jsx)(u.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"linux-binary",children:"Linux Binary"}),"\n",(0,t.jsx)(a.F,{children:(0,t.jsx)("div",{className:l.A.downloadContainer,children:(0,t.jsx)(o.A,{osName:"Linux",osLogo:"/img/logo-linux.svg"})})}),"\n",(0,t.jsxs)(n.p,{children:["Download the binary distribution for your Linux distribution's architecture or run the install script below to pick the correct CPU architecture automatically. For Intel and AMD 64-bit machines use the ",(0,t.jsx)(n.code,{children:"amd64"})," distribution. For Raspberry Pi use the ",(0,t.jsx)(n.code,{children:"arm64"})," distribution."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Manually install in ",(0,t.jsx)(n.code,{children:"~/bin/zrok"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Unarchive the distribution in a temporary directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir /tmp/zrok && tar -xf ./zrok*linux*.tar.gz -C /tmp/zrok\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the ",(0,t.jsx)(n.code,{children:"zrok"})," executable."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"mkdir -p ~/bin && install /tmp/zrok/zrok ~/bin/\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"~/bin"})," to your shell's executable search path. Optionally add this to your ~/.zshenv to persist the change."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"PATH=~/bin:$PATH\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["With the ",(0,t.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,t.jsx)(n.code,{children:"zrok"})," command from your shell:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" _ \n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | < \n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Script to install binary in ",(0,t.jsx)(n.code,{children:"/usr/local/bin/zrok"})]}),(0,t.jsx)(n.p,{children:"This script auto-selects the correct architecture and may be helpful for Raspberry Pi users."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"cd $(mktemp -d);\n\nZROK_VERSION=$(\n curl -sSf https://api.github.com/repos/openziti/zrok/releases/latest \\\n | jq -r '.tag_name'\n);\n\ncase $(uname -m) in\n x86_64) GOXARCH=amd64\n ;;\n aarch64|arm64) GOXARCH=arm64\n ;;\n arm*) GOXARCH=armv7\n ;;\n *) echo \"ERROR: unknown arch '$(uname -m)'\" >&2\n exit 1\n ;;\nesac;\n\ncurl -sSfL \\\n \"https://github.com/openziti/zrok/releases/download/${ZROK_VERSION}/zrok_${ZROK_VERSION#v}_linux_${GOXARCH}.tar.gz\" \\\n | tar -xz -f -;\n\nsudo install -o root -g root ./zrok /usr/local/bin/;\n\nzrok version;\n"})})]})]})}function b(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},8151:(e,n,s)=>{s.d(n,{F:()=>o,d:()=>a});var r=s(6540),t=s(4848);const i=(0,r.createContext)([]),a=()=>(0,r.useContext)(i),o=e=>{let{children:n}=e;const[s,a]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(i.Provider,{value:s,children:n})}},3902:(e,n,s)=>{s.d(n,{A:()=>a});s(6540);var r=s(382),t=s(1432),i=s(4848);const a=e=>{let{title:n,children:s}=e;const a=s.map((e=>"string"==typeof e?e.trim():r.Ay.dump(e).trim())).join("\n\n");return(0,i.jsx)("div",{children:(0,i.jsx)(t.A,{language:"yaml",title:n,children:a})})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var r=s(8151),t=s(1342),i=s(5293),a=s(4848);const o=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:c}=e;const{colorMode:d}=(0,i.G)(),u=(0,r.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),p=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",p),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),p.length>0&&(0,a.jsx)("ul",{children:p.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:o(e.arch)})},n)))}),c&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:c,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},397:(e,n,s)=>{s.d(n,{A:()=>r});const r=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/4831.cc421862.js b/assets/js/4831.cc421862.js new file mode 100644 index 00000000..954744be --- /dev/null +++ b/assets/js/4831.cc421862.js @@ -0,0 +1 @@ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4831],{9329:(e,i,r)=>{"use strict";r.d(i,{A:()=>a});r(6540);var n=r(8215);const t={tabItem:"tabItem_Ymn6"};var o=r(4848);function a(e){let{children:i,hidden:r,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,a),hidden:r,children:i})}},5537:(e,i,r)=>{"use strict";r.d(i,{A:()=>k});var n=r(6540),t=r(8215),o=r(5627),a=r(6347),s=r(372),u=r(604),l=r(1861),c=r(8749);function b(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function d(e){const{values:i,children:r}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return b(e).map((e=>{let{props:{value:i,label:r,attributes:n,default:t}}=e;return{value:i,label:r,attributes:n,default:t}}))}(r);return function(e){const i=(0,l.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[i,r])}function w(e){let{value:i,tabValues:r}=e;return r.some((e=>e.value===i))}function f(e){let{queryString:i=!1,groupId:r}=e;const t=(0,a.W6)(),o=function(e){let{queryString:i=!1,groupId:r}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:i,groupId:r});return[(0,u.aZ)(o),(0,n.useCallback)((e=>{if(!o)return;const i=new URLSearchParams(t.location.search);i.set(o,e),t.replace({...t.location,search:i.toString()})}),[o,t])]}function m(e){const{defaultValue:i,queryString:r=!1,groupId:t}=e,o=d(e),[a,u]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(i){if(!w({value:i,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:o}))),[l,b]=f({queryString:r,groupId:t}),[m,p]=function(e){let{groupId:i}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,o]=(0,c.Dv)(r);return[t,(0,n.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:t}),h=(()=>{const e=l??m;return w({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{h&&u(h)}),[h]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!w({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);u(e),b(e),p(e)}),[b,p,o]),tabValues:o}}var p=r(9136);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function g(e){let{className:i,block:r,selectedValue:n,selectValue:a,tabValues:s}=e;const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,o.a_)(),c=e=>{const i=e.currentTarget,r=u.indexOf(i),t=s[r].value;t!==n&&(l(i),a(t))},b=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;i=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;i=u[r]??u[u.length-1];break}}i?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":r},i),children:s.map((e=>{let{value:i,label:r,attributes:o}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>{u.push(e)},onKeyDown:b,onClick:c,...o,className:(0,t.A)("tabs__item",h.tabItem,o?.className,{"tabs__item--active":n===i}),children:r??i},i)}))})}function y(e){let{lazy:i,children:r,selectedValue:o}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(i){const e=a.find((e=>e.props.value===o));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==o})))})}function x(e){const i=m(e);return(0,v.jsxs)("div",{className:(0,t.A)("tabs-container",h.tabList),children:[(0,v.jsx)(g,{...i,...e}),(0,v.jsx)(y,{...i,...e})]})}function k(e){const i=(0,p.A)();return(0,v.jsx)(x,{...e,children:b(e.children)},String(i))}},159:(e,i,r)=>{"use strict";var n,t=r(6540),o=(n=t)&&"object"==typeof n&&"default"in n?n.default:n,a=r(5576),s=new a,u=s.getBrowser(),l=s.getCPU(),c=s.getDevice(),b=s.getEngine(),d=s.getOS(),w=s.getUA(),f=function(e){return s.setUA(e)},m=function(e){if(e){var i=new a(e);return{UA:i,browser:i.getBrowser(),cpu:i.getCPU(),device:i.getDevice(),engine:i.getEngine(),os:i.getOS(),ua:i.getUA(),setUserAgent:function(e){return i.setUA(e)}}}console.error("No userAgent string was provided")},p=Object.freeze({ClientUAInstance:s,browser:u,cpu:l,device:c,engine:b,os:d,ua:w,setUa:f,parseUserAgent:m});function h(e,i){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);i&&(n=n.filter((function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable}))),r.push.apply(r,n)}return r}function v(e){return v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},v(e)}function g(e,i){for(var r=0;r<i.length;r++){var n=i[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,i,r){return i in e?Object.defineProperty(e,i,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[i]=r,e}function x(){return x=Object.assign||function(e){for(var i=1;i<arguments.length;i++){var r=arguments[i];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},x.apply(this,arguments)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}function S(e,i){return S=Object.setPrototypeOf||function(e,i){return e.__proto__=i,e},S(e,i)}function O(e,i){if(null==e)return{};var r,n,t=function(e,i){if(null==e)return{};var r,n,t={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],i.indexOf(r)>=0||(t[r]=e[r]);return t}(e,i);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],i.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(t[r]=e[r])}return t}function A(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function I(e,i){return function(e){if(Array.isArray(e))return e}(e)||function(e,i){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,t,o=[],a=!0,s=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!i||o.length!==i);a=!0);}catch(u){s=!0,t=u}finally{try{a||null==r.return||r.return()}finally{if(s)throw t}}return o}(e,i)||function(e,i){if(!e)return;if("string"==typeof e)return _(e,i);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return _(e,i)}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _(e,i){(null==i||i>e.length)&&(i=e.length);for(var r=0,n=new Array(i);r<i;r++)n[r]=e[r];return n}var j="mobile",E="tablet",T="smarttv",P="console",C="wearable",N="embedded",V=void 0,q={Chrome:"Chrome",Firefox:"Firefox",Opera:"Opera",Yandex:"Yandex",Safari:"Safari",InternetExplorer:"Internet Explorer",Edge:"Edge",Chromium:"Chromium",Ie:"IE",MobileSafari:"Mobile Safari",EdgeChromium:"Edge Chromium",MIUI:"MIUI Browser",SamsungBrowser:"Samsung Browser"},U={IOS:"iOS",Android:"Android",WindowsPhone:"Windows Phone",Windows:"Windows",MAC_OS:"Mac OS"},M={isMobile:!1,isTablet:!1,isBrowser:!1,isSmartTV:!1,isConsole:!1,isWearable:!1},z=function(e){return e||(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"none")},B=function(){return!("undefined"==typeof window||!window.navigator&&!navigator)&&(window.navigator||navigator)},D=function(e){var i=B();return i&&i.platform&&(-1!==i.platform.indexOf(e)||"MacIntel"===i.platform&&i.maxTouchPoints>1&&!window.MSStream)},R=function(e,i,r,n){return function(e){for(var i=1;i<arguments.length;i++){var r=null!=arguments[i]?arguments[i]:{};i%2?h(Object(r),!0).forEach((function(i){y(e,i,r[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):h(Object(r)).forEach((function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i))}))}return e}({},e,{vendor:z(i.vendor),model:z(i.model),os:z(r.name),osVersion:z(r.version),ua:z(n)})};var W=function(e){return e.type===j},L=function(e){return e.type===E},$=function(e){var i=e.type;return i===j||i===E},F=function(e){return e.type===T},Y=function(e){return e.type===V},H=function(e){return e.type===C},Z=function(e){return e.type===P},G=function(e){return e.type===N},X=function(e){var i=e.vendor;return z(i)},K=function(e){var i=e.model;return z(i)},J=function(e){var i=e.type;return z(i,"browser")},Q=function(e){return e.name===U.Android},ee=function(e){return e.name===U.Windows},ie=function(e){return e.name===U.MAC_OS},re=function(e){return e.name===U.WindowsPhone},ne=function(e){return e.name===U.IOS},te=function(e){var i=e.version;return z(i)},oe=function(e){var i=e.name;return z(i)},ae=function(e){return e.name===q.Chrome},se=function(e){return e.name===q.Firefox},ue=function(e){return e.name===q.Chromium},le=function(e){return e.name===q.Edge},ce=function(e){return e.name===q.Yandex},be=function(e){var i=e.name;return i===q.Safari||i===q.MobileSafari},de=function(e){return e.name===q.MobileSafari},we=function(e){return e.name===q.Opera},fe=function(e){var i=e.name;return i===q.InternetExplorer||i===q.Ie},me=function(e){return e.name===q.MIUI},pe=function(e){return e.name===q.SamsungBrowser},he=function(e){var i=e.version;return z(i)},ve=function(e){var i=e.major;return z(i)},ge=function(e){var i=e.name;return z(i)},ye=function(e){var i=e.name;return z(i)},xe=function(e){var i=e.version;return z(i)},ke=function(){var e=B(),i=e&&e.userAgent&&e.userAgent.toLowerCase();return"string"==typeof i&&/electron/.test(i)},Se=function(e){return"string"==typeof e&&-1!==e.indexOf("Edg/")},Oe=function(){var e=B();return e&&(/iPad|iPhone|iPod/.test(e.platform)||"MacIntel"===e.platform&&e.maxTouchPoints>1)&&!window.MSStream},Ae=function(){return D("iPad")},Ie=function(){return D("iPhone")},_e=function(){return D("iPod")},je=function(e){return z(e)};function Ee(e){var i=e||p,r=i.device,n=i.browser,t=i.os,o=i.engine,a=i.ua;return{isSmartTV:F(r),isConsole:Z(r),isWearable:H(r),isEmbedded:G(r),isMobileSafari:de(n)||Ae(),isChromium:ue(n),isMobile:$(r)||Ae(),isMobileOnly:W(r),isTablet:L(r)||Ae(),isBrowser:Y(r),isDesktop:Y(r),isAndroid:Q(t),isWinPhone:re(t),isIOS:ne(t)||Ae(),isChrome:ae(n),isFirefox:se(n),isSafari:be(n),isOpera:we(n),isIE:fe(n),osVersion:te(t),osName:oe(t),fullBrowserVersion:he(n),browserVersion:ve(n),browserName:ge(n),mobileVendor:X(r),mobileModel:K(r),engineName:ye(o),engineVersion:xe(o),getUA:je(a),isEdge:le(n)||Se(a),isYandex:ce(n),deviceType:J(r),isIOS13:Oe(),isIPad13:Ae(),isIPhone13:Ie(),isIPod13:_e(),isElectron:ke(),isEdgeChromium:Se(a),isLegacyEdge:le(n)&&!Se(a),isWindows:ee(t),isMacOs:ie(t),isMIUI:me(n),isSamsungBrowser:pe(n)}}var Te=F(c),Pe=Z(c),Ce=H(c),Ne=G(c),Ve=de(u)||Ae(),qe=ue(u),Ue=$(c)||Ae(),Me=W(c),ze=L(c)||Ae(),Be=Y(c),De=Y(c),Re=Q(d),We=re(d),Le=ne(d)||Ae(),$e=ae(u),Fe=se(u),Ye=be(u),He=we(u),Ze=fe(u),Ge=te(d),Xe=oe(d),Ke=he(u),Je=ve(u),Qe=ge(u),ei=X(c),ii=K(c),ri=ye(b),ni=xe(b),ti=je(w),oi=le(u)||Se(w),ai=ce(u),si=J(c),ui=Oe(),li=Ae(),ci=Ie(),bi=_e(),di=ke(),wi=Se(w),fi=le(u)&&!Se(w),mi=ee(d),pi=ie(d),hi=me(u),vi=pe(u);function gi(e){var i=e||window.navigator.userAgent;return m(i)}i.wH=Xe},5576:function(e,i,r){var n;!function(t,o){"use strict";var a="function",s="undefined",u="object",l="string",c="major",b="model",d="name",w="type",f="vendor",m="version",p="architecture",h="console",v="mobile",g="tablet",y="smarttv",x="wearable",k="embedded",S="Amazon",O="Apple",A="ASUS",I="BlackBerry",_="Browser",j="Chrome",E="Firefox",T="Google",P="Huawei",C="LG",N="Microsoft",V="Motorola",q="Opera",U="Samsung",M="Sharp",z="Sony",B="Xiaomi",D="Zebra",R="Facebook",W="Chromium OS",L="Mac OS",$=function(e){for(var i={},r=0;r<e.length;r++)i[e[r].toUpperCase()]=e[r];return i},F=function(e,i){return typeof e===l&&-1!==Y(i).indexOf(Y(e))},Y=function(e){return e.toLowerCase()},H=function(e,i){if(typeof e===l)return e=e.replace(/^\s\s*/,""),typeof i===s?e:e.substring(0,500)},Z=function(e,i){for(var r,n,t,s,l,c,b=0;b<i.length&&!l;){var d=i[b],w=i[b+1];for(r=n=0;r<d.length&&!l&&d[r];)if(l=d[r++].exec(e))for(t=0;t<w.length;t++)c=l[++n],typeof(s=w[t])===u&&s.length>0?2===s.length?typeof s[1]==a?this[s[0]]=s[1].call(this,c):this[s[0]]=s[1]:3===s.length?typeof s[1]!==a||s[1].exec&&s[1].test?this[s[0]]=c?c.replace(s[1],s[2]):o:this[s[0]]=c?s[1].call(this,c,s[2]):o:4===s.length&&(this[s[0]]=c?s[3].call(this,c.replace(s[1],s[2])):o):this[s]=c||o;b+=2}},G=function(e,i){for(var r in i)if(typeof i[r]===u&&i[r].length>0){for(var n=0;n<i[r].length;n++)if(F(i[r][n],e))return"?"===r?o:r}else if(F(i[r],e))return"?"===r?o:r;return e},X={ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"},K={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[m,[d,"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[m,[d,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[d,m],[/opios[\/ ]+([\w\.]+)/i],[m,[d,q+" Mini"]],[/\bopr\/([\w\.]+)/i],[m,[d,q]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[m,[d,"Baidu"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(heytap|ovi)browser\/([\d\.]+)/i,/(weibo)__([\d\.]+)/i],[d,m],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[m,[d,"UC"+_]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[m,[d,"WeChat"]],[/konqueror\/([\w\.]+)/i],[m,[d,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[m,[d,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[m,[d,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[m,[d,"Smart Lenovo "+_]],[/(avast|avg)\/([\w\.]+)/i],[[d,/(.+)/,"$1 Secure "+_],m],[/\bfocus\/([\w\.]+)/i],[m,[d,E+" Focus"]],[/\bopt\/([\w\.]+)/i],[m,[d,q+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[m,[d,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[m,[d,"Dolphin"]],[/coast\/([\w\.]+)/i],[m,[d,q+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[m,[d,"MIUI "+_]],[/fxios\/([-\w\.]+)/i],[m,[d,E]],[/\bqihu|(qi?ho?o?|360)browser/i],[[d,"360 "+_]],[/(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i],[[d,/(.+)/,"$1 "+_],m],[/samsungbrowser\/([\w\.]+)/i],[m,[d,U+" Internet"]],[/(comodo_dragon)\/([\w\.]+)/i],[[d,/_/g," "],m],[/metasr[\/ ]?([\d\.]+)/i],[m,[d,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[d,"Sogou Mobile"],m],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i],[d,m],[/(lbbrowser)/i,/\[(linkedin)app\]/i],[d],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[d,R],m],[/(Klarna)\/([\w\.]+)/i,/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i],[d,m],[/\bgsa\/([\w\.]+) .*safari\//i],[m,[d,"GSA"]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[m,[d,"TikTok"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[m,[d,j+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[d,j+" WebView"],m],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[m,[d,"Android "+_]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[d,m],[/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i],[m,[d,"Mobile Safari"]],[/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i],[m,d],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[d,[m,G,{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}]],[/(webkit|khtml)\/([\w\.]+)/i],[d,m],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[d,"Netscape"],m],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[m,[d,E+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[d,m],[/(cobalt)\/([\w\.]+)/i],[d,[m,/master.|lts./,""]]],cpu:[[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i],[[p,"amd64"]],[/(ia32(?=;))/i],[[p,Y]],[/((?:i[346]|x)86)[;\)]/i],[[p,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[p,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[p,"armhf"]],[/windows (ce|mobile); ppc;/i],[[p,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[p,/ower/,"",Y]],[/(sun4\w)[;\)]/i],[[p,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[p,Y]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[b,[f,U],[w,g]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[b,[f,U],[w,v]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i],[b,[f,O],[w,v]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[b,[f,O],[w,g]],[/(macintosh);/i],[b,[f,O]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[b,[f,M],[w,v]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[b,[f,P],[w,g]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[b,[f,P],[w,v]],[/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[b,/_/g," "],[f,B],[w,v]],[/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i,/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[b,/_/g," "],[f,B],[w,g]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[b,[f,"OPPO"],[w,v]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[b,[f,"Vivo"],[w,v]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[b,[f,"Realme"],[w,v]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[b,[f,V],[w,v]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[b,[f,V],[w,g]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[b,[f,C],[w,g]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[b,[f,C],[w,v]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[b,[f,"Lenovo"],[w,g]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[b,/_/g," "],[f,"Nokia"],[w,v]],[/(pixel c)\b/i],[b,[f,T],[w,g]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[b,[f,T],[w,v]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[b,[f,z],[w,v]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[b,"Xperia Tablet"],[f,z],[w,g]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[b,[f,"OnePlus"],[w,v]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[b,[f,S],[w,g]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[b,/(.+)/g,"Fire Phone $1"],[f,S],[w,v]],[/(playbook);[-\w\),; ]+(rim)/i],[b,f,[w,g]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[b,[f,I],[w,v]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[b,[f,A],[w,g]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[b,[f,A],[w,v]],[/(nexus 9)/i],[b,[f,"HTC"],[w,g]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[f,[b,/_/g," "],[w,v]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[b,[f,"Acer"],[w,g]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[b,[f,"Meizu"],[w,v]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[b,[f,"Ulefone"],[w,v]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[f,b,[w,v]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i,/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[f,b,[w,g]],[/(surface duo)/i],[b,[f,N],[w,g]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[b,[f,"Fairphone"],[w,v]],[/(u304aa)/i],[b,[f,"AT&T"],[w,v]],[/\bsie-(\w*)/i],[b,[f,"Siemens"],[w,v]],[/\b(rct\w+) b/i],[b,[f,"RCA"],[w,g]],[/\b(venue[\d ]{2,7}) b/i],[b,[f,"Dell"],[w,g]],[/\b(q(?:mv|ta)\w+) b/i],[b,[f,"Verizon"],[w,g]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[b,[f,"Barnes & Noble"],[w,g]],[/\b(tm\d{3}\w+) b/i],[b,[f,"NuVision"],[w,g]],[/\b(k88) b/i],[b,[f,"ZTE"],[w,g]],[/\b(nx\d{3}j) b/i],[b,[f,"ZTE"],[w,v]],[/\b(gen\d{3}) b.+49h/i],[b,[f,"Swiss"],[w,v]],[/\b(zur\d{3}) b/i],[b,[f,"Swiss"],[w,g]],[/\b((zeki)?tb.*\b) b/i],[b,[f,"Zeki"],[w,g]],[/\b([yr]\d{2}) b/i,/\b(dragon[- ]+touch |dt)(\w{5}) b/i],[[f,"Dragon Touch"],b,[w,g]],[/\b(ns-?\w{0,9}) b/i],[b,[f,"Insignia"],[w,g]],[/\b((nxa|next)-?\w{0,9}) b/i],[b,[f,"NextBook"],[w,g]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[f,"Voice"],b,[w,v]],[/\b(lvtel\-)?(v1[12]) b/i],[[f,"LvTel"],b,[w,v]],[/\b(ph-1) /i],[b,[f,"Essential"],[w,v]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[b,[f,"Envizen"],[w,g]],[/\b(trio[-\w\. ]+) b/i],[b,[f,"MachSpeed"],[w,g]],[/\btu_(1491) b/i],[b,[f,"Rotor"],[w,g]],[/(shield[\w ]+) b/i],[b,[f,"Nvidia"],[w,g]],[/(sprint) (\w+)/i],[f,b,[w,v]],[/(kin\.[onetw]{3})/i],[[b,/\./g," "],[f,N],[w,v]],[/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[b,[f,D],[w,g]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[b,[f,D],[w,v]],[/smart-tv.+(samsung)/i],[f,[w,y]],[/hbbtv.+maple;(\d+)/i],[[b,/^/,"SmartTV"],[f,U],[w,y]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[f,C],[w,y]],[/(apple) ?tv/i],[f,[b,O+" TV"],[w,y]],[/crkey/i],[[b,j+"cast"],[f,T],[w,y]],[/droid.+aft(\w+)( bui|\))/i],[b,[f,S],[w,y]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[b,[f,M],[w,y]],[/(bravia[\w ]+)( bui|\))/i],[b,[f,z],[w,y]],[/(mitv-\w{5}) bui/i],[b,[f,B],[w,y]],[/Hbbtv.*(technisat) (.*);/i],[f,b,[w,y]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[f,H],[b,H],[w,y]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[w,y]],[/(ouya)/i,/(nintendo) ([wids3utch]+)/i],[f,b,[w,h]],[/droid.+; (shield) bui/i],[b,[f,"Nvidia"],[w,h]],[/(playstation [345portablevi]+)/i],[b,[f,z],[w,h]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[b,[f,N],[w,h]],[/((pebble))app/i],[f,b,[w,x]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[b,[f,O],[w,x]],[/droid.+; (glass) \d/i],[b,[f,T],[w,x]],[/droid.+; (wt63?0{2,3})\)/i],[b,[f,D],[w,x]],[/(quest( 2| pro)?)/i],[b,[f,R],[w,x]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[f,[w,k]],[/(aeobc)\b/i],[b,[f,S],[w,k]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i],[b,[w,v]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[b,[w,g]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[w,g]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[w,v]],[/(android[-\w\. ]{0,9});.+buil/i],[b,[f,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[m,[d,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[m,[d,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[d,m],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[m,d]],os:[[/microsoft (windows) (vista|xp)/i],[d,m],[/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i],[d,[m,G,X]],[/windows nt 6\.2; (arm)/i,/windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[m,G,X],[d,"Windows"]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,/cfnetwork\/.+darwin/i],[[m,/_/g,"."],[d,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[d,L],[m,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[m,d],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[d,m],[/\(bb(10);/i],[m,[d,I]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[m,[d,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[m,[d,E+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[m,[d,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[m,[d,"watchOS"]],[/crkey\/([\d\.]+)/i],[m,[d,j+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[d,W],m],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) ([wids345portablevuch]+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[d,m],[/(sunos) ?([\w\.\d]*)/i],[[d,"Solaris"],m],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[d,m]]},J=function(e,i){if(typeof e===u&&(i=e,e=o),!(this instanceof J))return new J(e,i).getResult();var r=typeof t!==s&&t.navigator?t.navigator:o,n=e||(r&&r.userAgent?r.userAgent:""),h=r&&r.userAgentData?r.userAgentData:o,y=i?function(e,i){var r={};for(var n in e)i[n]&&i[n].length%2==0?r[n]=i[n].concat(e[n]):r[n]=e[n];return r}(K,i):K,x=r&&r.userAgent==n;return this.getBrowser=function(){var e,i={};return i[d]=o,i[m]=o,Z.call(i,n,y.browser),i[c]=typeof(e=i[m])===l?e.replace(/[^\d\.]/g,"").split(".")[0]:o,x&&r&&r.brave&&typeof r.brave.isBrave==a&&(i[d]="Brave"),i},this.getCPU=function(){var e={};return e[p]=o,Z.call(e,n,y.cpu),e},this.getDevice=function(){var e={};return e[f]=o,e[b]=o,e[w]=o,Z.call(e,n,y.device),x&&!e[w]&&h&&h.mobile&&(e[w]=v),x&&"Macintosh"==e[b]&&r&&typeof r.standalone!==s&&r.maxTouchPoints&&r.maxTouchPoints>2&&(e[b]="iPad",e[w]=g),e},this.getEngine=function(){var e={};return e[d]=o,e[m]=o,Z.call(e,n,y.engine),e},this.getOS=function(){var e={};return e[d]=o,e[m]=o,Z.call(e,n,y.os),x&&!e[d]&&h&&"Unknown"!=h.platform&&(e[d]=h.platform.replace(/chrome os/i,W).replace(/macos/i,L)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return n},this.setUA=function(e){return n=typeof e===l&&e.length>500?H(e,500):e,this},this.setUA(n),this};J.VERSION="1.0.37",J.BROWSER=$([d,m,c]),J.CPU=$([p]),J.DEVICE=$([b,f,w,h,v,y,g,x,k]),J.ENGINE=J.OS=$([d,m]),typeof i!==s?(e.exports&&(i=e.exports=J),i.UAParser=J):r.amdO?(n=function(){return J}.call(i,r,i,e))===o||(e.exports=n):typeof t!==s&&(t.UAParser=J);var Q=typeof t!==s&&(t.jQuery||t.Zepto);if(Q&&!Q.ua){var ee=new J;Q.ua=ee.getResult(),Q.ua.get=function(){return ee.getUA()},Q.ua.set=function(e){ee.setUA(e);var i=ee.getResult();for(var r in i)Q.ua[r]=i[r]}}}("object"==typeof window?window:this)}}]); \ No newline at end of file diff --git a/assets/js/48341697.f4018882.js b/assets/js/48341697.ee186ebb.js similarity index 99% rename from assets/js/48341697.f4018882.js rename to assets/js/48341697.ee186ebb.js index abe0e26b..86331ea8 100644 --- a/assets/js/48341697.f4018882.js +++ b/assets/js/48341697.ee186ebb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9471],{4392:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","source":"@site/versioned_docs/version-0.4/guides/vpn/vpn.md","sourceDirName":"guides/vpn","slug":"/guides/vpn/","permalink":"/docs/0.4/guides/vpn/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/vpn/vpn.md","tags":[],"version":"0.4","frontMatter":{"sidebar_label":"VPN"},"sidebar":"tutorialSidebar","previous":{"title":"Drives","permalink":"/docs/0.4/guides/drives"},"next":{"title":"myzrok","permalink":"/docs/0.4/category/myzrok"}}');var a=s(4848),o=s(8453);const i={sidebar_label:"VPN"},t="zrok VPN Guide",c={},d=[{value:"Operating System Requirements",id:"operating-system-requirements",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Start the VPN Server",id:"start-the-vpn-server",level:2},{value:"Reserve a VPN Share Token",id:"reserve-a-vpn-share-token",level:2},{value:"Access the VPN Share",id:"access-the-vpn-share",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"zrok-vpn-guide",children:"zrok VPN Guide"})}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN backend allows for simple host-to-host VPN setup."}),"\n",(0,a.jsx)(n.h2,{id:"operating-system-requirements",children:"Operating System Requirements"}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN requires elevated privileges to manage network devices."}),"\n",(0,a.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsxs)(n.p,{children:["On Windows, you must run zrok VPN commands as an administrator and install Wintun by placing ",(0,a.jsx)(n.code,{children:"wintun.dll"})," (",(0,a.jsx)(n.a,{href:"https://www.wintun.net/",children:"download link"}),") in the same directory as the ",(0,a.jsx)(n.code,{children:"zrok.exe"})," executable."]}),"\n",(0,a.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsxs)(n.p,{children:["On Linux, the simplest way to grant the necessary privileges is to run zrok VPN commands as root. You can enable a separate environment for root by also running ",(0,a.jsx)(n.code,{children:"zrok enable"})," as the root user, or you can prefix the commands like ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user. The minimum privilege is runing zrok VPN commands and the ",(0,a.jsx)(n.code,{children:"ip"})," command with the ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," kernel capability. The ",(0,a.jsx)(n.code,{children:"zrok-share.service"})," unit has a commented example to grant ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," as an Ambient Capability."]}),"\n",(0,a.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsxs)(n.p,{children:["On macOS, you must run zrok VPN commands as root. You can prefix the zrok command with ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user."]}),"\n",(0,a.jsx)(n.h2,{id:"start-the-vpn-server",children:"Start the VPN Server"}),"\n",(0,a.jsxs)(n.p,{children:["VPN is shared through the ",(0,a.jsx)(n.code,{children:"vpn"})," backend of ",(0,a.jsx)(n.code,{children:"zrok"})," command."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ sudo -E zrok share private --headless --backend-mode vpn\n[ 0.542] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[589d443c-f59d-4fc8-8c48-76609b7fb402]} new service session\n[ 0.705] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 3rq7torslq3n\n[ 0.705] INFO zrok/endpoints/vpn.(*Backend).Run: started\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"VPN share",src:s(7224).A+"",width:"1626",height:"1314"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"sudo"})," or equivalent invocation is required because VPN mode needs to create a virtual network device (",(0,a.jsx)(n.code,{children:"tun"}),")\n",(0,a.jsx)(n.code,{children:"-E"})," option allows ",(0,a.jsx)(n.code,{children:"zrok"})," to find your zrok configuration files (in your ",(0,a.jsx)(n.code,{children:"$HOME/.zrok"}),")"]}),"\n",(0,a.jsxs)(n.p,{children:["By default ",(0,a.jsx)(n.code,{children:"vpn"})," backend uses subnet ",(0,a.jsx)(n.code,{children:"10.122.0.0/16"})," and assigns ",(0,a.jsx)(n.code,{children:"10.122.0.1"})," to the host that stared VPN share."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 16384\n inet 10.122.0.1 netmask 255.255.0.0 destination 10.122.0.1\n inet6 fe80::705f:24e4:dcfc:a6b2 prefixlen 64 scopeid 0x20<link>\n inet6 fd00:7a72:6f6b::1 prefixlen 64 scopeid 0x0<global>\n unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 27 bytes 3236 (3.2 KB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Default IP/subnet setting can be overridden by adding ",(0,a.jsx)(n.code,{children:"<target>"})," parameter:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo -E zrok share private --headless --backend-mode vpn 192.168.42.12/24\n"})}),"\n",(0,a.jsx)(n.h2,{id:"reserve-a-vpn-share-token",children:"Reserve a VPN Share Token"}),"\n",(0,a.jsx)(n.p,{children:"As with all backend modes, you can reserve a share token for a VPN share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ zrok reserve private --backend-mode vpn\n[ 0.297] INFO main.(*reserveCommand).run: your reserved share token is 'k77y2cl7jmjl'\n\neugene@hermes $ sudo -E zrok share reserved k77y2cl7jmjl --headless\n[ 0.211] INFO main.(*shareReservedCommand).run: sharing target: '10.122.0.1/16'\n[ 0.211] INFO main.(*shareReservedCommand).run: using existing backend target: 10.122.0.1/16\n[ 0.463] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[22c5708d-e2f2-41aa-a507-454055f8bfcc]} new service session\n[ 0.641] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private k77y2cl7jmjl'\n[\n"})}),"\n",(0,a.jsx)(n.h2,{id:"access-the-vpn-share",children:"Access the VPN Share"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon % sudo -E zrok access private --headless k77y2cl7jmjl\n[ 0.201] INFO main.(*accessPrivateCommand).run: allocated frontend '50B5hloP1s1X'\n[ 0.662] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: VPN:\n[ 0.662] INFO main.(*accessPrivateCommand).run: 10.122.0.1 -> CONNECTED Welcome to zrok VPN\n[ 0.662] INFO zrok/endpoints/vpn.(*Frontend).Run: connected:Welcome to zrok VPN\n"})}),"\n",(0,a.jsxs)(n.p,{children:['zrok creates a virtual network device, i.e., a "tun" interface, when you run ',(0,a.jsx)(n.code,{children:"zrok access"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"})," run on a VPN client device:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"utun5: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500\n inet 10.122.0.3 --\x3e 10.122.0.1 netmask 0xff000000\n inet6 fe80::ce08:faff:fe8a:7b25%utun5 prefixlen 64 scopeid 0x14\n nd6 options=201<PERFORMNUD,DAD>\n"})}),"\n",(0,a.jsxs)(n.p,{children:["At this point a VPN tunnel is active between your server and client.\nIn the example above server is ",(0,a.jsx)(n.code,{children:"hermes(10.122.0.1)"})," and client is ",(0,a.jsx)(n.code,{children:"calculon(10.122.0.3)"}),".\nAll devices in the VPN can access one another by IP address."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon ~ % ssh eugene@10.122.0.1\nWelcome to Ubuntu 23.10 (GNU/Linux 6.5.0-27-generic x86_64)\n\n * Documentation: https://help.ubuntu.com\n * Management: https://landscape.canonical.com\n * Support: https://ubuntu.com/pro\n\n0 updates can be applied immediately.\n\nLast login: Tue Apr 16 09:27:13 2024 from 127.0.0.1\n\neugene@hermes:~$ who am i\neugene pts/8 2024-04-16 10:04 (10.122.0.3)\n\neugene@hermes:~$\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also make a reverse(server-to-client) connection:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes:~$ ssh 10.122.0.3\nLast login: Tue Apr 16 09:57:28 2024\n\neugene@calculon ~ % who am i\neugene ttys008 Apr 16 10:06 (10.122.0.1)\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},7224:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/vpn-share-077094eabd79a2e072ee4c40f8e0fd31.png"},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>t});var r=s(6540);const a={},o=r.createContext(a);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9471],{7501:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/vpn/vpn","title":"zrok VPN Guide","description":"zrok VPN backend allows for simple host-to-host VPN setup.","source":"@site/versioned_docs/version-0.4/guides/vpn/vpn.md","sourceDirName":"guides/vpn","slug":"/guides/vpn/","permalink":"/docs/0.4/guides/vpn/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/vpn/vpn.md","tags":[],"version":"0.4","frontMatter":{"sidebar_label":"VPN"},"sidebar":"tutorialSidebar","previous":{"title":"Drives","permalink":"/docs/0.4/guides/drives"},"next":{"title":"myzrok","permalink":"/docs/0.4/category/myzrok"}}');var a=s(4848),o=s(8453);const i={sidebar_label:"VPN"},t="zrok VPN Guide",c={},d=[{value:"Operating System Requirements",id:"operating-system-requirements",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Start the VPN Server",id:"start-the-vpn-server",level:2},{value:"Reserve a VPN Share Token",id:"reserve-a-vpn-share-token",level:2},{value:"Access the VPN Share",id:"access-the-vpn-share",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"zrok-vpn-guide",children:"zrok VPN Guide"})}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN backend allows for simple host-to-host VPN setup."}),"\n",(0,a.jsx)(n.h2,{id:"operating-system-requirements",children:"Operating System Requirements"}),"\n",(0,a.jsx)(n.p,{children:"zrok VPN requires elevated privileges to manage network devices."}),"\n",(0,a.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsxs)(n.p,{children:["On Windows, you must run zrok VPN commands as an administrator and install Wintun by placing ",(0,a.jsx)(n.code,{children:"wintun.dll"})," (",(0,a.jsx)(n.a,{href:"https://www.wintun.net/",children:"download link"}),") in the same directory as the ",(0,a.jsx)(n.code,{children:"zrok.exe"})," executable."]}),"\n",(0,a.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsxs)(n.p,{children:["On Linux, the simplest way to grant the necessary privileges is to run zrok VPN commands as root. You can enable a separate environment for root by also running ",(0,a.jsx)(n.code,{children:"zrok enable"})," as the root user, or you can prefix the commands like ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user. The minimum privilege is runing zrok VPN commands and the ",(0,a.jsx)(n.code,{children:"ip"})," command with the ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," kernel capability. The ",(0,a.jsx)(n.code,{children:"zrok-share.service"})," unit has a commented example to grant ",(0,a.jsx)(n.code,{children:"NET_ADMIN"})," as an Ambient Capability."]}),"\n",(0,a.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsxs)(n.p,{children:["On macOS, you must run zrok VPN commands as root. You can prefix the zrok command with ",(0,a.jsx)(n.code,{children:"sudo -E"})," to allow zrok running as root to use the zrok environment owned by the current user."]}),"\n",(0,a.jsx)(n.h2,{id:"start-the-vpn-server",children:"Start the VPN Server"}),"\n",(0,a.jsxs)(n.p,{children:["VPN is shared through the ",(0,a.jsx)(n.code,{children:"vpn"})," backend of ",(0,a.jsx)(n.code,{children:"zrok"})," command."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ sudo -E zrok share private --headless --backend-mode vpn\n[ 0.542] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[589d443c-f59d-4fc8-8c48-76609b7fb402]} new service session\n[ 0.705] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private 3rq7torslq3n\n[ 0.705] INFO zrok/endpoints/vpn.(*Backend).Run: started\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"VPN share",src:s(7224).A+"",width:"1626",height:"1314"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"sudo"})," or equivalent invocation is required because VPN mode needs to create a virtual network device (",(0,a.jsx)(n.code,{children:"tun"}),")\n",(0,a.jsx)(n.code,{children:"-E"})," option allows ",(0,a.jsx)(n.code,{children:"zrok"})," to find your zrok configuration files (in your ",(0,a.jsx)(n.code,{children:"$HOME/.zrok"}),")"]}),"\n",(0,a.jsxs)(n.p,{children:["By default ",(0,a.jsx)(n.code,{children:"vpn"})," backend uses subnet ",(0,a.jsx)(n.code,{children:"10.122.0.0/16"})," and assigns ",(0,a.jsx)(n.code,{children:"10.122.0.1"})," to the host that stared VPN share."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 16384\n inet 10.122.0.1 netmask 255.255.0.0 destination 10.122.0.1\n inet6 fe80::705f:24e4:dcfc:a6b2 prefixlen 64 scopeid 0x20<link>\n inet6 fd00:7a72:6f6b::1 prefixlen 64 scopeid 0x0<global>\n unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 27 bytes 3236 (3.2 KB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Default IP/subnet setting can be overridden by adding ",(0,a.jsx)(n.code,{children:"<target>"})," parameter:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo -E zrok share private --headless --backend-mode vpn 192.168.42.12/24\n"})}),"\n",(0,a.jsx)(n.h2,{id:"reserve-a-vpn-share-token",children:"Reserve a VPN Share Token"}),"\n",(0,a.jsx)(n.p,{children:"As with all backend modes, you can reserve a share token for a VPN share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes $ zrok reserve private --backend-mode vpn\n[ 0.297] INFO main.(*reserveCommand).run: your reserved share token is 'k77y2cl7jmjl'\n\neugene@hermes $ sudo -E zrok share reserved k77y2cl7jmjl --headless\n[ 0.211] INFO main.(*shareReservedCommand).run: sharing target: '10.122.0.1/16'\n[ 0.211] INFO main.(*shareReservedCommand).run: using existing backend target: 10.122.0.1/16\n[ 0.463] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[22c5708d-e2f2-41aa-a507-454055f8bfcc]} new service session\n[ 0.641] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private k77y2cl7jmjl'\n[\n"})}),"\n",(0,a.jsx)(n.h2,{id:"access-the-vpn-share",children:"Access the VPN Share"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon % sudo -E zrok access private --headless k77y2cl7jmjl\n[ 0.201] INFO main.(*accessPrivateCommand).run: allocated frontend '50B5hloP1s1X'\n[ 0.662] INFO main.(*accessPrivateCommand).run: access the zrok share at the following endpoint: VPN:\n[ 0.662] INFO main.(*accessPrivateCommand).run: 10.122.0.1 -> CONNECTED Welcome to zrok VPN\n[ 0.662] INFO zrok/endpoints/vpn.(*Frontend).Run: connected:Welcome to zrok VPN\n"})}),"\n",(0,a.jsxs)(n.p,{children:['zrok creates a virtual network device, i.e., a "tun" interface, when you run ',(0,a.jsx)(n.code,{children:"zrok access"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Example output from ",(0,a.jsx)(n.code,{children:"ifconfig"})," run on a VPN client device:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"utun5: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500\n inet 10.122.0.3 --\x3e 10.122.0.1 netmask 0xff000000\n inet6 fe80::ce08:faff:fe8a:7b25%utun5 prefixlen 64 scopeid 0x14\n nd6 options=201<PERFORMNUD,DAD>\n"})}),"\n",(0,a.jsxs)(n.p,{children:["At this point a VPN tunnel is active between your server and client.\nIn the example above server is ",(0,a.jsx)(n.code,{children:"hermes(10.122.0.1)"})," and client is ",(0,a.jsx)(n.code,{children:"calculon(10.122.0.3)"}),".\nAll devices in the VPN can access one another by IP address."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@calculon ~ % ssh eugene@10.122.0.1\nWelcome to Ubuntu 23.10 (GNU/Linux 6.5.0-27-generic x86_64)\n\n * Documentation: https://help.ubuntu.com\n * Management: https://landscape.canonical.com\n * Support: https://ubuntu.com/pro\n\n0 updates can be applied immediately.\n\nLast login: Tue Apr 16 09:27:13 2024 from 127.0.0.1\n\neugene@hermes:~$ who am i\neugene pts/8 2024-04-16 10:04 (10.122.0.3)\n\neugene@hermes:~$\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also make a reverse(server-to-client) connection:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eugene@hermes:~$ ssh 10.122.0.3\nLast login: Tue Apr 16 09:57:28 2024\n\neugene@calculon ~ % who am i\neugene ttys008 Apr 16 10:06 (10.122.0.1)\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},7224:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/vpn-share-077094eabd79a2e072ee4c40f8e0fd31.png"},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>t});var r=s(6540);const a={},o=r.createContext(a);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4f1777fd.7a01d5ed.js b/assets/js/4f1777fd.8662c934.js similarity index 96% rename from assets/js/4f1777fd.7a01d5ed.js rename to assets/js/4f1777fd.8662c934.js index e689e6cf..5fbd321f 100644 --- a/assets/js/4f1777fd.7a01d5ed.js +++ b/assets/js/4f1777fd.8662c934.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[277],{7513:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","source":"@site/../docs/guides/self-hosting/self-service-invite.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/self-service-invite","permalink":"/docs/guides/self-hosting/self-service-invite","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/self-service-invite.mdx","tags":[],"version":"current","frontMatter":{"title":"Invitations"},"sidebar":"tutorialSidebar","previous":{"title":"Instance Config","permalink":"/docs/guides/self-hosting/instance-configuration"},"next":{"title":"Drives","permalink":"/docs/guides/drives"}}');var t=n(4848),o=n(8453);const r={title:"Invitations"},c=void 0,l={},a=[{value:"Overview",id:"overview",level:2},{value:"The Self-Service User Experience",id:"the-self-service-user-experience",level:2},{value:"How it Works",id:"how-it-works",level:2}];function d(e){const s={code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance."}),"\n",(0,t.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can create user accounts directly with the ",(0,t.jsx)(s.code,{children:"zrok admin create account"})," CLI or API instead of inviting them."]}),"\n",(0,t.jsx)(s.li,{children:"You can welcome users to invite themselves via email."}),"\n",(0,t.jsx)(s.li,{children:"To enable self-service invitations you must also configure the controller to send email."}),"\n",(0,t.jsx)(s.li,{children:"You can require an invitation token if you want to restrict self-service."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"the-self-service-user-experience",children:"The Self-Service User Experience"}),"\n",(0,t.jsx)(s.p,{children:"This is what your users will do."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"zrok invite\n"})}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-buttonless",metastring:'title="Output"',children:"enter and confirm your email address...\n\n> user@domain.com\n> user@domain.com\n\n[ Submit ]\n\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"zrok invite"})," command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the ",(0,t.jsx)(s.code,{children:"[ Submit ]"})," button will start the invitation process."]}),"\n",(0,t.jsxs)(s.p,{children:["Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your ",(0,t.jsx)(s.code,{children:"zrok"})," account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Enter a Password",src:n(8083).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Enter a password and its confirmation, and click the ",(0,t.jsx)(s.code,{children:"Register Account"})," button. You'll see the following:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Successful Registration",src:n(4159).A+"",width:"1791",height:"1369"})}),"\n",(0,t.jsxs)(s.p,{children:['For now, we\'ll ignore the "enable your shell for zrok" section. Just click the ',(0,t.jsx)(s.code,{children:"zrok web portal"})," link:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Login",src:n(6658).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["After clicking the ",(0,t.jsx)(s.code,{children:"Log In"})," button, you'll be brought into the ",(0,t.jsx)(s.code,{children:"zrok"})," ",(0,t.jsx)(s.em,{children:"web console"}),":"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Console; Empty",src:n(3824).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Congratulations! Your ",(0,t.jsx)(s.code,{children:"zrok"})," account is ready to go!"]})]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},4159:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_registration_success-05e7e328284f6dc38cd993322698d38b.png"},8083:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_verify-22a26d401b9a77a4278f3c0f54d2a981.png"},3824:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_web_console_empty-cce147eaf8e7bc83abe556336a4aea98.png"},6658:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_web_login-a6161cc79e66932fab76994bdfb8f9c1.png"},8453:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>c});var i=n(6540);const t={},o=i.createContext(t);function r(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[277],{1833:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"guides/self-hosting/self-service-invite","title":"Invitations","description":"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.","source":"@site/../docs/guides/self-hosting/self-service-invite.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/self-service-invite","permalink":"/docs/guides/self-hosting/self-service-invite","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/self-service-invite.mdx","tags":[],"version":"current","frontMatter":{"title":"Invitations"},"sidebar":"tutorialSidebar","previous":{"title":"Instance Config","permalink":"/docs/guides/self-hosting/instance-configuration"},"next":{"title":"Drives","permalink":"/docs/guides/drives"}}');var t=n(4848),o=n(8453);const r={title:"Invitations"},c=void 0,l={},a=[{value:"Overview",id:"overview",level:2},{value:"The Self-Service User Experience",id:"the-self-service-user-experience",level:2},{value:"How it Works",id:"how-it-works",level:2}];function d(e){const s={code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance."}),"\n",(0,t.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can create user accounts directly with the ",(0,t.jsx)(s.code,{children:"zrok admin create account"})," CLI or API instead of inviting them."]}),"\n",(0,t.jsx)(s.li,{children:"You can welcome users to invite themselves via email."}),"\n",(0,t.jsx)(s.li,{children:"To enable self-service invitations you must also configure the controller to send email."}),"\n",(0,t.jsx)(s.li,{children:"You can require an invitation token if you want to restrict self-service."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"the-self-service-user-experience",children:"The Self-Service User Experience"}),"\n",(0,t.jsx)(s.p,{children:"This is what your users will do."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"zrok invite\n"})}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-buttonless",metastring:'title="Output"',children:"enter and confirm your email address...\n\n> user@domain.com\n> user@domain.com\n\n[ Submit ]\n\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"zrok invite"})," command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the ",(0,t.jsx)(s.code,{children:"[ Submit ]"})," button will start the invitation process."]}),"\n",(0,t.jsxs)(s.p,{children:["Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your ",(0,t.jsx)(s.code,{children:"zrok"})," account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Enter a Password",src:n(8083).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Enter a password and its confirmation, and click the ",(0,t.jsx)(s.code,{children:"Register Account"})," button. You'll see the following:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Successful Registration",src:n(9397).A+"",width:"1791",height:"1369"})}),"\n",(0,t.jsxs)(s.p,{children:['For now, we\'ll ignore the "enable your shell for zrok" section. Just click the ',(0,t.jsx)(s.code,{children:"zrok web portal"})," link:"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Login",src:n(6658).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["After clicking the ",(0,t.jsx)(s.code,{children:"Log In"})," button, you'll be brought into the ",(0,t.jsx)(s.code,{children:"zrok"})," ",(0,t.jsx)(s.em,{children:"web console"}),":"]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Web Console; Empty",src:n(3824).A+"",width:"1791",height:"1362"})}),"\n",(0,t.jsxs)(s.p,{children:["Congratulations! Your ",(0,t.jsx)(s.code,{children:"zrok"})," account is ready to go!"]})]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9397:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_registration_success-05e7e328284f6dc38cd993322698d38b.png"},8083:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_verify-22a26d401b9a77a4278f3c0f54d2a981.png"},3824:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_web_console_empty-cce147eaf8e7bc83abe556336a4aea98.png"},6658:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_web_login-a6161cc79e66932fab76994bdfb8f9c1.png"},8453:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>c});var i=n(6540);const t={},o=i.createContext(t);function r(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/50ef9c44.7c0dd56b.js b/assets/js/50ef9c44.12fc4d19.js similarity index 97% rename from assets/js/50ef9c44.7c0dd56b.js rename to assets/js/50ef9c44.12fc4d19.js index 1708fd02..7302f367 100644 --- a/assets/js/50ef9c44.7c0dd56b.js +++ b/assets/js/50ef9c44.12fc4d19.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[429],{7928:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","source":"@site/../docs/concepts/hosting.md","sourceDirName":"concepts","slug":"/concepts/hosting","permalink":"/docs/concepts/hosting","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/hosting.md","tags":[],"version":"current","sidebarPosition":200,"frontMatter":{"sidebar_position":200},"sidebar":"tutorialSidebar","previous":{"title":"Open Source","permalink":"/docs/concepts/opensource"},"next":{"title":"Guides","permalink":"/docs/category/guides"}}');var t=s(4848),i=s(8453);const r={sidebar_position:200},c="Hosting",d={},a=[{value:"Self-Hosted",id:"self-hosted",level:2},{value:"Managed Service",id:"managed-service",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"hosting",children:"Hosting"})}),"\n",(0,t.jsx)(o.h2,{id:"self-hosted",children:"Self-Hosted"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is not limited to a managed offering. You can ",(0,t.jsx)(o.a,{href:"/docs/guides/self-hosting/linux/",children:"host your own"})," instance of ",(0,t.jsx)(o.code,{children:"zrok"})," as well. ",(0,t.jsx)(o.code,{children:"zrok"})," is\nalso freely available as open source software hosted by GitHub under a very permissive Apache v2 license."]}),"\n",(0,t.jsx)(o.h2,{id:"managed-service",children:"Managed Service"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is also offered as a cloud service, making it instantly accessible to a large population immediately.\nNetFoundry provides a manged version of ",(0,t.jsx)(o.code,{children:"zrok"})," at ",(0,t.jsx)(o.a,{href:"https://zrok.io",children:"https://zrok.io"}),". This provides the easy-to-use,\nquick to demonstrate features of ",(0,t.jsx)(o.code,{children:"zrok"})," without needing to deploy and host ",(0,t.jsx)(o.code,{children:"zrok"})," yourself."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>c});var n=s(6540);const t={},i=n.createContext(t);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[429],{5853:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","source":"@site/../docs/concepts/hosting.md","sourceDirName":"concepts","slug":"/concepts/hosting","permalink":"/docs/concepts/hosting","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/hosting.md","tags":[],"version":"current","sidebarPosition":200,"frontMatter":{"sidebar_position":200},"sidebar":"tutorialSidebar","previous":{"title":"Open Source","permalink":"/docs/concepts/opensource"},"next":{"title":"Guides","permalink":"/docs/category/guides"}}');var t=s(4848),i=s(8453);const r={sidebar_position:200},c="Hosting",d={},a=[{value:"Self-Hosted",id:"self-hosted",level:2},{value:"Managed Service",id:"managed-service",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"hosting",children:"Hosting"})}),"\n",(0,t.jsx)(o.h2,{id:"self-hosted",children:"Self-Hosted"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is not limited to a managed offering. You can ",(0,t.jsx)(o.a,{href:"/docs/guides/self-hosting/linux/",children:"host your own"})," instance of ",(0,t.jsx)(o.code,{children:"zrok"})," as well. ",(0,t.jsx)(o.code,{children:"zrok"})," is\nalso freely available as open source software hosted by GitHub under a very permissive Apache v2 license."]}),"\n",(0,t.jsx)(o.h2,{id:"managed-service",children:"Managed Service"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is also offered as a cloud service, making it instantly accessible to a large population immediately.\nNetFoundry provides a manged version of ",(0,t.jsx)(o.code,{children:"zrok"})," at ",(0,t.jsx)(o.a,{href:"https://zrok.io",children:"https://zrok.io"}),". This provides the easy-to-use,\nquick to demonstrate features of ",(0,t.jsx)(o.code,{children:"zrok"})," without needing to deploy and host ",(0,t.jsx)(o.code,{children:"zrok"})," yourself."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>c});var n=s(6540);const t={},i=n.createContext(t);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5394.216a6dc4.js b/assets/js/5394.216a6dc4.js deleted file mode 100644 index d9942d3a..00000000 --- a/assets/js/5394.216a6dc4.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5394],{1432:(e,t,n)=>{"use strict";n.d(t,{A:()=>V});var o=n(6540),s=n(2303),c=n(8215),r=n(5293),a=n(6342);function l(){const{prism:e}=(0,a.p)(),{colorMode:t}=(0,r.G)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var i=n(7559),u=n(8426),d=n.n(u);const m=/title=(?<quote>["'])(?<title>.*?)\1/,p=/\{(?<range>[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},f={...b,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},h=Object.keys(b);function g(e,t){const n=e.map((e=>{const{start:n,end:o}=f[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function k(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:s,metastring:c}=t;if(c&&p.test(c)){const e=c.match(p).groups.range;if(0===s.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=s[0].className,o=d()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const r=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(h,t)}}(o,s),a=n.split("\n"),l=Object.fromEntries(s.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(s.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let d=0;d<a.length;){const e=a[d].match(r);if(!e){d+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?l[i[t]].range+=`${d},`:u[t]?l[u[t]].start=d:m[t]&&(l[m[t]].range+=`${l[m[t]].start}-${d-1},`),a.splice(d,1)}n=a.join("\n");const b={};return Object.entries(l).forEach((e=>{let[t,{range:n}]=e;d()(n).forEach((e=>{b[e]??=[],b[e].push(t)}))})),{lineClassNames:b,code:n}}const x={codeBlockContainer:"codeBlockContainer_Ckt0"};var B=n(4848);function j(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,s]=e;const c=t[o];c&&"string"==typeof s&&(n[c]=s)})),n}(l());return(0,B.jsx)(t,{...n,style:o,className:(0,c.A)(n.className,x.codeBlockContainer,i.G.common.codeBlock)})}const y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function v(e){let{children:t,className:n}=e;return(0,B.jsx)(j,{as:"pre",tabIndex:0,className:(0,c.A)(y.codeBlockStandalone,"thin-scrollbar",n),children:(0,B.jsx)("code",{className:y.codeBlockLines,children:t})})}var C=n(9532);const N={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,s]=(0,o.useState)(),c=(0,o.useCallback)((()=>{s(e.current?.closest("[role=tabpanel][hidden]"))}),[e,s]);(0,o.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=N);const s=(0,C._q)(t),c=(0,C.Be)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(s);return e&&t.observe(e,c),()=>t.disconnect()}),[e,s,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var E=n(4876);const L={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function A(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:s,getTokenProps:r}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=s({line:t,className:(0,c.A)(n,o&&L.codeLine)}),l=t.map(((e,t)=>(0,B.jsx)("span",{...r({token:e})},t)));return(0,B.jsxs)("span",{...a,children:[o?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)("span",{className:L.codeLineNumber}),(0,B.jsx)("span",{className:L.codeLineContent,children:l})]}):l,(0,B.jsx)("br",{})]})}var S=n(1312);function T(e){return(0,B.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,B.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function _(e){return(0,B.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,B.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function $(e){let{code:t,className:n}=e;const[s,r]=(0,o.useState)(!1),a=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),s=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection(),r=c.rangeCount>0&&c.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let a=!1;try{a=document.execCommand("copy")}catch{}o.remove(),r&&(c.removeAllRanges(),c.addRange(r)),s&&s.focus()}(t),r(!0),a.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,B.jsx)("button",{type:"button","aria-label":s?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.A)("clean-btn",n,I.copyButton,s&&I.copyButtonCopied),onClick:l,children:(0,B.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,B.jsx)(T,{className:I.copyButtonIcon}),(0,B.jsx)(_,{className:I.copyButtonSuccessIcon})]})})}function W(e){return(0,B.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,B.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:o}=e;const s=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,B.jsx)("button",{type:"button",onClick:n,className:(0,c.A)("clean-btn",t,o&&M.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,B.jsx)(W,{className:M.wordWrapButtonIcon,"aria-hidden":"true"})})}function R(e){let{children:t,className:n="",metastring:s,title:r,showLineNumbers:i,language:u}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,a.p)(),b=function(e){return e?.toLowerCase()}(u??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d),f=l(),h=function(){const[e,t]=(0,o.useState)(!1),[n,s]=(0,o.useState)(!1),c=(0,o.useRef)(null),r=(0,o.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),a=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");s(n)}),[c]);return w(c,a),(0,o.useEffect)((()=>{a()}),[e,a]),(0,o.useEffect)((()=>(window.addEventListener("resize",a,{passive:!0}),()=>{window.removeEventListener("resize",a)})),[a]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:r}}(),g=function(e){return e?.match(m)?.groups.title??""}(s)||r,{lineClassNames:x,code:v}=k(t,{metastring:s,language:b,magicComments:p}),C=i??function(e){return Boolean(e?.includes("showLineNumbers"))}(s);return(0,B.jsxs)(j,{as:"div",className:(0,c.A)(n,b&&!n.includes(`language-${b}`)&&`language-${b}`),children:[g&&(0,B.jsx)("div",{className:y.codeBlockTitle,children:g}),(0,B.jsxs)("div",{className:y.codeBlockContent,children:[(0,B.jsx)(E.f4,{theme:f,code:v,language:b??"text",children:e=>{let{className:t,style:n,tokens:o,getLineProps:s,getTokenProps:r}=e;return(0,B.jsx)("pre",{tabIndex:0,ref:h.codeBlockRef,className:(0,c.A)(t,y.codeBlock,"thin-scrollbar"),style:n,children:(0,B.jsx)("code",{className:(0,c.A)(y.codeBlockLines,C&&y.codeBlockLinesWithNumbering),children:o.map(((e,t)=>(0,B.jsx)(A,{line:e,getLineProps:s,getTokenProps:r,classNames:x[t],showLineNumbers:C},t)))})})}}),(0,B.jsxs)("div",{className:y.buttonGroup,children:[(h.isEnabled||h.isCodeScrollable)&&(0,B.jsx)(H,{className:y.codeButton,onClick:()=>h.toggle(),isEnabled:h.isEnabled}),(0,B.jsx)($,{className:y.codeButton,code:v})]})]})]})}function V(e){let{children:t,...n}=e;const c=(0,s.A)(),r=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),a="string"==typeof r?R:v;return(0,B.jsx)(a,{...n,children:r},String(c))}},8426:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,s,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o<c?1:-1;"-"!==s&&".."!==s&&"\u2025"!==s||(c+=e);for(let t=o;t!==c;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>r,x:()=>a});var o=n(6540);const s={},c=o.createContext(s);function r(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54fa7005.cf645e57.js b/assets/js/54fa7005.b2d85980.js similarity index 96% rename from assets/js/54fa7005.cf645e57.js rename to assets/js/54fa7005.b2d85980.js index 36224d6f..8d6b8d62 100644 --- a/assets/js/54fa7005.cf645e57.js +++ b/assets/js/54fa7005.b2d85980.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8675],{9429:(e,s,r)=>{r.d(s,{Ay:()=>t,RM:()=>i});var n=r(4848),c=r(8453);const i=[];function o(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,c.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function t(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},1806:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>t,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","source":"@site/../docs/concepts/sharing-public.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-public","permalink":"/docs/concepts/sharing-public","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-public.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Private Shares","permalink":"/docs/concepts/sharing-private"},"next":{"title":"Reserved Shares","permalink":"/docs/concepts/sharing-reserved"}}');var c=r(4848),i=r(8453),o=r(9429);const t={sidebar_position:10},d="Public Shares",a={},l=[{value:"Peer to Public",id:"peer-to-public",level:2},{value:"Public Backend Modes",id:"public-backend-modes",level:2},...o.RM];function h(e){const s={code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.header,{children:(0,c.jsx)(s.h1,{id:"public-shares",children:"Public Shares"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"zrok"})," supports ",(0,c.jsx)(s.code,{children:"public"})," sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points."]}),"\n",(0,c.jsx)(s.h2,{id:"peer-to-public",children:"Peer to Public"}),"\n",(0,c.jsx)(s.p,{children:(0,c.jsx)(s.img,{alt:"zrok_public_share",src:r(1055).A+"",width:"2200",height:"916"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"public"})," sharing is most useful when the person or service accessing your resources does not have ",(0,c.jsx)(s.code,{children:"zrok"})," running locally and cannot make use of the ",(0,c.jsx)(s.code,{children:"private"})," sharing mode built into ",(0,c.jsx)(s.code,{children:"zrok"}),". Many users share development web servers, webhooks, and other HTTP/HTTPS resources."]}),"\n",(0,c.jsxs)(s.p,{children:["As with ",(0,c.jsx)(s.code,{children:"private"})," sharing, ",(0,c.jsx)(s.code,{children:"public"})," sharing does not require you to open any firewall ports or otherwise compromise the security of your local environments. A ",(0,c.jsx)(s.code,{children:"public"})," share goes away as soon as you terminate the ",(0,c.jsx)(s.code,{children:"zrok share"})," command."]}),"\n",(0,c.jsxs)(s.p,{children:["Using ",(0,c.jsx)(s.code,{children:"public"})," shares is easy and is accomplished using the ",(0,c.jsx)(s.code,{children:"zrok share public"})," command. Run ",(0,c.jsx)(s.code,{children:"zrok share public"})," to see the command-line help and to learn how to use ",(0,c.jsx)(s.code,{children:"public"})," shares."]}),"\n",(0,c.jsx)(s.h2,{id:"public-backend-modes",children:"Public Backend Modes"}),"\n",(0,c.jsxs)(s.p,{children:["The default backend mode is ",(0,c.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,c.jsx)(s.pre,{children:(0,c.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share public 80\n"})}),"\n",(0,c.jsx)(o.Ay,{})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,c.jsx)(s,{...e,children:(0,c.jsx)(h,{...e})}):h(e)}},1055:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_public_share-1eec22cb798395c2bcd3ac10465f62ca.png"},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>t});var n=r(6540);const c={},i=n.createContext(c);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8675],{9216:(e,s,r)=>{r.d(s,{Ay:()=>t,RM:()=>i});var n=r(4848),c=r(8453);const i=[];function o(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,c.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function t(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},7941:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>t,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","source":"@site/../docs/concepts/sharing-public.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-public","permalink":"/docs/concepts/sharing-public","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-public.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Private Shares","permalink":"/docs/concepts/sharing-private"},"next":{"title":"Reserved Shares","permalink":"/docs/concepts/sharing-reserved"}}');var c=r(4848),i=r(8453),o=r(9216);const t={sidebar_position:10},d="Public Shares",a={},l=[{value:"Peer to Public",id:"peer-to-public",level:2},{value:"Public Backend Modes",id:"public-backend-modes",level:2},...o.RM];function h(e){const s={code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.header,{children:(0,c.jsx)(s.h1,{id:"public-shares",children:"Public Shares"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"zrok"})," supports ",(0,c.jsx)(s.code,{children:"public"})," sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points."]}),"\n",(0,c.jsx)(s.h2,{id:"peer-to-public",children:"Peer to Public"}),"\n",(0,c.jsx)(s.p,{children:(0,c.jsx)(s.img,{alt:"zrok_public_share",src:r(1055).A+"",width:"2200",height:"916"})}),"\n",(0,c.jsxs)(s.p,{children:[(0,c.jsx)(s.code,{children:"public"})," sharing is most useful when the person or service accessing your resources does not have ",(0,c.jsx)(s.code,{children:"zrok"})," running locally and cannot make use of the ",(0,c.jsx)(s.code,{children:"private"})," sharing mode built into ",(0,c.jsx)(s.code,{children:"zrok"}),". Many users share development web servers, webhooks, and other HTTP/HTTPS resources."]}),"\n",(0,c.jsxs)(s.p,{children:["As with ",(0,c.jsx)(s.code,{children:"private"})," sharing, ",(0,c.jsx)(s.code,{children:"public"})," sharing does not require you to open any firewall ports or otherwise compromise the security of your local environments. A ",(0,c.jsx)(s.code,{children:"public"})," share goes away as soon as you terminate the ",(0,c.jsx)(s.code,{children:"zrok share"})," command."]}),"\n",(0,c.jsxs)(s.p,{children:["Using ",(0,c.jsx)(s.code,{children:"public"})," shares is easy and is accomplished using the ",(0,c.jsx)(s.code,{children:"zrok share public"})," command. Run ",(0,c.jsx)(s.code,{children:"zrok share public"})," to see the command-line help and to learn how to use ",(0,c.jsx)(s.code,{children:"public"})," shares."]}),"\n",(0,c.jsx)(s.h2,{id:"public-backend-modes",children:"Public Backend Modes"}),"\n",(0,c.jsxs)(s.p,{children:["The default backend mode is ",(0,c.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,c.jsx)(s.pre,{children:(0,c.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share public 80\n"})}),"\n",(0,c.jsx)(o.Ay,{})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,c.jsx)(s,{...e,children:(0,c.jsx)(h,{...e})}):h(e)}},1055:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_public_share-1eec22cb798395c2bcd3ac10465f62ca.png"},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>t});var n=r(6540);const c={},i=n.createContext(c);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5cd0a723.ff1769bd.js b/assets/js/5cd0a723.a9c6bc01.js similarity index 98% rename from assets/js/5cd0a723.ff1769bd.js rename to assets/js/5cd0a723.a9c6bc01.js index f128dff3..249482ae 100644 --- a/assets/js/5cd0a723.ff1769bd.js +++ b/assets/js/5cd0a723.a9c6bc01.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4074],{2388:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","source":"@site/../docs/guides/self-hosting/instance-configuration.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/instance-configuration","permalink":"/docs/guides/self-hosting/instance-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/instance-configuration.mdx","tags":[],"version":"current","frontMatter":{"title":"Use Another zrok Instance","sidebar_label":"Instance Config"},"sidebar":"tutorialSidebar","previous":{"title":"OAuth Public Frontend Configuration","permalink":"/docs/guides/self-hosting/oauth/configuring-oauth"},"next":{"title":"Invitations","permalink":"/docs/guides/self-hosting/self-service-invite"}}');var s=t(4848),i=t(8453);const r={title:"Use Another zrok Instance",sidebar_label:"Instance Config"},c=void 0,a={},d=[];function l(e){const n={admonition:"admonition",code:"code",em:"em",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["This guide is relevant if you are self-hosting or using a friend's ",(0,s.jsx)(n.code,{children:"zrok"})," instance instead of using zrok-as-a-service from ",(0,s.jsx)(n.code,{children:"zrok.io"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"command"})," on your computer uses a ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"instance"})," over the network."]}),"\n",(0,s.jsxs)(n.p,{children:["The default instance API endpoint for the ",(0,s.jsx)(n.code,{children:"zrok"})," command is ",(0,s.jsx)(n.code,{children:"api-v1.zrok.io"}),". Set the API endpoint to another instance's API endpoint:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok config set apiEndpoint https://zrok.example.com\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[WARNING]: unable to open environment metadata; ignoring\n\nzrok configuration updated\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"WARNING"})," about ",(0,s.jsx)(n.code,{children:"environment metadata"})," is expected when you run ",(0,s.jsx)(n.code,{children:"zrok config set"})," before ",(0,s.jsx)(n.code,{children:"zrok enable"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"zrok status"})," command to inspect the state of your local ",(0,s.jsx)(n.em,{children:"environment"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," refers to each shell where you install and ",(0,s.jsx)(n.code,{children:"enable"})," a copy of ",(0,s.jsx)(n.code,{children:"zrok"})," as an ",(0,s.jsx)(n.em,{children:"environment"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok status\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://zrok.mydomain.com config \n\n[WARNING]: Unable to load your local environment!\n\nTo create a local environment use the zrok enable command.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok status"})," command shows the configured API service that your environment is using, as well as the ",(0,s.jsx)(n.code,{children:"SOURCE"})," where the setting was retrieved. In this case, ",(0,s.jsx)(n.code,{children:"config"})," means that the setting was set into the environment using the ",(0,s.jsx)(n.code,{children:"zrok config"})," command."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var o=t(6540);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4074],{6413:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","source":"@site/../docs/guides/self-hosting/instance-configuration.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/instance-configuration","permalink":"/docs/guides/self-hosting/instance-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/instance-configuration.mdx","tags":[],"version":"current","frontMatter":{"title":"Use Another zrok Instance","sidebar_label":"Instance Config"},"sidebar":"tutorialSidebar","previous":{"title":"OAuth Public Frontend Configuration","permalink":"/docs/guides/self-hosting/oauth/configuring-oauth"},"next":{"title":"Invitations","permalink":"/docs/guides/self-hosting/self-service-invite"}}');var s=t(4848),i=t(8453);const r={title:"Use Another zrok Instance",sidebar_label:"Instance Config"},c=void 0,a={},d=[];function l(e){const n={admonition:"admonition",code:"code",em:"em",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["This guide is relevant if you are self-hosting or using a friend's ",(0,s.jsx)(n.code,{children:"zrok"})," instance instead of using zrok-as-a-service from ",(0,s.jsx)(n.code,{children:"zrok.io"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"command"})," on your computer uses a ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"instance"})," over the network."]}),"\n",(0,s.jsxs)(n.p,{children:["The default instance API endpoint for the ",(0,s.jsx)(n.code,{children:"zrok"})," command is ",(0,s.jsx)(n.code,{children:"api-v1.zrok.io"}),". Set the API endpoint to another instance's API endpoint:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok config set apiEndpoint https://zrok.example.com\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[WARNING]: unable to open environment metadata; ignoring\n\nzrok configuration updated\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"WARNING"})," about ",(0,s.jsx)(n.code,{children:"environment metadata"})," is expected when you run ",(0,s.jsx)(n.code,{children:"zrok config set"})," before ",(0,s.jsx)(n.code,{children:"zrok enable"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"zrok status"})," command to inspect the state of your local ",(0,s.jsx)(n.em,{children:"environment"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," refers to each shell where you install and ",(0,s.jsx)(n.code,{children:"enable"})," a copy of ",(0,s.jsx)(n.code,{children:"zrok"})," as an ",(0,s.jsx)(n.em,{children:"environment"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok status\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://zrok.mydomain.com config \n\n[WARNING]: Unable to load your local environment!\n\nTo create a local environment use the zrok enable command.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok status"})," command shows the configured API service that your environment is using, as well as the ",(0,s.jsx)(n.code,{children:"SOURCE"})," where the setting was retrieved. In this case, ",(0,s.jsx)(n.code,{children:"config"})," means that the setting was set into the environment using the ",(0,s.jsx)(n.code,{children:"zrok config"})," command."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var o=t(6540);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.6794ea18.js b/assets/js/5e95c892.6794ea18.js deleted file mode 100644 index abf60871..00000000 --- a/assets/js/5e95c892.6794ea18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var t=r(8215),u=r(9024),a=r(7559),c=r(2831),n=r(1957),i=r(4848);function l(e){return(0,i.jsx)(u.e3,{className:(0,t.A)(a.G.wrapper.docsPages),children:(0,i.jsx)(n.A,{children:(0,c.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.6fe04f8c.js b/assets/js/5e95c892.6fe04f8c.js new file mode 100644 index 00000000..c46fb659 --- /dev/null +++ b/assets/js/5e95c892.6fe04f8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9647],{8122:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var t=r(8215),u=r(9144),a=r(204),c=r(2831),n=r(7912),i=r(4848);function l(e){return(0,i.jsx)(u.e3,{className:(0,t.A)(a.G.wrapper.docsPages),children:(0,i.jsx)(n.A,{children:(0,c.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/600b2345.18130102.js b/assets/js/600b2345.9c2e688e.js similarity index 99% rename from assets/js/600b2345.18130102.js rename to assets/js/600b2345.9c2e688e.js index 39040c3f..daa05ecf 100644 --- a/assets/js/600b2345.18130102.js +++ b/assets/js/600b2345.9c2e688e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9355],{3989:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","source":"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-limits","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Configuring Metrics","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics"},"next":{"title":"OAuth","permalink":"/docs/category/oauth"}}');var s=n(4848),a=n(8453);const r={sidebar_position:40},l="Configuring Limits",o={},c=[{value:"Understanding the zrok Limits Agent",id:"understanding-the-zrok-limits-agent",level:2},{value:"Types of Limits",id:"types-of-limits",level:3},{value:"The Global Configuration",id:"the-global-configuration",level:2},{value:"Global Resouce Count Limits",id:"global-resouce-count-limits",level:3},{value:"Global Bandwidth Limits",id:"global-bandwidth-limits",level:3},{value:"Limit Classes",id:"limit-classes",level:2},{value:"Unscoped Resource Count Classes",id:"unscoped-resource-count-classes",level:3},{value:"Unscoped Bandwidth Classes",id:"unscoped-bandwidth-classes",level:3},{value:"Scoped Classes",id:"scoped-classes",level:3},{value:"Limit Actions",id:"limit-actions",level:2},{value:"Unlimited Accounts",id:"unlimited-accounts",level:2},{value:"Experimental Limits Locking",id:"experimental-limits-locking",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Aggregate Bandwidth",id:"aggregate-bandwidth",level:3},{value:"Administration Through SQL",id:"administration-through-sql",level:3},{value:"Performance",id:"performance",level:3}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"configuring-limits",children:"Configuring Limits"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["This guide is current as of zrok version ",(0,s.jsx)(i.code,{children:"v0.4.31"}),"."]})}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["If you have not yet configured ",(0,s.jsx)(i.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics"}),", please visit the ",(0,s.jsx)(i.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics guide"})," first before working through the limits configuration."]})}),"\n",(0,s.jsx)(i.h2,{id:"understanding-the-zrok-limits-agent",children:"Understanding the zrok Limits Agent"}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is a component of the zrok controller. It can be enabled and configured through the zrok controller configuration."}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is responsible for controlling the number of resources in use (environments, shares, etc.) and also for ensuring that accounts are held below the configured data transfer bandwidth thresholds. The limits agent exists to manage resource consumption for larger, multi-user zrok installations."}),"\n",(0,s.jsx)(i.h3,{id:"types-of-limits",children:"Types of Limits"}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified that control the number of environments, shares, reserved shares, unique names, and frontends per-share that can be created by an account. Limits that control the allowed number of resources are called ",(0,s.jsx)(i.em,{children:"resource count limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified to control the amount of data that can be transferred within a time period. Limits that control the amount of data that can be transferred are called ",(0,s.jsx)(i.em,{children:"bandwidth limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["zrok limits can be specified ",(0,s.jsx)(i.em,{children:"globally"}),", applying to all users in a service instance. Limit ",(0,s.jsx)(i.em,{children:"classes"})," can be created to provide additional levels of resource allocation. Limit classes can then be ",(0,s.jsx)(i.em,{children:"applied"})," to multiple accounts, to alter their limit allocation beyond what's configured in the global configuration."]}),"\n",(0,s.jsx)(i.h2,{id:"the-global-configuration",children:"The Global Configuration"}),"\n",(0,s.jsxs)(i.p,{children:["The reference configuration for the zrok controller (found at ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok/blob/main/etc/ctrl.yml",children:(0,s.jsx)(i.code,{children:"etc/ctrl.yaml"})})," in the ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok",children:"repository"}),") contains the global limits configuration, which looks like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"# Service instance limits global configuration.\n#\n# See `docs/guides/metrics-and-limits/configuring-limits.md` for details.\n#\nlimits:\n environments: -1\n shares: -1\n reserved_shares: -1\n unique_names: -1\n share_frontends: -1\n bandwidth:\n period: 5m\n warning:\n rx: -1\n tx: -1\n total: 7242880\n limit:\n rx: -1\n tx: -1\n total: 10485760\n enforcing: false\n cycle: 5m\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["A value of ",(0,s.jsx)(i.code,{children:"-1"})," appearing in the limits configuration mean the value is ",(0,s.jsx)(i.em,{children:"unlimited"}),"."]})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"enforcing"})," boolean specifies whether or not limits are enabled in the service instance. By default, limits is disabled. No matter what else is configured in this stanza, if ",(0,s.jsx)(i.code,{children:"enforcing"})," is set to ",(0,s.jsx)(i.code,{children:"false"}),", there will be no limits placed on any account in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"cycle"}),' value controls how frequently the limits agent will evaluate enforced limits. When a user exceeds a limit and has their shares disabled, the limits agent will evaluate their bandwidth usage on this interval looking to "relax" the limit once their usage falls below the threshold.']}),"\n",(0,s.jsx)(i.h3,{id:"global-resouce-count-limits",children:"Global Resouce Count Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", ",(0,s.jsx)(i.code,{children:"unique_names"}),", and ",(0,s.jsx)(i.code,{children:"share_frontends"})," specify the resource count limits, globally for the service instance."]}),"\n",(0,s.jsx)(i.p,{children:"These resource counts will be applied to all users in the service instance by default."}),"\n",(0,s.jsx)(i.h3,{id:"global-bandwidth-limits",children:"Global Bandwidth Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"bandwidth"})," section defines the global bandwidth limits for all users in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["There are two levels of bandwidth limits that can be specified in the global configuration. The first limit defines a ",(0,s.jsx)(i.em,{children:"warning"})," threshold where the user will receive an email that they are using increased data transfer amounts and will ultimately be subject to a limit. If you do not want this warning email to be sent, then configure all of the values to ",(0,s.jsx)(i.code,{children:"-1"})," (unlimited)."]}),"\n",(0,s.jsxs)(i.p,{children:["The second limit defines the the actual ",(0,s.jsx)(i.em,{children:"limit"})," threshold, where the limits agent will disabled traffic for the account's shares."]}),"\n",(0,s.jsxs)(i.p,{children:["Bandwidth limits can be specified in terms of ",(0,s.jsx)(i.code,{children:"tx"})," (or ",(0,s.jsx)(i.em,{children:"transmitted"})," data), ",(0,s.jsx)(i.code,{children:"rx"})," (or ",(0,s.jsx)(i.em,{children:"received"})," data), and the ",(0,s.jsx)(i.code,{children:"total"})," bytes that are sent in either direction. If you only want to set the ",(0,s.jsx)(i.code,{children:"total"})," transferred limit, you can set ",(0,s.jsx)(i.code,{children:"rx"})," and ",(0,s.jsx)(i.code,{children:"tx"})," to ",(0,s.jsx)(i.code,{children:"-1"})," (for ",(0,s.jsx)(i.em,{children:"unlimited"}),"). You can configure any combination of these these values at either the limit or warning levels."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"period"})," specifies the time window for the bandwidth limit. See the documentation for ",(0,s.jsx)(i.a,{href:"https://pkg.go.dev/time#ParseDuration",children:(0,s.jsx)(i.code,{children:"time.Duration.ParseDuration"})})," for details about the format used for these durations. If the ",(0,s.jsx)(i.code,{children:"period"})," is set to 5 minutes, then the limits agent will monitor the transmitted and receivde traffic for the account for the last 5 minutes, and if the amount of data is greater than either the ",(0,s.jsx)(i.code,{children:"warning"})," or the ",(0,s.jsx)(i.code,{children:"limit"})," threshold, action will be taken."]}),"\n",(0,s.jsxs)(i.p,{children:["In the global configuration example above users are allowed to transfer a total of ",(0,s.jsx)(i.code,{children:"10485760"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period, and they will receive a warning email after they transfer more than ",(0,s.jsx)(i.code,{children:"7242880"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period."]}),"\n",(0,s.jsx)(i.h2,{id:"limit-classes",children:"Limit Classes"}),"\n",(0,s.jsxs)(i.p,{children:["The zrok limits agent includes a concept called ",(0,s.jsx)(i.em,{children:"limit classes"}),". Limit classes can be used to define resource count and bandwidth limits that can be selectively applied to individual accounts in a service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["Limit classes are created by creating a record in the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table in the zrok controller database. The table has this schema:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.limit_classes (\n id integer NOT NULL,\n label VARCHAR(32),\n backend_mode public.backend_mode,\n environments integer DEFAULT '-1'::integer NOT NULL,\n shares integer DEFAULT '-1'::integer NOT NULL,\n reserved_shares integer DEFAULT '-1'::integer NOT NULL,\n unique_names integer DEFAULT '-1'::integer NOT NULL,\n share_frontends integer DEFAULT '-1'::integer NOT NULL,\n period_minutes integer DEFAULT 1440 NOT NULL,\n rx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n tx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n total_bytes bigint DEFAULT '-1'::integer NOT NULL,\n limit_action public.limit_action DEFAULT 'limit'::public.limit_action NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n\n"})}),"\n",(0,s.jsx)(i.p,{children:"This schema supports constructing the 3 different types of limits classes that the system supports."}),"\n",(0,s.jsxs)(i.p,{children:["After defining a limit class in the database, it can be applied to specific user accounts (overriding the relevant parts of the global configuration) by inserting a row into the ",(0,s.jsx)(i.code,{children:"applied_limit_classes"})," table:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.applied_limit_classes (\n id integer NOT NULL,\n account_id integer NOT NULL,\n limit_class_id integer NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Create a row in this table linking the ",(0,s.jsx)(i.code,{children:"account_id"})," to the ",(0,s.jsx)(i.code,{children:"limit_class_id"})," to apply the limit class to a specific user account."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-resource-count-classes",children:"Unscoped Resource Count Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the resource count limits defined in the global limits configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (environments, shares, reserved_shares, unique_names, share_frontends) values (1, 1, 1, 1, 1);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This creates a limit class that sets the ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"})," all to ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account those values would override the default resource count values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped resource count class ",(0,s.jsx)(i.em,{children:"does not"})," affect the bandwidth limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-bandwidth-classes",children:"Unscoped Bandwidth Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the bandwidth limits defined in the global configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (period_minutes, total_bytes, limit_action) values (2, 204800, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This inserts a limit class that allows for a total bandwidth transfer of ",(0,s.jsx)(i.code,{children:"204800"})," bytes every ",(0,s.jsx)(i.code,{children:"2"})," minutes."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account, those values would override the default bandwidth values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped bandwidth class ",(0,s.jsx)(i.em,{children:"does not"})," affect the resource count limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"scoped-classes",children:"Scoped Classes"}),"\n",(0,s.jsxs)(i.p,{children:["A scoped limit class specifies ",(0,s.jsx)(i.em,{children:"both"})," the resource counts (",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"}),", but ",(0,s.jsx)(i.em,{children:"NOT"})," ",(0,s.jsx)(i.code,{children:"environments"}),") for a ",(0,s.jsx)(i.em,{children:"specific"})," backend mode. Insert a row like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (backend_mode, shares, reserved_shares, unique_names, period_minutes, total_bytes, limit_action) values ('web', 2, 1, 1, 2, 4096000, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Scoped limits are designed to ",(0,s.jsx)(i.em,{children:"increase"})," the limits for a specific backend mode beyond what the global configuration and the unscoped classes provide. The general approach is to use the global configuration and the unscoped classes to provide the general account limits, and then the scoped classes can be used to further increase (or potentially ",(0,s.jsx)(i.em,{children:"decrease"}),") the limits for a specific backend mode."]}),"\n",(0,s.jsx)(i.p,{children:"If a scoped limit class exists for a specific backend mode, then the limits agent will use that limit in making a decision about limiting the resource count or bandwidth. All other types of shares will fall back to the unscoped classes or the global configuration."}),"\n",(0,s.jsx)(i.h2,{id:"limit-actions",children:"Limit Actions"}),"\n",(0,s.jsx)(i.p,{children:"When an account exceeds a bandwidth limit, the limits agent will seek to limit the affected shares (based on the combination of global configuration, unscoped limit classes, and scoped limit classes). It applies the limit by removing the underlying OpenZiti dial policies for any frontends that are trying to access the share."}),"\n",(0,s.jsxs)(i.p,{children:["This means that public frontends will simply return a ",(0,s.jsx)(i.code,{children:"404"})," as if the share is no longer there. Private frontends will also return ",(0,s.jsx)(i.code,{children:"404"})," errors. When the limit is relaxed, the dial policies are put back in place and the share will continue operating normally."]}),"\n",(0,s.jsx)(i.h2,{id:"unlimited-accounts",children:"Unlimited Accounts"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"accounts"})," table in the database includes a ",(0,s.jsx)(i.code,{children:"limitless"})," column. When this column is set to ",(0,s.jsx)(i.code,{children:"true"})," the account is not subject to any of the limits in the system."]}),"\n",(0,s.jsx)(i.h2,{id:"experimental-limits-locking",children:"Experimental Limits Locking"}),"\n",(0,s.jsxs)(i.p,{children:["zrok versions prior to ",(0,s.jsx)(i.code,{children:"v0.4.31"})," had a potential race condition when enforcing resource count limits. This usually only manifested in cases where shares or environments were being allocated programmatically (and fast enough to win the limits race)."]}),"\n",(0,s.jsxs)(i.p,{children:["This occurs due to a lack of transactional database locking around the limited structures. ",(0,s.jsx)(i.code,{children:"v0.4.31"})," includes a pessimistic locking facility that can be enabled ",(0,s.jsx)(i.em,{children:"only"})," on the PostgreSQL store implemention."]}),"\n",(0,s.jsxs)(i.p,{children:["If you're running PostgreSQL for your service instance and you want to enable the new experimental locking facility that eliminates the potential resource count race condition, add the ",(0,s.jsx)(i.code,{children:"enable_locking: true"})," flag to your ",(0,s.jsx)(i.code,{children:"store"})," definition:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"store:\n enable_locking: true\n"})}),"\n",(0,s.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,s.jsx)(i.p,{children:"There are a number of caveats that are important to understand when using the limits agent with more complicated limits scenarios:"}),"\n",(0,s.jsx)(i.h3,{id:"aggregate-bandwidth",children:"Aggregate Bandwidth"}),"\n",(0,s.jsx)(i.p,{children:"The zrok limits agent is a work in progress. The system currently does not track bandwidth individually for each backend mode type, which means all bandwidth values are aggregated between all of the share types that an account might be using. This will likely change in an upcoming release."}),"\n",(0,s.jsx)(i.h3,{id:"administration-through-sql",children:"Administration Through SQL"}),"\n",(0,s.jsx)(i.p,{children:"There are currently no administrative API endpoints (or corresponding CLI tools) to support creating and applying limit classes in the current release. The limits agent infrastructure was designed to support software integrations that directly manipulate the underlying database structures."}),"\n",(0,s.jsx)(i.p,{children:"A future release may provide API and CLI tooling to support the human administration of the limits agent."}),"\n",(0,s.jsx)(i.h3,{id:"performance",children:"Performance"}),"\n",(0,s.jsxs)(i.p,{children:["Be sure to minimize the number of different periods used for specifying bandwidth limits. Specifying limits in multiple different periods can cause a multiplicity of queries to be executed against the metrics store (InfluxDB). Standardizing on a period like ",(0,s.jsx)(i.code,{children:"24h"})," or ",(0,s.jsx)(i.code,{children:"6h"})," and using that consistently is the best way to to manage the performance of the metrics store."]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>l});var t=n(6540);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9355],{9056:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","source":"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-limits","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Configuring Metrics","permalink":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics"},"next":{"title":"OAuth","permalink":"/docs/category/oauth"}}');var s=n(4848),a=n(8453);const r={sidebar_position:40},l="Configuring Limits",o={},c=[{value:"Understanding the zrok Limits Agent",id:"understanding-the-zrok-limits-agent",level:2},{value:"Types of Limits",id:"types-of-limits",level:3},{value:"The Global Configuration",id:"the-global-configuration",level:2},{value:"Global Resouce Count Limits",id:"global-resouce-count-limits",level:3},{value:"Global Bandwidth Limits",id:"global-bandwidth-limits",level:3},{value:"Limit Classes",id:"limit-classes",level:2},{value:"Unscoped Resource Count Classes",id:"unscoped-resource-count-classes",level:3},{value:"Unscoped Bandwidth Classes",id:"unscoped-bandwidth-classes",level:3},{value:"Scoped Classes",id:"scoped-classes",level:3},{value:"Limit Actions",id:"limit-actions",level:2},{value:"Unlimited Accounts",id:"unlimited-accounts",level:2},{value:"Experimental Limits Locking",id:"experimental-limits-locking",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Aggregate Bandwidth",id:"aggregate-bandwidth",level:3},{value:"Administration Through SQL",id:"administration-through-sql",level:3},{value:"Performance",id:"performance",level:3}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"configuring-limits",children:"Configuring Limits"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["This guide is current as of zrok version ",(0,s.jsx)(i.code,{children:"v0.4.31"}),"."]})}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["If you have not yet configured ",(0,s.jsx)(i.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics"}),", please visit the ",(0,s.jsx)(i.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics guide"})," first before working through the limits configuration."]})}),"\n",(0,s.jsx)(i.h2,{id:"understanding-the-zrok-limits-agent",children:"Understanding the zrok Limits Agent"}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is a component of the zrok controller. It can be enabled and configured through the zrok controller configuration."}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is responsible for controlling the number of resources in use (environments, shares, etc.) and also for ensuring that accounts are held below the configured data transfer bandwidth thresholds. The limits agent exists to manage resource consumption for larger, multi-user zrok installations."}),"\n",(0,s.jsx)(i.h3,{id:"types-of-limits",children:"Types of Limits"}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified that control the number of environments, shares, reserved shares, unique names, and frontends per-share that can be created by an account. Limits that control the allowed number of resources are called ",(0,s.jsx)(i.em,{children:"resource count limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified to control the amount of data that can be transferred within a time period. Limits that control the amount of data that can be transferred are called ",(0,s.jsx)(i.em,{children:"bandwidth limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["zrok limits can be specified ",(0,s.jsx)(i.em,{children:"globally"}),", applying to all users in a service instance. Limit ",(0,s.jsx)(i.em,{children:"classes"})," can be created to provide additional levels of resource allocation. Limit classes can then be ",(0,s.jsx)(i.em,{children:"applied"})," to multiple accounts, to alter their limit allocation beyond what's configured in the global configuration."]}),"\n",(0,s.jsx)(i.h2,{id:"the-global-configuration",children:"The Global Configuration"}),"\n",(0,s.jsxs)(i.p,{children:["The reference configuration for the zrok controller (found at ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok/blob/main/etc/ctrl.yml",children:(0,s.jsx)(i.code,{children:"etc/ctrl.yaml"})})," in the ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok",children:"repository"}),") contains the global limits configuration, which looks like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"# Service instance limits global configuration.\n#\n# See `docs/guides/metrics-and-limits/configuring-limits.md` for details.\n#\nlimits:\n environments: -1\n shares: -1\n reserved_shares: -1\n unique_names: -1\n share_frontends: -1\n bandwidth:\n period: 5m\n warning:\n rx: -1\n tx: -1\n total: 7242880\n limit:\n rx: -1\n tx: -1\n total: 10485760\n enforcing: false\n cycle: 5m\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["A value of ",(0,s.jsx)(i.code,{children:"-1"})," appearing in the limits configuration mean the value is ",(0,s.jsx)(i.em,{children:"unlimited"}),"."]})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"enforcing"})," boolean specifies whether or not limits are enabled in the service instance. By default, limits is disabled. No matter what else is configured in this stanza, if ",(0,s.jsx)(i.code,{children:"enforcing"})," is set to ",(0,s.jsx)(i.code,{children:"false"}),", there will be no limits placed on any account in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"cycle"}),' value controls how frequently the limits agent will evaluate enforced limits. When a user exceeds a limit and has their shares disabled, the limits agent will evaluate their bandwidth usage on this interval looking to "relax" the limit once their usage falls below the threshold.']}),"\n",(0,s.jsx)(i.h3,{id:"global-resouce-count-limits",children:"Global Resouce Count Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", ",(0,s.jsx)(i.code,{children:"unique_names"}),", and ",(0,s.jsx)(i.code,{children:"share_frontends"})," specify the resource count limits, globally for the service instance."]}),"\n",(0,s.jsx)(i.p,{children:"These resource counts will be applied to all users in the service instance by default."}),"\n",(0,s.jsx)(i.h3,{id:"global-bandwidth-limits",children:"Global Bandwidth Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"bandwidth"})," section defines the global bandwidth limits for all users in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["There are two levels of bandwidth limits that can be specified in the global configuration. The first limit defines a ",(0,s.jsx)(i.em,{children:"warning"})," threshold where the user will receive an email that they are using increased data transfer amounts and will ultimately be subject to a limit. If you do not want this warning email to be sent, then configure all of the values to ",(0,s.jsx)(i.code,{children:"-1"})," (unlimited)."]}),"\n",(0,s.jsxs)(i.p,{children:["The second limit defines the the actual ",(0,s.jsx)(i.em,{children:"limit"})," threshold, where the limits agent will disabled traffic for the account's shares."]}),"\n",(0,s.jsxs)(i.p,{children:["Bandwidth limits can be specified in terms of ",(0,s.jsx)(i.code,{children:"tx"})," (or ",(0,s.jsx)(i.em,{children:"transmitted"})," data), ",(0,s.jsx)(i.code,{children:"rx"})," (or ",(0,s.jsx)(i.em,{children:"received"})," data), and the ",(0,s.jsx)(i.code,{children:"total"})," bytes that are sent in either direction. If you only want to set the ",(0,s.jsx)(i.code,{children:"total"})," transferred limit, you can set ",(0,s.jsx)(i.code,{children:"rx"})," and ",(0,s.jsx)(i.code,{children:"tx"})," to ",(0,s.jsx)(i.code,{children:"-1"})," (for ",(0,s.jsx)(i.em,{children:"unlimited"}),"). You can configure any combination of these these values at either the limit or warning levels."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"period"})," specifies the time window for the bandwidth limit. See the documentation for ",(0,s.jsx)(i.a,{href:"https://pkg.go.dev/time#ParseDuration",children:(0,s.jsx)(i.code,{children:"time.Duration.ParseDuration"})})," for details about the format used for these durations. If the ",(0,s.jsx)(i.code,{children:"period"})," is set to 5 minutes, then the limits agent will monitor the transmitted and receivde traffic for the account for the last 5 minutes, and if the amount of data is greater than either the ",(0,s.jsx)(i.code,{children:"warning"})," or the ",(0,s.jsx)(i.code,{children:"limit"})," threshold, action will be taken."]}),"\n",(0,s.jsxs)(i.p,{children:["In the global configuration example above users are allowed to transfer a total of ",(0,s.jsx)(i.code,{children:"10485760"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period, and they will receive a warning email after they transfer more than ",(0,s.jsx)(i.code,{children:"7242880"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period."]}),"\n",(0,s.jsx)(i.h2,{id:"limit-classes",children:"Limit Classes"}),"\n",(0,s.jsxs)(i.p,{children:["The zrok limits agent includes a concept called ",(0,s.jsx)(i.em,{children:"limit classes"}),". Limit classes can be used to define resource count and bandwidth limits that can be selectively applied to individual accounts in a service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["Limit classes are created by creating a record in the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table in the zrok controller database. The table has this schema:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.limit_classes (\n id integer NOT NULL,\n label VARCHAR(32),\n backend_mode public.backend_mode,\n environments integer DEFAULT '-1'::integer NOT NULL,\n shares integer DEFAULT '-1'::integer NOT NULL,\n reserved_shares integer DEFAULT '-1'::integer NOT NULL,\n unique_names integer DEFAULT '-1'::integer NOT NULL,\n share_frontends integer DEFAULT '-1'::integer NOT NULL,\n period_minutes integer DEFAULT 1440 NOT NULL,\n rx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n tx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n total_bytes bigint DEFAULT '-1'::integer NOT NULL,\n limit_action public.limit_action DEFAULT 'limit'::public.limit_action NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n\n"})}),"\n",(0,s.jsx)(i.p,{children:"This schema supports constructing the 3 different types of limits classes that the system supports."}),"\n",(0,s.jsxs)(i.p,{children:["After defining a limit class in the database, it can be applied to specific user accounts (overriding the relevant parts of the global configuration) by inserting a row into the ",(0,s.jsx)(i.code,{children:"applied_limit_classes"})," table:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.applied_limit_classes (\n id integer NOT NULL,\n account_id integer NOT NULL,\n limit_class_id integer NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Create a row in this table linking the ",(0,s.jsx)(i.code,{children:"account_id"})," to the ",(0,s.jsx)(i.code,{children:"limit_class_id"})," to apply the limit class to a specific user account."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-resource-count-classes",children:"Unscoped Resource Count Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the resource count limits defined in the global limits configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (environments, shares, reserved_shares, unique_names, share_frontends) values (1, 1, 1, 1, 1);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This creates a limit class that sets the ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"})," all to ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account those values would override the default resource count values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped resource count class ",(0,s.jsx)(i.em,{children:"does not"})," affect the bandwidth limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-bandwidth-classes",children:"Unscoped Bandwidth Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the bandwidth limits defined in the global configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (period_minutes, total_bytes, limit_action) values (2, 204800, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This inserts a limit class that allows for a total bandwidth transfer of ",(0,s.jsx)(i.code,{children:"204800"})," bytes every ",(0,s.jsx)(i.code,{children:"2"})," minutes."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account, those values would override the default bandwidth values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped bandwidth class ",(0,s.jsx)(i.em,{children:"does not"})," affect the resource count limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"scoped-classes",children:"Scoped Classes"}),"\n",(0,s.jsxs)(i.p,{children:["A scoped limit class specifies ",(0,s.jsx)(i.em,{children:"both"})," the resource counts (",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"}),", but ",(0,s.jsx)(i.em,{children:"NOT"})," ",(0,s.jsx)(i.code,{children:"environments"}),") for a ",(0,s.jsx)(i.em,{children:"specific"})," backend mode. Insert a row like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (backend_mode, shares, reserved_shares, unique_names, period_minutes, total_bytes, limit_action) values ('web', 2, 1, 1, 2, 4096000, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Scoped limits are designed to ",(0,s.jsx)(i.em,{children:"increase"})," the limits for a specific backend mode beyond what the global configuration and the unscoped classes provide. The general approach is to use the global configuration and the unscoped classes to provide the general account limits, and then the scoped classes can be used to further increase (or potentially ",(0,s.jsx)(i.em,{children:"decrease"}),") the limits for a specific backend mode."]}),"\n",(0,s.jsx)(i.p,{children:"If a scoped limit class exists for a specific backend mode, then the limits agent will use that limit in making a decision about limiting the resource count or bandwidth. All other types of shares will fall back to the unscoped classes or the global configuration."}),"\n",(0,s.jsx)(i.h2,{id:"limit-actions",children:"Limit Actions"}),"\n",(0,s.jsx)(i.p,{children:"When an account exceeds a bandwidth limit, the limits agent will seek to limit the affected shares (based on the combination of global configuration, unscoped limit classes, and scoped limit classes). It applies the limit by removing the underlying OpenZiti dial policies for any frontends that are trying to access the share."}),"\n",(0,s.jsxs)(i.p,{children:["This means that public frontends will simply return a ",(0,s.jsx)(i.code,{children:"404"})," as if the share is no longer there. Private frontends will also return ",(0,s.jsx)(i.code,{children:"404"})," errors. When the limit is relaxed, the dial policies are put back in place and the share will continue operating normally."]}),"\n",(0,s.jsx)(i.h2,{id:"unlimited-accounts",children:"Unlimited Accounts"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"accounts"})," table in the database includes a ",(0,s.jsx)(i.code,{children:"limitless"})," column. When this column is set to ",(0,s.jsx)(i.code,{children:"true"})," the account is not subject to any of the limits in the system."]}),"\n",(0,s.jsx)(i.h2,{id:"experimental-limits-locking",children:"Experimental Limits Locking"}),"\n",(0,s.jsxs)(i.p,{children:["zrok versions prior to ",(0,s.jsx)(i.code,{children:"v0.4.31"})," had a potential race condition when enforcing resource count limits. This usually only manifested in cases where shares or environments were being allocated programmatically (and fast enough to win the limits race)."]}),"\n",(0,s.jsxs)(i.p,{children:["This occurs due to a lack of transactional database locking around the limited structures. ",(0,s.jsx)(i.code,{children:"v0.4.31"})," includes a pessimistic locking facility that can be enabled ",(0,s.jsx)(i.em,{children:"only"})," on the PostgreSQL store implemention."]}),"\n",(0,s.jsxs)(i.p,{children:["If you're running PostgreSQL for your service instance and you want to enable the new experimental locking facility that eliminates the potential resource count race condition, add the ",(0,s.jsx)(i.code,{children:"enable_locking: true"})," flag to your ",(0,s.jsx)(i.code,{children:"store"})," definition:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"store:\n enable_locking: true\n"})}),"\n",(0,s.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,s.jsx)(i.p,{children:"There are a number of caveats that are important to understand when using the limits agent with more complicated limits scenarios:"}),"\n",(0,s.jsx)(i.h3,{id:"aggregate-bandwidth",children:"Aggregate Bandwidth"}),"\n",(0,s.jsx)(i.p,{children:"The zrok limits agent is a work in progress. The system currently does not track bandwidth individually for each backend mode type, which means all bandwidth values are aggregated between all of the share types that an account might be using. This will likely change in an upcoming release."}),"\n",(0,s.jsx)(i.h3,{id:"administration-through-sql",children:"Administration Through SQL"}),"\n",(0,s.jsx)(i.p,{children:"There are currently no administrative API endpoints (or corresponding CLI tools) to support creating and applying limit classes in the current release. The limits agent infrastructure was designed to support software integrations that directly manipulate the underlying database structures."}),"\n",(0,s.jsx)(i.p,{children:"A future release may provide API and CLI tooling to support the human administration of the limits agent."}),"\n",(0,s.jsx)(i.h3,{id:"performance",children:"Performance"}),"\n",(0,s.jsxs)(i.p,{children:["Be sure to minimize the number of different periods used for specifying bandwidth limits. Specifying limits in multiple different periods can cause a multiplicity of queries to be executed against the metrics store (InfluxDB). Standardizing on a period like ",(0,s.jsx)(i.code,{children:"24h"})," or ",(0,s.jsx)(i.code,{children:"6h"})," and using that consistently is the best way to to manage the performance of the metrics store."]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>l});var t=n(6540);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/61ea36d9.f59265a3.js b/assets/js/61ea36d9.d29dac57.js similarity index 98% rename from assets/js/61ea36d9.f59265a3.js rename to assets/js/61ea36d9.d29dac57.js index 5093f465..6853fab1 100644 --- a/assets/js/61ea36d9.f59265a3.js +++ b/assets/js/61ea36d9.d29dac57.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9576],{9140:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","source":"@site/versioned_docs/version-0.4/concepts/opensource.md","sourceDirName":"concepts","slug":"/concepts/opensource","permalink":"/docs/0.4/concepts/opensource","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/opensource.md","tags":[],"version":"0.4","sidebarPosition":100,"frontMatter":{"sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"Sharing Websites and Files","permalink":"/docs/0.4/concepts/files"},"next":{"title":"Hosting","permalink":"/docs/0.4/concepts/hosting"}}');var r=t(4848),i=t(8453);const s={sidebar_position:100},c="Open Source",a={},d=[{value:"Built on OpenZiti",id:"built-on-openziti",level:2}];function p(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"open-source",children:"Open Source"})}),"\n",(0,r.jsxs)(o.p,{children:["It's important to the ",(0,r.jsx)(o.code,{children:"zrok"})," project that it remain free and open source software. The code is available on ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"GitHub"}),"\nfor the world to use, inspect, and build upon!"]}),"\n",(0,r.jsxs)(o.p,{children:["Check out the repository over on GitHub at ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"https://github.com/openziti/zrok"}),". If you find ",(0,r.jsx)(o.code,{children:"zrok"})," to be useful, and\nyou want to help spread the word of ",(0,r.jsx)(o.code,{children:"zrok"})," give the project a star. It really does help get the word out about the\nproject."]}),"\n",(0,r.jsxs)(o.p,{children:["The project also uses a very permissive license: Apache v2. We encourage people to fork the repo and use ",(0,r.jsx)(o.code,{children:"zrok"})," for your own purposes how you see fit or contribute back to the project."]}),"\n",(0,r.jsx)(o.h2,{id:"built-on-openziti",children:"Built on OpenZiti"}),"\n",(0,r.jsxs)(o.p,{children:["The power of ",(0,r.jsx)(o.code,{children:"zrok"})," really lies in ",(0,r.jsx)(o.code,{children:"private"})," sharing. It's increasingly clear that security needs to be a first-class\nmember of any organization. To enable ",(0,r.jsx)(o.code,{children:"private"})," sharing, ",(0,r.jsx)(o.code,{children:"zrok"})," was built on top of another excellent open source project named OpenZiti."]}),"\n",(0,r.jsxs)(o.p,{children:["OpenZiti is a secure overlay network focusing on bringing zero trust to applications. It is the ",(0,r.jsx)(o.strong,{children:"backbone"})," of ",(0,r.jsx)(o.code,{children:"zrok"}),".\nIn fact, ",(0,r.jsx)(o.code,{children:"zrok"})," proudly proclaims itself as an Ziti ",(0,r.jsx)(o.em,{children:"native"})," application."]}),"\n",(0,r.jsxs)(o.p,{children:["If you are interested in learning more about OpenZiti head over to ",(0,r.jsx)(o.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"the docs"}),", try the quickstart, and don't forget to star that project too. We couldn't build ",(0,r.jsx)(o.code,{children:"zrok"})," without OpenZiti!"]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>c});var n=t(6540);const r={},i=n.createContext(r);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9576],{1101:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","source":"@site/versioned_docs/version-0.4/concepts/opensource.md","sourceDirName":"concepts","slug":"/concepts/opensource","permalink":"/docs/0.4/concepts/opensource","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/opensource.md","tags":[],"version":"0.4","sidebarPosition":100,"frontMatter":{"sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"Sharing Websites and Files","permalink":"/docs/0.4/concepts/files"},"next":{"title":"Hosting","permalink":"/docs/0.4/concepts/hosting"}}');var r=t(4848),i=t(8453);const s={sidebar_position:100},c="Open Source",a={},d=[{value:"Built on OpenZiti",id:"built-on-openziti",level:2}];function p(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"open-source",children:"Open Source"})}),"\n",(0,r.jsxs)(o.p,{children:["It's important to the ",(0,r.jsx)(o.code,{children:"zrok"})," project that it remain free and open source software. The code is available on ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"GitHub"}),"\nfor the world to use, inspect, and build upon!"]}),"\n",(0,r.jsxs)(o.p,{children:["Check out the repository over on GitHub at ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"https://github.com/openziti/zrok"}),". If you find ",(0,r.jsx)(o.code,{children:"zrok"})," to be useful, and\nyou want to help spread the word of ",(0,r.jsx)(o.code,{children:"zrok"})," give the project a star. It really does help get the word out about the\nproject."]}),"\n",(0,r.jsxs)(o.p,{children:["The project also uses a very permissive license: Apache v2. We encourage people to fork the repo and use ",(0,r.jsx)(o.code,{children:"zrok"})," for your own purposes how you see fit or contribute back to the project."]}),"\n",(0,r.jsx)(o.h2,{id:"built-on-openziti",children:"Built on OpenZiti"}),"\n",(0,r.jsxs)(o.p,{children:["The power of ",(0,r.jsx)(o.code,{children:"zrok"})," really lies in ",(0,r.jsx)(o.code,{children:"private"})," sharing. It's increasingly clear that security needs to be a first-class\nmember of any organization. To enable ",(0,r.jsx)(o.code,{children:"private"})," sharing, ",(0,r.jsx)(o.code,{children:"zrok"})," was built on top of another excellent open source project named OpenZiti."]}),"\n",(0,r.jsxs)(o.p,{children:["OpenZiti is a secure overlay network focusing on bringing zero trust to applications. It is the ",(0,r.jsx)(o.strong,{children:"backbone"})," of ",(0,r.jsx)(o.code,{children:"zrok"}),".\nIn fact, ",(0,r.jsx)(o.code,{children:"zrok"})," proudly proclaims itself as an Ziti ",(0,r.jsx)(o.em,{children:"native"})," application."]}),"\n",(0,r.jsxs)(o.p,{children:["If you are interested in learning more about OpenZiti head over to ",(0,r.jsx)(o.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"the docs"}),", try the quickstart, and don't forget to star that project too. We couldn't build ",(0,r.jsx)(o.code,{children:"zrok"})," without OpenZiti!"]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>c});var n=t(6540);const r={},i=n.createContext(r);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6272ba0e.e147ca1e.js b/assets/js/6272ba0e.6f3f0f49.js similarity index 98% rename from assets/js/6272ba0e.e147ca1e.js rename to assets/js/6272ba0e.6f3f0f49.js index a8f04177..9ace96ee 100644 --- a/assets/js/6272ba0e.e147ca1e.js +++ b/assets/js/6272ba0e.6f3f0f49.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7242],{2816:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","source":"@site/../docs/concepts/sharing-reserved.md","sourceDirName":"concepts","slug":"/concepts/sharing-reserved","permalink":"/docs/concepts/sharing-reserved","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-reserved.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Public Shares","permalink":"/docs/concepts/sharing-public"},"next":{"title":"Sharing HTTP Servers","permalink":"/docs/concepts/http"}}');var t=s(4848),o=s(8453);const a={sidebar_position:10},i="Reserved Shares",d={},c=[{value:"Unique Names",id:"unique-names",level:2}];function h(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"reserved-shares",children:"Reserved Shares"})}),"\n",(0,t.jsxs)(r.p,{children:["By default, a ",(0,t.jsx)(r.code,{children:"public"})," or ",(0,t.jsx)(r.code,{children:"private"})," share is assigned a ",(0,t.jsx)(r.em,{children:"share token"})," when you create a share using the ",(0,t.jsx)(r.code,{children:"zrok share"})," command. The ",(0,t.jsx)(r.code,{children:"zrok share"})," command is the bridge between your local environment and the users you are sharing with. When you terminate the ",(0,t.jsx)(r.code,{children:"zrok share"}),", the bridge is eliminated and the ",(0,t.jsx)(r.em,{children:"share token"})," is deleted. If you run ",(0,t.jsx)(r.code,{children:"zrok share"})," again, you will be allocated a brand new ",(0,t.jsx)(r.em,{children:"share token"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["You can use a ",(0,t.jsx)(r.code,{children:"reserved"})," share to persist your ",(0,t.jsx)(r.em,{children:"share token"})," across multiple runs of the ",(0,t.jsx)(r.code,{children:"zrok share"})," bridge. When you use a ",(0,t.jsx)(r.code,{children:"reserved"})," share, the share token will not be deleted between multiple runs of ",(0,t.jsx)(r.code,{children:"zrok share"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["To use a ",(0,t.jsx)(r.code,{children:"reserved"})," share, you will first run the ",(0,t.jsx)(r.code,{children:"zrok reserve"})," command to create the reserved share (see ",(0,t.jsx)(r.code,{children:"zrok reserve --help"})," for details). Once you've created your ",(0,t.jsx)(r.code,{children:"reserved"})," share, you will use the ",(0,t.jsx)(r.code,{children:"zrok share reserved"})," command (see ",(0,t.jsx)(r.code,{children:"--help"})," for details) to run the bridge for the shared resource."]}),"\n",(0,t.jsxs)(r.p,{children:["This pattern works for both ",(0,t.jsx)(r.code,{children:"public"})," and ",(0,t.jsx)(r.code,{children:"private"})," shares, and for all resource types supported by ",(0,t.jsx)(r.code,{children:"zrok"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["To delete your ",(0,t.jsx)(r.code,{children:"reserved"})," share use the ",(0,t.jsx)(r.code,{children:"zrok release"})," command or click the delete button in the share's ",(0,t.jsx)(r.em,{children:"Actions"})," tab in the web console."]}),"\n",(0,t.jsx)(r.h2,{id:"unique-names",children:"Unique Names"}),"\n",(0,t.jsxs)(r.p,{children:["The default is to generate a random ",(0,t.jsx)(r.em,{children:"share token"})," and you may instead specify a ",(0,t.jsx)(r.em,{children:"unique name"}),". The unique name must be lowercase alphanumeric, between 4 and 32 characters in length."]}),"\n",(0,t.jsx)(r.p,{children:'This reserves public share token "toaster".'}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",metastring:'title="Reserve with the Command Line"',children:'zrok reserve public 80 --unique-name "toaster"\n'})}),"\n",(0,t.jsxs)(r.p,{children:["This shares ",(0,t.jsx)(r.code,{children:"127.0.0.1:80"})," as ",(0,t.jsx)(r.code,{children:"https://toaster.zrok.example.com"})," where ",(0,t.jsx)(r.code,{children:"https://{token}.zrok.example.com"})," is the frontend's template."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",metastring:'title="Share a Reserved Token"',children:'zrok share reserved "toaster"\n'})})]})}function l(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>i});var n=s(6540);const t={},o=n.createContext(t);function a(e){const r=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),n.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7242],{7859:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","source":"@site/../docs/concepts/sharing-reserved.md","sourceDirName":"concepts","slug":"/concepts/sharing-reserved","permalink":"/docs/concepts/sharing-reserved","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-reserved.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Public Shares","permalink":"/docs/concepts/sharing-public"},"next":{"title":"Sharing HTTP Servers","permalink":"/docs/concepts/http"}}');var t=s(4848),o=s(8453);const a={sidebar_position:10},i="Reserved Shares",d={},c=[{value:"Unique Names",id:"unique-names",level:2}];function h(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"reserved-shares",children:"Reserved Shares"})}),"\n",(0,t.jsxs)(r.p,{children:["By default, a ",(0,t.jsx)(r.code,{children:"public"})," or ",(0,t.jsx)(r.code,{children:"private"})," share is assigned a ",(0,t.jsx)(r.em,{children:"share token"})," when you create a share using the ",(0,t.jsx)(r.code,{children:"zrok share"})," command. The ",(0,t.jsx)(r.code,{children:"zrok share"})," command is the bridge between your local environment and the users you are sharing with. When you terminate the ",(0,t.jsx)(r.code,{children:"zrok share"}),", the bridge is eliminated and the ",(0,t.jsx)(r.em,{children:"share token"})," is deleted. If you run ",(0,t.jsx)(r.code,{children:"zrok share"})," again, you will be allocated a brand new ",(0,t.jsx)(r.em,{children:"share token"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["You can use a ",(0,t.jsx)(r.code,{children:"reserved"})," share to persist your ",(0,t.jsx)(r.em,{children:"share token"})," across multiple runs of the ",(0,t.jsx)(r.code,{children:"zrok share"})," bridge. When you use a ",(0,t.jsx)(r.code,{children:"reserved"})," share, the share token will not be deleted between multiple runs of ",(0,t.jsx)(r.code,{children:"zrok share"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["To use a ",(0,t.jsx)(r.code,{children:"reserved"})," share, you will first run the ",(0,t.jsx)(r.code,{children:"zrok reserve"})," command to create the reserved share (see ",(0,t.jsx)(r.code,{children:"zrok reserve --help"})," for details). Once you've created your ",(0,t.jsx)(r.code,{children:"reserved"})," share, you will use the ",(0,t.jsx)(r.code,{children:"zrok share reserved"})," command (see ",(0,t.jsx)(r.code,{children:"--help"})," for details) to run the bridge for the shared resource."]}),"\n",(0,t.jsxs)(r.p,{children:["This pattern works for both ",(0,t.jsx)(r.code,{children:"public"})," and ",(0,t.jsx)(r.code,{children:"private"})," shares, and for all resource types supported by ",(0,t.jsx)(r.code,{children:"zrok"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:["To delete your ",(0,t.jsx)(r.code,{children:"reserved"})," share use the ",(0,t.jsx)(r.code,{children:"zrok release"})," command or click the delete button in the share's ",(0,t.jsx)(r.em,{children:"Actions"})," tab in the web console."]}),"\n",(0,t.jsx)(r.h2,{id:"unique-names",children:"Unique Names"}),"\n",(0,t.jsxs)(r.p,{children:["The default is to generate a random ",(0,t.jsx)(r.em,{children:"share token"})," and you may instead specify a ",(0,t.jsx)(r.em,{children:"unique name"}),". The unique name must be lowercase alphanumeric, between 4 and 32 characters in length."]}),"\n",(0,t.jsx)(r.p,{children:'This reserves public share token "toaster".'}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",metastring:'title="Reserve with the Command Line"',children:'zrok reserve public 80 --unique-name "toaster"\n'})}),"\n",(0,t.jsxs)(r.p,{children:["This shares ",(0,t.jsx)(r.code,{children:"127.0.0.1:80"})," as ",(0,t.jsx)(r.code,{children:"https://toaster.zrok.example.com"})," where ",(0,t.jsx)(r.code,{children:"https://{token}.zrok.example.com"})," is the frontend's template."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",metastring:'title="Share a Reserved Token"',children:'zrok share reserved "toaster"\n'})})]})}function l(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>i});var n=s(6540);const t={},o=n.createContext(t);function a(e){const r=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),n.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/685bed1a.a03f3930.js b/assets/js/685bed1a.805a7a11.js similarity index 90% rename from assets/js/685bed1a.a03f3930.js rename to assets/js/685bed1a.805a7a11.js index a9c7239d..9b984131 100644 --- a/assets/js/685bed1a.a03f3930.js +++ b/assets/js/685bed1a.805a7a11.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5689],{1181:(e,n,o)=>{o.d(n,{Ay:()=>c,RM:()=>t});var i=o(4848),r=o(8453);const t=[{value:"Docker Instance",id:"docker-instance",level:2},{value:"Create the Docker Compose Project",id:"create-the-docker-compose-project",level:3},{value:"YOLO",id:"yolo",level:4},{value:"I'll Do it Myself",id:"ill-do-it-myself",level:4},{value:"Basic Configuration (No TLS, Localhost Only)",id:"basic-configuration-no-tls-localhost-only",level:3},{value:"DNS Configuration (Optional for localhost-only setup)",id:"dns-configuration-optional-for-localhost-only-setup",level:4},{value:"Configure the Docker Compose Project Environment",id:"configure-the-docker-compose-project-environment",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project",level:4},{value:"Expanded Configuration with TLS (Caddy or Traefik)",id:"expanded-configuration-with-tls-caddy-or-traefik",level:3},{value:"DNS Configuration for TLS",id:"dns-configuration-for-tls",level:4},{value:"Configure the Docker Compose File",id:"configure-the-docker-compose-file",level:4},{value:"Caddy Configuration",id:"caddy-configuration",level:4},{value:"Traefik Configuration",id:"traefik-configuration",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project-1",level:4},{value:"Set up a User Account",id:"set-up-a-user-account",level:3},{value:"Enable the User Environment",id:"enable-the-user-environment",level:3},{value:"Firewall Configuration",id:"firewall-configuration",level:3},{value:"Additional Configuration Options",id:"additional-configuration-options",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function s(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"docker-instance",children:"Docker Instance"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/70zJ_h4uiD8",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(n.p,{children:"This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Basic Configuration"}),": Services exposed on localhost only (no TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Caddy"}),": Services published using Caddy (TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Traefik"}),": Services published using Traefik (TLS)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Create a working directory on your Docker host and save these Docker Compose project files."}),"\n",(0,i.jsx)(n.h4,{id:"yolo",children:"YOLO"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ill-do-it-myself",children:"I'll Do it Myself"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-configuration-no-tls-localhost-only",children:"Basic Configuration (No TLS, Localhost Only)"}),"\n",(0,i.jsx)(n.p,{children:"This is the simplest way to get started with zrok, exposing services on localhost only, without TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-optional-for-localhost-only-setup",children:"DNS Configuration (Optional for localhost-only setup)"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["If you plan to use this beyond localhost, set up a wildcard record for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Create an ",(0,i.jsx)(n.code,{children:".env"})," file in the working directory with the minimal required configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env minimal configuration"',children:"# Required settings\nZROK_DNS_ZONE=share.example.com\nZROK_USER_EMAIL=me@example.com\nZROK_USER_PWD=zrokuserpw\nZITI_PWD=zitiadminpw\nZROK_ADMIN_TOKEN=zroktoken\n\n# Expose services only on localhost (default)\nZROK_INSECURE_INTERFACE=127.0.0.1\n\n# Service ports\nZROK_CTRL_PORT=18080\nZROK_FRONTEND_PORT=8080\nZROK_OAUTH_PORT=8081\nZITI_CTRL_ADVERTISED_PORT=80\nZITI_ROUTER_PORT=3022\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"expanded-configuration-with-tls-caddy-or-traefik",children:"Expanded Configuration with TLS (Caddy or Traefik)"}),"\n",(0,i.jsx)(n.p,{children:"For production deployments, you should use TLS. You can choose between Caddy or Traefik for TLS termination and reverse proxy to the zrok services. The ziti services are always published directly, not proxied, and they bring their own TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-for-tls",children:"DNS Configuration for TLS"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Ensure a wildcard record exists for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Choose a DNS provider that supports automatic DNS challenge for obtaining wildcard certificates and for which a plugin is available in Caddy or Traefik."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-file",children:"Configure the Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Add this setting to your ",(0,i.jsx)(n.code,{children:".env"})," file to select which TLS provider to use:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Use one of the following:\nCOMPOSE_FILE=compose.yml:compose.caddy.yml # For Caddy\n# OR\nCOMPOSE_FILE=compose.yml:compose.traefik.yml # For Traefik\n"})}),"\n",(0,i.jsx)(n.h4,{id:"caddy-configuration",children:"Caddy Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Caddy, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Caddy"',children:"# Caddy TLS configuration\nCADDY_DNS_PLUGIN=cloudflare # Plugin name for your DNS provider (see github.com/caddy-dns)\nCADDY_DNS_PLUGIN_TOKEN=abcd1234 # API token from your DNS provider\nCADDY_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nCADDY_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nCADDY_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of CADDY_DNS_PLUGIN_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"traefik-configuration",children:"Traefik Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Traefik, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Traefik"',children:"# Traefik TLS configuration\nTRAEFIK_DNS_PROVIDER=digitalocean # DNS provider for Traefik\nTRAEFIK_DNS_PROVIDER_TOKEN=abcd1234 # API token from your DNS provider\nTRAEFIK_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nTRAEFIK_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nTRAEFIK_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of TRAEFIK_DNS_PROVIDER_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project-1",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance with TLS support:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,i.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The ZROK_USER_EMAIL and ZROK_USER_PWD variables are set in the ",(0,i.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create the first user account"',children:"docker compose exec zrok-controller bash -xc 'zrok admin create account ${ZROK_USER_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,i.jsx)(n.p,{children:"Create additional users by running the command again with a different email and password."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create another user"',children:"docker compose exec zrok-controller zrok admin create account <email> <password>\n"})}),"\n",(0,i.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,i.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,i.jsxs)(n.p,{children:["Follow ",(0,i.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure the environment with the zrok API endpoint:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# If using TLS (Caddy or Traefik)\nzrok config set apiEndpoint https://zrok.share.example.com\n\n# If using basic configuration (localhost, no TLS)\nzrok config set apiEndpoint http://localhost:18080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"443/tcp"})," - HTTPS for all services (Caddy or Traefik)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"80/tcp"})," - ziti ctrl plane"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"additional-configuration-options",children:"Additional Configuration Options"}),"\n",(0,i.jsxs)(n.p,{children:["You can add these additional settings to your ",(0,i.jsx)(n.code,{children:".env"})," file for more customization:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# OAuth configuration for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n"})}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the service logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# View logs for a specific service\ndocker compose logs zrok-controller\ndocker compose logs zrok-frontend\ndocker compose logs ziti-quickstart\n\n# View logs for Caddy (if using)\ndocker compose logs caddy\n\n# View logs for Traefik (if using)\ndocker compose logs traefik\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Validate TLS configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# For Caddy\ndocker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n\n# For Traefik\ndocker compose exec traefik traefik healthcheck\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check certificate status:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# For Caddy\ndocker compose exec caddy curl -s "http://localhost:2019/certificates"\n\n# For Traefik - view the ACME certificate file directly\ndocker compose exec traefik cat /etc/traefik/acme/acme.json | grep -A 5 "Certificates"\n'})}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},654:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","source":"@site/versioned_docs/version-0.4/guides/self-hosting/docker.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/docker","permalink":"/docs/0.4/guides/self-hosting/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/docker.mdx","tags":[],"version":"0.4","sidebarPosition":45,"frontMatter":{"title":"Self-hosting guide for Docker","sidebar_label":"Docker","sidebar_position":45},"sidebar":"tutorialSidebar","previous":{"title":"Personalized Frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend"},"next":{"title":"Kubernetes","permalink":"/docs/0.4/guides/self-hosting/kubernetes"}}');var r=o(4848),t=o(8453),s=o(1181);const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,l={},d=[...s.RM];function h(e){return(0,r.jsx)(s.Ay,{})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h()}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var i=o(6540);const r={},t=i.createContext(r);function s(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5689],{1181:(e,n,o)=>{o.d(n,{Ay:()=>c,RM:()=>t});var i=o(4848),r=o(8453);const t=[{value:"Docker Instance",id:"docker-instance",level:2},{value:"Create the Docker Compose Project",id:"create-the-docker-compose-project",level:3},{value:"YOLO",id:"yolo",level:4},{value:"I'll Do it Myself",id:"ill-do-it-myself",level:4},{value:"Basic Configuration (No TLS, Localhost Only)",id:"basic-configuration-no-tls-localhost-only",level:3},{value:"DNS Configuration (Optional for localhost-only setup)",id:"dns-configuration-optional-for-localhost-only-setup",level:4},{value:"Configure the Docker Compose Project Environment",id:"configure-the-docker-compose-project-environment",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project",level:4},{value:"Expanded Configuration with TLS (Caddy or Traefik)",id:"expanded-configuration-with-tls-caddy-or-traefik",level:3},{value:"DNS Configuration for TLS",id:"dns-configuration-for-tls",level:4},{value:"Configure the Docker Compose File",id:"configure-the-docker-compose-file",level:4},{value:"Caddy Configuration",id:"caddy-configuration",level:4},{value:"Traefik Configuration",id:"traefik-configuration",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project-1",level:4},{value:"Set up a User Account",id:"set-up-a-user-account",level:3},{value:"Enable the User Environment",id:"enable-the-user-environment",level:3},{value:"Firewall Configuration",id:"firewall-configuration",level:3},{value:"Additional Configuration Options",id:"additional-configuration-options",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function s(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"docker-instance",children:"Docker Instance"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/70zJ_h4uiD8",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(n.p,{children:"This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Basic Configuration"}),": Services exposed on localhost only (no TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Caddy"}),": Services published using Caddy (TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Traefik"}),": Services published using Traefik (TLS)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Create a working directory on your Docker host and save these Docker Compose project files."}),"\n",(0,i.jsx)(n.h4,{id:"yolo",children:"YOLO"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ill-do-it-myself",children:"I'll Do it Myself"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-configuration-no-tls-localhost-only",children:"Basic Configuration (No TLS, Localhost Only)"}),"\n",(0,i.jsx)(n.p,{children:"This is the simplest way to get started with zrok, exposing services on localhost only, without TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-optional-for-localhost-only-setup",children:"DNS Configuration (Optional for localhost-only setup)"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["If you plan to use this beyond localhost, set up a wildcard record for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Create an ",(0,i.jsx)(n.code,{children:".env"})," file in the working directory with the minimal required configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env minimal configuration"',children:"# Required settings\nZROK_DNS_ZONE=share.example.com\nZROK_USER_EMAIL=me@example.com\nZROK_USER_PWD=zrokuserpw\nZITI_PWD=zitiadminpw\nZROK_ADMIN_TOKEN=zroktoken\n\n# Expose services only on localhost (default)\nZROK_INSECURE_INTERFACE=127.0.0.1\n\n# Service ports\nZROK_CTRL_PORT=18080\nZROK_FRONTEND_PORT=8080\nZROK_OAUTH_PORT=8081\nZITI_CTRL_ADVERTISED_PORT=80\nZITI_ROUTER_PORT=3022\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"expanded-configuration-with-tls-caddy-or-traefik",children:"Expanded Configuration with TLS (Caddy or Traefik)"}),"\n",(0,i.jsx)(n.p,{children:"For production deployments, you should use TLS. You can choose between Caddy or Traefik for TLS termination and reverse proxy to the zrok services. The ziti services are always published directly, not proxied, and they bring their own TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-for-tls",children:"DNS Configuration for TLS"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Ensure a wildcard record exists for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Choose a DNS provider that supports automatic DNS challenge for obtaining wildcard certificates and for which a plugin is available in Caddy or Traefik."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-file",children:"Configure the Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Add this setting to your ",(0,i.jsx)(n.code,{children:".env"})," file to select which TLS provider to use:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Use one of the following:\nCOMPOSE_FILE=compose.yml:compose.caddy.yml # For Caddy\n# OR\nCOMPOSE_FILE=compose.yml:compose.traefik.yml # For Traefik\n"})}),"\n",(0,i.jsx)(n.h4,{id:"caddy-configuration",children:"Caddy Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Caddy, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Caddy"',children:"# Caddy TLS configuration\nCADDY_DNS_PLUGIN=cloudflare # Plugin name for your DNS provider (see github.com/caddy-dns)\nCADDY_DNS_PLUGIN_TOKEN=abcd1234 # API token from your DNS provider\nCADDY_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nCADDY_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nCADDY_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of CADDY_DNS_PLUGIN_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"traefik-configuration",children:"Traefik Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Traefik, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Traefik"',children:"# Traefik TLS configuration\nTRAEFIK_DNS_PROVIDER=digitalocean # DNS provider for Traefik\nTRAEFIK_DNS_PROVIDER_TOKEN=abcd1234 # API token from your DNS provider\nTRAEFIK_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nTRAEFIK_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nTRAEFIK_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of TRAEFIK_DNS_PROVIDER_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project-1",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance with TLS support:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,i.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The ZROK_USER_EMAIL and ZROK_USER_PWD variables are set in the ",(0,i.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create the first user account"',children:"docker compose exec zrok-controller bash -xc 'zrok admin create account ${ZROK_USER_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,i.jsx)(n.p,{children:"Create additional users by running the command again with a different email and password."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create another user"',children:"docker compose exec zrok-controller zrok admin create account <email> <password>\n"})}),"\n",(0,i.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,i.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,i.jsxs)(n.p,{children:["Follow ",(0,i.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure the environment with the zrok API endpoint:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# If using TLS (Caddy or Traefik)\nzrok config set apiEndpoint https://zrok.share.example.com\n\n# If using basic configuration (localhost, no TLS)\nzrok config set apiEndpoint http://localhost:18080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"443/tcp"})," - HTTPS for all services (Caddy or Traefik)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"80/tcp"})," - ziti ctrl plane"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"additional-configuration-options",children:"Additional Configuration Options"}),"\n",(0,i.jsxs)(n.p,{children:["You can add these additional settings to your ",(0,i.jsx)(n.code,{children:".env"})," file for more customization:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# OAuth configuration for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n"})}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the service logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# View logs for a specific service\ndocker compose logs zrok-controller\ndocker compose logs zrok-frontend\ndocker compose logs ziti-quickstart\n\n# View logs for Caddy (if using)\ndocker compose logs caddy\n\n# View logs for Traefik (if using)\ndocker compose logs traefik\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Validate TLS configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# For Caddy\ndocker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n\n# For Traefik\ndocker compose exec traefik traefik healthcheck\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check certificate status:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# For Caddy\ndocker compose exec caddy curl -s "http://localhost:2019/certificates"\n\n# For Traefik - view the ACME certificate file directly\ndocker compose exec traefik cat /etc/traefik/acme/acme.json | grep -A 5 "Certificates"\n'})}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},9900:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","source":"@site/versioned_docs/version-0.4/guides/self-hosting/docker.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/docker","permalink":"/docs/0.4/guides/self-hosting/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/docker.mdx","tags":[],"version":"0.4","sidebarPosition":45,"frontMatter":{"title":"Self-hosting guide for Docker","sidebar_label":"Docker","sidebar_position":45},"sidebar":"tutorialSidebar","previous":{"title":"Personalized Frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend"},"next":{"title":"Kubernetes","permalink":"/docs/0.4/guides/self-hosting/kubernetes"}}');var r=o(4848),t=o(8453),s=o(1181);const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,l={},d=[...s.RM];function h(e){return(0,r.jsx)(s.Ay,{})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h()}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var i=o(6540);const r={},t=i.createContext(r);function s(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6a6a5bbc.7ff8dd0a.js b/assets/js/6a6a5bbc.492570ea.js similarity index 98% rename from assets/js/6a6a5bbc.7ff8dd0a.js rename to assets/js/6a6a5bbc.492570ea.js index 1df643de..a9c55fda 100644 --- a/assets/js/6a6a5bbc.7ff8dd0a.js +++ b/assets/js/6a6a5bbc.492570ea.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2867],{2468:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","source":"@site/versioned_docs/version-0.4/concepts/files.md","sourceDirName":"concepts","slug":"/concepts/files","permalink":"/docs/0.4/concepts/files","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/files.md","tags":[],"version":"0.4","sidebarPosition":30,"frontMatter":{"title":"Sharing Websites and Files","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/0.4/concepts/tunnels"},"next":{"title":"Open Source","permalink":"/docs/0.4/concepts/opensource"}}');var r=n(4848),t=n(8453);const o={title:"Sharing Websites and Files",sidebar_position:30},c=void 0,l={},a=[];function d(e){const s={code:"code",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:["With ",(0,r.jsx)(s.code,{children:"zrok"})," it is possible to share files quickly and easily as well. To share files using ",(0,r.jsx)(s.code,{children:"zrok"})," use\nthe ",(0,r.jsx)(s.code,{children:"--backend-mode web"}),", for example: ",(0,r.jsx)(s.code,{children:"zrok share private . --backend-mode web"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Running with this mode will make it trivially easy to share files from the directory which the command\nwas run from."}),"\n",(0,r.jsx)(s.p,{children:"For example if you have a directory with a structure like this:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-r--r--+ 1 Michael None 7090 Apr 17 12:53 CHANGELOG.md\n-rw-r--r--+ 1 Michael None 11346 Apr 17 12:53 LICENSE\n-rw-r--r--+ 1 Michael None 2885 Apr 17 12:53 README.md\n-rwxr-xr-x+ 1 Michael None 44250624 Apr 17 13:00 zrok.exe*\n"})}),"\n",(0,r.jsx)(s.p,{children:"The files can be shared using a command such as:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"zrok share public --backend-mode web .\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Then the files can be access with a ",(0,r.jsx)(s.code,{children:"private"})," or ",(0,r.jsx)(s.code,{children:"public"})," share, for example as shown:"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_files",src:n(3920).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," will automatically provide a stock website, which will allow the accessing user to browse and navigate the file tree. Clicking the files allows the user to download them."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," can also share a pre-rendered static HTML website. If you have a directory like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-rw-r--+ 1 Michael None 56 Jun 26 13:23 index.html\n"})}),"\n",(0,r.jsxs)(s.p,{children:["If ",(0,r.jsx)(s.code,{children:"index.html"})," contains valid HTML, like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-html",children:"<html>\n<body>\n <h1>Hello <code>zrok</code></h1>\n</html>\n"})}),"\n",(0,r.jsx)(s.p,{children:"Sharing the directory will result in the following when you access the share in a web browser:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_website",src:n(6866).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," contains a built-in web server, which you can use to serve static websites as a share."]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3920:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_files-936de420b39b071d71a8e275fe84e63d.png"},6866:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_website-5d4c550374b118d1992e488bb319e230.png"},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>c});var i=n(6540);const r={},t=i.createContext(r);function o(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2867],{8899:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","source":"@site/versioned_docs/version-0.4/concepts/files.md","sourceDirName":"concepts","slug":"/concepts/files","permalink":"/docs/0.4/concepts/files","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/files.md","tags":[],"version":"0.4","sidebarPosition":30,"frontMatter":{"title":"Sharing Websites and Files","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/0.4/concepts/tunnels"},"next":{"title":"Open Source","permalink":"/docs/0.4/concepts/opensource"}}');var r=n(4848),t=n(8453);const o={title:"Sharing Websites and Files",sidebar_position:30},c=void 0,l={},a=[];function d(e){const s={code:"code",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:["With ",(0,r.jsx)(s.code,{children:"zrok"})," it is possible to share files quickly and easily as well. To share files using ",(0,r.jsx)(s.code,{children:"zrok"})," use\nthe ",(0,r.jsx)(s.code,{children:"--backend-mode web"}),", for example: ",(0,r.jsx)(s.code,{children:"zrok share private . --backend-mode web"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Running with this mode will make it trivially easy to share files from the directory which the command\nwas run from."}),"\n",(0,r.jsx)(s.p,{children:"For example if you have a directory with a structure like this:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-r--r--+ 1 Michael None 7090 Apr 17 12:53 CHANGELOG.md\n-rw-r--r--+ 1 Michael None 11346 Apr 17 12:53 LICENSE\n-rw-r--r--+ 1 Michael None 2885 Apr 17 12:53 README.md\n-rwxr-xr-x+ 1 Michael None 44250624 Apr 17 13:00 zrok.exe*\n"})}),"\n",(0,r.jsx)(s.p,{children:"The files can be shared using a command such as:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"zrok share public --backend-mode web .\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Then the files can be access with a ",(0,r.jsx)(s.code,{children:"private"})," or ",(0,r.jsx)(s.code,{children:"public"})," share, for example as shown:"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_files",src:n(3920).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," will automatically provide a stock website, which will allow the accessing user to browse and navigate the file tree. Clicking the files allows the user to download them."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," can also share a pre-rendered static HTML website. If you have a directory like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-rw-r--+ 1 Michael None 56 Jun 26 13:23 index.html\n"})}),"\n",(0,r.jsxs)(s.p,{children:["If ",(0,r.jsx)(s.code,{children:"index.html"})," contains valid HTML, like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-html",children:"<html>\n<body>\n <h1>Hello <code>zrok</code></h1>\n</html>\n"})}),"\n",(0,r.jsx)(s.p,{children:"Sharing the directory will result in the following when you access the share in a web browser:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_website",src:n(6866).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," contains a built-in web server, which you can use to serve static websites as a share."]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3920:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_files-936de420b39b071d71a8e275fe84e63d.png"},6866:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_website-5d4c550374b118d1992e488bb319e230.png"},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>c});var i=n(6540);const r={},t=i.createContext(r);function o(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e881e32.58f05075.js b/assets/js/6e881e32.d1a95584.js similarity index 99% rename from assets/js/6e881e32.58f05075.js rename to assets/js/6e881e32.d1a95584.js index dec7c22f..df85c43c 100644 --- a/assets/js/6e881e32.58f05075.js +++ b/assets/js/6e881e32.d1a95584.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3373],{9864:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","source":"@site/../docs/guides/self-hosting/oauth/configuring-oauth.md","sourceDirName":"guides/self-hosting/oauth","slug":"/guides/self-hosting/oauth/configuring-oauth","permalink":"/docs/guides/self-hosting/oauth/configuring-oauth","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/oauth/configuring-oauth.md","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"OAuth","permalink":"/docs/category/oauth"},"next":{"title":"Instance Config","permalink":"/docs/guides/self-hosting/instance-configuration"}}');var o=n(4848),s=n(8453);const r={},a="OAuth Public Frontend Configuration",c={},h=[{value:"Planning for the OAuth Frontend",id:"planning-for-the-oauth-frontend",level:2},{value:"Configuring a Google OAuth Client ID",id:"configuring-a-google-oauth-client-id",level:2},{value:"OAuth Content Screen",id:"oauth-content-screen",level:3},{value:"Create the OAuth 2.0 Client ID",id:"create-the-oauth-20-client-id",level:3},{value:"Configuring a GitHub Client ID",id:"configuring-a-github-client-id",level:2},{value:"Configuring your Public Frontend",id:"configuring-your-public-frontend",level:2},{value:"Enabling OAuth on a Public Share",id:"enabling-oauth-on-a-public-share",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oauth-public-frontend-configuration",children:"OAuth Public Frontend Configuration"})}),"\n",(0,o.jsxs)(t.p,{children:["As of ",(0,o.jsx)(t.code,{children:"v0.4.7"}),", ",(0,o.jsx)(t.code,{children:"zrok"})," includes OAuth integration for both Google and GitHub for ",(0,o.jsx)(t.code,{children:"zrok access public"})," public frontends."]}),"\n",(0,o.jsx)(t.p,{children:"This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share."}),"\n",(0,o.jsxs)(t.p,{children:["This is a first step towards a more comprehensive portfolio of user authentication strategies in future ",(0,o.jsx)(t.code,{children:"zrok"})," releases."]}),"\n",(0,o.jsx)(t.h2,{id:"planning-for-the-oauth-frontend",children:"Planning for the OAuth Frontend"}),"\n",(0,o.jsx)(t.p,{children:"The current implementation of the OAuth public frontend uses a HTTP listener to handle redirects from OAuth providers. You'll need to configure a DNS name and a port for this listener that is accessible by your end users. We'll refer to this listener as the \"OAuth frontend\" in this guide."}),"\n",(0,o.jsx)(t.p,{children:'We\'ll use the public DNS address of the OAuth frontend when creating the Google and GitHub OAuth clients below. This address is typically configured into these clients as the "redirect URL" where these clients will send the authenticated users after authentication.'}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend will capture the successful authentication and forward the user back to their original destination."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-google-oauth-client-id",children:"Configuring a Google OAuth Client ID"}),"\n",(0,o.jsx)(t.h3,{id:"oauth-content-screen",children:"OAuth Content Screen"}),"\n",(0,o.jsx)(t.p,{children:'Before you can configure an OAuth Client ID in Google Cloud, you have to configure the "OAuth content screen".'}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > OAuth content screen"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1004).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsxs)(t.p,{children:["Here you can give your ",(0,o.jsx)(t.code,{children:"zrok"})," public frontend an identity and branding to match your deployment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(3269).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsx)(t.p,{children:"Describe what domains are authorized to access your public frontend and establish contact information."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(6490).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Add a non-sensitive scope for ",(0,o.jsx)(t.code,{children:"../auth/userinfo.email"}),". This is important as it allows the ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend to receive the email address of the authenticated user."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(8403).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2792).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Now your OAuth content screen is configured."}),"\n",(0,o.jsx)(t.h3,{id:"create-the-oauth-20-client-id",children:"Create the OAuth 2.0 Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Next we create the OAuth Client ID for your public frontend."}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud Console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > + Create Credentials"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(8998).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Select ",(0,o.jsx)(t.code,{children:"OAuth client ID"})," from the ",(0,o.jsx)(t.code,{children:"+ Create Credentials"})," dropdown."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(9677).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Application type is ",(0,o.jsx)(t.code,{children:"Web Application"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(3524).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The most important bit here is the "Authorized redirect URIs". You\'re going to want to put a URL here that matches the ',(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend address that you configured at the start of this guide, but at the end of the URL you're going to append ",(0,o.jsx)(t.code,{children:"/google/oauth"})," to the URL."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7115).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"With this your Google OAuth client should be configured and ready."}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-github-client-id",children:"Configuring a GitHub Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Register a new OAuth application through the GitHub settings for the account that owns the application."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to:",(0,o.jsx)(t.code,{children:"Settings > Developer Settings > OAuth Apps > Register a new application"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4378).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1809).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The "Authorized callback URL" should be configured to match the OAuth frontend address you configured at the start of this guide, with ',(0,o.jsx)(t.code,{children:"/github/oauth"})," appended to the end."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(680).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Create a new client secret."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2823).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-your-public-frontend",children:"Configuring your Public Frontend"}),"\n",(0,o.jsxs)(t.p,{children:["The public frontend configuration includes a new ",(0,o.jsx)(t.code,{children:"oauth"})," section:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'oauth:\n bind_address: 0.0.0.0:8181\n redirect_url: https://oauth.zrok.io\n cookie_domain: zrok.io\n hash_key: "the quick brown fox jumped over the lazy dog"\n providers:\n - name: google\n client_id: "<client id from google>"\n client_secret: "<client secret from google>"\n - name: github\n client_id: "<client id from github>"\n client_secret: "<client secret from github>"\n \n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"bind_address"})," parameter determines where the OAuth frontend will bind. Should be in ",(0,o.jsx)(t.code,{children:"ip:port"})," format."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"redirect_url"})," parameter determines the base URL where OAuth frontend requests will be redirected."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"cookie_domain"})," is the domain where authentication cookies should be stored."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"hash_key"})," is a unique string for your installation that is used to secure the authentication payloads for your public frontend."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"providers"})," is a list of configured providers for this public frontend. The current implementation supports ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," as options."]}),"\n",(0,o.jsxs)(t.p,{children:["Both the ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," providers accept a ",(0,o.jsx)(t.code,{children:"client_id"})," and ",(0,o.jsx)(t.code,{children:"client_secret"})," parameter. These values are provided when you configure the OAuth clients at Google or GitHub."]}),"\n",(0,o.jsx)(t.h2,{id:"enabling-oauth-on-a-public-share",children:"Enabling OAuth on a Public Share"}),"\n",(0,o.jsx)(t.p,{children:"With your public frontend configured to support OAuth, you can test this by creating a public share. There are new command line options to support this:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:'$ zrok share public --help\nShare a target resource publicly\n\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n -b, --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n --oauth-check-interval duration Maximum lifetime for OAuth authentication; reauthenticate after expiry (default 3h0m0s)\n --oauth-email-address-patterns stringArray Allow only these email domain globs to authenticate via OAuth\n --oauth-provider string Enable OAuth provider [google, github]\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-provider"})," flag enables OAuth for the share using the specified provider."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-email-address-patterns"})," flag accepts a single glob pattern that matches an authenticated email address that is allowed to access the share. Use this flag multiple times to allow different patterns."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-check-interval"})," flag specifies how frequently the authentication must be checked."]}),"\n",(0,o.jsx)(t.p,{children:"An example public share:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:"zrok share public --backend-mode web --oauth-provider github --oauth-email-address-patterns '*@zrok.io' ~/public\n"})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},4378:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_1-dbb289a694d0c99b50cb949654d818f8.png"},1809:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_2-bc9d4c3f25853d608870eb220d00e5ee.png"},680:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_3-7973d63cd117eaba72fbaeb4ff119a39.png"},2823:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_4-6fed398013c9e6c3a31e5721adac4a4c.png"},8998:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_1-e61ee7e8fa51bdc93feab84235a90673.png"},9677:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_2-60cf4edb52f453d605907c17400e0800.png"},3524:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_3-1b3db3f9057d8626d64c5466dbb05ec7.png"},7115:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_4-f720031df1d09f997a18842745e9ea0d.png"},1004:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_2-b94a6456ce9b13e053b4c07d8f233e84.png"},3269:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_3-edf62ea2b291b58093289d31c2dae58d.png"},6490:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_4-4bc7e07b06c8a9a3c1e8f766f6f1c5a6.png"},8403:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_5-7c375cf49d8e2e392ca12b584462ab59.png"},2792:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_6-9b0fe216a782ef378313650e99ea52a1.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3373],{3707:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","source":"@site/../docs/guides/self-hosting/oauth/configuring-oauth.md","sourceDirName":"guides/self-hosting/oauth","slug":"/guides/self-hosting/oauth/configuring-oauth","permalink":"/docs/guides/self-hosting/oauth/configuring-oauth","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/oauth/configuring-oauth.md","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"OAuth","permalink":"/docs/category/oauth"},"next":{"title":"Instance Config","permalink":"/docs/guides/self-hosting/instance-configuration"}}');var o=n(4848),s=n(8453);const r={},a="OAuth Public Frontend Configuration",c={},h=[{value:"Planning for the OAuth Frontend",id:"planning-for-the-oauth-frontend",level:2},{value:"Configuring a Google OAuth Client ID",id:"configuring-a-google-oauth-client-id",level:2},{value:"OAuth Content Screen",id:"oauth-content-screen",level:3},{value:"Create the OAuth 2.0 Client ID",id:"create-the-oauth-20-client-id",level:3},{value:"Configuring a GitHub Client ID",id:"configuring-a-github-client-id",level:2},{value:"Configuring your Public Frontend",id:"configuring-your-public-frontend",level:2},{value:"Enabling OAuth on a Public Share",id:"enabling-oauth-on-a-public-share",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oauth-public-frontend-configuration",children:"OAuth Public Frontend Configuration"})}),"\n",(0,o.jsxs)(t.p,{children:["As of ",(0,o.jsx)(t.code,{children:"v0.4.7"}),", ",(0,o.jsx)(t.code,{children:"zrok"})," includes OAuth integration for both Google and GitHub for ",(0,o.jsx)(t.code,{children:"zrok access public"})," public frontends."]}),"\n",(0,o.jsx)(t.p,{children:"This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share."}),"\n",(0,o.jsxs)(t.p,{children:["This is a first step towards a more comprehensive portfolio of user authentication strategies in future ",(0,o.jsx)(t.code,{children:"zrok"})," releases."]}),"\n",(0,o.jsx)(t.h2,{id:"planning-for-the-oauth-frontend",children:"Planning for the OAuth Frontend"}),"\n",(0,o.jsx)(t.p,{children:"The current implementation of the OAuth public frontend uses a HTTP listener to handle redirects from OAuth providers. You'll need to configure a DNS name and a port for this listener that is accessible by your end users. We'll refer to this listener as the \"OAuth frontend\" in this guide."}),"\n",(0,o.jsx)(t.p,{children:'We\'ll use the public DNS address of the OAuth frontend when creating the Google and GitHub OAuth clients below. This address is typically configured into these clients as the "redirect URL" where these clients will send the authenticated users after authentication.'}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend will capture the successful authentication and forward the user back to their original destination."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-google-oauth-client-id",children:"Configuring a Google OAuth Client ID"}),"\n",(0,o.jsx)(t.h3,{id:"oauth-content-screen",children:"OAuth Content Screen"}),"\n",(0,o.jsx)(t.p,{children:'Before you can configure an OAuth Client ID in Google Cloud, you have to configure the "OAuth content screen".'}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > OAuth content screen"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1004).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsxs)(t.p,{children:["Here you can give your ",(0,o.jsx)(t.code,{children:"zrok"})," public frontend an identity and branding to match your deployment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(3269).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsx)(t.p,{children:"Describe what domains are authorized to access your public frontend and establish contact information."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(6490).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Add a non-sensitive scope for ",(0,o.jsx)(t.code,{children:"../auth/userinfo.email"}),". This is important as it allows the ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend to receive the email address of the authenticated user."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(8403).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2792).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Now your OAuth content screen is configured."}),"\n",(0,o.jsx)(t.h3,{id:"create-the-oauth-20-client-id",children:"Create the OAuth 2.0 Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Next we create the OAuth Client ID for your public frontend."}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud Console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > + Create Credentials"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(8998).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Select ",(0,o.jsx)(t.code,{children:"OAuth client ID"})," from the ",(0,o.jsx)(t.code,{children:"+ Create Credentials"})," dropdown."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(9677).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Application type is ",(0,o.jsx)(t.code,{children:"Web Application"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(3524).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The most important bit here is the "Authorized redirect URIs". You\'re going to want to put a URL here that matches the ',(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend address that you configured at the start of this guide, but at the end of the URL you're going to append ",(0,o.jsx)(t.code,{children:"/google/oauth"})," to the URL."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7115).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"With this your Google OAuth client should be configured and ready."}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-github-client-id",children:"Configuring a GitHub Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Register a new OAuth application through the GitHub settings for the account that owns the application."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to:",(0,o.jsx)(t.code,{children:"Settings > Developer Settings > OAuth Apps > Register a new application"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4378).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1809).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The "Authorized callback URL" should be configured to match the OAuth frontend address you configured at the start of this guide, with ',(0,o.jsx)(t.code,{children:"/github/oauth"})," appended to the end."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(680).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Create a new client secret."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2823).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-your-public-frontend",children:"Configuring your Public Frontend"}),"\n",(0,o.jsxs)(t.p,{children:["The public frontend configuration includes a new ",(0,o.jsx)(t.code,{children:"oauth"})," section:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'oauth:\n bind_address: 0.0.0.0:8181\n redirect_url: https://oauth.zrok.io\n cookie_domain: zrok.io\n hash_key: "the quick brown fox jumped over the lazy dog"\n providers:\n - name: google\n client_id: "<client id from google>"\n client_secret: "<client secret from google>"\n - name: github\n client_id: "<client id from github>"\n client_secret: "<client secret from github>"\n \n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"bind_address"})," parameter determines where the OAuth frontend will bind. Should be in ",(0,o.jsx)(t.code,{children:"ip:port"})," format."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"redirect_url"})," parameter determines the base URL where OAuth frontend requests will be redirected."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"cookie_domain"})," is the domain where authentication cookies should be stored."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"hash_key"})," is a unique string for your installation that is used to secure the authentication payloads for your public frontend."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"providers"})," is a list of configured providers for this public frontend. The current implementation supports ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," as options."]}),"\n",(0,o.jsxs)(t.p,{children:["Both the ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," providers accept a ",(0,o.jsx)(t.code,{children:"client_id"})," and ",(0,o.jsx)(t.code,{children:"client_secret"})," parameter. These values are provided when you configure the OAuth clients at Google or GitHub."]}),"\n",(0,o.jsx)(t.h2,{id:"enabling-oauth-on-a-public-share",children:"Enabling OAuth on a Public Share"}),"\n",(0,o.jsx)(t.p,{children:"With your public frontend configured to support OAuth, you can test this by creating a public share. There are new command line options to support this:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:'$ zrok share public --help\nShare a target resource publicly\n\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n -b, --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n --oauth-check-interval duration Maximum lifetime for OAuth authentication; reauthenticate after expiry (default 3h0m0s)\n --oauth-email-address-patterns stringArray Allow only these email domain globs to authenticate via OAuth\n --oauth-provider string Enable OAuth provider [google, github]\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-provider"})," flag enables OAuth for the share using the specified provider."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-email-address-patterns"})," flag accepts a single glob pattern that matches an authenticated email address that is allowed to access the share. Use this flag multiple times to allow different patterns."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-check-interval"})," flag specifies how frequently the authentication must be checked."]}),"\n",(0,o.jsx)(t.p,{children:"An example public share:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:"zrok share public --backend-mode web --oauth-provider github --oauth-email-address-patterns '*@zrok.io' ~/public\n"})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},4378:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_1-dbb289a694d0c99b50cb949654d818f8.png"},1809:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_2-bc9d4c3f25853d608870eb220d00e5ee.png"},680:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_3-7973d63cd117eaba72fbaeb4ff119a39.png"},2823:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_4-6fed398013c9e6c3a31e5721adac4a4c.png"},8998:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_1-e61ee7e8fa51bdc93feab84235a90673.png"},9677:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_2-60cf4edb52f453d605907c17400e0800.png"},3524:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_3-1b3db3f9057d8626d64c5466dbb05ec7.png"},7115:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_4-f720031df1d09f997a18842745e9ea0d.png"},1004:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_2-b94a6456ce9b13e053b4c07d8f233e84.png"},3269:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_3-edf62ea2b291b58093289d31c2dae58d.png"},6490:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_4-4bc7e07b06c8a9a3c1e8f766f6f1c5a6.png"},8403:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_5-7c375cf49d8e2e392ca12b584462ab59.png"},2792:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_6-9b0fe216a782ef378313650e99ea52a1.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/71c8a211.0259d6a9.js b/assets/js/71c8a211.bc7ae09e.js similarity index 99% rename from assets/js/71c8a211.0259d6a9.js rename to assets/js/71c8a211.bc7ae09e.js index d4cc9ea9..d3040e47 100644 --- a/assets/js/71c8a211.0259d6a9.js +++ b/assets/js/71c8a211.bc7ae09e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1421],{4999:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>l,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/agent/index","title":"Agent","description":"The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.","source":"@site/../docs/guides/agent/index.mdx","sourceDirName":"guides/agent","slug":"/guides/agent/","permalink":"/docs/guides/agent/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/index.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"Agent","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Windows","permalink":"/docs/guides/install/windows"},"next":{"title":"Linux Agent Service","permalink":"/docs/guides/agent/linux-service"}}');var a=s(4848),r=s(8453);const i={title:"Agent",sidebar_position:20},c=void 0,o={},d=[{value:"Tutorial",id:"tutorial",level:2},{value:"Running the Agent in the background",id:"running-the-agent-in-the-background",level:3},{value:"How the Agent Works",id:"how-the-agent-works",level:2},{value:"Centralized Management",id:"centralized-management",level:3},{value:"Agent Console",id:"agent-console",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.p,{children:["The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the ",(0,a.jsx)(n.code,{children:"zrok share"})," and ",(0,a.jsx)(n.code,{children:"zrok access"})," commands behave."]}),"\n",(0,a.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,a.jsx)(n.p,{children:"Run the Agent in the foreground."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent\n"})}),"\n",(0,a.jsx)(n.p,{children:"In another terminal, open the console."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent console\n"})}),"\n",(0,a.jsx)(n.p,{children:"You should see the Agent UI in your default web browser."}),"\n",(0,a.jsx)(n.p,{children:"Start sharing a public share with the Agent."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'token:"zje5x8p0k9pi" frontendEndpoints:"https://zje5x8p0k9pi.share.zrok.io"\n'})}),"\n",(0,a.jsx)(n.p,{children:"You will see the new public share in the Agent UI and you can access it at the public share URL."}),"\n",(0,a.jsx)(n.p,{children:"Reserve a private share for the Agent to share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'zrok reserve private 8080 --closed --unique-name "myshare"\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[ 1.883] INFO main.(*reserveCommand).run: your reserved share token is 'myshare'\n"})}),"\n",(0,a.jsx)(n.p,{children:"Start sharing the reserved share with the Agent."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'zrok share reserved "myshare"\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'[ 0.001] INFO main.(*shareReservedCommand).shareAgent: starting\ntoken:"myshare" backendMode:"proxy" shareMode:"private" target:"http://127.0.0.1:8080"\n'})}),"\n",(0,a.jsxs)(n.p,{children:["You will see the new reserved share in the Agent UI and you can access it by running ",(0,a.jsx)(n.code,{children:'zrok access "myshare"'})," on another device where you have enabled the same zrok account, since the share was reserved with closed permission mode."]}),"\n",(0,a.jsx)(n.p,{children:"Check the status of the Agent's shares and accesses."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent status\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" FRONTEND TOKEN TOKEN BIND ADDRESS\n0 accesses in agent\n\n TOKEN RESERVED SHARE MODE BACKEND MODE TARGET\n myshare true private tcpTunnel 127.0.0.1:8080\n1 share in agent\n"})}),"\n",(0,a.jsx)(n.h3,{id:"running-the-agent-in-the-background",children:"Running the Agent in the background"}),"\n",(0,a.jsx)(n.p,{children:"You can keep the Agent running reliably in the background by installing the Agent service in Windows or Linux."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Windows - ",(0,a.jsx)(n.a,{href:"/docs/guides/agent/windows-service/",children:"set up the Windows system service"})]}),"\n",(0,a.jsxs)(n.li,{children:["Linux - ",(0,a.jsxs)(n.a,{href:"/docs/guides/agent/linux-service",children:["install the Linux package ",(0,a.jsx)(n.code,{children:"zrok-agent"})]})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"how-the-agent-works",children:"How the Agent Works"}),"\n",(0,a.jsx)(n.h3,{id:"centralized-management",children:"Centralized Management"}),"\n",(0,a.jsxs)(n.p,{children:["Without the Agent running, each time you execute a ",(0,a.jsx)(n.code,{children:"zrok share"})," or ",(0,a.jsx)(n.code,{children:"zrok access"})," command, a separate process is created to handle that specific share or access."]}),"\n",(0,a.jsx)(n.p,{children:"When the Agent is running:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"All shares and accesses are managed by a single Agent process."}),"\n",(0,a.jsx)(n.li,{children:"The Agent provides a web UI for monitoring and managing your shares and accesses."}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.code,{children:"zrok share"})," and ",(0,a.jsx)(n.code,{children:"zrok access"})," commands delegate their operations to the running Agent."]}),"\n",(0,a.jsx)(n.li,{children:"You can stop and restart individual shares/accesses without terminating the Agent."}),"\n",(0,a.jsxs)(n.li,{children:["The Agent will remember and automatically restart your shares started with ",(0,a.jsx)(n.code,{children:"share reserved"}),", and any accesses started with ",(0,a.jsx)(n.code,{children:"access private"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["The Agent will not restart regular, ephemeral shares started with ",(0,a.jsx)(n.code,{children:"share private"})," or ",(0,a.jsx)(n.code,{children:"share public"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"agent-console",children:"Agent Console"}),"\n",(0,a.jsx)(n.p,{children:"The Agent provides a web-based console interface that can be accessed with:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent console\n"})}),"\n",(0,a.jsx)(n.p,{children:"This command opens your default web browser to the Agent UI, where you can:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"View the status of all your active shares and accesses"}),"\n",(0,a.jsx)(n.li,{children:"Create new shares and accesses using simple UI widgets"}),"\n",(0,a.jsx)(n.li,{children:"Stop or restart existing shares and accesses"}),"\n",(0,a.jsx)(n.li,{children:"Monitor traffic and connection statistics"}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var t=s(6540);const a={},r=t.createContext(a);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1421],{7417:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>l,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/agent/index","title":"Agent","description":"The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.","source":"@site/../docs/guides/agent/index.mdx","sourceDirName":"guides/agent","slug":"/guides/agent/","permalink":"/docs/guides/agent/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/agent/index.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"Agent","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Windows","permalink":"/docs/guides/install/windows"},"next":{"title":"Linux Agent Service","permalink":"/docs/guides/agent/linux-service"}}');var a=s(4848),r=s(8453);const i={title:"Agent",sidebar_position:20},c=void 0,o={},d=[{value:"Tutorial",id:"tutorial",level:2},{value:"Running the Agent in the background",id:"running-the-agent-in-the-background",level:3},{value:"How the Agent Works",id:"how-the-agent-works",level:2},{value:"Centralized Management",id:"centralized-management",level:3},{value:"Agent Console",id:"agent-console",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.p,{children:["The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the ",(0,a.jsx)(n.code,{children:"zrok share"})," and ",(0,a.jsx)(n.code,{children:"zrok access"})," commands behave."]}),"\n",(0,a.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,a.jsx)(n.p,{children:"Run the Agent in the foreground."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent\n"})}),"\n",(0,a.jsx)(n.p,{children:"In another terminal, open the console."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent console\n"})}),"\n",(0,a.jsx)(n.p,{children:"You should see the Agent UI in your default web browser."}),"\n",(0,a.jsx)(n.p,{children:"Start sharing a public share with the Agent."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'token:"zje5x8p0k9pi" frontendEndpoints:"https://zje5x8p0k9pi.share.zrok.io"\n'})}),"\n",(0,a.jsx)(n.p,{children:"You will see the new public share in the Agent UI and you can access it at the public share URL."}),"\n",(0,a.jsx)(n.p,{children:"Reserve a private share for the Agent to share."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'zrok reserve private 8080 --closed --unique-name "myshare"\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[ 1.883] INFO main.(*reserveCommand).run: your reserved share token is 'myshare'\n"})}),"\n",(0,a.jsx)(n.p,{children:"Start sharing the reserved share with the Agent."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'zrok share reserved "myshare"\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'[ 0.001] INFO main.(*shareReservedCommand).shareAgent: starting\ntoken:"myshare" backendMode:"proxy" shareMode:"private" target:"http://127.0.0.1:8080"\n'})}),"\n",(0,a.jsxs)(n.p,{children:["You will see the new reserved share in the Agent UI and you can access it by running ",(0,a.jsx)(n.code,{children:'zrok access "myshare"'})," on another device where you have enabled the same zrok account, since the share was reserved with closed permission mode."]}),"\n",(0,a.jsx)(n.p,{children:"Check the status of the Agent's shares and accesses."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent status\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:" FRONTEND TOKEN TOKEN BIND ADDRESS\n0 accesses in agent\n\n TOKEN RESERVED SHARE MODE BACKEND MODE TARGET\n myshare true private tcpTunnel 127.0.0.1:8080\n1 share in agent\n"})}),"\n",(0,a.jsx)(n.h3,{id:"running-the-agent-in-the-background",children:"Running the Agent in the background"}),"\n",(0,a.jsx)(n.p,{children:"You can keep the Agent running reliably in the background by installing the Agent service in Windows or Linux."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Windows - ",(0,a.jsx)(n.a,{href:"/docs/guides/agent/windows-service/",children:"set up the Windows system service"})]}),"\n",(0,a.jsxs)(n.li,{children:["Linux - ",(0,a.jsxs)(n.a,{href:"/docs/guides/agent/linux-service",children:["install the Linux package ",(0,a.jsx)(n.code,{children:"zrok-agent"})]})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"how-the-agent-works",children:"How the Agent Works"}),"\n",(0,a.jsx)(n.h3,{id:"centralized-management",children:"Centralized Management"}),"\n",(0,a.jsxs)(n.p,{children:["Without the Agent running, each time you execute a ",(0,a.jsx)(n.code,{children:"zrok share"})," or ",(0,a.jsx)(n.code,{children:"zrok access"})," command, a separate process is created to handle that specific share or access."]}),"\n",(0,a.jsx)(n.p,{children:"When the Agent is running:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"All shares and accesses are managed by a single Agent process."}),"\n",(0,a.jsx)(n.li,{children:"The Agent provides a web UI for monitoring and managing your shares and accesses."}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.code,{children:"zrok share"})," and ",(0,a.jsx)(n.code,{children:"zrok access"})," commands delegate their operations to the running Agent."]}),"\n",(0,a.jsx)(n.li,{children:"You can stop and restart individual shares/accesses without terminating the Agent."}),"\n",(0,a.jsxs)(n.li,{children:["The Agent will remember and automatically restart your shares started with ",(0,a.jsx)(n.code,{children:"share reserved"}),", and any accesses started with ",(0,a.jsx)(n.code,{children:"access private"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["The Agent will not restart regular, ephemeral shares started with ",(0,a.jsx)(n.code,{children:"share private"})," or ",(0,a.jsx)(n.code,{children:"share public"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"agent-console",children:"Agent Console"}),"\n",(0,a.jsx)(n.p,{children:"The Agent provides a web-based console interface that can be accessed with:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zrok agent console\n"})}),"\n",(0,a.jsx)(n.p,{children:"This command opens your default web browser to the Agent UI, where you can:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"View the status of all your active shares and accesses"}),"\n",(0,a.jsx)(n.li,{children:"Create new shares and accesses using simple UI widgets"}),"\n",(0,a.jsx)(n.li,{children:"Stop or restart existing shares and accesses"}),"\n",(0,a.jsx)(n.li,{children:"Monitor traffic and connection statistics"}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var t=s(6540);const a={},r=t.createContext(a);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7452427d.951c0809.js b/assets/js/7452427d.213d2c47.js similarity index 98% rename from assets/js/7452427d.951c0809.js rename to assets/js/7452427d.213d2c47.js index 41f23d17..cfe801a1 100644 --- a/assets/js/7452427d.951c0809.js +++ b/assets/js/7452427d.213d2c47.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9476],{4674:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","source":"@site/../docs/guides/self-hosting/personalized-frontend.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/personalized-frontend","permalink":"/docs/guides/self-hosting/personalized-frontend","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/personalized-frontend.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"title":"Personalized Frontend","sidebar_label":"Personalized Frontend","sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Organizations","permalink":"/docs/guides/self-hosting/organizations"},"next":{"title":"Docker","permalink":"/docs/guides/self-hosting/docker"}}');var s=n(4848),i=n(8453);const t={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:22},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,s.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,s.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,s.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,s.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,s.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". Both ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," are shares using the ",(0,s.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,s.jsx)(o.code,{children:"C"})," uses the ",(0,s.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,s.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,s.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"personalized-frontend-1",src:n(8396).A+"",width:"716",height:"357"})}),"\n",(0,s.jsxs)(o.p,{children:["We're using ",(0,s.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,s.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,s.jsxs)(o.p,{children:["Because we're using ",(0,s.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,s.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,s.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,s.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,s.jsx)(o.admonition,{type:"note",children:(0,s.jsxs)(o.p,{children:["When you use ",(0,s.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,s.jsx)(o.code,{children:"zrok share private"})," (or ",(0,s.jsx)(o.code,{children:"zrok reserve"}),"/",(0,s.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,s.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,s.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,s.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,s.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," as ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,s.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,s.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,s.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,s.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,s.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,s.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,s.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". The ",(0,s.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private <shareToken> [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,s.jsxs)(o.p,{children:["Notice the ",(0,s.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,s.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,s.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,s.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,s.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,s.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,s.jsx)(o.code,{children:"A"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"B"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,s.jsx)(o.code,{children:"zrok access private"})," with a ",(0,s.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,s.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", ",(0,s.jsx)(o.code,{children:"b.example.com"}),", and ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,s.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,s.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,s.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,s.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,s.jsxs)(o.p,{children:["If you create private shares using ",(0,s.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,s.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,s.jsx)(o.code,{children:"zrok share private"})," and the ",(0,s.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8396:(e,o,n)=>{n.d(o,{A:()=>r});const r=n.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var r=n(6540);const s={},i=r.createContext(s);function t(e){const o=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),r.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9476],{2285:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","source":"@site/../docs/guides/self-hosting/personalized-frontend.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/personalized-frontend","permalink":"/docs/guides/self-hosting/personalized-frontend","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/personalized-frontend.md","tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"title":"Personalized Frontend","sidebar_label":"Personalized Frontend","sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Organizations","permalink":"/docs/guides/self-hosting/organizations"},"next":{"title":"Docker","permalink":"/docs/guides/self-hosting/docker"}}');var s=n(4848),i=n(8453);const t={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:22},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,s.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,s.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,s.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,s.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,s.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". Both ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," are shares using the ",(0,s.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,s.jsx)(o.code,{children:"C"})," uses the ",(0,s.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,s.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,s.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"personalized-frontend-1",src:n(6015).A+"",width:"716",height:"357"})}),"\n",(0,s.jsxs)(o.p,{children:["We're using ",(0,s.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,s.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,s.jsxs)(o.p,{children:["Because we're using ",(0,s.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,s.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,s.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,s.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,s.jsx)(o.admonition,{type:"note",children:(0,s.jsxs)(o.p,{children:["When you use ",(0,s.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,s.jsx)(o.code,{children:"zrok share private"})," (or ",(0,s.jsx)(o.code,{children:"zrok reserve"}),"/",(0,s.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,s.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,s.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,s.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,s.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," as ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,s.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,s.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,s.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,s.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,s.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,s.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,s.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". The ",(0,s.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private <shareToken> [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,s.jsxs)(o.p,{children:["Notice the ",(0,s.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,s.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,s.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,s.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,s.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,s.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,s.jsx)(o.code,{children:"A"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"B"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,s.jsx)(o.code,{children:"zrok access private"})," with a ",(0,s.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,s.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", ",(0,s.jsx)(o.code,{children:"b.example.com"}),", and ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,s.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,s.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,s.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,s.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,s.jsxs)(o.p,{children:["If you create private shares using ",(0,s.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,s.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,s.jsx)(o.code,{children:"zrok share private"})," and the ",(0,s.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6015:(e,o,n)=>{n.d(o,{A:()=>r});const r=n.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var r=n(6540);const s={},i=r.createContext(s);function t(e){const o=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),r.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75b20590.c44edc33.js b/assets/js/75b20590.6e350206.js similarity index 98% rename from assets/js/75b20590.c44edc33.js rename to assets/js/75b20590.6e350206.js index eda9db8d..b27e5fd0 100644 --- a/assets/js/75b20590.c44edc33.js +++ b/assets/js/75b20590.6e350206.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9025],{6992:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","source":"@site/../docs/concepts/opensource.md","sourceDirName":"concepts","slug":"/concepts/opensource","permalink":"/docs/concepts/opensource","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/opensource.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"Sharing Websites and Files","permalink":"/docs/concepts/files"},"next":{"title":"Hosting","permalink":"/docs/concepts/hosting"}}');var r=t(4848),i=t(8453);const s={sidebar_position:100},c="Open Source",a={},p=[{value:"Built on OpenZiti",id:"built-on-openziti",level:2}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"open-source",children:"Open Source"})}),"\n",(0,r.jsxs)(o.p,{children:["It's important to the ",(0,r.jsx)(o.code,{children:"zrok"})," project that it remain free and open source software. The code is available on ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"GitHub"}),"\nfor the world to use, inspect, and build upon!"]}),"\n",(0,r.jsxs)(o.p,{children:["Check out the repository over on GitHub at ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"https://github.com/openziti/zrok"}),". If you find ",(0,r.jsx)(o.code,{children:"zrok"})," to be useful, and\nyou want to help spread the word of ",(0,r.jsx)(o.code,{children:"zrok"})," give the project a star. It really does help get the word out about the\nproject."]}),"\n",(0,r.jsxs)(o.p,{children:["The project also uses a very permissive license: Apache v2. We encourage people to fork the repo and use ",(0,r.jsx)(o.code,{children:"zrok"})," for your own purposes how you see fit or contribute back to the project."]}),"\n",(0,r.jsx)(o.h2,{id:"built-on-openziti",children:"Built on OpenZiti"}),"\n",(0,r.jsxs)(o.p,{children:["The power of ",(0,r.jsx)(o.code,{children:"zrok"})," really lies in ",(0,r.jsx)(o.code,{children:"private"})," sharing. It's increasingly clear that security needs to be a first-class\nmember of any organization. To enable ",(0,r.jsx)(o.code,{children:"private"})," sharing, ",(0,r.jsx)(o.code,{children:"zrok"})," was built on top of another excellent open source project named OpenZiti."]}),"\n",(0,r.jsxs)(o.p,{children:["OpenZiti is a secure overlay network focusing on bringing zero trust to applications. It is the ",(0,r.jsx)(o.strong,{children:"backbone"})," of ",(0,r.jsx)(o.code,{children:"zrok"}),".\nIn fact, ",(0,r.jsx)(o.code,{children:"zrok"})," proudly proclaims itself as an Ziti ",(0,r.jsx)(o.em,{children:"native"})," application."]}),"\n",(0,r.jsxs)(o.p,{children:["If you are interested in learning more about OpenZiti head over to ",(0,r.jsx)(o.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"the docs"}),", try the quickstart, and don't forget to star that project too. We couldn't build ",(0,r.jsx)(o.code,{children:"zrok"})," without OpenZiti!"]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>c});var n=t(6540);const r={},i=n.createContext(r);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9025],{6988:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","source":"@site/../docs/concepts/opensource.md","sourceDirName":"concepts","slug":"/concepts/opensource","permalink":"/docs/concepts/opensource","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/opensource.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"Sharing Websites and Files","permalink":"/docs/concepts/files"},"next":{"title":"Hosting","permalink":"/docs/concepts/hosting"}}');var r=t(4848),i=t(8453);const s={sidebar_position:100},c="Open Source",a={},p=[{value:"Built on OpenZiti",id:"built-on-openziti",level:2}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"open-source",children:"Open Source"})}),"\n",(0,r.jsxs)(o.p,{children:["It's important to the ",(0,r.jsx)(o.code,{children:"zrok"})," project that it remain free and open source software. The code is available on ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"GitHub"}),"\nfor the world to use, inspect, and build upon!"]}),"\n",(0,r.jsxs)(o.p,{children:["Check out the repository over on GitHub at ",(0,r.jsx)(o.a,{href:"https://github.com/openziti/zrok",children:"https://github.com/openziti/zrok"}),". If you find ",(0,r.jsx)(o.code,{children:"zrok"})," to be useful, and\nyou want to help spread the word of ",(0,r.jsx)(o.code,{children:"zrok"})," give the project a star. It really does help get the word out about the\nproject."]}),"\n",(0,r.jsxs)(o.p,{children:["The project also uses a very permissive license: Apache v2. We encourage people to fork the repo and use ",(0,r.jsx)(o.code,{children:"zrok"})," for your own purposes how you see fit or contribute back to the project."]}),"\n",(0,r.jsx)(o.h2,{id:"built-on-openziti",children:"Built on OpenZiti"}),"\n",(0,r.jsxs)(o.p,{children:["The power of ",(0,r.jsx)(o.code,{children:"zrok"})," really lies in ",(0,r.jsx)(o.code,{children:"private"})," sharing. It's increasingly clear that security needs to be a first-class\nmember of any organization. To enable ",(0,r.jsx)(o.code,{children:"private"})," sharing, ",(0,r.jsx)(o.code,{children:"zrok"})," was built on top of another excellent open source project named OpenZiti."]}),"\n",(0,r.jsxs)(o.p,{children:["OpenZiti is a secure overlay network focusing on bringing zero trust to applications. It is the ",(0,r.jsx)(o.strong,{children:"backbone"})," of ",(0,r.jsx)(o.code,{children:"zrok"}),".\nIn fact, ",(0,r.jsx)(o.code,{children:"zrok"})," proudly proclaims itself as an Ziti ",(0,r.jsx)(o.em,{children:"native"})," application."]}),"\n",(0,r.jsxs)(o.p,{children:["If you are interested in learning more about OpenZiti head over to ",(0,r.jsx)(o.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"the docs"}),", try the quickstart, and don't forget to star that project too. We couldn't build ",(0,r.jsx)(o.code,{children:"zrok"})," without OpenZiti!"]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>c});var n=t(6540);const r={},i=n.createContext(r);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d0a541a.bebc18c0.js b/assets/js/7d0a541a.60c67a50.js similarity index 98% rename from assets/js/7d0a541a.bebc18c0.js rename to assets/js/7d0a541a.60c67a50.js index 7793a808..37810f37 100644 --- a/assets/js/7d0a541a.bebc18c0.js +++ b/assets/js/7d0a541a.60c67a50.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4466],{2454:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","source":"@site/versioned_docs/version-0.4/concepts/index.md","sourceDirName":"concepts","slug":"/concepts/","permalink":"/docs/0.4/concepts/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/index.md","tags":[],"version":"0.4","sidebarPosition":25,"frontMatter":{"sidebar_title":"Core Features","sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/0.4/getting-started"},"next":{"title":"Private Shares","permalink":"/docs/0.4/concepts/sharing-private"}}');var o=s(4848),r=s(8453);const c={sidebar_title:"Core Features",sidebar_position:25},i="Concepts",a={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," was designed to make sharing local resources both secure and easy. In this section of the ",(0,o.jsx)(n.code,{children:"zrok"})," documentation, we'll tour through all of the most important features."]}),"\n",(0,o.jsxs)(n.p,{children:["Sharing with ",(0,o.jsx)(n.code,{children:"zrok"})," can be either ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:(0,o.jsx)(n.code,{children:"public"})})," or ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:(0,o.jsx)(n.code,{children:"private"})}),".\nNaturally, regular web-based resources can be shared but ",(0,o.jsx)(n.code,{children:"zrok"})," also includes support for sharing raw ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"TCP"})," and ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"UDP"})," network connections, and also includes a ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/files",children:"website and file sharing"})," feature."]}),"\n",(0,o.jsxs)(n.p,{children:["Learn about ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/hosting",children:"hosting here"}),", including instructions on how to ",(0,o.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:["install your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function c(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4466],{6698:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","source":"@site/versioned_docs/version-0.4/concepts/index.md","sourceDirName":"concepts","slug":"/concepts/","permalink":"/docs/0.4/concepts/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/index.md","tags":[],"version":"0.4","sidebarPosition":25,"frontMatter":{"sidebar_title":"Core Features","sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/0.4/getting-started"},"next":{"title":"Private Shares","permalink":"/docs/0.4/concepts/sharing-private"}}');var o=s(4848),r=s(8453);const c={sidebar_title:"Core Features",sidebar_position:25},i="Concepts",a={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," was designed to make sharing local resources both secure and easy. In this section of the ",(0,o.jsx)(n.code,{children:"zrok"})," documentation, we'll tour through all of the most important features."]}),"\n",(0,o.jsxs)(n.p,{children:["Sharing with ",(0,o.jsx)(n.code,{children:"zrok"})," can be either ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:(0,o.jsx)(n.code,{children:"public"})})," or ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:(0,o.jsx)(n.code,{children:"private"})}),".\nNaturally, regular web-based resources can be shared but ",(0,o.jsx)(n.code,{children:"zrok"})," also includes support for sharing raw ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"TCP"})," and ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"UDP"})," network connections, and also includes a ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/files",children:"website and file sharing"})," feature."]}),"\n",(0,o.jsxs)(n.p,{children:["Learn about ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.a,{href:"/docs/0.4/concepts/hosting",children:"hosting here"}),", including instructions on how to ",(0,o.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:["install your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function c(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7dd0c8d0.b0b509b1.js b/assets/js/7dd0c8d0.b0b509b1.js deleted file mode 100644 index dd908888..00000000 --- a/assets/js/7dd0c8d0.b0b509b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[471],{1796:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/kubernetes","permalink":"/docs/0.4/guides/self-hosting/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx","tags":[],"version":"0.4","sidebarPosition":55,"frontMatter":{"title":"Self-host a zrok Instance in Kubernetes","sidebar_label":"Kubernetes","sidebar_position":55},"sidebar":"tutorialSidebar","previous":{"title":"Docker","permalink":"/docs/0.4/guides/self-hosting/docker"},"next":{"title":"Metrics and Limits","permalink":"/docs/0.4/category/metrics-and-limits"}}');var i=s(4848),r=s(8453);const o={title:"Self-host a zrok Instance in Kubernetes",sidebar_label:"Kubernetes",sidebar_position:55},a=void 0,c={},l=[];function d(e){const t={a:"a",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Helm chart for zrok is available from the main OpenZiti charts repo."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://github.com/openziti/helm-charts/tree/main/charts/zrok#readme",children:"Link to README in GitHub"})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7dd0c8d0.bff7c1df.js b/assets/js/7dd0c8d0.bff7c1df.js new file mode 100644 index 00000000..4ba62814 --- /dev/null +++ b/assets/js/7dd0c8d0.bff7c1df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[471],{845:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"guides/self-hosting/kubernetes","title":"Self-host a zrok Instance in Kubernetes","description":"The Helm chart for zrok is available from the main OpenZiti charts repo.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/kubernetes","permalink":"/docs/0.4/guides/self-hosting/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx","tags":[],"version":"0.4","sidebarPosition":55,"frontMatter":{"title":"Self-host a zrok Instance in Kubernetes","sidebar_label":"Kubernetes","sidebar_position":55},"sidebar":"tutorialSidebar","previous":{"title":"Docker","permalink":"/docs/0.4/guides/self-hosting/docker"},"next":{"title":"Metrics and Limits","permalink":"/docs/0.4/category/metrics-and-limits"}}');var i=s(4848),r=s(8453);const o={title:"Self-host a zrok Instance in Kubernetes",sidebar_label:"Kubernetes",sidebar_position:55},a=void 0,c={},l=[];function d(e){const t={a:"a",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Helm chart for zrok is available from the main OpenZiti charts repo."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"https://github.com/openziti/helm-charts/tree/main/charts/zrok#readme",children:"Link to README in GitHub"})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f5ec875.bb718edf.js b/assets/js/7f5ec875.930ba73d.js similarity index 99% rename from assets/js/7f5ec875.bb718edf.js rename to assets/js/7f5ec875.930ba73d.js index cc430a82..7d2da7c6 100644 --- a/assets/js/7f5ec875.bb718edf.js +++ b/assets/js/7f5ec875.930ba73d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1939],{7433:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","source":"@site/../docs/guides/self-hosting/organizations.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/organizations","permalink":"/docs/guides/self-hosting/organizations","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/organizations.md","tags":[],"version":"current","sidebarPosition":21,"frontMatter":{"sidebar_position":21,"sidebar_label":"Organizations"},"sidebar":"tutorialSidebar","previous":{"title":"Interstitial Pages","permalink":"/docs/guides/self-hosting/interstitial-page"},"next":{"title":"Personalized Frontend","permalink":"/docs/guides/self-hosting/personalized-frontend"}}');var o=i(4848),r=i(8453);const t={sidebar_position:21,sidebar_label:"Organizations"},s="Organizations",d={},c=[{value:"Configuring an Organization",id:"configuring-an-organization",level:2},{value:"Create an Organization",id:"create-an-organization",level:3},{value:"List Organizations",id:"list-organizations",level:3},{value:"Add a Member to an Organization",id:"add-a-member-to-an-organization",level:3},{value:"List Members of an Organization",id:"list-members-of-an-organization",level:3},{value:"Removing Organizations and Members",id:"removing-organizations-and-members",level:3},{value:"End-user Organization Administrator Commands",id:"end-user-organization-administrator-commands",level:2},{value:"End-user Organization Commands",id:"end-user-organization-commands",level:2}];function l(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"organizations",children:"Organizations"})}),"\n",(0,o.jsxs)(e.p,{children:["zrok (starting with ",(0,o.jsx)(e.code,{children:"v0.4.45"}),') includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of ',(0,o.jsx)(e.code,{children:"v0.4.45"}),' organization admins are able to retrieve an "overview" (',(0,o.jsx)(e.code,{children:"zrok overview"}),") from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account."]}),"\n",(0,o.jsxs)(e.p,{children:["Future zrok releases will include additional organization features, including ",(0,o.jsx)(e.code,{children:"--closed"})," permission sharing functions."]}),"\n",(0,o.jsx)(e.h2,{id:"configuring-an-organization",children:"Configuring an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The API endpoints used to manage organizations and their members require a site-level ",(0,o.jsx)(e.code,{children:"ZROK_ADMIN_TOKEN"})," to access. See the ",(0,o.jsx)(e.a,{href:"/docs/guides/self-hosting/linux/#configure-the-controller",children:"self-hosting guide"})," for details on configuring admin tokens."]}),"\n",(0,o.jsx)(e.h3,{id:"create-an-organization",children:"Create an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin create organization"})," command is used to create organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization --help\nCreate a new organization\n\nUsage:\n zrok admin create organization [flags]\n\nAliases:\n organization, org\n\nFlags:\n -d, --description string Organization description\n -h, --help help for organization\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsxs)(e.p,{children:["Use the ",(0,o.jsx)(e.code,{children:"-d"})," flag to add a description that shows up in end-user membership listings."]}),"\n",(0,o.jsx)(e.p,{children:"We'll create an example organization:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization -d \"documentation\"\n[ 0.006] INFO main.(*adminCreateOrganizationCommand).run: created new organization with token 'gK1XRvthq7ci'\n"})}),"\n",(0,o.jsx)(e.h3,{id:"list-organizations",children:"List Organizations"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin list organizations"})," command to list our organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list organizations\n\n ORGANIZATION TOKEN DESCRIPTION \n gK1XRvthq7ci documentation \n"})}),"\n",(0,o.jsx)(e.h3,{id:"add-a-member-to-an-organization",children:"Add a Member to an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to add members to organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member \nError: accepts 2 arg(s), received 0\nUsage:\n zrok admin create org-member <organizationToken> <accountEmail> [flags]\n\nAliases:\n org-member, member\n\nFlags:\n --admin Make the new account an admin of the organization\n -h, --help help for org-member\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsx)(e.p,{children:"Like this:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member gK1XRvthq7ci michael.quigley@netfoundry.io\n[ 0.006] INFO main.(*adminCreateOrgMemberCommand).run: added 'michael.quigley@netfoundry.io' to organization 'gK1XRvthq7ci\n"})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"--admin"})," flag can be added to the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to mark the member as an administrator of the organization."]}),"\n",(0,o.jsx)(e.h3,{id:"list-members-of-an-organization",children:"List Members of an Organization"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list org-members gK1XRvthq7ci\n\n ACCOUNT EMAIL ADMIN? \n michael.quigley@netfoundry.io false \n"})}),"\n",(0,o.jsx)(e.h3,{id:"removing-organizations-and-members",children:"Removing Organizations and Members"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin delete org-member"})," and ",(0,o.jsx)(e.code,{children:"zrok admin delete organization"})," commands are available to clean up organizations and their membership lists."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-administrator-commands",children:"End-user Organization Administrator Commands"}),"\n",(0,o.jsxs)(e.p,{children:["When a zrok account is added to an organization as an administrator it allows them to use the ",(0,o.jsx)(e.code,{children:"zrok organization admin"})," commands, which include:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:'$ zrok organization admin\nOrganization admin commands\n\nUsage:\n zrok organization admin [command]\n\nAvailable Commands:\n list List the members of an organization\n overview Retrieve account overview for organization member account\n\nFlags:\n -h, --help help for admin\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\nUse "zrok organization admin [command] --help" for more information about a command.\n'})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin list"})," command is used to list the members of an organization."]}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin overview"})," command is used to retrieve an overview of an organization member account. This is functionally equivalent to what the ",(0,o.jsx)(e.code,{children:"zrok overview"})," command does, but it allows an organization admin to retrieve the overview for another zrok account."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-commands",children:"End-user Organization Commands"}),"\n",(0,o.jsxs)(e.p,{children:["All zrok accounts can use the ",(0,o.jsx)(e.code,{children:"zrok organization memberships"})," command to list the organizations they're a member of:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok organization memberships\n\n ORGANIZATION TOKEN DESCRIPTION ADMIN? \n gK1XRvthq7ci documentation false \n\n"})})]})}function m(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(l,{...n})}):l(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>t,x:()=>s});var a=i(6540);const o={},r=a.createContext(o);function t(n){const e=a.useContext(r);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:t(n.components),a.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1939],{1911:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","source":"@site/../docs/guides/self-hosting/organizations.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/organizations","permalink":"/docs/guides/self-hosting/organizations","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/organizations.md","tags":[],"version":"current","sidebarPosition":21,"frontMatter":{"sidebar_position":21,"sidebar_label":"Organizations"},"sidebar":"tutorialSidebar","previous":{"title":"Interstitial Pages","permalink":"/docs/guides/self-hosting/interstitial-page"},"next":{"title":"Personalized Frontend","permalink":"/docs/guides/self-hosting/personalized-frontend"}}');var o=i(4848),r=i(8453);const t={sidebar_position:21,sidebar_label:"Organizations"},s="Organizations",d={},c=[{value:"Configuring an Organization",id:"configuring-an-organization",level:2},{value:"Create an Organization",id:"create-an-organization",level:3},{value:"List Organizations",id:"list-organizations",level:3},{value:"Add a Member to an Organization",id:"add-a-member-to-an-organization",level:3},{value:"List Members of an Organization",id:"list-members-of-an-organization",level:3},{value:"Removing Organizations and Members",id:"removing-organizations-and-members",level:3},{value:"End-user Organization Administrator Commands",id:"end-user-organization-administrator-commands",level:2},{value:"End-user Organization Commands",id:"end-user-organization-commands",level:2}];function l(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"organizations",children:"Organizations"})}),"\n",(0,o.jsxs)(e.p,{children:["zrok (starting with ",(0,o.jsx)(e.code,{children:"v0.4.45"}),') includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of ',(0,o.jsx)(e.code,{children:"v0.4.45"}),' organization admins are able to retrieve an "overview" (',(0,o.jsx)(e.code,{children:"zrok overview"}),") from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account."]}),"\n",(0,o.jsxs)(e.p,{children:["Future zrok releases will include additional organization features, including ",(0,o.jsx)(e.code,{children:"--closed"})," permission sharing functions."]}),"\n",(0,o.jsx)(e.h2,{id:"configuring-an-organization",children:"Configuring an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The API endpoints used to manage organizations and their members require a site-level ",(0,o.jsx)(e.code,{children:"ZROK_ADMIN_TOKEN"})," to access. See the ",(0,o.jsx)(e.a,{href:"/docs/guides/self-hosting/linux/#configure-the-controller",children:"self-hosting guide"})," for details on configuring admin tokens."]}),"\n",(0,o.jsx)(e.h3,{id:"create-an-organization",children:"Create an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin create organization"})," command is used to create organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization --help\nCreate a new organization\n\nUsage:\n zrok admin create organization [flags]\n\nAliases:\n organization, org\n\nFlags:\n -d, --description string Organization description\n -h, --help help for organization\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsxs)(e.p,{children:["Use the ",(0,o.jsx)(e.code,{children:"-d"})," flag to add a description that shows up in end-user membership listings."]}),"\n",(0,o.jsx)(e.p,{children:"We'll create an example organization:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization -d \"documentation\"\n[ 0.006] INFO main.(*adminCreateOrganizationCommand).run: created new organization with token 'gK1XRvthq7ci'\n"})}),"\n",(0,o.jsx)(e.h3,{id:"list-organizations",children:"List Organizations"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin list organizations"})," command to list our organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list organizations\n\n ORGANIZATION TOKEN DESCRIPTION \n gK1XRvthq7ci documentation \n"})}),"\n",(0,o.jsx)(e.h3,{id:"add-a-member-to-an-organization",children:"Add a Member to an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to add members to organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member \nError: accepts 2 arg(s), received 0\nUsage:\n zrok admin create org-member <organizationToken> <accountEmail> [flags]\n\nAliases:\n org-member, member\n\nFlags:\n --admin Make the new account an admin of the organization\n -h, --help help for org-member\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsx)(e.p,{children:"Like this:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member gK1XRvthq7ci michael.quigley@netfoundry.io\n[ 0.006] INFO main.(*adminCreateOrgMemberCommand).run: added 'michael.quigley@netfoundry.io' to organization 'gK1XRvthq7ci\n"})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"--admin"})," flag can be added to the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to mark the member as an administrator of the organization."]}),"\n",(0,o.jsx)(e.h3,{id:"list-members-of-an-organization",children:"List Members of an Organization"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list org-members gK1XRvthq7ci\n\n ACCOUNT EMAIL ADMIN? \n michael.quigley@netfoundry.io false \n"})}),"\n",(0,o.jsx)(e.h3,{id:"removing-organizations-and-members",children:"Removing Organizations and Members"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin delete org-member"})," and ",(0,o.jsx)(e.code,{children:"zrok admin delete organization"})," commands are available to clean up organizations and their membership lists."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-administrator-commands",children:"End-user Organization Administrator Commands"}),"\n",(0,o.jsxs)(e.p,{children:["When a zrok account is added to an organization as an administrator it allows them to use the ",(0,o.jsx)(e.code,{children:"zrok organization admin"})," commands, which include:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:'$ zrok organization admin\nOrganization admin commands\n\nUsage:\n zrok organization admin [command]\n\nAvailable Commands:\n list List the members of an organization\n overview Retrieve account overview for organization member account\n\nFlags:\n -h, --help help for admin\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\nUse "zrok organization admin [command] --help" for more information about a command.\n'})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin list"})," command is used to list the members of an organization."]}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin overview"})," command is used to retrieve an overview of an organization member account. This is functionally equivalent to what the ",(0,o.jsx)(e.code,{children:"zrok overview"})," command does, but it allows an organization admin to retrieve the overview for another zrok account."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-commands",children:"End-user Organization Commands"}),"\n",(0,o.jsxs)(e.p,{children:["All zrok accounts can use the ",(0,o.jsx)(e.code,{children:"zrok organization memberships"})," command to list the organizations they're a member of:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok organization memberships\n\n ORGANIZATION TOKEN DESCRIPTION ADMIN? \n gK1XRvthq7ci documentation false \n\n"})})]})}function m(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(l,{...n})}):l(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>t,x:()=>s});var a=i(6540);const o={},r=a.createContext(o);function t(n){const e=a.useContext(r);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:t(n.components),a.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/8158.900dc11d.js b/assets/js/8158.18bfb97f.js similarity index 82% rename from assets/js/8158.900dc11d.js rename to assets/js/8158.18bfb97f.js index afc8d7aa..c5d156c5 100644 --- a/assets/js/8158.900dc11d.js +++ b/assets/js/8158.18bfb97f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8158],{8158:(e,s,a)=>{a.r(s),a.d(s,{DocSearchModal:()=>c.a1});var c=a(3219)}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8158],{8158:(e,s,a)=>{a.r(s),a.d(s,{DocSearchModal:()=>c.a1});var c=a(5600)}}]); \ No newline at end of file diff --git a/assets/js/81fb89b8.5431648f.js b/assets/js/81fb89b8.5431648f.js new file mode 100644 index 00000000..c168b58a --- /dev/null +++ b/assets/js/81fb89b8.5431648f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8301],{4605:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/personalized-frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"title":"Personalized Frontend","sidebar_label":"Personalized Frontend","sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Organizations","permalink":"/docs/0.4/guides/self-hosting/organizations"},"next":{"title":"Docker","permalink":"/docs/0.4/guides/self-hosting/docker"}}');var s=n(4848),i=n(8453);const t={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:22},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,s.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,s.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,s.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,s.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,s.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". Both ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," are shares using the ",(0,s.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,s.jsx)(o.code,{children:"C"})," uses the ",(0,s.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,s.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,s.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"personalized-frontend-1",src:n(5300).A+"",width:"716",height:"357"})}),"\n",(0,s.jsxs)(o.p,{children:["We're using ",(0,s.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,s.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,s.jsxs)(o.p,{children:["Because we're using ",(0,s.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,s.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,s.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,s.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,s.jsx)(o.admonition,{type:"note",children:(0,s.jsxs)(o.p,{children:["When you use ",(0,s.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,s.jsx)(o.code,{children:"zrok share private"})," (or ",(0,s.jsx)(o.code,{children:"zrok reserve"}),"/",(0,s.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,s.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,s.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,s.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,s.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," as ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,s.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,s.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,s.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,s.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,s.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,s.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,s.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". The ",(0,s.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private <shareToken> [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,s.jsxs)(o.p,{children:["Notice the ",(0,s.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,s.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,s.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,s.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,s.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,s.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,s.jsx)(o.code,{children:"A"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"B"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,s.jsx)(o.code,{children:"zrok access private"})," with a ",(0,s.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,s.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", ",(0,s.jsx)(o.code,{children:"b.example.com"}),", and ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,s.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,s.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,s.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,s.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,s.jsxs)(o.p,{children:["If you create private shares using ",(0,s.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,s.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,s.jsx)(o.code,{children:"zrok share private"})," and the ",(0,s.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},5300:(e,o,n)=>{n.d(o,{A:()=>r});const r=n.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var r=n(6540);const s={},i=r.createContext(s);function t(e){const o=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),r.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81fb89b8.8e503f5a.js b/assets/js/81fb89b8.8e503f5a.js deleted file mode 100644 index 6dd50edd..00000000 --- a/assets/js/81fb89b8.8e503f5a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8301],{599:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"guides/self-hosting/personalized-frontend","title":"Personalized Frontend","description":"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/personalized-frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md","tags":[],"version":"0.4","sidebarPosition":22,"frontMatter":{"title":"Personalized Frontend","sidebar_label":"Personalized Frontend","sidebar_position":22},"sidebar":"tutorialSidebar","previous":{"title":"Organizations","permalink":"/docs/0.4/guides/self-hosting/organizations"},"next":{"title":"Docker","permalink":"/docs/0.4/guides/self-hosting/docker"}}');var s=n(4848),i=n(8453);const t={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:22},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,s.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,s.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,s.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,s.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,s.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". Both ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," are shares using the ",(0,s.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,s.jsx)(o.code,{children:"C"})," uses the ",(0,s.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,s.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,s.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"personalized-frontend-1",src:n(5300).A+"",width:"716",height:"357"})}),"\n",(0,s.jsxs)(o.p,{children:["We're using ",(0,s.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,s.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,s.jsxs)(o.p,{children:["Because we're using ",(0,s.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,s.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,s.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,s.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,s.jsx)(o.admonition,{type:"note",children:(0,s.jsxs)(o.p,{children:["When you use ",(0,s.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,s.jsx)(o.code,{children:"zrok share private"})," (or ",(0,s.jsx)(o.code,{children:"zrok reserve"}),"/",(0,s.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,s.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,s.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,s.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,s.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"})," as ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,s.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,s.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,s.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,s.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,s.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,s.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,s.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,s.jsx)(o.code,{children:"A"}),", ",(0,s.jsx)(o.code,{children:"B"}),", and ",(0,s.jsx)(o.code,{children:"C"}),". The ",(0,s.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private <shareToken> [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,s.jsxs)(o.p,{children:["Notice the ",(0,s.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,s.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,s.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,s.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,s.jsx)(o.code,{children:"a.example.com"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,s.jsx)(o.code,{children:"A"})," and ",(0,s.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,s.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,s.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,s.jsx)(o.code,{children:"A"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"B"})," to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,s.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,s.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,s.jsx)(o.code,{children:"zrok access private"})," with a ",(0,s.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,s.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,s.jsx)(o.code,{children:"a.example.com"}),", ",(0,s.jsx)(o.code,{children:"b.example.com"}),", and ",(0,s.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,s.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,s.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,s.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,s.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,s.jsxs)(o.p,{children:["If you create private shares using ",(0,s.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,s.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,s.jsx)(o.code,{children:"zrok share private"})," and the ",(0,s.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},5300:(e,o,n)=>{n.d(o,{A:()=>r});const r=n.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},8453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var r=n(6540);const s={},i=r.createContext(s);function t(e){const o=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),r.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8585.e93703b4.js b/assets/js/8585.e93703b4.js deleted file mode 100644 index 194c34c4..00000000 --- a/assets/js/8585.e93703b4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8585],{7293:(e,n,t)=>{t.d(n,{A:()=>B});var s=t(6540),i=t(4848);function a(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=s.Children.toArray(e),t=n.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=n.filter((e=>e!==t)),l=t?.props.children;return{mdxAdmonitionTitle:l,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??n;return{...e,...a&&{title:a},children:t}}var l=t(8215),o=t(1312),r=t(7559);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",m="admonitionContent_BuS1";function h(e){let{type:n,className:t,children:s}=e;return(0,i.jsx)("div",{className:(0,l.A)(r.G.common.admonition,r.G.common.admonitionType(n),c,t),children:s})}function x(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function f(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:m,children:n}):null}function p(e){const{type:n,icon:t,title:s,children:a,className:l}=e;return(0,i.jsxs)(h,{type:n,className:l,children:[s||t?(0,i.jsx)(x,{title:s,icon:t}):null,(0,i.jsx)(f,{children:a})]})}function v(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,i.jsx)(v,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,i.jsx)(p,{...j,...e,className:(0,l.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const A={icon:(0,i.jsx)(b,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function N(e){return(0,i.jsx)(p,{...A,...e,className:(0,l.A)("alert alert--success",e.className),children:e.children})}function C(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const L={icon:(0,i.jsx)(C,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function _(e){return(0,i.jsx)(p,{...L,...e,className:(0,l.A)("alert alert--info",e.className),children:e.children})}function y(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const T={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const H={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(o.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const M={...{note:g,tip:N,info:_,warning:function(e){return(0,i.jsx)(p,{...T,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(p,{...w,...e,className:(0,l.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(g,{title:"secondary",...e}),important:e=>(0,i.jsx)(_,{title:"important",...e}),success:e=>(0,i.jsx)(N,{title:"success",...e}),caution:function(e){return(0,i.jsx)(p,{...H,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})}}};function B(e){const n=a(e),t=(s=n.type,M[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),M.info));var s;return(0,i.jsx)(t,{...n})}},1243:(e,n,t)=>{t.d(n,{A:()=>v});t(6540);var s=t(8215),i=t(7559),a=t(6972),l=t(9169),o=t(8774),r=t(1312),c=t(6025),d=t(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(o.A,{"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const x={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function f(e){let{children:n,href:t,isLast:s}=e;const i="breadcrumbs__link";return s?(0,d.jsx)("span",{className:i,itemProp:"name",children:n}):t?(0,d.jsx)(o.A,{className:i,href:t,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:i,children:n})}function p(e){let{children:n,active:t,index:i,addMicrodata:a}=e;return(0,d.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(i+1)})]})}function v(){const e=(0,a.OF)(),n=(0,l.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(i.G.docs.docBreadcrumbs,x.breadcrumbsContainer),"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map(((n,t)=>{const s=t===e.length-1,i="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(p,{active:s,index:t,addMicrodata:!!i,children:(0,d.jsx)(f,{href:i,isLast:s,children:n.label})},t)}))]})}):null}},5587:(e,n,t)=>{t.r(n),t.d(n,{default:()=>Ne});var s=t(6540),i=t(9024),a=t(9532),l=t(4848);const o=s.createContext(null);function r(e){let{children:n,content:t}=e;const i=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(t);return(0,l.jsx)(o.Provider,{value:i,children:n})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new a.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(i.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(8215),m=t(4581),h=t(6929);function x(){const{metadata:e}=c();return(0,l.jsx)(h.A,{previous:e.previous,next:e.next})}var f=t(1878),p=t(4267),v=t(7559),j=t(1312),g=t(8774);const b={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function A(e){let{permalink:n,label:t,count:s,description:i}=e;return(0,l.jsxs)(g.A,{href:n,title:i,className:(0,u.A)(b.tag,s?b.tagWithCount:b.tagRegular),children:[t,s&&(0,l.jsx)("span",{children:s})]})}const N={tags:"tags_jXut",tag:"tag_QGVx"};function C(e){let{tags:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(j.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.A)(N.tags,"padding--none","margin-left--sm"),children:n.map((e=>(0,l.jsx)("li",{className:N.tag,children:(0,l.jsx)(A,{...e})},e.permalink)))})]})}const L={iconEdit:"iconEdit_Z9Sw"};function _(e){let{className:n,...t}=e;return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(L.iconEdit,n),"aria-hidden":"true",...t,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function y(e){let{editUrl:n}=e;return(0,l.jsxs)(g.A,{to:n,className:v.G.common.editThisPage,children:[(0,l.jsx)(_,{}),(0,l.jsx)(j.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var T=t(4586);function k(e){void 0===e&&(e={});const{i18n:{currentLocale:n}}=(0,T.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:n}}=(0,T.A)();return n[e].calendar}();return new Intl.DateTimeFormat(n,{calendar:t,...e})}function w(e){let{lastUpdatedAt:n}=e;const t=new Date(n),s=k({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,l.jsx)(j.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function H(e){let{lastUpdatedBy:n}=e;return(0,l.jsx)(j.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:n})},children:" by {user}"})}function M(e){let{lastUpdatedAt:n,lastUpdatedBy:t}=e;return(0,l.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,l.jsx)(j.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:n?(0,l.jsx)(w,{lastUpdatedAt:n}):"",byUser:t?(0,l.jsx)(H,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const B={lastUpdated:"lastUpdated_JAkA"};function U(e){let{className:n,editUrl:t,lastUpdatedAt:s,lastUpdatedBy:i}=e;return(0,l.jsxs)("div",{className:(0,u.A)("row",n),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(y,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.A)("col",B.lastUpdated),children:(s||i)&&(0,l.jsx)(M,{lastUpdatedAt:s,lastUpdatedBy:i})})]})}function E(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:i}=e,a=i.length>0,o=!!(n||t||s);return a||o?(0,l.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[a&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",v.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(C,{tags:i})})}),o&&(0,l.jsx)(U,{className:(0,u.A)("margin-top--sm",v.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var I=t(1422),V=t(6342);function z(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):s.push(i)})),s}function S(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=S({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(e)?[{...e,children:n}]:n}))}function R(e){const n=e.getBoundingClientRect();return n.top===n.bottom?R(e.parentNode):n}function D(e,n){let{anchorTopOffset:t}=n;const s=e.find((e=>R(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(R(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function G(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:n}}=(0,V.p)();return(0,s.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function O(e){const n=(0,s.useRef)(void 0),t=G();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let i=n;i<=t;i+=1)s.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:a,maxHeadingLevel:l}),r=D(o,{anchorTopOffset:t.current}),c=e.find((e=>r&&r.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===c)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}function F(e){let{toc:n,className:t,linkClassName:s,isChild:i}=e;return n.length?(0,l.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,l.jsxs)("li",{children:[(0,l.jsx)(g.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,l.jsx)(F,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const P=s.memo(F);function q(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r,...c}=e;const d=(0,V.p)(),u=o??d.tableOfContents.minHeadingLevel,m=r??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,s.useMemo)((()=>S({toc:z(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:u,maxHeadingLevel:m});return O((0,s.useMemo)((()=>{if(i&&a)return{linkClassName:i,linkActiveClassName:a,minHeadingLevel:u,maxHeadingLevel:m}}),[i,a,u,m])),(0,l.jsx)(P,{toc:h,className:t,linkClassName:i,...c})}const W={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function $(e){let{collapsed:n,...t}=e;return(0,l.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",W.tocCollapsibleButton,!n&&W.tocCollapsibleButtonExpanded,t.className),children:(0,l.jsx)(j.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const Z={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function J(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:i}=e;const{collapsed:a,toggleCollapsed:o}=(0,I.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(Z.tocCollapsible,!a&&Z.tocCollapsibleExpanded,t),children:[(0,l.jsx)($,{collapsed:a,onClick:o}),(0,l.jsx)(I.N,{lazy:!0,className:Z.tocCollapsibleContent,collapsed:a,children:(0,l.jsx)(q,{toc:n,minHeadingLevel:s,maxHeadingLevel:i})})]})}const Y={tocMobile:"tocMobile_ITEo"};function Q(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(J,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,Y.tocMobile)})}const X={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},K="table-of-contents__link toc-highlight",ee="table-of-contents__link--active";function ne(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,u.A)(X.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(q,{...t,linkClassName:K,linkActiveClassName:ee})})}function te(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(ne,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var se=t(1107),ie=t(8453),ae=t(1759);function le(e){let{children:n}=e;return(0,l.jsx)(ie.x,{components:ae.A,children:n})}function oe(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(se.A,{as:"h1",children:t})}),(0,l.jsx)(le,{children:n})]})}var re=t(1243),ce=t(5260);function de(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function ue(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function me(){return(0,l.jsx)(ce.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function he(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function xe(){return(0,l.jsx)(j.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var fe=t(7293);function pe(e){let{className:n}=e;return(0,l.jsx)(fe.A,{type:"caution",title:(0,l.jsx)(he,{}),className:(0,u.A)(n,v.G.common.draftBanner),children:(0,l.jsx)(xe,{})})}function ve(e){let{className:n}=e;return(0,l.jsx)(fe.A,{type:"caution",title:(0,l.jsx)(de,{}),className:(0,u.A)(n,v.G.common.unlistedBanner),children:(0,l.jsx)(ue,{})})}function je(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(me,{}),(0,l.jsx)(ve,{...e})]})}function ge(e){let{metadata:n}=e;const{unlisted:t,frontMatter:s}=n;return(0,l.jsxs)(l.Fragment,{children:[(t||s.unlisted)&&(0,l.jsx)(je,{}),s.draft&&(0,l.jsx)(pe,{})]})}const be={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ae(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,i=!s&&n.length>0;return{hidden:s,mobile:i?(0,l.jsx)(Q,{}):void 0,desktop:!i||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(te,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&be.docItemCol),children:[(0,l.jsx)(ge,{metadata:s}),(0,l.jsx)(f.A,{}),(0,l.jsxs)("div",{className:be.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(re.A,{}),(0,l.jsx)(p.A,{}),t.mobile,(0,l.jsx)(oe,{children:n}),(0,l.jsx)(E,{})]}),(0,l.jsx)(x,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function Ne(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(i.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(Ae,{children:(0,l.jsx)(t,{})})]})})}},6929:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(1312),i=t(8215),a=t(8774),l=t(4848);function o(e){const{permalink:n,title:t,subLabel:s,isNext:o}=e;return(0,l.jsxs)(a.A,{className:(0,i.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[s&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,l.jsx)("div",{className:"pagination-nav__label",children:t})]})}function r(e){const{previous:n,next:t}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(o,{...n,subLabel:(0,l.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,l.jsx)(o,{...t,subLabel:(0,l.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},4267:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(8215),i=t(1312),a=t(7559),l=t(3025),o=t(4848);function r(e){let{className:n}=e;const t=(0,l.r)();return t.badge?(0,o.jsx)("span",{className:(0,s.A)(n,a.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(i.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},1878:(e,n,t)=>{t.d(n,{A:()=>p});t(6540);var s=t(8215),i=t(4586),a=t(8774),l=t(1312),o=t(4070),r=t(7559),c=t(3886),d=t(3025),u=t(4848);const m={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const n=m[e.versionMetadata.banner];return(0,u.jsx)(n,{...e})}function x(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(a.A,{to:t,onClick:s,children:(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function f(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:a}}=(0,i.A)(),{pluginId:l}=(0,o.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(l),{latestDocSuggestion:m,latestVersionSuggestion:f}=(0,o.HW)(l),p=m??(v=f).docs.find((e=>e.id===v.mainDocId));var v;return(0,u.jsxs)("div",{className:(0,s.A)(n,r.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:a,versionMetadata:t})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(x,{versionLabel:f.label,to:p.path,onClick:()=>d(f.name)})})]})}function p(e){let{className:n}=e;const t=(0,d.r)();return t.banner?(0,u.jsx)(f,{className:n,versionMetadata:t}):null}},4971:(e,n,t)=>{t.d(n,{A:()=>v});var s=t(6540),i=t(8215),a=t(5066),l=t(3427),o=t(2303),r=t(1422);const c={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var d=t(4848);function u(e){return!!e&&("SUMMARY"===e.tagName||u(e.parentElement))}function m(e,n){return!!e&&(e===n||m(e.parentElement,n))}function h(e){let{summary:n,children:t,...i}=e;(0,l.A)().collectAnchor(i.id);const h=(0,o.A)(),x=(0,s.useRef)(null),{collapsed:f,setCollapsed:p}=(0,r.u)({initialState:!i.open}),[v,j]=(0,s.useState)(i.open),g=s.isValidElement(n)?n:(0,d.jsx)("summary",{children:n??"Details"});return(0,d.jsxs)("details",{...i,ref:x,open:v,"data-collapsed":f,className:(0,a.A)(c.details,h&&c.isBrowser,i.className),onMouseDown:e=>{u(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;u(n)&&m(n,x.current)&&(e.preventDefault(),f?(p(!1),j(!0)):p(!0))},children:[g,(0,d.jsx)(r.N,{lazy:!1,collapsed:f,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{p(e),j(!e)},children:(0,d.jsx)("div",{className:c.collapsibleContent,children:t})})]})}const x={details:"details_b_Ee"},f="alert alert--info";function p(e){let{...n}=e;return(0,d.jsx)(h,{...n,className:(0,i.A)(f,x.details,n.className)})}function v(e){const n=s.Children.toArray(e.children),t=n.find((e=>s.isValidElement(e)&&"summary"===e.type)),i=(0,d.jsx)(d.Fragment,{children:n.filter((e=>e!==t))});return(0,d.jsx)(p,{...e,summary:t,children:i})}},7667:(e,n,t)=>{t.d(n,{A:()=>j});var s=t(6540),i=t(5260),a=t(1432),l=t(4848);function o(e){return(0,l.jsx)("code",{...e})}var r=t(8774);var c=t(4971),d=t(1107);function u(e){return(0,l.jsx)(d.A,{...e})}var m=t(8215);const h="containsTaskList_mC6p";function x(e){if(void 0!==e)return(0,m.A)(e,e?.includes("contains-task-list")&&h)}var f=t(3427);const p="img_ev3q";var v=t(7293);const j={Head:i.A,details:c.A,Details:c.A,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,l.jsx)(o,{...e}):(0,l.jsx)(a.A,{...e})},a:function(e){return(0,l.jsx)(r.A,{...e})},pre:function(e){return(0,l.jsx)(l.Fragment,{children:e.children})},ul:function(e){return(0,l.jsx)("ul",{...e,className:x(e.className)})},li:function(e){return(0,f.A)().collectAnchor(e.id),(0,l.jsx)("li",{...e})},img:function(e){return(0,l.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(n=e.className,(0,m.A)(n,p))});var n},h1:e=>(0,l.jsx)(u,{as:"h1",...e}),h2:e=>(0,l.jsx)(u,{as:"h2",...e}),h3:e=>(0,l.jsx)(u,{as:"h3",...e}),h4:e=>(0,l.jsx)(u,{as:"h4",...e}),h5:e=>(0,l.jsx)(u,{as:"h5",...e}),h6:e=>(0,l.jsx)(u,{as:"h6",...e}),admonition:v.A,mermaid:()=>null}},53:(e,n,t)=>{function s(e){var n,t,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e))for(n=0;n<e.length;n++)e[n]&&(t=s(e[n]))&&(i&&(i+=" "),i+=t);else for(n in e)e[n]&&(i&&(i+=" "),i+=n);return i}t.d(n,{A:()=>i});const i=function(){for(var e,n,t=0,i="";t<arguments.length;)(e=arguments[t++])&&(n=s(e))&&(i&&(i+=" "),i+=n);return i}}}]); \ No newline at end of file diff --git a/assets/js/8a9ffb5d.77502c26.js b/assets/js/8a9ffb5d.77502c26.js deleted file mode 100644 index ead45a98..00000000 --- a/assets/js/8a9ffb5d.77502c26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1864],{8477:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>c});var r=s(4848),i=s(8453),o=s(8151),t=s(595),a=s(1342);const c=[];function d(e){return(0,r.jsx)(o.F,{children:(0,r.jsxs)("div",{className:a.A.downloadContainer,children:[(0,r.jsx)(t.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,r.jsx)(t.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,r.jsx)(t.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d()}},2158:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"Your Secure Internet Sharing Perimeter","source":"@site/versioned_docs/version-0.4/getting-started.mdx","sourceDirName":".","slug":"/getting-started","permalink":"/docs/0.4/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/getting-started.mdx","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"title":"Getting Started","sidebar_label":"Getting Started","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"Concepts","permalink":"/docs/0.4/concepts/"}}');var i=s(4848),o=s(8453),t=(s(8151),s(595),s(1342),s(8477));const a={title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:10},c=void 0,d={},l=[{value:"Your Secure Internet Sharing Perimeter",id:"your-secure-internet-sharing-perimeter",level:2},{value:"Your First Share",id:"your-first-share",level:3},{value:"Share Backend Modes",id:"share-backend-modes",level:2},{value:"Open Source",id:"open-source",level:2},{value:"Ziti native",id:"ziti-native",level:3},{value:"What's it for?",id:"whats-it-for",level:2},{value:"Installing the zrok Command",id:"installing-the-zrok-command",level:2},...t.RM,{value:"Enabling Your zrok Environment",id:"enabling-your-zrok-environment",level:2},{value:"Sharing",id:"sharing",level:2},{value:"Ephemeral by Default",id:"ephemeral-by-default",level:3},{value:"Public Shares and Frontends",id:"public-shares-and-frontends",level:3},{value:"Private Shares",id:"private-shares",level:3},{value:"Proxy Backend Mode",id:"proxy-backend-mode",level:3},{value:"Web Backend Mode",id:"web-backend-mode",level:3},{value:"Reserved Shares",id:"reserved-shares",level:3},{value:"Concepts Review",id:"concepts-review",level:2},{value:"Instance and Account",id:"instance-and-account",level:3},{value:"Environment",id:"environment",level:3},{value:"Shares",id:"shares",level:3},{value:"Reserved Shares",id:"reserved-shares-1",level:3},{value:"Self-Hosting an Instance",id:"self-hosting-an-instance",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components},{Card:r,CardBody:a,CardFooter:c,CardHeader:d,Column:l,Columns:h}=n;return r||m("Card",!0),a||m("CardBody",!0),c||m("CardFooter",!0),d||m("CardHeader",!0),l||m("Column",!0),h||m("Columns",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"your-secure-internet-sharing-perimeter",children:"Your Secure Internet Sharing Perimeter"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," (",(0,i.jsx)(n.em,{children:"/zi\u02d0\u0279\u0252k/ ZEE-rock"}),") is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files.\nThere's a hardened zrok-as-a-service offering available at ",(0,i.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," with a generous free tier."]}),"\n",(0,i.jsx)(n.h3,{id:"your-first-share",children:"Your First Share"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Get an account token"}),"\n"]}),"\n",(0,i.jsxs)(h,{className:"text--center getting-started-cards",style:{marginLeft:1},children:[(0,i.jsx)(l,{style:{paddingBottom:20},children:(0,i.jsxs)(r,{shadow:"tl",children:[(0,i.jsx)(d,{children:(0,i.jsx)("h3",{children:"Hosted zrok"})}),(0,i.jsx)(a,{children:(0,i.jsx)(n.p,{children:"Use NetFoundry's public zrok instance."})}),(0,i.jsx)(c,{children:(0,i.jsx)("a",{href:"https://myzrok.io/",children:(0,i.jsx)("button",{className:"button button--secondary button--block",children:"Get an Account"})})})]})}),(0,i.jsx)(l,{style:{paddingBottom:20},children:(0,i.jsxs)(r,{shadow:"tl",children:[(0,i.jsx)(d,{children:(0,i.jsx)("h3",{children:"Self-Hosted zrok"})}),(0,i.jsx)(a,{children:(0,i.jsx)(n.p,{children:"Run a zrok instance on Linux, Docker, or Kubernetes."})}),(0,i.jsx)(c,{children:(0,i.jsx)("a",{href:"/docs/category/self-hosting/",children:(0,i.jsx)("button",{className:"button button--secondary button--block",children:"Guides"})})})]})})]}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"#installing-the-zrok-command",children:"Download the zrok binary"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Enable zrok for your ",(0,i.jsx)(n.a,{href:"#enabling-your-zrok-environment",children:"user environment"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Share ",(0,i.jsx)(n.code,{children:"http://localhost:8080"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Visit the public URL displayed in your terminal"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok share public",src:s(439).A+"",width:"1115",height:"628"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"share-backend-modes",children:"Share Backend Modes"}),"\n",(0,i.jsx)(n.p,{children:"zrok shares can be public or private, with different options for backend modes, including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"Public shares"})," for ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/http",children:"web services"})," or ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/files",children:"files"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"Private shares for web services or files"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"TCP Tunnels"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"UDP Tunnels"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/guides/drives",children:"File Drives"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/guides/vpn/",children:"VPN"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"open-source",children:"Open Source"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is licensed under Apache 2.0."]}),"\n",(0,i.jsxs)(n.p,{children:["Check ",(0,i.jsx)(n.a,{href:"https://github.com/orgs/openziti/projects/16",children:"the roadmap"})," if you're thinking about the future. We would love to hear your ideas for ",(0,i.jsx)(n.code,{children:"zrok"}),"!"]}),"\n",(0,i.jsxs)(n.p,{children:["The best ways to engage are ",(0,i.jsx)(n.a,{href:"https://openziti.discourse.group/",children:"Discourse"})," for questions and ",(0,i.jsx)(n.a,{href:"https://github.com/openziti/zrok/issues",children:"GitHub Issues"})," for documenting problems."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/opensource",children:"Read more about zrok open source"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"ziti-native",children:"Ziti native"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is a ",(0,i.jsx)(n.em,{children:"Ziti Native Application"}),", built on the ",(0,i.jsx)(n.a,{href:"https://openziti.io",children:"OpenZiti"})," platform, and supported by the OpenZiti community and NetFoundry team."]}),"\n",(0,i.jsx)(n.h2,{id:"whats-it-for",children:"What's it for?"}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"zrok"})," to share a running service, like a web server or a network socket, or to share a directory of static files."]}),"\n",(0,i.jsxs)(n.p,{children:["If ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"sharing publicly"}),", you can reserve a subdomain, enable authentication options, or both. Public shares proxy HTTPS to your service or files."]}),"\n",(0,i.jsxs)(n.p,{children:["If ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"sharing privately"}),", only users with the share token can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services."]}),"\n",(0,i.jsx)(n.h2,{id:"installing-the-zrok-command",children:"Installing the zrok Command"}),"\n",(0,i.jsx)(t.Ay,{}),"\n",(0,i.jsx)(n.h2,{id:"enabling-your-zrok-environment",children:"Enabling Your zrok Environment"}),"\n",(0,i.jsxs)(n.p,{children:["After you have ",(0,i.jsx)(n.a,{href:"#your-first-share",children:"an account"}),", you can enable your ",(0,i.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,i.jsxs)(n.p,{children:["A zrok environment usually refers to an enabled device where shares and accesses can be created, .e.g., ",(0,i.jsx)(n.code,{children:"~/.zrok"})," on a Unix machine. It can be a specific user's environment or a system-wide agent's environment owned by the administrator."]}),"\n",(0,i.jsxs)(n.p,{children:["When your ",(0,i.jsx)(n.code,{children:"zrok"})," account was created, the service generated a ",(0,i.jsx)(n.em,{children:"secret token"})," that identifies and authenticates in a single step. Protect your secret token as if it were a password, or an important account number; it's a ",(0,i.jsx)(n.em,{children:"secret"}),", protect it."]}),"\n",(0,i.jsxs)(n.p,{children:["When we left off you had downloaded, extracted, and configured your ",(0,i.jsx)(n.code,{children:"zrok"})," environment. In order to use that environment with your account, you'll need to ",(0,i.jsx)(n.code,{children:"enable"})," it. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the ",(0,i.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,i.jsxs)(n.p,{children:["From the web console, click on your email address in the upper right corner of the header. That drop down menu contains an ",(0,i.jsx)(n.code,{children:"Enable Your Environment"})," link. Click that link and a modal dialog will be shown like this:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Modal Dialog",src:s(5803).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["This dialog box shows you the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command that you can use to enable any shell to work with your ",(0,i.jsx)(n.code,{children:"zrok"})," account with a single command."]}),"\n",(0,i.jsx)(n.p,{children:"Let's copy that command and paste it into your shell:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok enable klFEoIi0QAg7 \n\u28fb contacting the zrok service...\n"})}),"\n",(0,i.jsx)(n.p,{children:"After a few seconds, the message will change and indicate that the enable operation succeeded:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok enable klFEoIi0QAg7 \n\u28fb the zrok environment was successfully enabled...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, if we run a ",(0,i.jsx)(n.code,{children:"zrok status"})," command, you will see the details of your environment:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"zrok status\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://api.staging.zrok.io env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token <<SET>>\n Ziti Identity <<SET>>\n"})}),"\n",(0,i.jsx)(n.p,{children:"Excellent... our environment is now fully enabled."}),"\n",(0,i.jsxs)(n.p,{children:["If we return to the ",(0,i.jsx)(n.em,{children:"web console"}),", we'll now see the new environment reflected in the explorer view:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"New Environment in Web UI",src:s(6054).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["In my case, the environment is named ",(0,i.jsx)(n.code,{children:"michael@ziti-lx"}),", which is the username of my shell and the hostname of the system the shell is running on."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Should you want to use a non-default name for your environment, you can pass the ",(0,i.jsx)(n.code,{children:"-d"})," option to the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command. See ",(0,i.jsx)(n.code,{children:"zrok enable --help"})," for details."]})}),"\n",(0,i.jsxs)(n.p,{children:["If you click on the environment node in the explorer in the ",(0,i.jsx)(n.em,{children:"web console"}),", the details panel shown at the bottom of the page will change:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Empty Environment",src:s(3826).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["The explorer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the explorer, click the ",(0,i.jsx)(n.img,{alt:"Zoom to Fit",src:s(6413).A+"",width:"30",height:"25"})," ",(0,i.jsx)(n.em,{children:"zoom to fit"})," icon in the lower right corner of the explorer."]}),"\n",(0,i.jsxs)(n.p,{children:["If we click on the ",(0,i.jsx)(n.code,{children:"Detail"})," tab for our environment, we'll see something like:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Environment Detail",src:s(4387).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["With your ",(0,i.jsx)(n.code,{children:"zrok"})," account you can ",(0,i.jsx)(n.code,{children:"zrok enable"})," multiple environments. This will allow you to run ",(0,i.jsx)(n.code,{children:"zrok share"})," in one environment, and ",(0,i.jsx)(n.code,{children:"zrok access"})," in other environments."]})}),"\n",(0,i.jsx)(n.p,{children:"Your environment is fully ready to go. Now we can move on to the fun stuff..."}),"\n",(0,i.jsx)(n.h2,{id:"sharing",children:"Sharing"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is designed to make sharing resources as effortless as possible, while providing a high degree of security and control."]}),"\n",(0,i.jsx)(n.h3,{id:"ephemeral-by-default",children:"Ephemeral by Default"}),"\n",(0,i.jsxs)(n.p,{children:["Shared resources are ",(0,i.jsx)(n.em,{children:"ephemeral"})," by default; as soon as you terminate the ",(0,i.jsx)(n.code,{children:"zrok share"})," command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created."]}),"\n",(0,i.jsx)(n.h3,{id:"public-shares-and-frontends",children:"Public Shares and Frontends"}),"\n",(0,i.jsxs)(n.p,{children:["Resources that are shared ",(0,i.jsx)(n.em,{children:"publicly"})," are exposed to any users on the internet who have access to the ",(0,i.jsx)(n.code,{children:"zrok"}),' instance\'s "frontend".']}),"\n",(0,i.jsx)(n.p,{children:"A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources."}),"\n",(0,i.jsxs)(n.p,{children:["For example, I might create a public share using the ",(0,i.jsx)(n.code,{children:"zrok share public"})," command, which results in my ",(0,i.jsx)(n.code,{children:"zrok"})," instance exposing a URL like ",(0,i.jsx)(n.code,{children:"https://2ptgbr8tlfvk.share.zrok.io"})," to access my resources."]}),"\n",(0,i.jsxs)(n.p,{children:['In this case, my share was given the "share token" of ',(0,i.jsx)(n.code,{children:"2ptgbr8tlfvk"}),". That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["Here is the ",(0,i.jsx)(n.code,{children:"--help"})," output from ",(0,i.jsx)(n.code,{children:"zrok share public"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"zrok share public\n"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'Error: accepts 1 arg(s), received 0\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\n[ERROR]: an error occurred (accepts 1 arg(s), received 0)\n'})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"<target>"})," defines the path to the local resource that you intend to share. The form of ",(0,i.jsx)(n.code,{children:"<target>"})," depends on the ",(0,i.jsx)(n.code,{children:"--backend-mode"})," that you're using."]}),(0,i.jsxs)(n.p,{children:["In the case of ",(0,i.jsx)(n.code,{children:"--backend-mode proxy"}),", ",(0,i.jsx)(n.code,{children:"<target>"})," should be a URL to an HTTP endpoint."]}),(0,i.jsxs)(n.p,{children:["In the case of ",(0,i.jsx)(n.code,{children:"--backend-mode web"}),", ",(0,i.jsx)(n.code,{children:"<target>"}),' is the path to a file on disk that serves as the "root" of the file tree to be shared.']})]}),"\n",(0,i.jsx)(n.p,{children:"If we return to the web console, we see our share in the explorer:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Web Console Share",src:s(8517).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["If we click on our new share in the explorer, we can see the share details:\n",(0,i.jsx)(n.img,{alt:"Share Details",src:s(8404).A+"",width:"1791",height:"1369"})]}),"\n",(0,i.jsxs)(n.p,{children:["If we click on the ",(0,i.jsx)(n.em,{children:"frontend endpoint"})," a new browser tab opens and we see the content of our share:\n",(0,i.jsx)(n.img,{alt:"Share Frontend",src:s(9467).A+"",width:"1669",height:"1033"})]}),"\n",(0,i.jsx)(n.p,{children:"If we click on the environment in the explorer, we're shown all of the shares for that environment (including our new share), along with a spark line that shows the activity:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Environment Spark Line",src:s(590).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["And as soon as I terminate the ",(0,i.jsx)(n.code,{children:"zrok share"})," client, the resources are removed from the ",(0,i.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,i.jsx)(n.p,{children:"If we try to reload the frontend endpoint in our web browser, we'll see:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Not Found",src:s(4532).A+"",width:"1556",height:"1229"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"More about public shares"})}),"\n",(0,i.jsx)(n.h3,{id:"private-shares",children:"Private Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," also provides a powerful ",(0,i.jsx)(n.em,{children:"private"})," sharing model. If I execute the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok share private http://localhost:8080\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok"})," service will respond with the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"access your share with: zrok access private wvszln4dyz9q\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Rather than allowing access to your service through a public frontend, a ",(0,i.jsx)(n.em,{children:"private"})," share is only exposed to the underlying OpenZiti network, and can only be accessed using the ",(0,i.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok access private wvszln4dyz9q"})," command can be run by any ",(0,i.jsx)(n.code,{children:"zrok"})," user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"More about private shares"})}),"\n",(0,i.jsx)(n.h3,{id:"proxy-backend-mode",children:"Proxy Backend Mode"}),"\n",(0,i.jsxs)(n.p,{children:["Without specifying a ",(0,i.jsx)(n.em,{children:"backend mode"}),", the ",(0,i.jsx)(n.code,{children:"zrok share"})," command will assume that you're trying to share a ",(0,i.jsx)(n.code,{children:"proxy"})," resource. A ",(0,i.jsx)(n.code,{children:"proxy"})," resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on ",(0,i.jsx)(n.code,{children:"localhost"}),", or only listening on a private LAN segment behind a firewall."]}),"\n",(0,i.jsxs)(n.p,{children:["For these services a ",(0,i.jsx)(n.code,{children:"proxy"})," share will allow those endpoints to be reached, either ",(0,i.jsx)(n.em,{children:"publicly"})," or ",(0,i.jsx)(n.em,{children:"privately"})," through the ",(0,i.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,i.jsx)(n.h3,{id:"web-backend-mode",children:"Web Backend Mode"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok share"})," command accepts a ",(0,i.jsx)(n.code,{children:"--backend-mode"})," option. Besides ",(0,i.jsx)(n.code,{children:"proxy"}),", the current ",(0,i.jsx)(n.code,{children:"v0.3"})," release (as of this writing) also supports a ",(0,i.jsx)(n.code,{children:"web"})," mode. The ",(0,i.jsx)(n.code,{children:"web"})," mode allows you to specify a local folder on your filesystem, and instantly turns your ",(0,i.jsx)(n.code,{children:"zrok"})," client into a web server, exposing your web content either ",(0,i.jsx)(n.em,{children:"publicly"})," or ",(0,i.jsx)(n.em,{children:"privately"})," without having to a configure a web server."]}),"\n",(0,i.jsx)(n.h3,{id:"reserved-shares",children:"Reserved Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," shares are ",(0,i.jsx)(n.em,{children:"ephemeral"}),' unless you specifically create a "reserved" share.']}),"\n",(0,i.jsxs)(n.p,{children:["A reserved share can be re-used multiple times; it will survive termination of the ",(0,i.jsx)(n.code,{children:"zrok share"})," command, allowing for longer-lasting semi-permanent access to shared resources."]}),"\n",(0,i.jsx)(n.p,{children:"The first step is to create the reserved share:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok reserve public --backend-mode web v0.3_getting_started\n[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'\n[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io\n"})}),"\n",(0,i.jsxs)(n.p,{children:["I'm asking the ",(0,i.jsx)(n.code,{children:"zrok"})," service to reserve a share with a ",(0,i.jsx)(n.code,{children:"web"})," backend mode, pointing at my local ",(0,i.jsx)(n.code,{children:"docs"})," folder."]}),"\n",(0,i.jsxs)(n.p,{children:["You'll want to remember the share token (",(0,i.jsx)(n.code,{children:"mltwsinym1s2"})," in this case), and the frontend endpoint URL. If this were a ",(0,i.jsx)(n.em,{children:"private"})," reserved share, there would not be a frontend URL."]}),"\n",(0,i.jsx)(n.p,{children:"If we do nothing else, and then point a web browser at the frontend endpoint, we get:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Not Found",src:s(5151).A+"",width:"1556",height:"1229"})}),"\n",(0,i.jsxs)(n.p,{children:["This is the ",(0,i.jsx)(n.code,{children:"404"})," error message returned by the ",(0,i.jsx)(n.code,{children:"zrok"})," frontend. We're getting this because we haven't yet started up a ",(0,i.jsx)(n.code,{children:"zrok share"})," for the service. Let's do that:"]}),"\n",(0,i.jsx)(n.p,{children:"This command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok share reserved mltwsinym1s2\n"})}),"\n",(0,i.jsx)(n.p,{children:"...results in a new share backend starting up and connecting to the existing reserved share:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok share reserved",src:s(1248).A+"",width:"951",height:"706"})}),"\n",(0,i.jsxs)(n.p,{children:["And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the ",(0,i.jsx)(n.code,{children:"docs"})," directory:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok docs share",src:s(9467).A+"",width:"1669",height:"1033"})}),"\n",(0,i.jsxs)(n.p,{children:["With the reserved share, we're free to stop and restart the ",(0,i.jsx)(n.code,{children:"zrok share reserved"})," command as many times as we want, without losing the token for our share."]}),"\n",(0,i.jsxs)(n.p,{children:["When we're done with the reserved share, we can ",(0,i.jsx)(n.em,{children:"release"})," it using this command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok release mltwsinym1s2\n[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"More about reserved shares"})}),"\n",(0,i.jsx)(n.h2,{id:"concepts-review",children:"Concepts Review"}),"\n",(0,i.jsxs)(n.p,{children:["In summary, ",(0,i.jsx)(n.code,{children:"zrok"})," lets you easily and securely share resources with both general internet users (through ",(0,i.jsx)(n.em,{children:"public"})," sharing) and also with other ",(0,i.jsx)(n.code,{children:"zrok"})," users (through ",(0,i.jsx)(n.em,{children:"private"})," sharing)."]}),"\n",(0,i.jsxs)(n.p,{children:["Here's a quick review of the ",(0,i.jsx)(n.code,{children:"zrok"})," mental model and the vocabulary."]}),"\n",(0,i.jsx)(n.h3,{id:"instance-and-account",children:"Instance and Account"}),"\n",(0,i.jsxs)(n.p,{children:["You create an ",(0,i.jsx)(n.em,{children:"account"})," with a ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"}),". Your account is identified by a username and a password, which you use to log into the ",(0,i.jsx)(n.em,{children:"web console"}),". Your account also has a ",(0,i.jsx)(n.em,{children:"secret token"}),", which you will use to authenticate from the ",(0,i.jsx)(n.code,{children:"zrok"})," command-line to interact with the ",(0,i.jsx)(n.em,{children:"instance"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You create a new ",(0,i.jsx)(n.em,{children:"account"})," with NetFoundry's ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"})," by subscribing in ",(0,i.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," or in a self-hosted ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"})," by running ",(0,i.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/self-service-invite",children:["the ",(0,i.jsx)(n.code,{children:"zrok invite"})," command"]})," or the ",(0,i.jsx)(n.code,{children:"zrok admin create account"})," command."]}),"\n",(0,i.jsx)(n.h3,{id:"environment",children:"Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Using your ",(0,i.jsx)(n.em,{children:"secret token"})," you use the ",(0,i.jsx)(n.code,{children:"zrok"})," command-line interface to create an ",(0,i.jsx)(n.em,{children:"environment"}),". An ",(0,i.jsx)(n.em,{children:"environment"})," corresponds to a single command-line user on a specific ",(0,i.jsx)(n.em,{children:"host system"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You create a new ",(0,i.jsx)(n.em,{children:"environment"})," by using the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command."]}),"\n",(0,i.jsx)(n.h3,{id:"shares",children:"Shares"}),"\n",(0,i.jsxs)(n.p,{children:["Once you've enabled an ",(0,i.jsx)(n.em,{children:"environment"}),", you then create one or more ",(0,i.jsx)(n.em,{children:"shares"}),". Shares have either a ",(0,i.jsx)(n.em,{children:"public"})," or ",(0,i.jsx)(n.em,{children:"private"})," ",(0,i.jsx)(n.em,{children:"sharing mode"}),". ",(0,i.jsx)(n.em,{children:"Shares"})," share a specific type of resource using a ",(0,i.jsx)(n.em,{children:"backend mode"}),". As of this writing ",(0,i.jsx)(n.code,{children:"zrok"})," supports a ",(0,i.jsx)(n.code,{children:"proxy"})," ",(0,i.jsx)(n.em,{children:"backend mode"})," to share local HTTP resources as a ",(0,i.jsx)(n.em,{children:"reverse proxy"}),". ",(0,i.jsx)(n.code,{children:"zrok"})," also supports a ",(0,i.jsx)(n.code,{children:"web"})," ",(0,i.jsx)(n.em,{children:"backend mode"})," to share local file and HTML resources by enabling a basic HTTP server."]}),"\n",(0,i.jsxs)(n.p,{children:["Every ",(0,i.jsx)(n.em,{children:"share"})," is identified by a ",(0,i.jsx)(n.em,{children:"share token"}),". ",(0,i.jsx)(n.em,{children:"Public shares"})," can be accessed through either a ",(0,i.jsx)(n.em,{children:"frontend"})," instance offered through the ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"}),", or through the ",(0,i.jsx)(n.code,{children:"zrok access"})," command. ",(0,i.jsx)(n.em,{children:"Private shares"})," can only be accessed through the ",(0,i.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,i.jsxs)(n.p,{children:["You use the ",(0,i.jsx)(n.code,{children:"zrok share"})," command to create and enable ",(0,i.jsx)(n.em,{children:"ephemeral shares"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"reserved-shares-1",children:"Reserved Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," supports creating ",(0,i.jsx)(n.em,{children:"shares"})," that have a consistent ",(0,i.jsx)(n.em,{children:"share token"})," that survives restarts of the ",(0,i.jsx)(n.code,{children:"zrok share"})," command. These are considered ",(0,i.jsx)(n.em,{children:"non-ephemeral"}),", and is callled a ",(0,i.jsx)(n.em,{children:"reserved share"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You use the ",(0,i.jsx)(n.code,{children:"zrok reserve"})," command to create ",(0,i.jsx)(n.em,{children:"reserved shares"}),". Reserved shares last until you use the ",(0,i.jsx)(n.code,{children:"zrok release"})," command to delete them."]}),"\n",(0,i.jsx)(n.h2,{id:"self-hosting-an-instance",children:"Self-Hosting an Instance"}),"\n",(0,i.jsxs)(n.p,{children:["Interested in self-hosting your own ",(0,i.jsx)(n.code,{children:"zrok"})," instance? See the ",(0,i.jsx)(n.a,{href:"/docs/category/self-hosting/",children:"self-hosting guides"}),"!"]}),"\n",(0,i.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Learn about ",(0,i.jsx)(n.a,{href:"https://openziti.io/",children:"OpenZiti"})]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8151:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>t});var r=s(6540),i=s(4848);const o=(0,r.createContext)([]),t=()=>(0,r.useContext)(o),a=e=>{let{children:n}=e;const[s,t]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),t(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,i.jsx)(o.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>c});s(6540);var r=s(8151),i=s(1342),o=s(5293),t=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},c=e=>{let{osName:n,osLogo:s,infoText:c,guideLink:d}=e;const{colorMode:l}=(0,o.G)(),h=(0,r.d)();console.log("Assets in DownloadCard:",h);const u=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=h.filter((e=>e.name.includes(u)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,t.jsxs)("div",{className:i.A.downloadCard,children:[(0,t.jsx)("div",{className:i.A.imgContainer,children:(0,t.jsx)("img",{src:s,alt:`${n} logo`})}),(0,t.jsx)("h3",{children:n}),m.length>0&&(0,t.jsx)("ul",{children:m.map(((e,n)=>(0,t.jsx)("li",{className:i.A.downloadButtons,children:(0,t.jsx)("a",{href:e.url,className:i.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,t.jsxs)("div",{className:i.A.cardFooter,children:[(0,t.jsx)("p",{children:c}),(0,t.jsx)("a",{href:d,children:"GUIDE"}),(0,t.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},5803:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_enable_modal-45da63a6907e930daaa4c798272ce5fa.png"},4532:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_not_found-fa3415937c341eb10e1eb98c9b063583.png"},5151:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_reserved_not_found-2519707e5cc3e635b7a6feb381c1d040.png"},439:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_public-322dc971477d3a0b97b42478ea023dd7.png"},1248:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_reserved-6bce67775ce2c41abb0ef13ee1fad972.png"},590:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_environment_spark-925c0709ed7a42f0a708ab0523cdeb5f.png"},8517:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_explorer_share-11236f68819da60014d5444e7429c189.png"},8404:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_detail-efeaa472d5e5c225a160f6d5647086b3.png"},9467:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_frontend-d7c0d6495493c00b94ae237339f2dc2d.png"},4387:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_empty_environment_detail-153c921ade86f924079947b0f734e3ff.png"},3826:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_empty_shares-048c08c18477bcabb9fa8c1b58537012.png"},6054:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_new_environment-414d8e8fc25b09f257cb40ba47d6acbb.png"},6413:(e,n,s)=>{s.d(n,{A:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAZCAIAAACpVwlNAAAEr2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjUiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMzAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249Ijk2LzEiCiAgIHRpZmY6WVJlc29sdXRpb249Ijk2LzEiCiAgIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI1IgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgUGhvdG8gMi4wLjMiCiAgICAgIHN0RXZ0OndoZW49IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pq+HLHgAAAGBaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHP7UwemBQixYtJKyVRg8Q27RQyoJqYQZZbfTmI/BxuVcJaRu0FQqiNr0W9RfUNmgdBEURRNtaF7UpuZ2rghF5hjnzzW/OOcycAWs4rWT0piHIZPNaKOh3LkaWnPYXLHThwIclqujq7PxkmIb2eS/RYrces1bjuH+tbTWuK2BpER5XVC0vPCU8s55XTd4R7lZS0VXhM2G3JhcUvjP1WJVfTU5W+dtkLRwKgLVT2Jn8xbFfrKS0jLC8HFcmXVBq9zFf0h7PLszL2iezF50QQfw4mWaCAF6GGRPvxcMIg7KjQf5QJX+OnOQq4lWKaKyRJEUet6gFqR6XNSF6XEaaotn/v33VE6Mj1ertfmh+Noz3frBvQ7lkGF9HhlE+BtsTXGbr+blD8H2IXqprrgNwbML5VV2L7cLFFvQ8qlEtWpFsMq2JBLydQkcEum6gdbnas9o5Jw8Q3pCvuoa9fRiQeMfKD2DYZ+PDGzxnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZklEQVRIie2VvW7CMBDHr1UfwE5fII7lvahIWUEiQ7qxMLEwsVQMSB0YKsTExsDGxFs0QyqlYyMVld3k4wWw/QgMlqp+JXFQGZB649n3k+9/f9sX9w+PcJq4PBH3H/0zrkrWfK99jVF5/V6qIIzqod1m485rC6nK0S5GAPArvRDNHFtINZ0vviQp4Un2OTObjIs6q6G122yMhgPfaxvuN0VbGDHHBgDm2FbVAGqgLYyEVPFmCwDB84uQilHyB2i32ej3uoySvZDT+YInGaPE77QqlSkznz5vv9cFAEbJdL4QUlkYjYYDnYnf3o9HC6mewog5ttZBq7xcrf1OK95sy61ZgQaAIIx2lGgdRsPBcrXmSbYXstLyRmPkSWZh5HdaAODe3uipVlaZmk9IxdMcAHiam3DBRJCPCMJol+bfbuMxaJ7mjJLZZFxeb2Gku6mDTrJXjExeviILFqJF8WtpGOf5y5wn+gBcXI4F9z6rgwAAAABJRU5ErkJggg=="},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a9ffb5d.d8752724.js b/assets/js/8a9ffb5d.d8752724.js new file mode 100644 index 00000000..2052824a --- /dev/null +++ b/assets/js/8a9ffb5d.d8752724.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1864],{2390:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>c});var r=s(4848),i=s(8453),o=s(3070),t=s(3484),a=s(3769);const c=[];function d(e){return(0,r.jsx)(o.F,{children:(0,r.jsxs)("div",{className:a.A.downloadContainer,children:[(0,r.jsx)(t.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,r.jsx)(t.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,r.jsx)(t.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d()}},4954:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"Your Secure Internet Sharing Perimeter","source":"@site/versioned_docs/version-0.4/getting-started.mdx","sourceDirName":".","slug":"/getting-started","permalink":"/docs/0.4/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/getting-started.mdx","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"title":"Getting Started","sidebar_label":"Getting Started","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"Concepts","permalink":"/docs/0.4/concepts/"}}');var i=s(4848),o=s(8453),t=(s(3070),s(3484),s(3769),s(2390));const a={title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:10},c=void 0,d={},l=[{value:"Your Secure Internet Sharing Perimeter",id:"your-secure-internet-sharing-perimeter",level:2},{value:"Your First Share",id:"your-first-share",level:3},{value:"Share Backend Modes",id:"share-backend-modes",level:2},{value:"Open Source",id:"open-source",level:2},{value:"Ziti native",id:"ziti-native",level:3},{value:"What's it for?",id:"whats-it-for",level:2},{value:"Installing the zrok Command",id:"installing-the-zrok-command",level:2},...t.RM,{value:"Enabling Your zrok Environment",id:"enabling-your-zrok-environment",level:2},{value:"Sharing",id:"sharing",level:2},{value:"Ephemeral by Default",id:"ephemeral-by-default",level:3},{value:"Public Shares and Frontends",id:"public-shares-and-frontends",level:3},{value:"Private Shares",id:"private-shares",level:3},{value:"Proxy Backend Mode",id:"proxy-backend-mode",level:3},{value:"Web Backend Mode",id:"web-backend-mode",level:3},{value:"Reserved Shares",id:"reserved-shares",level:3},{value:"Concepts Review",id:"concepts-review",level:2},{value:"Instance and Account",id:"instance-and-account",level:3},{value:"Environment",id:"environment",level:3},{value:"Shares",id:"shares",level:3},{value:"Reserved Shares",id:"reserved-shares-1",level:3},{value:"Self-Hosting an Instance",id:"self-hosting-an-instance",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components},{Card:r,CardBody:a,CardFooter:c,CardHeader:d,Column:l,Columns:h}=n;return r||m("Card",!0),a||m("CardBody",!0),c||m("CardFooter",!0),d||m("CardHeader",!0),l||m("Column",!0),h||m("Columns",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"your-secure-internet-sharing-perimeter",children:"Your Secure Internet Sharing Perimeter"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," (",(0,i.jsx)(n.em,{children:"/zi\u02d0\u0279\u0252k/ ZEE-rock"}),") is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files.\nThere's a hardened zrok-as-a-service offering available at ",(0,i.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," with a generous free tier."]}),"\n",(0,i.jsx)(n.h3,{id:"your-first-share",children:"Your First Share"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Get an account token"}),"\n"]}),"\n",(0,i.jsxs)(h,{className:"text--center getting-started-cards",style:{marginLeft:1},children:[(0,i.jsx)(l,{style:{paddingBottom:20},children:(0,i.jsxs)(r,{shadow:"tl",children:[(0,i.jsx)(d,{children:(0,i.jsx)("h3",{children:"Hosted zrok"})}),(0,i.jsx)(a,{children:(0,i.jsx)(n.p,{children:"Use NetFoundry's public zrok instance."})}),(0,i.jsx)(c,{children:(0,i.jsx)("a",{href:"https://myzrok.io/",children:(0,i.jsx)("button",{className:"button button--secondary button--block",children:"Get an Account"})})})]})}),(0,i.jsx)(l,{style:{paddingBottom:20},children:(0,i.jsxs)(r,{shadow:"tl",children:[(0,i.jsx)(d,{children:(0,i.jsx)("h3",{children:"Self-Hosted zrok"})}),(0,i.jsx)(a,{children:(0,i.jsx)(n.p,{children:"Run a zrok instance on Linux, Docker, or Kubernetes."})}),(0,i.jsx)(c,{children:(0,i.jsx)("a",{href:"/docs/category/self-hosting/",children:(0,i.jsx)("button",{className:"button button--secondary button--block",children:"Guides"})})})]})})]}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"#installing-the-zrok-command",children:"Download the zrok binary"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Enable zrok for your ",(0,i.jsx)(n.a,{href:"#enabling-your-zrok-environment",children:"user environment"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Share ",(0,i.jsx)(n.code,{children:"http://localhost:8080"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Visit the public URL displayed in your terminal"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok share public",src:s(439).A+"",width:"1115",height:"628"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"share-backend-modes",children:"Share Backend Modes"}),"\n",(0,i.jsx)(n.p,{children:"zrok shares can be public or private, with different options for backend modes, including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"Public shares"})," for ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/http",children:"web services"})," or ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/files",children:"files"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"Private shares for web services or files"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"TCP Tunnels"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/tunnels",children:"UDP Tunnels"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/guides/drives",children:"File Drives"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/guides/vpn/",children:"VPN"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"open-source",children:"Open Source"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is licensed under Apache 2.0."]}),"\n",(0,i.jsxs)(n.p,{children:["Check ",(0,i.jsx)(n.a,{href:"https://github.com/orgs/openziti/projects/16",children:"the roadmap"})," if you're thinking about the future. We would love to hear your ideas for ",(0,i.jsx)(n.code,{children:"zrok"}),"!"]}),"\n",(0,i.jsxs)(n.p,{children:["The best ways to engage are ",(0,i.jsx)(n.a,{href:"https://openziti.discourse.group/",children:"Discourse"})," for questions and ",(0,i.jsx)(n.a,{href:"https://github.com/openziti/zrok/issues",children:"GitHub Issues"})," for documenting problems."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/opensource",children:"Read more about zrok open source"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"ziti-native",children:"Ziti native"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is a ",(0,i.jsx)(n.em,{children:"Ziti Native Application"}),", built on the ",(0,i.jsx)(n.a,{href:"https://openziti.io",children:"OpenZiti"})," platform, and supported by the OpenZiti community and NetFoundry team."]}),"\n",(0,i.jsx)(n.h2,{id:"whats-it-for",children:"What's it for?"}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"zrok"})," to share a running service, like a web server or a network socket, or to share a directory of static files."]}),"\n",(0,i.jsxs)(n.p,{children:["If ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"sharing publicly"}),", you can reserve a subdomain, enable authentication options, or both. Public shares proxy HTTPS to your service or files."]}),"\n",(0,i.jsxs)(n.p,{children:["If ",(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"sharing privately"}),", only users with the share token can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services."]}),"\n",(0,i.jsx)(n.h2,{id:"installing-the-zrok-command",children:"Installing the zrok Command"}),"\n",(0,i.jsx)(t.Ay,{}),"\n",(0,i.jsx)(n.h2,{id:"enabling-your-zrok-environment",children:"Enabling Your zrok Environment"}),"\n",(0,i.jsxs)(n.p,{children:["After you have ",(0,i.jsx)(n.a,{href:"#your-first-share",children:"an account"}),", you can enable your ",(0,i.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,i.jsxs)(n.p,{children:["A zrok environment usually refers to an enabled device where shares and accesses can be created, .e.g., ",(0,i.jsx)(n.code,{children:"~/.zrok"})," on a Unix machine. It can be a specific user's environment or a system-wide agent's environment owned by the administrator."]}),"\n",(0,i.jsxs)(n.p,{children:["When your ",(0,i.jsx)(n.code,{children:"zrok"})," account was created, the service generated a ",(0,i.jsx)(n.em,{children:"secret token"})," that identifies and authenticates in a single step. Protect your secret token as if it were a password, or an important account number; it's a ",(0,i.jsx)(n.em,{children:"secret"}),", protect it."]}),"\n",(0,i.jsxs)(n.p,{children:["When we left off you had downloaded, extracted, and configured your ",(0,i.jsx)(n.code,{children:"zrok"})," environment. In order to use that environment with your account, you'll need to ",(0,i.jsx)(n.code,{children:"enable"})," it. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the ",(0,i.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,i.jsxs)(n.p,{children:["From the web console, click on your email address in the upper right corner of the header. That drop down menu contains an ",(0,i.jsx)(n.code,{children:"Enable Your Environment"})," link. Click that link and a modal dialog will be shown like this:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Modal Dialog",src:s(5803).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["This dialog box shows you the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command that you can use to enable any shell to work with your ",(0,i.jsx)(n.code,{children:"zrok"})," account with a single command."]}),"\n",(0,i.jsx)(n.p,{children:"Let's copy that command and paste it into your shell:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok enable klFEoIi0QAg7 \n\u28fb contacting the zrok service...\n"})}),"\n",(0,i.jsx)(n.p,{children:"After a few seconds, the message will change and indicate that the enable operation succeeded:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok enable klFEoIi0QAg7 \n\u28fb the zrok environment was successfully enabled...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, if we run a ",(0,i.jsx)(n.code,{children:"zrok status"})," command, you will see the details of your environment:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"zrok status\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://api.staging.zrok.io env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token <<SET>>\n Ziti Identity <<SET>>\n"})}),"\n",(0,i.jsx)(n.p,{children:"Excellent... our environment is now fully enabled."}),"\n",(0,i.jsxs)(n.p,{children:["If we return to the ",(0,i.jsx)(n.em,{children:"web console"}),", we'll now see the new environment reflected in the explorer view:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"New Environment in Web UI",src:s(6054).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["In my case, the environment is named ",(0,i.jsx)(n.code,{children:"michael@ziti-lx"}),", which is the username of my shell and the hostname of the system the shell is running on."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Should you want to use a non-default name for your environment, you can pass the ",(0,i.jsx)(n.code,{children:"-d"})," option to the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command. See ",(0,i.jsx)(n.code,{children:"zrok enable --help"})," for details."]})}),"\n",(0,i.jsxs)(n.p,{children:["If you click on the environment node in the explorer in the ",(0,i.jsx)(n.em,{children:"web console"}),", the details panel shown at the bottom of the page will change:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Empty Environment",src:s(3826).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["The explorer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the explorer, click the ",(0,i.jsx)(n.img,{alt:"Zoom to Fit",src:s(8794).A+"",width:"30",height:"25"})," ",(0,i.jsx)(n.em,{children:"zoom to fit"})," icon in the lower right corner of the explorer."]}),"\n",(0,i.jsxs)(n.p,{children:["If we click on the ",(0,i.jsx)(n.code,{children:"Detail"})," tab for our environment, we'll see something like:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Environment Detail",src:s(4387).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["With your ",(0,i.jsx)(n.code,{children:"zrok"})," account you can ",(0,i.jsx)(n.code,{children:"zrok enable"})," multiple environments. This will allow you to run ",(0,i.jsx)(n.code,{children:"zrok share"})," in one environment, and ",(0,i.jsx)(n.code,{children:"zrok access"})," in other environments."]})}),"\n",(0,i.jsx)(n.p,{children:"Your environment is fully ready to go. Now we can move on to the fun stuff..."}),"\n",(0,i.jsx)(n.h2,{id:"sharing",children:"Sharing"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," is designed to make sharing resources as effortless as possible, while providing a high degree of security and control."]}),"\n",(0,i.jsx)(n.h3,{id:"ephemeral-by-default",children:"Ephemeral by Default"}),"\n",(0,i.jsxs)(n.p,{children:["Shared resources are ",(0,i.jsx)(n.em,{children:"ephemeral"})," by default; as soon as you terminate the ",(0,i.jsx)(n.code,{children:"zrok share"})," command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created."]}),"\n",(0,i.jsx)(n.h3,{id:"public-shares-and-frontends",children:"Public Shares and Frontends"}),"\n",(0,i.jsxs)(n.p,{children:["Resources that are shared ",(0,i.jsx)(n.em,{children:"publicly"})," are exposed to any users on the internet who have access to the ",(0,i.jsx)(n.code,{children:"zrok"}),' instance\'s "frontend".']}),"\n",(0,i.jsx)(n.p,{children:"A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources."}),"\n",(0,i.jsxs)(n.p,{children:["For example, I might create a public share using the ",(0,i.jsx)(n.code,{children:"zrok share public"})," command, which results in my ",(0,i.jsx)(n.code,{children:"zrok"})," instance exposing a URL like ",(0,i.jsx)(n.code,{children:"https://2ptgbr8tlfvk.share.zrok.io"})," to access my resources."]}),"\n",(0,i.jsxs)(n.p,{children:['In this case, my share was given the "share token" of ',(0,i.jsx)(n.code,{children:"2ptgbr8tlfvk"}),". That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["Here is the ",(0,i.jsx)(n.code,{children:"--help"})," output from ",(0,i.jsx)(n.code,{children:"zrok share public"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"zrok share public\n"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:'Error: accepts 1 arg(s), received 0\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\n[ERROR]: an error occurred (accepts 1 arg(s), received 0)\n'})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"<target>"})," defines the path to the local resource that you intend to share. The form of ",(0,i.jsx)(n.code,{children:"<target>"})," depends on the ",(0,i.jsx)(n.code,{children:"--backend-mode"})," that you're using."]}),(0,i.jsxs)(n.p,{children:["In the case of ",(0,i.jsx)(n.code,{children:"--backend-mode proxy"}),", ",(0,i.jsx)(n.code,{children:"<target>"})," should be a URL to an HTTP endpoint."]}),(0,i.jsxs)(n.p,{children:["In the case of ",(0,i.jsx)(n.code,{children:"--backend-mode web"}),", ",(0,i.jsx)(n.code,{children:"<target>"}),' is the path to a file on disk that serves as the "root" of the file tree to be shared.']})]}),"\n",(0,i.jsx)(n.p,{children:"If we return to the web console, we see our share in the explorer:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Web Console Share",src:s(898).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["If we click on our new share in the explorer, we can see the share details:\n",(0,i.jsx)(n.img,{alt:"Share Details",src:s(8404).A+"",width:"1791",height:"1369"})]}),"\n",(0,i.jsxs)(n.p,{children:["If we click on the ",(0,i.jsx)(n.em,{children:"frontend endpoint"})," a new browser tab opens and we see the content of our share:\n",(0,i.jsx)(n.img,{alt:"Share Frontend",src:s(9467).A+"",width:"1669",height:"1033"})]}),"\n",(0,i.jsx)(n.p,{children:"If we click on the environment in the explorer, we're shown all of the shares for that environment (including our new share), along with a spark line that shows the activity:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Environment Spark Line",src:s(590).A+"",width:"1791",height:"1369"})}),"\n",(0,i.jsxs)(n.p,{children:["And as soon as I terminate the ",(0,i.jsx)(n.code,{children:"zrok share"})," client, the resources are removed from the ",(0,i.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,i.jsx)(n.p,{children:"If we try to reload the frontend endpoint in our web browser, we'll see:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Not Found",src:s(4532).A+"",width:"1556",height:"1229"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-public",children:"More about public shares"})}),"\n",(0,i.jsx)(n.h3,{id:"private-shares",children:"Private Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," also provides a powerful ",(0,i.jsx)(n.em,{children:"private"})," sharing model. If I execute the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example"',children:"$ zrok share private http://localhost:8080\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok"})," service will respond with the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"access your share with: zrok access private wvszln4dyz9q\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Rather than allowing access to your service through a public frontend, a ",(0,i.jsx)(n.em,{children:"private"})," share is only exposed to the underlying OpenZiti network, and can only be accessed using the ",(0,i.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok access private wvszln4dyz9q"})," command can be run by any ",(0,i.jsx)(n.code,{children:"zrok"})," user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-private",children:"More about private shares"})}),"\n",(0,i.jsx)(n.h3,{id:"proxy-backend-mode",children:"Proxy Backend Mode"}),"\n",(0,i.jsxs)(n.p,{children:["Without specifying a ",(0,i.jsx)(n.em,{children:"backend mode"}),", the ",(0,i.jsx)(n.code,{children:"zrok share"})," command will assume that you're trying to share a ",(0,i.jsx)(n.code,{children:"proxy"})," resource. A ",(0,i.jsx)(n.code,{children:"proxy"})," resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on ",(0,i.jsx)(n.code,{children:"localhost"}),", or only listening on a private LAN segment behind a firewall."]}),"\n",(0,i.jsxs)(n.p,{children:["For these services a ",(0,i.jsx)(n.code,{children:"proxy"})," share will allow those endpoints to be reached, either ",(0,i.jsx)(n.em,{children:"publicly"})," or ",(0,i.jsx)(n.em,{children:"privately"})," through the ",(0,i.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,i.jsx)(n.h3,{id:"web-backend-mode",children:"Web Backend Mode"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"zrok share"})," command accepts a ",(0,i.jsx)(n.code,{children:"--backend-mode"})," option. Besides ",(0,i.jsx)(n.code,{children:"proxy"}),", the current ",(0,i.jsx)(n.code,{children:"v0.3"})," release (as of this writing) also supports a ",(0,i.jsx)(n.code,{children:"web"})," mode. The ",(0,i.jsx)(n.code,{children:"web"})," mode allows you to specify a local folder on your filesystem, and instantly turns your ",(0,i.jsx)(n.code,{children:"zrok"})," client into a web server, exposing your web content either ",(0,i.jsx)(n.em,{children:"publicly"})," or ",(0,i.jsx)(n.em,{children:"privately"})," without having to a configure a web server."]}),"\n",(0,i.jsx)(n.h3,{id:"reserved-shares",children:"Reserved Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," shares are ",(0,i.jsx)(n.em,{children:"ephemeral"}),' unless you specifically create a "reserved" share.']}),"\n",(0,i.jsxs)(n.p,{children:["A reserved share can be re-used multiple times; it will survive termination of the ",(0,i.jsx)(n.code,{children:"zrok share"})," command, allowing for longer-lasting semi-permanent access to shared resources."]}),"\n",(0,i.jsx)(n.p,{children:"The first step is to create the reserved share:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok reserve public --backend-mode web v0.3_getting_started\n[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'\n[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io\n"})}),"\n",(0,i.jsxs)(n.p,{children:["I'm asking the ",(0,i.jsx)(n.code,{children:"zrok"})," service to reserve a share with a ",(0,i.jsx)(n.code,{children:"web"})," backend mode, pointing at my local ",(0,i.jsx)(n.code,{children:"docs"})," folder."]}),"\n",(0,i.jsxs)(n.p,{children:["You'll want to remember the share token (",(0,i.jsx)(n.code,{children:"mltwsinym1s2"})," in this case), and the frontend endpoint URL. If this were a ",(0,i.jsx)(n.em,{children:"private"})," reserved share, there would not be a frontend URL."]}),"\n",(0,i.jsx)(n.p,{children:"If we do nothing else, and then point a web browser at the frontend endpoint, we get:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Not Found",src:s(5151).A+"",width:"1556",height:"1229"})}),"\n",(0,i.jsxs)(n.p,{children:["This is the ",(0,i.jsx)(n.code,{children:"404"})," error message returned by the ",(0,i.jsx)(n.code,{children:"zrok"})," frontend. We're getting this because we haven't yet started up a ",(0,i.jsx)(n.code,{children:"zrok share"})," for the service. Let's do that:"]}),"\n",(0,i.jsx)(n.p,{children:"This command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok share reserved mltwsinym1s2\n"})}),"\n",(0,i.jsx)(n.p,{children:"...results in a new share backend starting up and connecting to the existing reserved share:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok share reserved",src:s(1248).A+"",width:"951",height:"706"})}),"\n",(0,i.jsxs)(n.p,{children:["And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the ",(0,i.jsx)(n.code,{children:"docs"})," directory:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"zrok docs share",src:s(9467).A+"",width:"1669",height:"1033"})}),"\n",(0,i.jsxs)(n.p,{children:["With the reserved share, we're free to stop and restart the ",(0,i.jsx)(n.code,{children:"zrok share reserved"})," command as many times as we want, without losing the token for our share."]}),"\n",(0,i.jsxs)(n.p,{children:["When we're done with the reserved share, we can ",(0,i.jsx)(n.em,{children:"release"})," it using this command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",metastring:'title="Example"',children:"$ zrok release mltwsinym1s2\n[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"More about reserved shares"})}),"\n",(0,i.jsx)(n.h2,{id:"concepts-review",children:"Concepts Review"}),"\n",(0,i.jsxs)(n.p,{children:["In summary, ",(0,i.jsx)(n.code,{children:"zrok"})," lets you easily and securely share resources with both general internet users (through ",(0,i.jsx)(n.em,{children:"public"})," sharing) and also with other ",(0,i.jsx)(n.code,{children:"zrok"})," users (through ",(0,i.jsx)(n.em,{children:"private"})," sharing)."]}),"\n",(0,i.jsxs)(n.p,{children:["Here's a quick review of the ",(0,i.jsx)(n.code,{children:"zrok"})," mental model and the vocabulary."]}),"\n",(0,i.jsx)(n.h3,{id:"instance-and-account",children:"Instance and Account"}),"\n",(0,i.jsxs)(n.p,{children:["You create an ",(0,i.jsx)(n.em,{children:"account"})," with a ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"}),". Your account is identified by a username and a password, which you use to log into the ",(0,i.jsx)(n.em,{children:"web console"}),". Your account also has a ",(0,i.jsx)(n.em,{children:"secret token"}),", which you will use to authenticate from the ",(0,i.jsx)(n.code,{children:"zrok"})," command-line to interact with the ",(0,i.jsx)(n.em,{children:"instance"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You create a new ",(0,i.jsx)(n.em,{children:"account"})," with NetFoundry's ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"})," by subscribing in ",(0,i.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," or in a self-hosted ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"})," by running ",(0,i.jsxs)(n.a,{href:"/docs/0.4/guides/self-hosting/self-service-invite",children:["the ",(0,i.jsx)(n.code,{children:"zrok invite"})," command"]})," or the ",(0,i.jsx)(n.code,{children:"zrok admin create account"})," command."]}),"\n",(0,i.jsx)(n.h3,{id:"environment",children:"Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Using your ",(0,i.jsx)(n.em,{children:"secret token"})," you use the ",(0,i.jsx)(n.code,{children:"zrok"})," command-line interface to create an ",(0,i.jsx)(n.em,{children:"environment"}),". An ",(0,i.jsx)(n.em,{children:"environment"})," corresponds to a single command-line user on a specific ",(0,i.jsx)(n.em,{children:"host system"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You create a new ",(0,i.jsx)(n.em,{children:"environment"})," by using the ",(0,i.jsx)(n.code,{children:"zrok enable"})," command."]}),"\n",(0,i.jsx)(n.h3,{id:"shares",children:"Shares"}),"\n",(0,i.jsxs)(n.p,{children:["Once you've enabled an ",(0,i.jsx)(n.em,{children:"environment"}),", you then create one or more ",(0,i.jsx)(n.em,{children:"shares"}),". Shares have either a ",(0,i.jsx)(n.em,{children:"public"})," or ",(0,i.jsx)(n.em,{children:"private"})," ",(0,i.jsx)(n.em,{children:"sharing mode"}),". ",(0,i.jsx)(n.em,{children:"Shares"})," share a specific type of resource using a ",(0,i.jsx)(n.em,{children:"backend mode"}),". As of this writing ",(0,i.jsx)(n.code,{children:"zrok"})," supports a ",(0,i.jsx)(n.code,{children:"proxy"})," ",(0,i.jsx)(n.em,{children:"backend mode"})," to share local HTTP resources as a ",(0,i.jsx)(n.em,{children:"reverse proxy"}),". ",(0,i.jsx)(n.code,{children:"zrok"})," also supports a ",(0,i.jsx)(n.code,{children:"web"})," ",(0,i.jsx)(n.em,{children:"backend mode"})," to share local file and HTML resources by enabling a basic HTTP server."]}),"\n",(0,i.jsxs)(n.p,{children:["Every ",(0,i.jsx)(n.em,{children:"share"})," is identified by a ",(0,i.jsx)(n.em,{children:"share token"}),". ",(0,i.jsx)(n.em,{children:"Public shares"})," can be accessed through either a ",(0,i.jsx)(n.em,{children:"frontend"})," instance offered through the ",(0,i.jsx)(n.code,{children:"zrok"})," ",(0,i.jsx)(n.em,{children:"instance"}),", or through the ",(0,i.jsx)(n.code,{children:"zrok access"})," command. ",(0,i.jsx)(n.em,{children:"Private shares"})," can only be accessed through the ",(0,i.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,i.jsxs)(n.p,{children:["You use the ",(0,i.jsx)(n.code,{children:"zrok share"})," command to create and enable ",(0,i.jsx)(n.em,{children:"ephemeral shares"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"reserved-shares-1",children:"Reserved Shares"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"zrok"})," supports creating ",(0,i.jsx)(n.em,{children:"shares"})," that have a consistent ",(0,i.jsx)(n.em,{children:"share token"})," that survives restarts of the ",(0,i.jsx)(n.code,{children:"zrok share"})," command. These are considered ",(0,i.jsx)(n.em,{children:"non-ephemeral"}),", and is callled a ",(0,i.jsx)(n.em,{children:"reserved share"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You use the ",(0,i.jsx)(n.code,{children:"zrok reserve"})," command to create ",(0,i.jsx)(n.em,{children:"reserved shares"}),". Reserved shares last until you use the ",(0,i.jsx)(n.code,{children:"zrok release"})," command to delete them."]}),"\n",(0,i.jsx)(n.h2,{id:"self-hosting-an-instance",children:"Self-Hosting an Instance"}),"\n",(0,i.jsxs)(n.p,{children:["Interested in self-hosting your own ",(0,i.jsx)(n.code,{children:"zrok"})," instance? See the ",(0,i.jsx)(n.a,{href:"/docs/category/self-hosting/",children:"self-hosting guides"}),"!"]}),"\n",(0,i.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Learn about ",(0,i.jsx)(n.a,{href:"https://openziti.io/",children:"OpenZiti"})]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3070:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>t});var r=s(6540),i=s(4848);const o=(0,r.createContext)([]),t=()=>(0,r.useContext)(o),a=e=>{let{children:n}=e;const[s,t]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),t(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,i.jsx)(o.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>c});s(6540);var r=s(3070),i=s(3769),o=s(8532),t=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},c=e=>{let{osName:n,osLogo:s,infoText:c,guideLink:d}=e;const{colorMode:l}=(0,o.G)(),h=(0,r.d)();console.log("Assets in DownloadCard:",h);const u=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=h.filter((e=>e.name.includes(u)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,t.jsxs)("div",{className:i.A.downloadCard,children:[(0,t.jsx)("div",{className:i.A.imgContainer,children:(0,t.jsx)("img",{src:s,alt:`${n} logo`})}),(0,t.jsx)("h3",{children:n}),m.length>0&&(0,t.jsx)("ul",{children:m.map(((e,n)=>(0,t.jsx)("li",{className:i.A.downloadButtons,children:(0,t.jsx)("a",{href:e.url,className:i.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,t.jsxs)("div",{className:i.A.cardFooter,children:[(0,t.jsx)("p",{children:c}),(0,t.jsx)("a",{href:d,children:"GUIDE"}),(0,t.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},5803:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_enable_modal-45da63a6907e930daaa4c798272ce5fa.png"},4532:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_not_found-fa3415937c341eb10e1eb98c9b063583.png"},5151:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_reserved_not_found-2519707e5cc3e635b7a6feb381c1d040.png"},439:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_public-322dc971477d3a0b97b42478ea023dd7.png"},1248:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_reserved-6bce67775ce2c41abb0ef13ee1fad972.png"},590:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_environment_spark-925c0709ed7a42f0a708ab0523cdeb5f.png"},898:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_explorer_share-11236f68819da60014d5444e7429c189.png"},8404:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_detail-efeaa472d5e5c225a160f6d5647086b3.png"},9467:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_frontend-d7c0d6495493c00b94ae237339f2dc2d.png"},4387:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_empty_environment_detail-153c921ade86f924079947b0f734e3ff.png"},3826:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_empty_shares-048c08c18477bcabb9fa8c1b58537012.png"},6054:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_ui_new_environment-414d8e8fc25b09f257cb40ba47d6acbb.png"},8794:(e,n,s)=>{s.d(n,{A:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAZCAIAAACpVwlNAAAEr2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjUiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMzAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249Ijk2LzEiCiAgIHRpZmY6WVJlc29sdXRpb249Ijk2LzEiCiAgIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI1IgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgUGhvdG8gMi4wLjMiCiAgICAgIHN0RXZ0OndoZW49IjIwMjMtMDEtMTlUMTA6NTY6NTYtMDU6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pq+HLHgAAAGBaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHP7UwemBQixYtJKyVRg8Q27RQyoJqYQZZbfTmI/BxuVcJaRu0FQqiNr0W9RfUNmgdBEURRNtaF7UpuZ2rghF5hjnzzW/OOcycAWs4rWT0piHIZPNaKOh3LkaWnPYXLHThwIclqujq7PxkmIb2eS/RYrces1bjuH+tbTWuK2BpER5XVC0vPCU8s55XTd4R7lZS0VXhM2G3JhcUvjP1WJVfTU5W+dtkLRwKgLVT2Jn8xbFfrKS0jLC8HFcmXVBq9zFf0h7PLszL2iezF50QQfw4mWaCAF6GGRPvxcMIg7KjQf5QJX+OnOQq4lWKaKyRJEUet6gFqR6XNSF6XEaaotn/v33VE6Mj1ertfmh+Noz3frBvQ7lkGF9HhlE+BtsTXGbr+blD8H2IXqprrgNwbML5VV2L7cLFFvQ8qlEtWpFsMq2JBLydQkcEum6gdbnas9o5Jw8Q3pCvuoa9fRiQeMfKD2DYZ+PDGzxnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZklEQVRIie2VvW7CMBDHr1UfwE5fII7lvahIWUEiQ7qxMLEwsVQMSB0YKsTExsDGxFs0QyqlYyMVld3k4wWw/QgMlqp+JXFQGZB649n3k+9/f9sX9w+PcJq4PBH3H/0zrkrWfK99jVF5/V6qIIzqod1m485rC6nK0S5GAPArvRDNHFtINZ0vviQp4Un2OTObjIs6q6G122yMhgPfaxvuN0VbGDHHBgDm2FbVAGqgLYyEVPFmCwDB84uQilHyB2i32ej3uoySvZDT+YInGaPE77QqlSkznz5vv9cFAEbJdL4QUlkYjYYDnYnf3o9HC6mewog5ttZBq7xcrf1OK95sy61ZgQaAIIx2lGgdRsPBcrXmSbYXstLyRmPkSWZh5HdaAODe3uipVlaZmk9IxdMcAHiam3DBRJCPCMJol+bfbuMxaJ7mjJLZZFxeb2Gku6mDTrJXjExeviILFqJF8WtpGOf5y5wn+gBcXI4F9z6rgwAAAABJRU5ErkJggg=="},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b4ddd1a.c9cbe2e9.js b/assets/js/8b4ddd1a.f19e7085.js similarity index 99% rename from assets/js/8b4ddd1a.c9cbe2e9.js rename to assets/js/8b4ddd1a.f19e7085.js index 9f84aaaf..c0f63030 100644 --- a/assets/js/8b4ddd1a.c9cbe2e9.js +++ b/assets/js/8b4ddd1a.f19e7085.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5955],{1770:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","source":"@site/versioned_docs/version-0.4/guides/drives.mdx","sourceDirName":"guides","slug":"/guides/drives","permalink":"/docs/0.4/guides/drives","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/drives.mdx","tags":[],"version":"0.4","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Invitations","permalink":"/docs/0.4/guides/self-hosting/self-service-invite"},"next":{"title":"VPN","permalink":"/docs/0.4/guides/vpn/"}}');var s=r(4848),o=r(8453);const t={},c="Drives",a={},d=[{value:"Sharing a Drive",id:"sharing-a-drive",level:2},{value:"Working with a Private Drive Share",id:"working-with-a-private-drive-share",level:2},{value:"Working with Public Shares",id:"working-with-public-shares",level:2},{value:"One-way Synchronization",id:"one-way-synchronization",level:2},{value:"Drive-to-Drive Copies and Synchronization",id:"drive-to-drive-copies-and-synchronization",level:2},{value:"Copying from Drives to the Local Filesystem",id:"copying-from-drives-to-the-local-filesystem",level:2},{value:"Unique Names and Reserved Shares",id:"unique-names-and-reserved-shares",level:2},{value:"Future Enhancements",id:"future-enhancements",level:2}];function l(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"drives",children:"Drives"})}),"\n",(0,s.jsx)(n.p,{children:"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files."}),"\n",(0,s.jsx)(n.h2,{id:"sharing-a-drive",children:"Sharing a Drive"}),"\n",(0,s.jsxs)(n.p,{children:["Virtual drives are shared through the ",(0,s.jsx)(n.code,{children:"zrok"})," CLI using the ",(0,s.jsx)(n.code,{children:"--backend-mode drive"})," flag through the ",(0,s.jsx)(n.code,{children:"zrok share"})," command, using either the ",(0,s.jsx)(n.code,{children:"public"})," or ",(0,s.jsx)(n.code,{children:"private"})," sharing modes. We'll use the ",(0,s.jsx)(n.code,{children:"private"})," sharing mode for this example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ mkdir /tmp/junk\n$ zrok share private --headless --backend-mode drive /tmp/junk\n[ 0.124] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[cf640aac-2706-49ae-9cc9-9a497d67d9c5]} new service session\n[ 0.145] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private wkcfb58vj51l\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The command shown above creates an ephemeral, ",(0,s.jsx)(n.code,{children:"private"})," drive share pointed at the local ",(0,s.jsx)(n.code,{children:"/tmp/junk"})," folder."]}),"\n",(0,s.jsxs)(n.p,{children:["Notice that the share token allocated by ",(0,s.jsx)(n.code,{children:"zrok"})," is ",(0,s.jsx)(n.code,{children:"wkcfb58vj51l"}),". We'll use that share token to identify our virtual drive in the following operations."]}),"\n",(0,s.jsx)(n.h2,{id:"working-with-a-private-drive-share",children:"Working with a Private Drive Share"}),"\n",(0,s.jsxs)(n.p,{children:["First, let's copy a file into our virtual drive using the ",(0,s.jsx)(n.code,{children:"zrok copy"})," command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy LICENSE zrok://wkcfb58vj51l\n[ 0.119] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We used the URL scheme ",(0,s.jsx)(n.code,{children:"zrok://<shareToken>"})," to refer to the private virtual drive we allocated above using the ",(0,s.jsx)(n.code,{children:"zrok share private"})," command. Use ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs with the drives CLI tools to refer to contents of private virtual drives."]}),"\n",(0,s.jsx)(n.p,{children:"Next, let's get a directory listing of the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can make directories on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok mkdir zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can copy the contents of a local directory into the new directory on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ ls -l util/\ntotal 20\n-rw-rw-r-- 1 michael michael 329 Jul 21 13:17 email.go\n-rw-rw-r-- 1 michael michael 456 Jul 21 13:17 headers.go\n-rw-rw-r-- 1 michael michael 609 Jul 21 13:17 proxy.go\n-rw-rw-r-- 1 michael michael 361 Jul 21 13:17 size.go\n-rw-rw-r-- 1 michael michael 423 Jan 2 11:57 uniqueName.go\n$ zrok copy util/ zrok://wkcfb58vj51l/stuff\n[ 0.123] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.194] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.267] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.337] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.408] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\n$ zrok ls zrok://wkcfb58vj51l/stuff\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"And we can remove files and directories from the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm zrok://wkcfb58vj51l/LICENSE\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok rm zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"working-with-public-shares",children:"Working with Public Shares"}),"\n",(0,s.jsx)(n.p,{children:"Public shares work very similarly to private shares, they just use a different URL scheme:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok share public --headless --backend-mode drive /tmp/junk\n[ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session\n[ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:\n https://6kiww4bn7iok.share.zrok.io\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The same commands, with a different URL scheme work with the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy util/ https://6kiww4bn7iok.share.zrok.io\n[ 0.268] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.655] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\nmichael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok \n$ zrok ls https://6kiww4bn7iok.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-02 11:57:14 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For basic authentication provided by public shares, the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI offers the ",(0,s.jsx)(n.code,{children:"--basic-auth"})," flag, which accepts a ",(0,s.jsx)(n.code,{children:"<username>:<password>"})," parameter to specify the authentication for the public virtual drive (if it's required)."]}),"\n",(0,s.jsxs)(n.p,{children:["Alternatively, the authentication can be set using the ",(0,s.jsx)(n.code,{children:"ZROK_DRIVES_BASIC_AUTH"})," environment variable:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ export ZROK_DRIVES_BASIC_AUTH=username:password\n"})}),"\n",(0,s.jsx)(n.h2,{id:"one-way-synchronization",children:"One-way Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," command includes a ",(0,s.jsx)(n.code,{children:"--sync"})," flag, which only copies files detected as ",(0,s.jsx)(n.em,{children:"modified"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," considers a file with the same modification timestamp and size to be the same. Of course, this is not a strong guarantee that the files are equivalent. Future ",(0,s.jsx)(n.code,{children:"zrok"})," drives versions will provide a cryptographically strong mechanism (a-la ",(0,s.jsx)(n.code,{children:"rsync"})," and friends) to guarantee that files and trees of files are synchronized."]}),"\n",(0,s.jsxs)(n.p,{children:["For now, the ",(0,s.jsx)(n.code,{children:"--sync"})," flag provides a convenience mechanism to allow resuming copies of large file trees and provide a reasonable guarantee that the trees are in sync."]}),"\n",(0,s.jsxs)(n.p,{children:["Let's take a look at ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," in action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.636] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 0.760] INFO zrok/drives/sync.OneWay: => /_attic/network/\n[ 0.816] INFO zrok/drives/sync.OneWay: => /_attic/network/_category_.json\n[ 0.928] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/\n[ 0.987] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.service\n[ 1.048] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.yml\n[ 1.107] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.service\n[ 1.167] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.yml\n[ 1.218] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-access-public.service\n[ 1.273] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.service\n[ 1.328] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.yml\n[ 1.382] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok.io-network-skeleton.md\n[ 1.447] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 1.572] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n[ 1.622] INFO zrok/drives/sync.OneWay: => /_attic/sharing/_category_.json\n[ 1.673] INFO zrok/drives/sync.OneWay: => /_attic/sharing/reserved_services.md\n[ 1.737] INFO zrok/drives/sync.OneWay: => /_attic/sharing/sharing_modes.md\n[ 1.793] INFO zrok/drives/sync.OneWay: => /_attic/v0.2_account_requests.md\n[ 1.902] INFO zrok/drives/sync.OneWay: => /_attic/v0.4_limits.md\n...\n[ 9.691] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 9.812] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 9.870] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because the target drive was empty, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," copied the entire contents of the local ",(0,s.jsx)(n.code,{children:"docs/"})," tree into the virtual drive. However, if we run that command again, we get:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.p,{children:"The virtual drive contents are already in sync with the local filesystem tree, so there is nothing for it to copy."}),"\n",(0,s.jsxs)(n.p,{children:["Let's alter the contents of the drive and run the ",(0,s.jsx)(n.code,{children:"--sync"})," again:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm https://glmv049c62p7.share.zrok.io/images\n$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.364] INFO zrok/drives/sync.OneWay: => /images/\n[ 0.456] INFO zrok/drives/sync.OneWay: => /images/zrok.png\n[ 0.795] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 0.866] INFO zrok/drives/sync.OneWay: => /images/zrok_deployment.drawio\n...\n[ 2.254] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 2.340] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 2.391] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because we removed the ",(0,s.jsx)(n.code,{children:"images/"})," tree from the virtual drive, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," detected this and copied the local ",(0,s.jsx)(n.code,{children:"images/"})," tree back onto the virtual drive."]}),"\n",(0,s.jsx)(n.h2,{id:"drive-to-drive-copies-and-synchronization",children:"Drive-to-Drive Copies and Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," CLI can operate on pairs of virtual drives remotely, without ever having to store files locally. This allow for drive-to-drive copies and synchronization."]}),"\n",(0,s.jsx)(n.p,{children:"Here are a couple of examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Specifying the same URL for both the source and the target of a ",(0,s.jsx)(n.code,{children:"--sync"})," operation should always result in nothing being copied... they are the same drive with the same state."]}),"\n",(0,s.jsx)(n.p,{children:"We can copy files between two virtual drives with a single command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\n[ 1.396] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 2.083] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 2.704] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n...\n[ 118.240] INFO zrok/drives/sync.OneWay: => /images/zrok_web_console_empty.png\n[ 118.920] INFO zrok/drives/sync.OneWay: => /images/zrok_enable_modal.png\n[ 119.589] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 120.214] INFO zrok/drives/sync.OneWay: => /getting-started.mdx\ncopy complete!\n$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.h2,{id:"copying-from-drives-to-the-local-filesystem",children:"Copying from Drives to the Local Filesystem"}),"\n",(0,s.jsxs)(n.p,{children:["In the current version of the drives CLI, ",(0,s.jsx)(n.code,{children:"zrok copy"})," always assumes the destination is a directory. There is currently no way to do:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy somefile someotherfile\n"})}),"\n",(0,s.jsx)(n.p,{children:"What you'll end up with on the local filesystem is:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"somefile\nsomeotherfile/somefile\n"})}),"\n",(0,s.jsxs)(n.p,{children:["It's in the backlog to support file destinations in a future release of ",(0,s.jsx)(n.code,{children:"zrok"}),". So, when using ",(0,s.jsx)(n.code,{children:"zrok copy"}),", always take note of the destination."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"zrok copy"})," supports a default destination of ",(0,s.jsx)(n.code,{children:"file://."}),", so you can do single parameter ",(0,s.jsx)(n.code,{children:"zrok copy"})," commands like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls https://azc47r3cwjds.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE\n[ 0.260] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n$ ls -l\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:29 LICENSE\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can also specify a local folder as the destination for your copy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE /tmp/inbox\n[ 0.221] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete! \n$ l /tmp/inbox\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:30 LICENSE\n"})}),"\n",(0,s.jsx)(n.h2,{id:"unique-names-and-reserved-shares",children:"Unique Names and Reserved Shares"}),"\n",(0,s.jsx)(n.p,{children:"Private reserved shares with unque names can be particularly useful with the drives CLI:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok reserve private -b drive --unique-name mydrive /tmp/junk\n[ 0.315] INFO main.(*reserveCommand).run: your reserved share token is 'mydrive'\n$ zrok share reserved --headless mydrive\n[ 0.289] INFO main.(*shareReservedCommand).run: sharing target: '/tmp/junk'\n[ 0.289] INFO main.(*shareReservedCommand).run: using existing backend target: /tmp/junk\n[ 0.767] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[d519a436-9fb5-4207-afd5-7cbc28fb779a]} new service session\n[ 0.927] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private mydrive'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This makes working with ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs particularly convenient:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://mydrive\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"future-enhancements",children:"Future Enhancements"}),"\n",(0,s.jsxs)(n.p,{children:["Coming in a future release of ",(0,s.jsx)(n.code,{children:"zrok"})," drives are features like:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'two-way synchronization between multiple hosts... allowing for shared "dropbox-like" usage scenarios between multiple environments'}),"\n",(0,s.jsx)(n.li,{children:"better ergonomics for single-file destinations"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>c});var i=r(6540);const s={},o=i.createContext(s);function t(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5955],{3671:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/drives","title":"Drives","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","source":"@site/versioned_docs/version-0.4/guides/drives.mdx","sourceDirName":"guides","slug":"/guides/drives","permalink":"/docs/0.4/guides/drives","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/drives.mdx","tags":[],"version":"0.4","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Invitations","permalink":"/docs/0.4/guides/self-hosting/self-service-invite"},"next":{"title":"VPN","permalink":"/docs/0.4/guides/vpn/"}}');var s=r(4848),o=r(8453);const t={},c="Drives",a={},d=[{value:"Sharing a Drive",id:"sharing-a-drive",level:2},{value:"Working with a Private Drive Share",id:"working-with-a-private-drive-share",level:2},{value:"Working with Public Shares",id:"working-with-public-shares",level:2},{value:"One-way Synchronization",id:"one-way-synchronization",level:2},{value:"Drive-to-Drive Copies and Synchronization",id:"drive-to-drive-copies-and-synchronization",level:2},{value:"Copying from Drives to the Local Filesystem",id:"copying-from-drives-to-the-local-filesystem",level:2},{value:"Unique Names and Reserved Shares",id:"unique-names-and-reserved-shares",level:2},{value:"Future Enhancements",id:"future-enhancements",level:2}];function l(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"drives",children:"Drives"})}),"\n",(0,s.jsx)(n.p,{children:"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files."}),"\n",(0,s.jsx)(n.h2,{id:"sharing-a-drive",children:"Sharing a Drive"}),"\n",(0,s.jsxs)(n.p,{children:["Virtual drives are shared through the ",(0,s.jsx)(n.code,{children:"zrok"})," CLI using the ",(0,s.jsx)(n.code,{children:"--backend-mode drive"})," flag through the ",(0,s.jsx)(n.code,{children:"zrok share"})," command, using either the ",(0,s.jsx)(n.code,{children:"public"})," or ",(0,s.jsx)(n.code,{children:"private"})," sharing modes. We'll use the ",(0,s.jsx)(n.code,{children:"private"})," sharing mode for this example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ mkdir /tmp/junk\n$ zrok share private --headless --backend-mode drive /tmp/junk\n[ 0.124] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[cf640aac-2706-49ae-9cc9-9a497d67d9c5]} new service session\n[ 0.145] INFO main.(*sharePrivateCommand).run: allow other to access your share with the following command:\nzrok access private wkcfb58vj51l\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The command shown above creates an ephemeral, ",(0,s.jsx)(n.code,{children:"private"})," drive share pointed at the local ",(0,s.jsx)(n.code,{children:"/tmp/junk"})," folder."]}),"\n",(0,s.jsxs)(n.p,{children:["Notice that the share token allocated by ",(0,s.jsx)(n.code,{children:"zrok"})," is ",(0,s.jsx)(n.code,{children:"wkcfb58vj51l"}),". We'll use that share token to identify our virtual drive in the following operations."]}),"\n",(0,s.jsx)(n.h2,{id:"working-with-a-private-drive-share",children:"Working with a Private Drive Share"}),"\n",(0,s.jsxs)(n.p,{children:["First, let's copy a file into our virtual drive using the ",(0,s.jsx)(n.code,{children:"zrok copy"})," command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy LICENSE zrok://wkcfb58vj51l\n[ 0.119] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We used the URL scheme ",(0,s.jsx)(n.code,{children:"zrok://<shareToken>"})," to refer to the private virtual drive we allocated above using the ",(0,s.jsx)(n.code,{children:"zrok share private"})," command. Use ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs with the drives CLI tools to refer to contents of private virtual drives."]}),"\n",(0,s.jsx)(n.p,{children:"Next, let's get a directory listing of the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can make directories on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok mkdir zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2024-01-19 12:16:46 -0500 EST \u2502\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"We can copy the contents of a local directory into the new directory on the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ ls -l util/\ntotal 20\n-rw-rw-r-- 1 michael michael 329 Jul 21 13:17 email.go\n-rw-rw-r-- 1 michael michael 456 Jul 21 13:17 headers.go\n-rw-rw-r-- 1 michael michael 609 Jul 21 13:17 proxy.go\n-rw-rw-r-- 1 michael michael 361 Jul 21 13:17 size.go\n-rw-rw-r-- 1 michael michael 423 Jan 2 11:57 uniqueName.go\n$ zrok copy util/ zrok://wkcfb58vj51l/stuff\n[ 0.123] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.194] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.267] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.337] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.408] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\n$ zrok ls zrok://wkcfb58vj51l/stuff\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-19 12:26:45 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:"And we can remove files and directories from the virtual drive:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm zrok://wkcfb58vj51l/LICENSE\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 DIR \u2502 stuff \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok rm zrok://wkcfb58vj51l/stuff\n$ zrok ls zrok://wkcfb58vj51l\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"working-with-public-shares",children:"Working with Public Shares"}),"\n",(0,s.jsx)(n.p,{children:"Public shares work very similarly to private shares, they just use a different URL scheme:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok share public --headless --backend-mode drive /tmp/junk\n[ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session\n[ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:\n https://6kiww4bn7iok.share.zrok.io\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The same commands, with a different URL scheme work with the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy util/ https://6kiww4bn7iok.share.zrok.io\n[ 0.268] INFO zrok/drives/sync.OneWay: => /email.go\n[ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go\n[ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go\n[ 0.655] INFO zrok/drives/sync.OneWay: => /size.go\n[ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go\ncopy complete!\nmichael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok \n$ zrok ls https://6kiww4bn7iok.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 email.go \u2502 329 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 headers.go \u2502 456 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 proxy.go \u2502 609 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 size.go \u2502 361 B \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2502 \u2502 uniqueName.go \u2502 423 B \u2502 2024-01-02 11:57:14 -0500 EST \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For basic authentication provided by public shares, the ",(0,s.jsx)(n.code,{children:"zrok"})," drives CLI offers the ",(0,s.jsx)(n.code,{children:"--basic-auth"})," flag, which accepts a ",(0,s.jsx)(n.code,{children:"<username>:<password>"})," parameter to specify the authentication for the public virtual drive (if it's required)."]}),"\n",(0,s.jsxs)(n.p,{children:["Alternatively, the authentication can be set using the ",(0,s.jsx)(n.code,{children:"ZROK_DRIVES_BASIC_AUTH"})," environment variable:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ export ZROK_DRIVES_BASIC_AUTH=username:password\n"})}),"\n",(0,s.jsx)(n.h2,{id:"one-way-synchronization",children:"One-way Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," command includes a ",(0,s.jsx)(n.code,{children:"--sync"})," flag, which only copies files detected as ",(0,s.jsx)(n.em,{children:"modified"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," considers a file with the same modification timestamp and size to be the same. Of course, this is not a strong guarantee that the files are equivalent. Future ",(0,s.jsx)(n.code,{children:"zrok"})," drives versions will provide a cryptographically strong mechanism (a-la ",(0,s.jsx)(n.code,{children:"rsync"})," and friends) to guarantee that files and trees of files are synchronized."]}),"\n",(0,s.jsxs)(n.p,{children:["For now, the ",(0,s.jsx)(n.code,{children:"--sync"})," flag provides a convenience mechanism to allow resuming copies of large file trees and provide a reasonable guarantee that the trees are in sync."]}),"\n",(0,s.jsxs)(n.p,{children:["Let's take a look at ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," in action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.636] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 0.760] INFO zrok/drives/sync.OneWay: => /_attic/network/\n[ 0.816] INFO zrok/drives/sync.OneWay: => /_attic/network/_category_.json\n[ 0.928] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/\n[ 0.987] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.service\n[ 1.048] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-ctrl.yml\n[ 1.107] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.service\n[ 1.167] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/ziti-router0.yml\n[ 1.218] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-access-public.service\n[ 1.273] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.service\n[ 1.328] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok-ctrl.yml\n[ 1.382] INFO zrok/drives/sync.OneWay: => /_attic/network/prod/zrok.io-network-skeleton.md\n[ 1.447] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 1.572] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n[ 1.622] INFO zrok/drives/sync.OneWay: => /_attic/sharing/_category_.json\n[ 1.673] INFO zrok/drives/sync.OneWay: => /_attic/sharing/reserved_services.md\n[ 1.737] INFO zrok/drives/sync.OneWay: => /_attic/sharing/sharing_modes.md\n[ 1.793] INFO zrok/drives/sync.OneWay: => /_attic/v0.2_account_requests.md\n[ 1.902] INFO zrok/drives/sync.OneWay: => /_attic/v0.4_limits.md\n...\n[ 9.691] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 9.812] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 9.870] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because the target drive was empty, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," copied the entire contents of the local ",(0,s.jsx)(n.code,{children:"docs/"})," tree into the virtual drive. However, if we run that command again, we get:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.p,{children:"The virtual drive contents are already in sync with the local filesystem tree, so there is nothing for it to copy."}),"\n",(0,s.jsxs)(n.p,{children:["Let's alter the contents of the drive and run the ",(0,s.jsx)(n.code,{children:"--sync"})," again:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok rm https://glmv049c62p7.share.zrok.io/images\n$ zrok copy --sync docs/ https://glmv049c62p7.share.zrok.io\n[ 0.364] INFO zrok/drives/sync.OneWay: => /images/\n[ 0.456] INFO zrok/drives/sync.OneWay: => /images/zrok.png\n[ 0.795] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 0.866] INFO zrok/drives/sync.OneWay: => /images/zrok_deployment.drawio\n...\n[ 2.254] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_empty_shares.png\n[ 2.340] INFO zrok/drives/sync.OneWay: => /images/zrok_web_ui_new_environment.png\n[ 2.391] INFO zrok/drives/sync.OneWay: => /images/zrok_zoom_to_fit.png\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Because we removed the ",(0,s.jsx)(n.code,{children:"images/"})," tree from the virtual drive, ",(0,s.jsx)(n.code,{children:"zrok copy --sync"})," detected this and copied the local ",(0,s.jsx)(n.code,{children:"images/"})," tree back onto the virtual drive."]}),"\n",(0,s.jsx)(n.h2,{id:"drive-to-drive-copies-and-synchronization",children:"Drive-to-Drive Copies and Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok copy"})," CLI can operate on pairs of virtual drives remotely, without ever having to store files locally. This allow for drive-to-drive copies and synchronization."]}),"\n",(0,s.jsx)(n.p,{children:"Here are a couple of examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io https://glmv049c62p7.share.zrok.io\ncopy complete!\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Specifying the same URL for both the source and the target of a ",(0,s.jsx)(n.code,{children:"--sync"})," operation should always result in nothing being copied... they are the same drive with the same state."]}),"\n",(0,s.jsx)(n.p,{children:"We can copy files between two virtual drives with a single command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\n[ 1.396] INFO zrok/drives/sync.OneWay: => /_attic/\n[ 2.083] INFO zrok/drives/sync.OneWay: => /_attic/overview.md\n[ 2.704] INFO zrok/drives/sync.OneWay: => /_attic/sharing/\n...\n[ 118.240] INFO zrok/drives/sync.OneWay: => /images/zrok_web_console_empty.png\n[ 118.920] INFO zrok/drives/sync.OneWay: => /images/zrok_enable_modal.png\n[ 119.589] INFO zrok/drives/sync.OneWay: => /images/zrok_cover.png\n[ 120.214] INFO zrok/drives/sync.OneWay: => /getting-started.mdx\ncopy complete!\n$ zrok copy --sync https://glmv049c62p7.share.zrok.io zrok://hsml272j3xzf\ncopy complete!\n"})}),"\n",(0,s.jsx)(n.h2,{id:"copying-from-drives-to-the-local-filesystem",children:"Copying from Drives to the Local Filesystem"}),"\n",(0,s.jsxs)(n.p,{children:["In the current version of the drives CLI, ",(0,s.jsx)(n.code,{children:"zrok copy"})," always assumes the destination is a directory. There is currently no way to do:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy somefile someotherfile\n"})}),"\n",(0,s.jsx)(n.p,{children:"What you'll end up with on the local filesystem is:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"somefile\nsomeotherfile/somefile\n"})}),"\n",(0,s.jsxs)(n.p,{children:["It's in the backlog to support file destinations in a future release of ",(0,s.jsx)(n.code,{children:"zrok"}),". So, when using ",(0,s.jsx)(n.code,{children:"zrok copy"}),", always take note of the destination."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"zrok copy"})," supports a default destination of ",(0,s.jsx)(n.code,{children:"file://."}),", so you can do single parameter ",(0,s.jsx)(n.code,{children:"zrok copy"})," commands like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls https://azc47r3cwjds.share.zrok.io\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE\n[ 0.260] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete!\n$ ls -l\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:29 LICENSE\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can also specify a local folder as the destination for your copy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok copy https://azc47r3cwjds.share.zrok.io/LICENSE /tmp/inbox\n[ 0.221] INFO zrok/drives/sync.OneWay: => /LICENSE\ncopy complete! \n$ l /tmp/inbox\ntotal 12\n-rw-rw-r-- 1 michael michael 11346 Jan 19 13:30 LICENSE\n"})}),"\n",(0,s.jsx)(n.h2,{id:"unique-names-and-reserved-shares",children:"Unique Names and Reserved Shares"}),"\n",(0,s.jsx)(n.p,{children:"Private reserved shares with unque names can be particularly useful with the drives CLI:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok reserve private -b drive --unique-name mydrive /tmp/junk\n[ 0.315] INFO main.(*reserveCommand).run: your reserved share token is 'mydrive'\n$ zrok share reserved --headless mydrive\n[ 0.289] INFO main.(*shareReservedCommand).run: sharing target: '/tmp/junk'\n[ 0.289] INFO main.(*shareReservedCommand).run: using existing backend target: /tmp/junk\n[ 0.767] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[d519a436-9fb5-4207-afd5-7cbc28fb779a]} new service session\n[ 0.927] INFO main.(*shareReservedCommand).run: use this command to access your zrok share: 'zrok access private mydrive'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This makes working with ",(0,s.jsx)(n.code,{children:"zrok://"})," URLs particularly convenient:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ zrok ls zrok://mydrive\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 TYPE \u2502 NAME \u2502 SIZE \u2502 MODIFIED \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502 LICENSE \u2502 11.3 kB \u2502 2023-07-21 13:17:56 -0400 EDT \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"future-enhancements",children:"Future Enhancements"}),"\n",(0,s.jsxs)(n.p,{children:["Coming in a future release of ",(0,s.jsx)(n.code,{children:"zrok"})," drives are features like:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'two-way synchronization between multiple hosts... allowing for shared "dropbox-like" usage scenarios between multiple environments'}),"\n",(0,s.jsx)(n.li,{children:"better ergonomics for single-file destinations"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>c});var i=r(6540);const s={},o=i.createContext(s);function t(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8dbf8f84.b796122d.js b/assets/js/8dbf8f84.3f2e467f.js similarity index 99% rename from assets/js/8dbf8f84.b796122d.js rename to assets/js/8dbf8f84.3f2e467f.js index a7c08b2c..c29e5148 100644 --- a/assets/js/8dbf8f84.b796122d.js +++ b/assets/js/8dbf8f84.3f2e467f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5117],{9754:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-limits","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md","tags":[],"version":"0.4","sidebarPosition":40,"frontMatter":{"sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Configuring Metrics","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics"},"next":{"title":"OAuth","permalink":"/docs/0.4/category/oauth"}}');var s=n(4848),a=n(8453);const r={sidebar_position:40},l="Configuring Limits",o={},c=[{value:"Understanding the zrok Limits Agent",id:"understanding-the-zrok-limits-agent",level:2},{value:"Types of Limits",id:"types-of-limits",level:3},{value:"The Global Configuration",id:"the-global-configuration",level:2},{value:"Global Resouce Count Limits",id:"global-resouce-count-limits",level:3},{value:"Global Bandwidth Limits",id:"global-bandwidth-limits",level:3},{value:"Limit Classes",id:"limit-classes",level:2},{value:"Unscoped Resource Count Classes",id:"unscoped-resource-count-classes",level:3},{value:"Unscoped Bandwidth Classes",id:"unscoped-bandwidth-classes",level:3},{value:"Scoped Classes",id:"scoped-classes",level:3},{value:"Limit Actions",id:"limit-actions",level:2},{value:"Unlimited Accounts",id:"unlimited-accounts",level:2},{value:"Experimental Limits Locking",id:"experimental-limits-locking",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Aggregate Bandwidth",id:"aggregate-bandwidth",level:3},{value:"Administration Through SQL",id:"administration-through-sql",level:3},{value:"Performance",id:"performance",level:3}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"configuring-limits",children:"Configuring Limits"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["This guide is current as of zrok version ",(0,s.jsx)(i.code,{children:"v0.4.31"}),"."]})}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["If you have not yet configured ",(0,s.jsx)(i.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics"}),", please visit the ",(0,s.jsx)(i.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics guide"})," first before working through the limits configuration."]})}),"\n",(0,s.jsx)(i.h2,{id:"understanding-the-zrok-limits-agent",children:"Understanding the zrok Limits Agent"}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is a component of the zrok controller. It can be enabled and configured through the zrok controller configuration."}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is responsible for controlling the number of resources in use (environments, shares, etc.) and also for ensuring that accounts are held below the configured data transfer bandwidth thresholds. The limits agent exists to manage resource consumption for larger, multi-user zrok installations."}),"\n",(0,s.jsx)(i.h3,{id:"types-of-limits",children:"Types of Limits"}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified that control the number of environments, shares, reserved shares, unique names, and frontends per-share that can be created by an account. Limits that control the allowed number of resources are called ",(0,s.jsx)(i.em,{children:"resource count limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified to control the amount of data that can be transferred within a time period. Limits that control the amount of data that can be transferred are called ",(0,s.jsx)(i.em,{children:"bandwidth limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["zrok limits can be specified ",(0,s.jsx)(i.em,{children:"globally"}),", applying to all users in a service instance. Limit ",(0,s.jsx)(i.em,{children:"classes"})," can be created to provide additional levels of resource allocation. Limit classes can then be ",(0,s.jsx)(i.em,{children:"applied"})," to multiple accounts, to alter their limit allocation beyond what's configured in the global configuration."]}),"\n",(0,s.jsx)(i.h2,{id:"the-global-configuration",children:"The Global Configuration"}),"\n",(0,s.jsxs)(i.p,{children:["The reference configuration for the zrok controller (found at ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok/blob/main/etc/ctrl.yml",children:(0,s.jsx)(i.code,{children:"etc/ctrl.yaml"})})," in the ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok",children:"repository"}),") contains the global limits configuration, which looks like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"# Service instance limits global configuration.\n#\n# See `docs/guides/metrics-and-limits/configuring-limits.md` for details.\n#\nlimits:\n environments: -1\n shares: -1\n reserved_shares: -1\n unique_names: -1\n share_frontends: -1\n bandwidth:\n period: 5m\n warning:\n rx: -1\n tx: -1\n total: 7242880\n limit:\n rx: -1\n tx: -1\n total: 10485760\n enforcing: false\n cycle: 5m\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["A value of ",(0,s.jsx)(i.code,{children:"-1"})," appearing in the limits configuration mean the value is ",(0,s.jsx)(i.em,{children:"unlimited"}),"."]})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"enforcing"})," boolean specifies whether or not limits are enabled in the service instance. By default, limits is disabled. No matter what else is configured in this stanza, if ",(0,s.jsx)(i.code,{children:"enforcing"})," is set to ",(0,s.jsx)(i.code,{children:"false"}),", there will be no limits placed on any account in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"cycle"}),' value controls how frequently the limits agent will evaluate enforced limits. When a user exceeds a limit and has their shares disabled, the limits agent will evaluate their bandwidth usage on this interval looking to "relax" the limit once their usage falls below the threshold.']}),"\n",(0,s.jsx)(i.h3,{id:"global-resouce-count-limits",children:"Global Resouce Count Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", ",(0,s.jsx)(i.code,{children:"unique_names"}),", and ",(0,s.jsx)(i.code,{children:"share_frontends"})," specify the resource count limits, globally for the service instance."]}),"\n",(0,s.jsx)(i.p,{children:"These resource counts will be applied to all users in the service instance by default."}),"\n",(0,s.jsx)(i.h3,{id:"global-bandwidth-limits",children:"Global Bandwidth Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"bandwidth"})," section defines the global bandwidth limits for all users in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["There are two levels of bandwidth limits that can be specified in the global configuration. The first limit defines a ",(0,s.jsx)(i.em,{children:"warning"})," threshold where the user will receive an email that they are using increased data transfer amounts and will ultimately be subject to a limit. If you do not want this warning email to be sent, then configure all of the values to ",(0,s.jsx)(i.code,{children:"-1"})," (unlimited)."]}),"\n",(0,s.jsxs)(i.p,{children:["The second limit defines the the actual ",(0,s.jsx)(i.em,{children:"limit"})," threshold, where the limits agent will disabled traffic for the account's shares."]}),"\n",(0,s.jsxs)(i.p,{children:["Bandwidth limits can be specified in terms of ",(0,s.jsx)(i.code,{children:"tx"})," (or ",(0,s.jsx)(i.em,{children:"transmitted"})," data), ",(0,s.jsx)(i.code,{children:"rx"})," (or ",(0,s.jsx)(i.em,{children:"received"})," data), and the ",(0,s.jsx)(i.code,{children:"total"})," bytes that are sent in either direction. If you only want to set the ",(0,s.jsx)(i.code,{children:"total"})," transferred limit, you can set ",(0,s.jsx)(i.code,{children:"rx"})," and ",(0,s.jsx)(i.code,{children:"tx"})," to ",(0,s.jsx)(i.code,{children:"-1"})," (for ",(0,s.jsx)(i.em,{children:"unlimited"}),"). You can configure any combination of these these values at either the limit or warning levels."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"period"})," specifies the time window for the bandwidth limit. See the documentation for ",(0,s.jsx)(i.a,{href:"https://pkg.go.dev/time#ParseDuration",children:(0,s.jsx)(i.code,{children:"time.Duration.ParseDuration"})})," for details about the format used for these durations. If the ",(0,s.jsx)(i.code,{children:"period"})," is set to 5 minutes, then the limits agent will monitor the transmitted and receivde traffic for the account for the last 5 minutes, and if the amount of data is greater than either the ",(0,s.jsx)(i.code,{children:"warning"})," or the ",(0,s.jsx)(i.code,{children:"limit"})," threshold, action will be taken."]}),"\n",(0,s.jsxs)(i.p,{children:["In the global configuration example above users are allowed to transfer a total of ",(0,s.jsx)(i.code,{children:"10485760"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period, and they will receive a warning email after they transfer more than ",(0,s.jsx)(i.code,{children:"7242880"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period."]}),"\n",(0,s.jsx)(i.h2,{id:"limit-classes",children:"Limit Classes"}),"\n",(0,s.jsxs)(i.p,{children:["The zrok limits agent includes a concept called ",(0,s.jsx)(i.em,{children:"limit classes"}),". Limit classes can be used to define resource count and bandwidth limits that can be selectively applied to individual accounts in a service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["Limit classes are created by creating a record in the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table in the zrok controller database. The table has this schema:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.limit_classes (\n id integer NOT NULL,\n label VARCHAR(32),\n backend_mode public.backend_mode,\n environments integer DEFAULT '-1'::integer NOT NULL,\n shares integer DEFAULT '-1'::integer NOT NULL,\n reserved_shares integer DEFAULT '-1'::integer NOT NULL,\n unique_names integer DEFAULT '-1'::integer NOT NULL,\n share_frontends integer DEFAULT '-1'::integer NOT NULL,\n period_minutes integer DEFAULT 1440 NOT NULL,\n rx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n tx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n total_bytes bigint DEFAULT '-1'::integer NOT NULL,\n limit_action public.limit_action DEFAULT 'limit'::public.limit_action NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n\n"})}),"\n",(0,s.jsx)(i.p,{children:"This schema supports constructing the 3 different types of limits classes that the system supports."}),"\n",(0,s.jsxs)(i.p,{children:["After defining a limit class in the database, it can be applied to specific user accounts (overriding the relevant parts of the global configuration) by inserting a row into the ",(0,s.jsx)(i.code,{children:"applied_limit_classes"})," table:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.applied_limit_classes (\n id integer NOT NULL,\n account_id integer NOT NULL,\n limit_class_id integer NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Create a row in this table linking the ",(0,s.jsx)(i.code,{children:"account_id"})," to the ",(0,s.jsx)(i.code,{children:"limit_class_id"})," to apply the limit class to a specific user account."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-resource-count-classes",children:"Unscoped Resource Count Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the resource count limits defined in the global limits configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (environments, shares, reserved_shares, unique_names, share_frontends) values (1, 1, 1, 1, 1);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This creates a limit class that sets the ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"})," all to ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account those values would override the default resource count values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped resource count class ",(0,s.jsx)(i.em,{children:"does not"})," affect the bandwidth limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-bandwidth-classes",children:"Unscoped Bandwidth Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the bandwidth limits defined in the global configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (period_minutes, total_bytes, limit_action) values (2, 204800, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This inserts a limit class that allows for a total bandwidth transfer of ",(0,s.jsx)(i.code,{children:"204800"})," bytes every ",(0,s.jsx)(i.code,{children:"2"})," minutes."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account, those values would override the default bandwidth values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped bandwidth class ",(0,s.jsx)(i.em,{children:"does not"})," affect the resource count limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"scoped-classes",children:"Scoped Classes"}),"\n",(0,s.jsxs)(i.p,{children:["A scoped limit class specifies ",(0,s.jsx)(i.em,{children:"both"})," the resource counts (",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"}),", but ",(0,s.jsx)(i.em,{children:"NOT"})," ",(0,s.jsx)(i.code,{children:"environments"}),") for a ",(0,s.jsx)(i.em,{children:"specific"})," backend mode. Insert a row like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (backend_mode, shares, reserved_shares, unique_names, period_minutes, total_bytes, limit_action) values ('web', 2, 1, 1, 2, 4096000, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Scoped limits are designed to ",(0,s.jsx)(i.em,{children:"increase"})," the limits for a specific backend mode beyond what the global configuration and the unscoped classes provide. The general approach is to use the global configuration and the unscoped classes to provide the general account limits, and then the scoped classes can be used to further increase (or potentially ",(0,s.jsx)(i.em,{children:"decrease"}),") the limits for a specific backend mode."]}),"\n",(0,s.jsx)(i.p,{children:"If a scoped limit class exists for a specific backend mode, then the limits agent will use that limit in making a decision about limiting the resource count or bandwidth. All other types of shares will fall back to the unscoped classes or the global configuration."}),"\n",(0,s.jsx)(i.h2,{id:"limit-actions",children:"Limit Actions"}),"\n",(0,s.jsx)(i.p,{children:"When an account exceeds a bandwidth limit, the limits agent will seek to limit the affected shares (based on the combination of global configuration, unscoped limit classes, and scoped limit classes). It applies the limit by removing the underlying OpenZiti dial policies for any frontends that are trying to access the share."}),"\n",(0,s.jsxs)(i.p,{children:["This means that public frontends will simply return a ",(0,s.jsx)(i.code,{children:"404"})," as if the share is no longer there. Private frontends will also return ",(0,s.jsx)(i.code,{children:"404"})," errors. When the limit is relaxed, the dial policies are put back in place and the share will continue operating normally."]}),"\n",(0,s.jsx)(i.h2,{id:"unlimited-accounts",children:"Unlimited Accounts"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"accounts"})," table in the database includes a ",(0,s.jsx)(i.code,{children:"limitless"})," column. When this column is set to ",(0,s.jsx)(i.code,{children:"true"})," the account is not subject to any of the limits in the system."]}),"\n",(0,s.jsx)(i.h2,{id:"experimental-limits-locking",children:"Experimental Limits Locking"}),"\n",(0,s.jsxs)(i.p,{children:["zrok versions prior to ",(0,s.jsx)(i.code,{children:"v0.4.31"})," had a potential race condition when enforcing resource count limits. This usually only manifested in cases where shares or environments were being allocated programmatically (and fast enough to win the limits race)."]}),"\n",(0,s.jsxs)(i.p,{children:["This occurs due to a lack of transactional database locking around the limited structures. ",(0,s.jsx)(i.code,{children:"v0.4.31"})," includes a pessimistic locking facility that can be enabled ",(0,s.jsx)(i.em,{children:"only"})," on the PostgreSQL store implemention."]}),"\n",(0,s.jsxs)(i.p,{children:["If you're running PostgreSQL for your service instance and you want to enable the new experimental locking facility that eliminates the potential resource count race condition, add the ",(0,s.jsx)(i.code,{children:"enable_locking: true"})," flag to your ",(0,s.jsx)(i.code,{children:"store"})," definition:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"store:\n enable_locking: true\n"})}),"\n",(0,s.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,s.jsx)(i.p,{children:"There are a number of caveats that are important to understand when using the limits agent with more complicated limits scenarios:"}),"\n",(0,s.jsx)(i.h3,{id:"aggregate-bandwidth",children:"Aggregate Bandwidth"}),"\n",(0,s.jsx)(i.p,{children:"The zrok limits agent is a work in progress. The system currently does not track bandwidth individually for each backend mode type, which means all bandwidth values are aggregated between all of the share types that an account might be using. This will likely change in an upcoming release."}),"\n",(0,s.jsx)(i.h3,{id:"administration-through-sql",children:"Administration Through SQL"}),"\n",(0,s.jsx)(i.p,{children:"There are currently no administrative API endpoints (or corresponding CLI tools) to support creating and applying limit classes in the current release. The limits agent infrastructure was designed to support software integrations that directly manipulate the underlying database structures."}),"\n",(0,s.jsx)(i.p,{children:"A future release may provide API and CLI tooling to support the human administration of the limits agent."}),"\n",(0,s.jsx)(i.h3,{id:"performance",children:"Performance"}),"\n",(0,s.jsxs)(i.p,{children:["Be sure to minimize the number of different periods used for specifying bandwidth limits. Specifying limits in multiple different periods can cause a multiplicity of queries to be executed against the metrics store (InfluxDB). Standardizing on a period like ",(0,s.jsx)(i.code,{children:"24h"})," or ",(0,s.jsx)(i.code,{children:"6h"})," and using that consistently is the best way to to manage the performance of the metrics store."]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>l});var t=n(6540);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5117],{4836:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","title":"Configuring Limits","description":"This guide is current as of zrok version v0.4.31.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-limits","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md","tags":[],"version":"0.4","sidebarPosition":40,"frontMatter":{"sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"Configuring Metrics","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics"},"next":{"title":"OAuth","permalink":"/docs/0.4/category/oauth"}}');var s=n(4848),a=n(8453);const r={sidebar_position:40},l="Configuring Limits",o={},c=[{value:"Understanding the zrok Limits Agent",id:"understanding-the-zrok-limits-agent",level:2},{value:"Types of Limits",id:"types-of-limits",level:3},{value:"The Global Configuration",id:"the-global-configuration",level:2},{value:"Global Resouce Count Limits",id:"global-resouce-count-limits",level:3},{value:"Global Bandwidth Limits",id:"global-bandwidth-limits",level:3},{value:"Limit Classes",id:"limit-classes",level:2},{value:"Unscoped Resource Count Classes",id:"unscoped-resource-count-classes",level:3},{value:"Unscoped Bandwidth Classes",id:"unscoped-bandwidth-classes",level:3},{value:"Scoped Classes",id:"scoped-classes",level:3},{value:"Limit Actions",id:"limit-actions",level:2},{value:"Unlimited Accounts",id:"unlimited-accounts",level:2},{value:"Experimental Limits Locking",id:"experimental-limits-locking",level:2},{value:"Caveats",id:"caveats",level:2},{value:"Aggregate Bandwidth",id:"aggregate-bandwidth",level:3},{value:"Administration Through SQL",id:"administration-through-sql",level:3},{value:"Performance",id:"performance",level:3}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"configuring-limits",children:"Configuring Limits"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["This guide is current as of zrok version ",(0,s.jsx)(i.code,{children:"v0.4.31"}),"."]})}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["If you have not yet configured ",(0,s.jsx)(i.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics"}),", please visit the ",(0,s.jsx)(i.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"metrics guide"})," first before working through the limits configuration."]})}),"\n",(0,s.jsx)(i.h2,{id:"understanding-the-zrok-limits-agent",children:"Understanding the zrok Limits Agent"}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is a component of the zrok controller. It can be enabled and configured through the zrok controller configuration."}),"\n",(0,s.jsx)(i.p,{children:"The limits agent is responsible for controlling the number of resources in use (environments, shares, etc.) and also for ensuring that accounts are held below the configured data transfer bandwidth thresholds. The limits agent exists to manage resource consumption for larger, multi-user zrok installations."}),"\n",(0,s.jsx)(i.h3,{id:"types-of-limits",children:"Types of Limits"}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified that control the number of environments, shares, reserved shares, unique names, and frontends per-share that can be created by an account. Limits that control the allowed number of resources are called ",(0,s.jsx)(i.em,{children:"resource count limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Limits can be specified to control the amount of data that can be transferred within a time period. Limits that control the amount of data that can be transferred are called ",(0,s.jsx)(i.em,{children:"bandwidth limits"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["zrok limits can be specified ",(0,s.jsx)(i.em,{children:"globally"}),", applying to all users in a service instance. Limit ",(0,s.jsx)(i.em,{children:"classes"})," can be created to provide additional levels of resource allocation. Limit classes can then be ",(0,s.jsx)(i.em,{children:"applied"})," to multiple accounts, to alter their limit allocation beyond what's configured in the global configuration."]}),"\n",(0,s.jsx)(i.h2,{id:"the-global-configuration",children:"The Global Configuration"}),"\n",(0,s.jsxs)(i.p,{children:["The reference configuration for the zrok controller (found at ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok/blob/main/etc/ctrl.yml",children:(0,s.jsx)(i.code,{children:"etc/ctrl.yaml"})})," in the ",(0,s.jsx)(i.a,{href:"https://github.com/openziti/zrok",children:"repository"}),") contains the global limits configuration, which looks like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"# Service instance limits global configuration.\n#\n# See `docs/guides/metrics-and-limits/configuring-limits.md` for details.\n#\nlimits:\n environments: -1\n shares: -1\n reserved_shares: -1\n unique_names: -1\n share_frontends: -1\n bandwidth:\n period: 5m\n warning:\n rx: -1\n tx: -1\n total: 7242880\n limit:\n rx: -1\n tx: -1\n total: 10485760\n enforcing: false\n cycle: 5m\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsxs)(i.p,{children:["A value of ",(0,s.jsx)(i.code,{children:"-1"})," appearing in the limits configuration mean the value is ",(0,s.jsx)(i.em,{children:"unlimited"}),"."]})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"enforcing"})," boolean specifies whether or not limits are enabled in the service instance. By default, limits is disabled. No matter what else is configured in this stanza, if ",(0,s.jsx)(i.code,{children:"enforcing"})," is set to ",(0,s.jsx)(i.code,{children:"false"}),", there will be no limits placed on any account in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"cycle"}),' value controls how frequently the limits agent will evaluate enforced limits. When a user exceeds a limit and has their shares disabled, the limits agent will evaluate their bandwidth usage on this interval looking to "relax" the limit once their usage falls below the threshold.']}),"\n",(0,s.jsx)(i.h3,{id:"global-resouce-count-limits",children:"Global Resouce Count Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", ",(0,s.jsx)(i.code,{children:"unique_names"}),", and ",(0,s.jsx)(i.code,{children:"share_frontends"})," specify the resource count limits, globally for the service instance."]}),"\n",(0,s.jsx)(i.p,{children:"These resource counts will be applied to all users in the service instance by default."}),"\n",(0,s.jsx)(i.h3,{id:"global-bandwidth-limits",children:"Global Bandwidth Limits"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"bandwidth"})," section defines the global bandwidth limits for all users in the service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["There are two levels of bandwidth limits that can be specified in the global configuration. The first limit defines a ",(0,s.jsx)(i.em,{children:"warning"})," threshold where the user will receive an email that they are using increased data transfer amounts and will ultimately be subject to a limit. If you do not want this warning email to be sent, then configure all of the values to ",(0,s.jsx)(i.code,{children:"-1"})," (unlimited)."]}),"\n",(0,s.jsxs)(i.p,{children:["The second limit defines the the actual ",(0,s.jsx)(i.em,{children:"limit"})," threshold, where the limits agent will disabled traffic for the account's shares."]}),"\n",(0,s.jsxs)(i.p,{children:["Bandwidth limits can be specified in terms of ",(0,s.jsx)(i.code,{children:"tx"})," (or ",(0,s.jsx)(i.em,{children:"transmitted"})," data), ",(0,s.jsx)(i.code,{children:"rx"})," (or ",(0,s.jsx)(i.em,{children:"received"})," data), and the ",(0,s.jsx)(i.code,{children:"total"})," bytes that are sent in either direction. If you only want to set the ",(0,s.jsx)(i.code,{children:"total"})," transferred limit, you can set ",(0,s.jsx)(i.code,{children:"rx"})," and ",(0,s.jsx)(i.code,{children:"tx"})," to ",(0,s.jsx)(i.code,{children:"-1"})," (for ",(0,s.jsx)(i.em,{children:"unlimited"}),"). You can configure any combination of these these values at either the limit or warning levels."]}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"period"})," specifies the time window for the bandwidth limit. See the documentation for ",(0,s.jsx)(i.a,{href:"https://pkg.go.dev/time#ParseDuration",children:(0,s.jsx)(i.code,{children:"time.Duration.ParseDuration"})})," for details about the format used for these durations. If the ",(0,s.jsx)(i.code,{children:"period"})," is set to 5 minutes, then the limits agent will monitor the transmitted and receivde traffic for the account for the last 5 minutes, and if the amount of data is greater than either the ",(0,s.jsx)(i.code,{children:"warning"})," or the ",(0,s.jsx)(i.code,{children:"limit"})," threshold, action will be taken."]}),"\n",(0,s.jsxs)(i.p,{children:["In the global configuration example above users are allowed to transfer a total of ",(0,s.jsx)(i.code,{children:"10485760"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period, and they will receive a warning email after they transfer more than ",(0,s.jsx)(i.code,{children:"7242880"})," bytes in a ",(0,s.jsx)(i.code,{children:"5m"})," period."]}),"\n",(0,s.jsx)(i.h2,{id:"limit-classes",children:"Limit Classes"}),"\n",(0,s.jsxs)(i.p,{children:["The zrok limits agent includes a concept called ",(0,s.jsx)(i.em,{children:"limit classes"}),". Limit classes can be used to define resource count and bandwidth limits that can be selectively applied to individual accounts in a service instance."]}),"\n",(0,s.jsxs)(i.p,{children:["Limit classes are created by creating a record in the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table in the zrok controller database. The table has this schema:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.limit_classes (\n id integer NOT NULL,\n label VARCHAR(32),\n backend_mode public.backend_mode,\n environments integer DEFAULT '-1'::integer NOT NULL,\n shares integer DEFAULT '-1'::integer NOT NULL,\n reserved_shares integer DEFAULT '-1'::integer NOT NULL,\n unique_names integer DEFAULT '-1'::integer NOT NULL,\n share_frontends integer DEFAULT '-1'::integer NOT NULL,\n period_minutes integer DEFAULT 1440 NOT NULL,\n rx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n tx_bytes bigint DEFAULT '-1'::integer NOT NULL,\n total_bytes bigint DEFAULT '-1'::integer NOT NULL,\n limit_action public.limit_action DEFAULT 'limit'::public.limit_action NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n\n"})}),"\n",(0,s.jsx)(i.p,{children:"This schema supports constructing the 3 different types of limits classes that the system supports."}),"\n",(0,s.jsxs)(i.p,{children:["After defining a limit class in the database, it can be applied to specific user accounts (overriding the relevant parts of the global configuration) by inserting a row into the ",(0,s.jsx)(i.code,{children:"applied_limit_classes"})," table:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE TABLE public.applied_limit_classes (\n id integer NOT NULL,\n account_id integer NOT NULL,\n limit_class_id integer NOT NULL,\n created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,\n deleted boolean DEFAULT false NOT NULL\n);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Create a row in this table linking the ",(0,s.jsx)(i.code,{children:"account_id"})," to the ",(0,s.jsx)(i.code,{children:"limit_class_id"})," to apply the limit class to a specific user account."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-resource-count-classes",children:"Unscoped Resource Count Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the resource count limits defined in the global limits configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (environments, shares, reserved_shares, unique_names, share_frontends) values (1, 1, 1, 1, 1);\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This creates a limit class that sets the ",(0,s.jsx)(i.code,{children:"environments"}),", ",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"})," all to ",(0,s.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account those values would override the default resource count values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped resource count class ",(0,s.jsx)(i.em,{children:"does not"})," affect the bandwidth limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"unscoped-bandwidth-classes",children:"Unscoped Bandwidth Classes"}),"\n",(0,s.jsxs)(i.p,{children:["To support overriding the bandwidth limits defined in the global configuration, a site administrator can create a limit class by inserting a row into the ",(0,s.jsx)(i.code,{children:"limit_classes"})," table structured like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (period_minutes, total_bytes, limit_action) values (2, 204800, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["This inserts a limit class that allows for a total bandwidth transfer of ",(0,s.jsx)(i.code,{children:"204800"})," bytes every ",(0,s.jsx)(i.code,{children:"2"})," minutes."]}),"\n",(0,s.jsx)(i.p,{children:"When this limit class is applied to a user account, those values would override the default bandwidth values configured globally."}),"\n",(0,s.jsxs)(i.p,{children:["Applying an unscoped bandwidth class ",(0,s.jsx)(i.em,{children:"does not"})," affect the resource count limits (either globally configured, or via a limit class)."]}),"\n",(0,s.jsx)(i.h3,{id:"scoped-classes",children:"Scoped Classes"}),"\n",(0,s.jsxs)(i.p,{children:["A scoped limit class specifies ",(0,s.jsx)(i.em,{children:"both"})," the resource counts (",(0,s.jsx)(i.code,{children:"shares"}),", ",(0,s.jsx)(i.code,{children:"reserved_shares"}),", and ",(0,s.jsx)(i.code,{children:"unique_names"}),", but ",(0,s.jsx)(i.em,{children:"NOT"})," ",(0,s.jsx)(i.code,{children:"environments"}),") for a ",(0,s.jsx)(i.em,{children:"specific"})," backend mode. Insert a row like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"insert into limit_classes (backend_mode, shares, reserved_shares, unique_names, period_minutes, total_bytes, limit_action) values ('web', 2, 1, 1, 2, 4096000, 'limit');\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Scoped limits are designed to ",(0,s.jsx)(i.em,{children:"increase"})," the limits for a specific backend mode beyond what the global configuration and the unscoped classes provide. The general approach is to use the global configuration and the unscoped classes to provide the general account limits, and then the scoped classes can be used to further increase (or potentially ",(0,s.jsx)(i.em,{children:"decrease"}),") the limits for a specific backend mode."]}),"\n",(0,s.jsx)(i.p,{children:"If a scoped limit class exists for a specific backend mode, then the limits agent will use that limit in making a decision about limiting the resource count or bandwidth. All other types of shares will fall back to the unscoped classes or the global configuration."}),"\n",(0,s.jsx)(i.h2,{id:"limit-actions",children:"Limit Actions"}),"\n",(0,s.jsx)(i.p,{children:"When an account exceeds a bandwidth limit, the limits agent will seek to limit the affected shares (based on the combination of global configuration, unscoped limit classes, and scoped limit classes). It applies the limit by removing the underlying OpenZiti dial policies for any frontends that are trying to access the share."}),"\n",(0,s.jsxs)(i.p,{children:["This means that public frontends will simply return a ",(0,s.jsx)(i.code,{children:"404"})," as if the share is no longer there. Private frontends will also return ",(0,s.jsx)(i.code,{children:"404"})," errors. When the limit is relaxed, the dial policies are put back in place and the share will continue operating normally."]}),"\n",(0,s.jsx)(i.h2,{id:"unlimited-accounts",children:"Unlimited Accounts"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"accounts"})," table in the database includes a ",(0,s.jsx)(i.code,{children:"limitless"})," column. When this column is set to ",(0,s.jsx)(i.code,{children:"true"})," the account is not subject to any of the limits in the system."]}),"\n",(0,s.jsx)(i.h2,{id:"experimental-limits-locking",children:"Experimental Limits Locking"}),"\n",(0,s.jsxs)(i.p,{children:["zrok versions prior to ",(0,s.jsx)(i.code,{children:"v0.4.31"})," had a potential race condition when enforcing resource count limits. This usually only manifested in cases where shares or environments were being allocated programmatically (and fast enough to win the limits race)."]}),"\n",(0,s.jsxs)(i.p,{children:["This occurs due to a lack of transactional database locking around the limited structures. ",(0,s.jsx)(i.code,{children:"v0.4.31"})," includes a pessimistic locking facility that can be enabled ",(0,s.jsx)(i.em,{children:"only"})," on the PostgreSQL store implemention."]}),"\n",(0,s.jsxs)(i.p,{children:["If you're running PostgreSQL for your service instance and you want to enable the new experimental locking facility that eliminates the potential resource count race condition, add the ",(0,s.jsx)(i.code,{children:"enable_locking: true"})," flag to your ",(0,s.jsx)(i.code,{children:"store"})," definition:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"store:\n enable_locking: true\n"})}),"\n",(0,s.jsx)(i.h2,{id:"caveats",children:"Caveats"}),"\n",(0,s.jsx)(i.p,{children:"There are a number of caveats that are important to understand when using the limits agent with more complicated limits scenarios:"}),"\n",(0,s.jsx)(i.h3,{id:"aggregate-bandwidth",children:"Aggregate Bandwidth"}),"\n",(0,s.jsx)(i.p,{children:"The zrok limits agent is a work in progress. The system currently does not track bandwidth individually for each backend mode type, which means all bandwidth values are aggregated between all of the share types that an account might be using. This will likely change in an upcoming release."}),"\n",(0,s.jsx)(i.h3,{id:"administration-through-sql",children:"Administration Through SQL"}),"\n",(0,s.jsx)(i.p,{children:"There are currently no administrative API endpoints (or corresponding CLI tools) to support creating and applying limit classes in the current release. The limits agent infrastructure was designed to support software integrations that directly manipulate the underlying database structures."}),"\n",(0,s.jsx)(i.p,{children:"A future release may provide API and CLI tooling to support the human administration of the limits agent."}),"\n",(0,s.jsx)(i.h3,{id:"performance",children:"Performance"}),"\n",(0,s.jsxs)(i.p,{children:["Be sure to minimize the number of different periods used for specifying bandwidth limits. Specifying limits in multiple different periods can cause a multiplicity of queries to be executed against the metrics store (InfluxDB). Standardizing on a period like ",(0,s.jsx)(i.code,{children:"24h"})," or ",(0,s.jsx)(i.code,{children:"6h"})," and using that consistently is the best way to to manage the performance of the metrics store."]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>l});var t=n(6540);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/901ef07d.08f99ecd.js b/assets/js/901ef07d.b8ef613e.js similarity index 99% rename from assets/js/901ef07d.08f99ecd.js rename to assets/js/901ef07d.b8ef613e.js index 0f9db849..ef8d12a0 100644 --- a/assets/js/901ef07d.08f99ecd.js +++ b/assets/js/901ef07d.b8ef613e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9033],{8628:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","source":"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-metrics","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Metrics and Limits","permalink":"/docs/0.4/category/metrics-and-limits"},"next":{"title":"Configuring Limits","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits"}}');var r=i(4848),o=i(8453);const s={sidebar_position:20},c="Configuring Metrics",l={},a=[{value:"Configuring the OpenZiti Controller",id:"configuring-the-openziti-controller",level:2},{value:"Configuring the zrok Metrics Bridge",id:"configuring-the-zrok-metrics-bridge",level:2},{value:"RabbitMQ",id:"rabbitmq",level:3},{value:"Configuring zrok Metrics",id:"configuring-zrok-metrics",level:2},{value:"Testing Metrics",id:"testing-metrics",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"configuring-metrics",children:"Configuring Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["A fully configured, production-scale ",(0,r.jsx)(n.code,{children:"zrok"})," service instance looks like this:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok Metrics Architecture",src:i(6499).A+"",width:"381",height:"492"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"})," metrics builds on top of the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller has several ways to consume ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events. Smaller installations could be configured in these ways:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok simplified metrics architecture",src:i(7556).A+"",width:"522",height:"322"})}),"\n",(0,r.jsxs)(n.p,{children:["Environments that horizontally scale the ",(0,r.jsx)(n.code,{children:"zrok"}),' control plane with multiple controllers should use an AMQP-based queue to "fan out" the metrics workload across the entire control plane. Simpler installations that use a single ',(0,r.jsx)(n.code,{children:"zrok"})," controller can collect ",(0,r.jsx)(n.code,{children:"fabric.usage"}),' events from the OpenZiti controller by "tailing" the events log file, or collecting them from the OpenZiti controller\'s websocket implementation.']}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-openziti-controller",children:"Configuring the OpenZiti Controller"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["This requires a version of OpenZiti with a ",(0,r.jsx)(n.code,{children:"fabric"})," dependency of ",(0,r.jsx)(n.code,{children:"v0.22.52"})," or newer, which is satisfed by the ",(0,r.jsx)(n.code,{children:"v0.27.6"})," release of OpenZiti Controller."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Emitting ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file is currently the most reliable mechanism to capture usage events into ",(0,r.jsx)(n.code,{children:"zrok"}),". We're going to configure the OpenZiti controller to append ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file, by adding this stanza to the OpenZiti controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"events:\n jsonLogger:\n subscriptions:\n - type: fabric.usage\n version: 3\n handler:\n type: file\n format: json\n path: /tmp/fabric-usage.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You'll want to adjust the ",(0,r.jsx)(n.code,{children:"events/jsonLogger/handler/path"})," to wherever you would like to send these events for ingestion into ",(0,r.jsx)(n.code,{children:"zrok"}),". There are additional OpenZiti options that control file rotation. Be sure to consult the OpenZiti docs to tune these settings to be appropriate for your environment."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the OpenZiti events infrastructure reports and batches events in 1 minute buckets. 1 minute is too large of an interval to provide a snappy ",(0,r.jsx)(n.code,{children:"zrok"})," metrics experience. So, let's increase the frequency to every 5 seconds. Add this to the ",(0,r.jsx)(n.code,{children:"network"})," stanza of your OpenZiti controller's configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"network:\n intervalAgeThreshold: 5s \n metricsReportInterval: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"And you'll want to add this stanza to the tail-end of the router configuration for every router on your OpenZiti network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"metrics:\n reportInterval: 5s\n intervalAgeThreshold: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"Be sure to restart all of the components of your OpenZiti network after making these configuration changes."}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-zrok-metrics-bridge",children:"Configuring the zrok Metrics Bridge"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"}),' currently uses a "metrics bridge" component (running as a separate process) to consume the ',(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the OpenZiti controller, and publish them onto an AMQP queue. Add a stanza like the following to your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"bridge:\n source:\n type: fileSource\n path: /tmp/fabric-usage.json\n sink:\n type: amqpSink\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This configuration consumes the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the file we previously specified in our OpenZiti controller configuration, and publishes them onto an AMQP queue."]}),"\n",(0,r.jsx)(n.h3,{id:"rabbitmq",children:"RabbitMQ"}),"\n",(0,r.jsxs)(n.p,{children:["For this example, we're going to use RabbitMQ as our AMQP implementation. The stock, default RabbitMQ configuration, launched as a ",(0,r.jsx)(n.code,{children:"docker"})," container will work just fine:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Once RabbitMQ is running, you can start the ",(0,r.jsx)(n.code,{children:"zrok"})," metrics bridge by pointing it at your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration, like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ zrok ctrl metrics bridge <path/to/zrok-controller.yaml>\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-zrok-metrics",children:"Configuring zrok Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Configure the ",(0,r.jsx)(n.code,{children:"metrics"})," section of your ",(0,r.jsx)(n.code,{children:"zrok"})," controller. Here is an example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'metrics:\n agent:\n source:\n type: amqpSource\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n influx:\n url: "http://127.0.0.1:8086"\n bucket: zrok # the bucket and org must be\n org: zrok # created in advance in InfluxDB\n token: "<secret token>"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This configures the ",(0,r.jsx)(n.code,{children:"zrok"})," controller to consume usage events from the AMQP queue, and configures the InfluxDB metrics store. The InfluxDB organization and bucket must be created in advance. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller will not create these for you."]}),"\n",(0,r.jsx)(n.h2,{id:"testing-metrics",children:"Testing Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["With all of the components configured and running, either use ",(0,r.jsx)(n.code,{children:"zrok test loop"})," or manually create share(s) to generate traffic on the ",(0,r.jsx)(n.code,{children:"zrok"})," instance. If everything is working correctly, you should see log messages from the controller like the following, which indicate that that the controller is processing OpenZiti usage events, and generating ",(0,r.jsx)(n.code,{children:"zrok"})," metrics:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[5339.658] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 4.5 kB, tx: 4.6 kB} frontend {rx: 4.6 kB, tx: 4.5 kB}\n[5349.652] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 2.5 kB, tx: 2.6 kB} frontend {rx: 2.6 kB, tx: 2.5 kB}\n[5354.657] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 5a4u7lqxb7pa, circuit: iG1--6H4S backend {rx: 13.2 kB, tx: 13.3 kB} frontend {rx: 13.3 kB, tx: 13.2 kB}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"zrok"})," web console should also be showing activity for your share(s) like the following:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok web console activity",src:i(8824).A+"",width:"1920",height:"1230"})}),"\n",(0,r.jsxs)(n.p,{children:["With metrics configured, you might be interested in ",(0,r.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},7556:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-simple-15902678f75b6a41fc6d26c1b6165d48.png"},6499:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-abc07e1548198a0d2176bbfea70521fa.png"},8824:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zrok-console-activity-5e11ec1f9f3e58b54566c42a213e4ee5.png"},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9033],{9273:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","title":"Configuring Metrics","description":"A fully configured, production-scale zrok service instance looks like this:","source":"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md","sourceDirName":"guides/self-hosting/metrics-and-limits","slug":"/guides/self-hosting/metrics-and-limits/configuring-metrics","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"Metrics and Limits","permalink":"/docs/0.4/category/metrics-and-limits"},"next":{"title":"Configuring Limits","permalink":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits"}}');var r=i(4848),o=i(8453);const s={sidebar_position:20},c="Configuring Metrics",l={},a=[{value:"Configuring the OpenZiti Controller",id:"configuring-the-openziti-controller",level:2},{value:"Configuring the zrok Metrics Bridge",id:"configuring-the-zrok-metrics-bridge",level:2},{value:"RabbitMQ",id:"rabbitmq",level:3},{value:"Configuring zrok Metrics",id:"configuring-zrok-metrics",level:2},{value:"Testing Metrics",id:"testing-metrics",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"configuring-metrics",children:"Configuring Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["A fully configured, production-scale ",(0,r.jsx)(n.code,{children:"zrok"})," service instance looks like this:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok Metrics Architecture",src:i(6499).A+"",width:"381",height:"492"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"})," metrics builds on top of the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller has several ways to consume ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events. Smaller installations could be configured in these ways:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok simplified metrics architecture",src:i(7556).A+"",width:"522",height:"322"})}),"\n",(0,r.jsxs)(n.p,{children:["Environments that horizontally scale the ",(0,r.jsx)(n.code,{children:"zrok"}),' control plane with multiple controllers should use an AMQP-based queue to "fan out" the metrics workload across the entire control plane. Simpler installations that use a single ',(0,r.jsx)(n.code,{children:"zrok"})," controller can collect ",(0,r.jsx)(n.code,{children:"fabric.usage"}),' events from the OpenZiti controller by "tailing" the events log file, or collecting them from the OpenZiti controller\'s websocket implementation.']}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-openziti-controller",children:"Configuring the OpenZiti Controller"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["This requires a version of OpenZiti with a ",(0,r.jsx)(n.code,{children:"fabric"})," dependency of ",(0,r.jsx)(n.code,{children:"v0.22.52"})," or newer, which is satisfed by the ",(0,r.jsx)(n.code,{children:"v0.27.6"})," release of OpenZiti Controller."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Emitting ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file is currently the most reliable mechanism to capture usage events into ",(0,r.jsx)(n.code,{children:"zrok"}),". We're going to configure the OpenZiti controller to append ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events to a file, by adding this stanza to the OpenZiti controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"events:\n jsonLogger:\n subscriptions:\n - type: fabric.usage\n version: 3\n handler:\n type: file\n format: json\n path: /tmp/fabric-usage.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You'll want to adjust the ",(0,r.jsx)(n.code,{children:"events/jsonLogger/handler/path"})," to wherever you would like to send these events for ingestion into ",(0,r.jsx)(n.code,{children:"zrok"}),". There are additional OpenZiti options that control file rotation. Be sure to consult the OpenZiti docs to tune these settings to be appropriate for your environment."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the OpenZiti events infrastructure reports and batches events in 1 minute buckets. 1 minute is too large of an interval to provide a snappy ",(0,r.jsx)(n.code,{children:"zrok"})," metrics experience. So, let's increase the frequency to every 5 seconds. Add this to the ",(0,r.jsx)(n.code,{children:"network"})," stanza of your OpenZiti controller's configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"network:\n intervalAgeThreshold: 5s \n metricsReportInterval: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"And you'll want to add this stanza to the tail-end of the router configuration for every router on your OpenZiti network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"metrics:\n reportInterval: 5s\n intervalAgeThreshold: 5s\n"})}),"\n",(0,r.jsx)(n.p,{children:"Be sure to restart all of the components of your OpenZiti network after making these configuration changes."}),"\n",(0,r.jsx)(n.h2,{id:"configuring-the-zrok-metrics-bridge",children:"Configuring the zrok Metrics Bridge"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"zrok"}),' currently uses a "metrics bridge" component (running as a separate process) to consume the ',(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the OpenZiti controller, and publish them onto an AMQP queue. Add a stanza like the following to your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"bridge:\n source:\n type: fileSource\n path: /tmp/fabric-usage.json\n sink:\n type: amqpSink\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This configuration consumes the ",(0,r.jsx)(n.code,{children:"fabric.usage"})," events from the file we previously specified in our OpenZiti controller configuration, and publishes them onto an AMQP queue."]}),"\n",(0,r.jsx)(n.h3,{id:"rabbitmq",children:"RabbitMQ"}),"\n",(0,r.jsxs)(n.p,{children:["For this example, we're going to use RabbitMQ as our AMQP implementation. The stock, default RabbitMQ configuration, launched as a ",(0,r.jsx)(n.code,{children:"docker"})," container will work just fine:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Once RabbitMQ is running, you can start the ",(0,r.jsx)(n.code,{children:"zrok"})," metrics bridge by pointing it at your ",(0,r.jsx)(n.code,{children:"zrok"})," controller configuration, like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ zrok ctrl metrics bridge <path/to/zrok-controller.yaml>\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-zrok-metrics",children:"Configuring zrok Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Configure the ",(0,r.jsx)(n.code,{children:"metrics"})," section of your ",(0,r.jsx)(n.code,{children:"zrok"})," controller. Here is an example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'metrics:\n agent:\n source:\n type: amqpSource\n url: amqp://guest:guest@localhost:5672\n queue_name: events\n influx:\n url: "http://127.0.0.1:8086"\n bucket: zrok # the bucket and org must be\n org: zrok # created in advance in InfluxDB\n token: "<secret token>"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This configures the ",(0,r.jsx)(n.code,{children:"zrok"})," controller to consume usage events from the AMQP queue, and configures the InfluxDB metrics store. The InfluxDB organization and bucket must be created in advance. The ",(0,r.jsx)(n.code,{children:"zrok"})," controller will not create these for you."]}),"\n",(0,r.jsx)(n.h2,{id:"testing-metrics",children:"Testing Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["With all of the components configured and running, either use ",(0,r.jsx)(n.code,{children:"zrok test loop"})," or manually create share(s) to generate traffic on the ",(0,r.jsx)(n.code,{children:"zrok"})," instance. If everything is working correctly, you should see log messages from the controller like the following, which indicate that that the controller is processing OpenZiti usage events, and generating ",(0,r.jsx)(n.code,{children:"zrok"})," metrics:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[5339.658] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 4.5 kB, tx: 4.6 kB} frontend {rx: 4.6 kB, tx: 4.5 kB}\n[5349.652] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 736z80mr4syu, circuit: Ad1V-6y48 backend {rx: 2.5 kB, tx: 2.6 kB} frontend {rx: 2.6 kB, tx: 2.5 kB}\n[5354.657] INFO zrok/controller/metrics.(*influxWriter).Handle: share: 5a4u7lqxb7pa, circuit: iG1--6H4S backend {rx: 13.2 kB, tx: 13.3 kB} frontend {rx: 13.3 kB, tx: 13.2 kB}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"zrok"})," web console should also be showing activity for your share(s) like the following:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"zrok web console activity",src:i(8824).A+"",width:"1920",height:"1230"})}),"\n",(0,r.jsxs)(n.p,{children:["With metrics configured, you might be interested in ",(0,r.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},7556:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-simple-15902678f75b6a41fc6d26c1b6165d48.png"},6499:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/metrics-architecture-abc07e1548198a0d2176bbfea70521fa.png"},8824:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zrok-console-activity-5e11ec1f9f3e58b54566c42a213e4ee5.png"},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/962.3828f828.js b/assets/js/962.3828f828.js deleted file mode 100644 index 5b221b9d..00000000 --- a/assets/js/962.3828f828.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[962],{9365:(e,i,r)=>{"use strict";r.d(i,{A:()=>a});r(6540);var n=r(8215);const t={tabItem:"tabItem_Ymn6"};var o=r(4848);function a(e){let{children:i,hidden:r,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,a),hidden:r,children:i})}},1470:(e,i,r)=>{"use strict";r.d(i,{A:()=>k});var n=r(6540),t=r(8215),o=r(3104),a=r(6347),s=r(205),u=r(7485),l=r(1682),c=r(679);function b(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function d(e){const{values:i,children:r}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return b(e).map((e=>{let{props:{value:i,label:r,attributes:n,default:t}}=e;return{value:i,label:r,attributes:n,default:t}}))}(r);return function(e){const i=(0,l.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[i,r])}function w(e){let{value:i,tabValues:r}=e;return r.some((e=>e.value===i))}function f(e){let{queryString:i=!1,groupId:r}=e;const t=(0,a.W6)(),o=function(e){let{queryString:i=!1,groupId:r}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:i,groupId:r});return[(0,u.aZ)(o),(0,n.useCallback)((e=>{if(!o)return;const i=new URLSearchParams(t.location.search);i.set(o,e),t.replace({...t.location,search:i.toString()})}),[o,t])]}function m(e){const{defaultValue:i,queryString:r=!1,groupId:t}=e,o=d(e),[a,u]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(i){if(!w({value:i,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:o}))),[l,b]=f({queryString:r,groupId:t}),[m,p]=function(e){let{groupId:i}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,o]=(0,c.Dv)(r);return[t,(0,n.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:t}),h=(()=>{const e=l??m;return w({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{h&&u(h)}),[h]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!w({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);u(e),b(e),p(e)}),[b,p,o]),tabValues:o}}var p=r(2303);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function g(e){let{className:i,block:r,selectedValue:n,selectValue:a,tabValues:s}=e;const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,o.a_)(),c=e=>{const i=e.currentTarget,r=u.indexOf(i),t=s[r].value;t!==n&&(l(i),a(t))},b=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;i=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;i=u[r]??u[u.length-1];break}}i?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":r},i),children:s.map((e=>{let{value:i,label:r,attributes:o}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>u.push(e),onKeyDown:b,onClick:c,...o,className:(0,t.A)("tabs__item",h.tabItem,o?.className,{"tabs__item--active":n===i}),children:r??i},i)}))})}function y(e){let{lazy:i,children:r,selectedValue:o}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(i){const e=a.find((e=>e.props.value===o));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==o})))})}function x(e){const i=m(e);return(0,v.jsxs)("div",{className:(0,t.A)("tabs-container",h.tabList),children:[(0,v.jsx)(g,{...i,...e}),(0,v.jsx)(y,{...i,...e})]})}function k(e){const i=(0,p.A)();return(0,v.jsx)(x,{...e,children:b(e.children)},String(i))}},159:(e,i,r)=>{"use strict";var n,t=r(6540),o=(n=t)&&"object"==typeof n&&"default"in n?n.default:n,a=r(5576),s=new a,u=s.getBrowser(),l=s.getCPU(),c=s.getDevice(),b=s.getEngine(),d=s.getOS(),w=s.getUA(),f=function(e){return s.setUA(e)},m=function(e){if(e){var i=new a(e);return{UA:i,browser:i.getBrowser(),cpu:i.getCPU(),device:i.getDevice(),engine:i.getEngine(),os:i.getOS(),ua:i.getUA(),setUserAgent:function(e){return i.setUA(e)}}}console.error("No userAgent string was provided")},p=Object.freeze({ClientUAInstance:s,browser:u,cpu:l,device:c,engine:b,os:d,ua:w,setUa:f,parseUserAgent:m});function h(e,i){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);i&&(n=n.filter((function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable}))),r.push.apply(r,n)}return r}function v(e){return v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},v(e)}function g(e,i){for(var r=0;r<i.length;r++){var n=i[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function y(e,i,r){return i in e?Object.defineProperty(e,i,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[i]=r,e}function x(){return x=Object.assign||function(e){for(var i=1;i<arguments.length;i++){var r=arguments[i];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},x.apply(this,arguments)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}function S(e,i){return S=Object.setPrototypeOf||function(e,i){return e.__proto__=i,e},S(e,i)}function O(e,i){if(null==e)return{};var r,n,t=function(e,i){if(null==e)return{};var r,n,t={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],i.indexOf(r)>=0||(t[r]=e[r]);return t}(e,i);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],i.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(t[r]=e[r])}return t}function A(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function I(e,i){return function(e){if(Array.isArray(e))return e}(e)||function(e,i){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,t,o=[],a=!0,s=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!i||o.length!==i);a=!0);}catch(u){s=!0,t=u}finally{try{a||null==r.return||r.return()}finally{if(s)throw t}}return o}(e,i)||function(e,i){if(!e)return;if("string"==typeof e)return _(e,i);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return _(e,i)}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _(e,i){(null==i||i>e.length)&&(i=e.length);for(var r=0,n=new Array(i);r<i;r++)n[r]=e[r];return n}var j="mobile",E="tablet",T="smarttv",P="console",C="wearable",N="embedded",V=void 0,q={Chrome:"Chrome",Firefox:"Firefox",Opera:"Opera",Yandex:"Yandex",Safari:"Safari",InternetExplorer:"Internet Explorer",Edge:"Edge",Chromium:"Chromium",Ie:"IE",MobileSafari:"Mobile Safari",EdgeChromium:"Edge Chromium",MIUI:"MIUI Browser",SamsungBrowser:"Samsung Browser"},U={IOS:"iOS",Android:"Android",WindowsPhone:"Windows Phone",Windows:"Windows",MAC_OS:"Mac OS"},M={isMobile:!1,isTablet:!1,isBrowser:!1,isSmartTV:!1,isConsole:!1,isWearable:!1},z=function(e){return e||(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"none")},B=function(){return!("undefined"==typeof window||!window.navigator&&!navigator)&&(window.navigator||navigator)},D=function(e){var i=B();return i&&i.platform&&(-1!==i.platform.indexOf(e)||"MacIntel"===i.platform&&i.maxTouchPoints>1&&!window.MSStream)},R=function(e,i,r,n){return function(e){for(var i=1;i<arguments.length;i++){var r=null!=arguments[i]?arguments[i]:{};i%2?h(Object(r),!0).forEach((function(i){y(e,i,r[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):h(Object(r)).forEach((function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i))}))}return e}({},e,{vendor:z(i.vendor),model:z(i.model),os:z(r.name),osVersion:z(r.version),ua:z(n)})};var W=function(e){return e.type===j},L=function(e){return e.type===E},$=function(e){var i=e.type;return i===j||i===E},F=function(e){return e.type===T},Y=function(e){return e.type===V},H=function(e){return e.type===C},Z=function(e){return e.type===P},G=function(e){return e.type===N},X=function(e){var i=e.vendor;return z(i)},K=function(e){var i=e.model;return z(i)},J=function(e){var i=e.type;return z(i,"browser")},Q=function(e){return e.name===U.Android},ee=function(e){return e.name===U.Windows},ie=function(e){return e.name===U.MAC_OS},re=function(e){return e.name===U.WindowsPhone},ne=function(e){return e.name===U.IOS},te=function(e){var i=e.version;return z(i)},oe=function(e){var i=e.name;return z(i)},ae=function(e){return e.name===q.Chrome},se=function(e){return e.name===q.Firefox},ue=function(e){return e.name===q.Chromium},le=function(e){return e.name===q.Edge},ce=function(e){return e.name===q.Yandex},be=function(e){var i=e.name;return i===q.Safari||i===q.MobileSafari},de=function(e){return e.name===q.MobileSafari},we=function(e){return e.name===q.Opera},fe=function(e){var i=e.name;return i===q.InternetExplorer||i===q.Ie},me=function(e){return e.name===q.MIUI},pe=function(e){return e.name===q.SamsungBrowser},he=function(e){var i=e.version;return z(i)},ve=function(e){var i=e.major;return z(i)},ge=function(e){var i=e.name;return z(i)},ye=function(e){var i=e.name;return z(i)},xe=function(e){var i=e.version;return z(i)},ke=function(){var e=B(),i=e&&e.userAgent&&e.userAgent.toLowerCase();return"string"==typeof i&&/electron/.test(i)},Se=function(e){return"string"==typeof e&&-1!==e.indexOf("Edg/")},Oe=function(){var e=B();return e&&(/iPad|iPhone|iPod/.test(e.platform)||"MacIntel"===e.platform&&e.maxTouchPoints>1)&&!window.MSStream},Ae=function(){return D("iPad")},Ie=function(){return D("iPhone")},_e=function(){return D("iPod")},je=function(e){return z(e)};function Ee(e){var i=e||p,r=i.device,n=i.browser,t=i.os,o=i.engine,a=i.ua;return{isSmartTV:F(r),isConsole:Z(r),isWearable:H(r),isEmbedded:G(r),isMobileSafari:de(n)||Ae(),isChromium:ue(n),isMobile:$(r)||Ae(),isMobileOnly:W(r),isTablet:L(r)||Ae(),isBrowser:Y(r),isDesktop:Y(r),isAndroid:Q(t),isWinPhone:re(t),isIOS:ne(t)||Ae(),isChrome:ae(n),isFirefox:se(n),isSafari:be(n),isOpera:we(n),isIE:fe(n),osVersion:te(t),osName:oe(t),fullBrowserVersion:he(n),browserVersion:ve(n),browserName:ge(n),mobileVendor:X(r),mobileModel:K(r),engineName:ye(o),engineVersion:xe(o),getUA:je(a),isEdge:le(n)||Se(a),isYandex:ce(n),deviceType:J(r),isIOS13:Oe(),isIPad13:Ae(),isIPhone13:Ie(),isIPod13:_e(),isElectron:ke(),isEdgeChromium:Se(a),isLegacyEdge:le(n)&&!Se(a),isWindows:ee(t),isMacOs:ie(t),isMIUI:me(n),isSamsungBrowser:pe(n)}}var Te=F(c),Pe=Z(c),Ce=H(c),Ne=G(c),Ve=de(u)||Ae(),qe=ue(u),Ue=$(c)||Ae(),Me=W(c),ze=L(c)||Ae(),Be=Y(c),De=Y(c),Re=Q(d),We=re(d),Le=ne(d)||Ae(),$e=ae(u),Fe=se(u),Ye=be(u),He=we(u),Ze=fe(u),Ge=te(d),Xe=oe(d),Ke=he(u),Je=ve(u),Qe=ge(u),ei=X(c),ii=K(c),ri=ye(b),ni=xe(b),ti=je(w),oi=le(u)||Se(w),ai=ce(u),si=J(c),ui=Oe(),li=Ae(),ci=Ie(),bi=_e(),di=ke(),wi=Se(w),fi=le(u)&&!Se(w),mi=ee(d),pi=ie(d),hi=me(u),vi=pe(u);function gi(e){var i=e||window.navigator.userAgent;return m(i)}i.wH=Xe},5576:function(e,i,r){var n;!function(t,o){"use strict";var a="function",s="undefined",u="object",l="string",c="major",b="model",d="name",w="type",f="vendor",m="version",p="architecture",h="console",v="mobile",g="tablet",y="smarttv",x="wearable",k="embedded",S="Amazon",O="Apple",A="ASUS",I="BlackBerry",_="Browser",j="Chrome",E="Firefox",T="Google",P="Huawei",C="LG",N="Microsoft",V="Motorola",q="Opera",U="Samsung",M="Sharp",z="Sony",B="Xiaomi",D="Zebra",R="Facebook",W="Chromium OS",L="Mac OS",$=function(e){for(var i={},r=0;r<e.length;r++)i[e[r].toUpperCase()]=e[r];return i},F=function(e,i){return typeof e===l&&-1!==Y(i).indexOf(Y(e))},Y=function(e){return e.toLowerCase()},H=function(e,i){if(typeof e===l)return e=e.replace(/^\s\s*/,""),typeof i===s?e:e.substring(0,500)},Z=function(e,i){for(var r,n,t,s,l,c,b=0;b<i.length&&!l;){var d=i[b],w=i[b+1];for(r=n=0;r<d.length&&!l&&d[r];)if(l=d[r++].exec(e))for(t=0;t<w.length;t++)c=l[++n],typeof(s=w[t])===u&&s.length>0?2===s.length?typeof s[1]==a?this[s[0]]=s[1].call(this,c):this[s[0]]=s[1]:3===s.length?typeof s[1]!==a||s[1].exec&&s[1].test?this[s[0]]=c?c.replace(s[1],s[2]):o:this[s[0]]=c?s[1].call(this,c,s[2]):o:4===s.length&&(this[s[0]]=c?s[3].call(this,c.replace(s[1],s[2])):o):this[s]=c||o;b+=2}},G=function(e,i){for(var r in i)if(typeof i[r]===u&&i[r].length>0){for(var n=0;n<i[r].length;n++)if(F(i[r][n],e))return"?"===r?o:r}else if(F(i[r],e))return"?"===r?o:r;return e},X={ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"},K={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[m,[d,"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[m,[d,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[d,m],[/opios[\/ ]+([\w\.]+)/i],[m,[d,q+" Mini"]],[/\bopr\/([\w\.]+)/i],[m,[d,q]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[m,[d,"Baidu"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(heytap|ovi)browser\/([\d\.]+)/i,/(weibo)__([\d\.]+)/i],[d,m],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[m,[d,"UC"+_]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[m,[d,"WeChat"]],[/konqueror\/([\w\.]+)/i],[m,[d,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[m,[d,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[m,[d,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[m,[d,"Smart Lenovo "+_]],[/(avast|avg)\/([\w\.]+)/i],[[d,/(.+)/,"$1 Secure "+_],m],[/\bfocus\/([\w\.]+)/i],[m,[d,E+" Focus"]],[/\bopt\/([\w\.]+)/i],[m,[d,q+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[m,[d,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[m,[d,"Dolphin"]],[/coast\/([\w\.]+)/i],[m,[d,q+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[m,[d,"MIUI "+_]],[/fxios\/([-\w\.]+)/i],[m,[d,E]],[/\bqihu|(qi?ho?o?|360)browser/i],[[d,"360 "+_]],[/(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i],[[d,/(.+)/,"$1 "+_],m],[/samsungbrowser\/([\w\.]+)/i],[m,[d,U+" Internet"]],[/(comodo_dragon)\/([\w\.]+)/i],[[d,/_/g," "],m],[/metasr[\/ ]?([\d\.]+)/i],[m,[d,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[d,"Sogou Mobile"],m],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i],[d,m],[/(lbbrowser)/i,/\[(linkedin)app\]/i],[d],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[d,R],m],[/(Klarna)\/([\w\.]+)/i,/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i],[d,m],[/\bgsa\/([\w\.]+) .*safari\//i],[m,[d,"GSA"]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[m,[d,"TikTok"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[m,[d,j+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[d,j+" WebView"],m],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[m,[d,"Android "+_]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[d,m],[/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i],[m,[d,"Mobile Safari"]],[/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i],[m,d],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[d,[m,G,{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}]],[/(webkit|khtml)\/([\w\.]+)/i],[d,m],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[d,"Netscape"],m],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[m,[d,E+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[d,m],[/(cobalt)\/([\w\.]+)/i],[d,[m,/master.|lts./,""]]],cpu:[[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i],[[p,"amd64"]],[/(ia32(?=;))/i],[[p,Y]],[/((?:i[346]|x)86)[;\)]/i],[[p,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[p,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[p,"armhf"]],[/windows (ce|mobile); ppc;/i],[[p,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[p,/ower/,"",Y]],[/(sun4\w)[;\)]/i],[[p,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[p,Y]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[b,[f,U],[w,g]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[b,[f,U],[w,v]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i],[b,[f,O],[w,v]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[b,[f,O],[w,g]],[/(macintosh);/i],[b,[f,O]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[b,[f,M],[w,v]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[b,[f,P],[w,g]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[b,[f,P],[w,v]],[/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[b,/_/g," "],[f,B],[w,v]],[/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i,/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[b,/_/g," "],[f,B],[w,g]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[b,[f,"OPPO"],[w,v]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[b,[f,"Vivo"],[w,v]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[b,[f,"Realme"],[w,v]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[b,[f,V],[w,v]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[b,[f,V],[w,g]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[b,[f,C],[w,g]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[b,[f,C],[w,v]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[b,[f,"Lenovo"],[w,g]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[b,/_/g," "],[f,"Nokia"],[w,v]],[/(pixel c)\b/i],[b,[f,T],[w,g]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[b,[f,T],[w,v]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[b,[f,z],[w,v]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[b,"Xperia Tablet"],[f,z],[w,g]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[b,[f,"OnePlus"],[w,v]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[b,[f,S],[w,g]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[b,/(.+)/g,"Fire Phone $1"],[f,S],[w,v]],[/(playbook);[-\w\),; ]+(rim)/i],[b,f,[w,g]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[b,[f,I],[w,v]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[b,[f,A],[w,g]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[b,[f,A],[w,v]],[/(nexus 9)/i],[b,[f,"HTC"],[w,g]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[f,[b,/_/g," "],[w,v]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[b,[f,"Acer"],[w,g]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[b,[f,"Meizu"],[w,v]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[b,[f,"Ulefone"],[w,v]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[f,b,[w,v]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i,/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[f,b,[w,g]],[/(surface duo)/i],[b,[f,N],[w,g]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[b,[f,"Fairphone"],[w,v]],[/(u304aa)/i],[b,[f,"AT&T"],[w,v]],[/\bsie-(\w*)/i],[b,[f,"Siemens"],[w,v]],[/\b(rct\w+) b/i],[b,[f,"RCA"],[w,g]],[/\b(venue[\d ]{2,7}) b/i],[b,[f,"Dell"],[w,g]],[/\b(q(?:mv|ta)\w+) b/i],[b,[f,"Verizon"],[w,g]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[b,[f,"Barnes & Noble"],[w,g]],[/\b(tm\d{3}\w+) b/i],[b,[f,"NuVision"],[w,g]],[/\b(k88) b/i],[b,[f,"ZTE"],[w,g]],[/\b(nx\d{3}j) b/i],[b,[f,"ZTE"],[w,v]],[/\b(gen\d{3}) b.+49h/i],[b,[f,"Swiss"],[w,v]],[/\b(zur\d{3}) b/i],[b,[f,"Swiss"],[w,g]],[/\b((zeki)?tb.*\b) b/i],[b,[f,"Zeki"],[w,g]],[/\b([yr]\d{2}) b/i,/\b(dragon[- ]+touch |dt)(\w{5}) b/i],[[f,"Dragon Touch"],b,[w,g]],[/\b(ns-?\w{0,9}) b/i],[b,[f,"Insignia"],[w,g]],[/\b((nxa|next)-?\w{0,9}) b/i],[b,[f,"NextBook"],[w,g]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[f,"Voice"],b,[w,v]],[/\b(lvtel\-)?(v1[12]) b/i],[[f,"LvTel"],b,[w,v]],[/\b(ph-1) /i],[b,[f,"Essential"],[w,v]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[b,[f,"Envizen"],[w,g]],[/\b(trio[-\w\. ]+) b/i],[b,[f,"MachSpeed"],[w,g]],[/\btu_(1491) b/i],[b,[f,"Rotor"],[w,g]],[/(shield[\w ]+) b/i],[b,[f,"Nvidia"],[w,g]],[/(sprint) (\w+)/i],[f,b,[w,v]],[/(kin\.[onetw]{3})/i],[[b,/\./g," "],[f,N],[w,v]],[/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[b,[f,D],[w,g]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[b,[f,D],[w,v]],[/smart-tv.+(samsung)/i],[f,[w,y]],[/hbbtv.+maple;(\d+)/i],[[b,/^/,"SmartTV"],[f,U],[w,y]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[f,C],[w,y]],[/(apple) ?tv/i],[f,[b,O+" TV"],[w,y]],[/crkey/i],[[b,j+"cast"],[f,T],[w,y]],[/droid.+aft(\w+)( bui|\))/i],[b,[f,S],[w,y]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[b,[f,M],[w,y]],[/(bravia[\w ]+)( bui|\))/i],[b,[f,z],[w,y]],[/(mitv-\w{5}) bui/i],[b,[f,B],[w,y]],[/Hbbtv.*(technisat) (.*);/i],[f,b,[w,y]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[f,H],[b,H],[w,y]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[w,y]],[/(ouya)/i,/(nintendo) ([wids3utch]+)/i],[f,b,[w,h]],[/droid.+; (shield) bui/i],[b,[f,"Nvidia"],[w,h]],[/(playstation [345portablevi]+)/i],[b,[f,z],[w,h]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[b,[f,N],[w,h]],[/((pebble))app/i],[f,b,[w,x]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[b,[f,O],[w,x]],[/droid.+; (glass) \d/i],[b,[f,T],[w,x]],[/droid.+; (wt63?0{2,3})\)/i],[b,[f,D],[w,x]],[/(quest( 2| pro)?)/i],[b,[f,R],[w,x]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[f,[w,k]],[/(aeobc)\b/i],[b,[f,S],[w,k]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i],[b,[w,v]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[b,[w,g]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[w,g]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[w,v]],[/(android[-\w\. ]{0,9});.+buil/i],[b,[f,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[m,[d,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[m,[d,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[d,m],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[m,d]],os:[[/microsoft (windows) (vista|xp)/i],[d,m],[/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i],[d,[m,G,X]],[/windows nt 6\.2; (arm)/i,/windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[m,G,X],[d,"Windows"]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,/cfnetwork\/.+darwin/i],[[m,/_/g,"."],[d,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[d,L],[m,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[m,d],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[d,m],[/\(bb(10);/i],[m,[d,I]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[m,[d,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[m,[d,E+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[m,[d,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[m,[d,"watchOS"]],[/crkey\/([\d\.]+)/i],[m,[d,j+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[d,W],m],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) ([wids345portablevuch]+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[d,m],[/(sunos) ?([\w\.\d]*)/i],[[d,"Solaris"],m],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[d,m]]},J=function(e,i){if(typeof e===u&&(i=e,e=o),!(this instanceof J))return new J(e,i).getResult();var r=typeof t!==s&&t.navigator?t.navigator:o,n=e||(r&&r.userAgent?r.userAgent:""),h=r&&r.userAgentData?r.userAgentData:o,y=i?function(e,i){var r={};for(var n in e)i[n]&&i[n].length%2==0?r[n]=i[n].concat(e[n]):r[n]=e[n];return r}(K,i):K,x=r&&r.userAgent==n;return this.getBrowser=function(){var e,i={};return i[d]=o,i[m]=o,Z.call(i,n,y.browser),i[c]=typeof(e=i[m])===l?e.replace(/[^\d\.]/g,"").split(".")[0]:o,x&&r&&r.brave&&typeof r.brave.isBrave==a&&(i[d]="Brave"),i},this.getCPU=function(){var e={};return e[p]=o,Z.call(e,n,y.cpu),e},this.getDevice=function(){var e={};return e[f]=o,e[b]=o,e[w]=o,Z.call(e,n,y.device),x&&!e[w]&&h&&h.mobile&&(e[w]=v),x&&"Macintosh"==e[b]&&r&&typeof r.standalone!==s&&r.maxTouchPoints&&r.maxTouchPoints>2&&(e[b]="iPad",e[w]=g),e},this.getEngine=function(){var e={};return e[d]=o,e[m]=o,Z.call(e,n,y.engine),e},this.getOS=function(){var e={};return e[d]=o,e[m]=o,Z.call(e,n,y.os),x&&!e[d]&&h&&"Unknown"!=h.platform&&(e[d]=h.platform.replace(/chrome os/i,W).replace(/macos/i,L)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return n},this.setUA=function(e){return n=typeof e===l&&e.length>500?H(e,500):e,this},this.setUA(n),this};J.VERSION="1.0.37",J.BROWSER=$([d,m,c]),J.CPU=$([p]),J.DEVICE=$([b,f,w,h,v,y,g,x,k]),J.ENGINE=J.OS=$([d,m]),typeof i!==s?(e.exports&&(i=e.exports=J),i.UAParser=J):r.amdO?(n=function(){return J}.call(i,r,i,e))===o||(e.exports=n):typeof t!==s&&(t.UAParser=J);var Q=typeof t!==s&&(t.jQuery||t.Zepto);if(Q&&!Q.ua){var ee=new J;Q.ua=ee.getResult(),Q.ua.get=function(){return ee.getUA()},Q.ua.set=function(e){ee.setUA(e);var i=ee.getResult();for(var r in i)Q.ua[r]=i[r]}}}("object"==typeof window?window:this)}}]); \ No newline at end of file diff --git a/assets/js/9939c4f4.0a8ed6f3.js b/assets/js/9939c4f4.269715f4.js similarity index 99% rename from assets/js/9939c4f4.0a8ed6f3.js rename to assets/js/9939c4f4.269715f4.js index 8f485881..a94e26f3 100644 --- a/assets/js/9939c4f4.0a8ed6f3.js +++ b/assets/js/9939c4f4.269715f4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[598],{4551:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","source":"@site/../docs/guides/self-hosting/interstitial-page.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/interstitial-page","permalink":"/docs/guides/self-hosting/interstitial-page","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/interstitial-page.md","tags":[],"version":"current","sidebarPosition":18,"frontMatter":{"title":"Interstitial Pages","sidebar_label":"Interstitial Pages","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"NGINX TLS","permalink":"/docs/guides/self-hosting/linux/nginx"},"next":{"title":"Organizations","permalink":"/docs/guides/self-hosting/organizations"}}');var s=i(4848),r=i(8453);const a={title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},o=void 0,l={},h=[{value:"Bypassing the Interstitial",id:"bypassing-the-interstitial",level:2}];function c(e){const t={code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution."}),"\n",(0,s.jsx)(t.p,{children:"Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use)."}),"\n",(0,s.jsx)(t.p,{children:"The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges."}),"\n",(0,s.jsx)(t.p,{children:"By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them."}),"\n",(0,s.jsx)(t.p,{children:"Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"zrok_interstitial_rendezvous",src:i(4214).A+"",width:"631",height:"362"})}),"\n",(0,s.jsxs)(t.p,{children:["Every zrok share has a ",(0,s.jsx)(t.em,{children:"config"})," recorded in the underlying OpenZiti network. The config is of type ",(0,s.jsx)(t.code,{children:"zrok.proxy.v1"}),". The frontend uses the information in this config to understand the disposition of the share. The config can contain an ",(0,s.jsx)(t.code,{children:"interstitial: true"})," setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit."]}),"\n",(0,s.jsxs)(t.p,{children:["By default the zrok controller will record ",(0,s.jsx)(t.code,{children:"interstitial: true"})," in the share config ",(0,s.jsx)(t.em,{children:"unless"})," a row is present in the ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table in the underlying database for the account creating the share. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table is a basic SQL structure that allows inserting a row per account."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"create table skip_interstitial_grants (\n id serial primary key,\n\n account_id integer references accounts (id) not null,\n\n created_at timestamptz not null default(current_timestamp),\n updated_at timestamptz not null default(current_timestamp),\n deleted boolean not null default(false)\n);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["If an account has a row present in this table when creating a share, then the controller will write ",(0,s.jsx)(t.code,{children:"interstitial: false"})," into the config for the share, which will bypass the interstitial regardless of frontend configuration. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," controls what the zrok controller will store in the share config when creating the share."]}),"\n",(0,s.jsx)(t.p,{children:"The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'# Configure interstitial pages for this frontend. The interstitial page presents a warning to internet users, alerting\n# them to the fact that they\'re visiting a zrok share.\n#\n#interstitial:\n# # Enable or disable interstitial pages on this frontend.\n# #\n# enabled: true\n#\n# # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled\n# # and this list is not set, all user agents will receive an interstitial page.\n# #\n# user_agent_prefixes:\n# - "Mozilla/5.0"\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Setting ",(0,s.jsx)(t.code,{children:"enabled: true"})," in the ",(0,s.jsx)(t.code,{children:"interstitial"})," stanza of the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share. The ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," array can be used to specify which specific ",(0,s.jsx)(t.code,{children:"User-Agent"})," types receive the interstitial. User agents that match a prefix in the list will receive the interstitial, while others will not. If the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list is omitted, ",(0,s.jsx)(t.em,{children:"all"})," user agents will receive the interstitial page."]}),"\n",(0,s.jsx)(t.h2,{id:"bypassing-the-interstitial",children:"Bypassing the Interstitial"}),"\n",(0,s.jsxs)(t.p,{children:["The interstitial page will be presented unless the client shows up with a ",(0,s.jsx)(t.code,{children:"zrok_interstitial"})," cookie (depending on ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," configuration). When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week."]}),"\n",(0,s.jsxs)(t.p,{children:["Typically the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list contains ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"}),", which matches all typical interactive mobile and desktop browsers. Setting a non-standard ",(0,s.jsx)(t.code,{children:"User-Agent"})," in an interactive browser will bypass the interstitial pages for frontends configured with the usual ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"})," prefix."]}),"\n",(0,s.jsxs)(t.p,{children:["End users can offer an HTTP header of ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"}),", set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"})," header is especially useful for API clients (like ",(0,s.jsx)(t.code,{children:"curl"}),") and other types of non-interactive clients."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"drive"})," backend mode does not currently support ",(0,s.jsx)(t.code,{children:"GET"})," requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},4214:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>o});var n=i(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[598],{4052:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","source":"@site/../docs/guides/self-hosting/interstitial-page.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/interstitial-page","permalink":"/docs/guides/self-hosting/interstitial-page","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/interstitial-page.md","tags":[],"version":"current","sidebarPosition":18,"frontMatter":{"title":"Interstitial Pages","sidebar_label":"Interstitial Pages","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"NGINX TLS","permalink":"/docs/guides/self-hosting/linux/nginx"},"next":{"title":"Organizations","permalink":"/docs/guides/self-hosting/organizations"}}');var s=i(4848),r=i(8453);const a={title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},o=void 0,l={},h=[{value:"Bypassing the Interstitial",id:"bypassing-the-interstitial",level:2}];function c(e){const t={code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution."}),"\n",(0,s.jsx)(t.p,{children:"Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use)."}),"\n",(0,s.jsx)(t.p,{children:"The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges."}),"\n",(0,s.jsx)(t.p,{children:"By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them."}),"\n",(0,s.jsx)(t.p,{children:"Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"zrok_interstitial_rendezvous",src:i(4214).A+"",width:"631",height:"362"})}),"\n",(0,s.jsxs)(t.p,{children:["Every zrok share has a ",(0,s.jsx)(t.em,{children:"config"})," recorded in the underlying OpenZiti network. The config is of type ",(0,s.jsx)(t.code,{children:"zrok.proxy.v1"}),". The frontend uses the information in this config to understand the disposition of the share. The config can contain an ",(0,s.jsx)(t.code,{children:"interstitial: true"})," setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit."]}),"\n",(0,s.jsxs)(t.p,{children:["By default the zrok controller will record ",(0,s.jsx)(t.code,{children:"interstitial: true"})," in the share config ",(0,s.jsx)(t.em,{children:"unless"})," a row is present in the ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table in the underlying database for the account creating the share. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table is a basic SQL structure that allows inserting a row per account."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"create table skip_interstitial_grants (\n id serial primary key,\n\n account_id integer references accounts (id) not null,\n\n created_at timestamptz not null default(current_timestamp),\n updated_at timestamptz not null default(current_timestamp),\n deleted boolean not null default(false)\n);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["If an account has a row present in this table when creating a share, then the controller will write ",(0,s.jsx)(t.code,{children:"interstitial: false"})," into the config for the share, which will bypass the interstitial regardless of frontend configuration. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," controls what the zrok controller will store in the share config when creating the share."]}),"\n",(0,s.jsx)(t.p,{children:"The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'# Configure interstitial pages for this frontend. The interstitial page presents a warning to internet users, alerting\n# them to the fact that they\'re visiting a zrok share.\n#\n#interstitial:\n# # Enable or disable interstitial pages on this frontend.\n# #\n# enabled: true\n#\n# # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled\n# # and this list is not set, all user agents will receive an interstitial page.\n# #\n# user_agent_prefixes:\n# - "Mozilla/5.0"\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Setting ",(0,s.jsx)(t.code,{children:"enabled: true"})," in the ",(0,s.jsx)(t.code,{children:"interstitial"})," stanza of the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share. The ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," array can be used to specify which specific ",(0,s.jsx)(t.code,{children:"User-Agent"})," types receive the interstitial. User agents that match a prefix in the list will receive the interstitial, while others will not. If the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list is omitted, ",(0,s.jsx)(t.em,{children:"all"})," user agents will receive the interstitial page."]}),"\n",(0,s.jsx)(t.h2,{id:"bypassing-the-interstitial",children:"Bypassing the Interstitial"}),"\n",(0,s.jsxs)(t.p,{children:["The interstitial page will be presented unless the client shows up with a ",(0,s.jsx)(t.code,{children:"zrok_interstitial"})," cookie (depending on ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," configuration). When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week."]}),"\n",(0,s.jsxs)(t.p,{children:["Typically the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list contains ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"}),", which matches all typical interactive mobile and desktop browsers. Setting a non-standard ",(0,s.jsx)(t.code,{children:"User-Agent"})," in an interactive browser will bypass the interstitial pages for frontends configured with the usual ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"})," prefix."]}),"\n",(0,s.jsxs)(t.p,{children:["End users can offer an HTTP header of ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"}),", set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"})," header is especially useful for API clients (like ",(0,s.jsx)(t.code,{children:"curl"}),") and other types of non-interactive clients."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"drive"})," backend mode does not currently support ",(0,s.jsx)(t.code,{children:"GET"})," requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},4214:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>o});var n=i(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.6c642da0.js b/assets/js/a7bd4aaa.cea47d6c.js similarity index 81% rename from assets/js/a7bd4aaa.6c642da0.js rename to assets/js/a7bd4aaa.cea47d6c.js index 44894cdc..86e0696a 100644 --- a/assets/js/a7bd4aaa.6c642da0.js +++ b/assets/js/a7bd4aaa.cea47d6c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7098],{2151:(e,n,s)=>{s.r(n),s.d(n,{default:()=>x});s(6540);var r=s(9024),t=s(2565),o=s(3025),i=s(2831),c=s(1463),u=s(4848);function a(e){const{version:n}=e;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(c.A,{version:n.version,tag:(0,t.k)(n.pluginId,n.version)}),(0,u.jsx)(r.be,{children:n.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(e){const{version:n,route:s}=e;return(0,u.jsx)(r.e3,{className:n.className,children:(0,u.jsx)(o.n,{version:n,children:(0,i.v)(s.routes)})})}function x(e){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...e}),(0,u.jsx)(l,{...e})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7098],{5047:(e,n,s)=>{s.r(n),s.d(n,{default:()=>x});s(6540);var r=s(9144),t=s(3716),o=s(1858),i=s(2831),c=s(7220),u=s(4848);function a(e){const{version:n}=e;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(c.A,{version:n.version,tag:(0,t.k)(n.pluginId,n.version)}),(0,u.jsx)(r.be,{children:n.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(e){const{version:n,route:s}=e;return(0,u.jsx)(r.e3,{className:n.className,children:(0,u.jsx)(o.n,{version:n,children:(0,i.v)(s.routes)})})}function x(e){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...e}),(0,u.jsx)(l,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.43814358.js b/assets/js/a94703ab.43814358.js deleted file mode 100644 index d285fcd5..00000000 --- a/assets/js/a94703ab.43814358.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9048],{1377:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(8215),i=n(9024),s=n(7559),l=n(6972),r=n(609),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:t,children:(0,b.jsx)(_,{className:A})})}var k=n(5041),S=n(9532);const T=Symbol("EmptyContext"),N=a.createContext(T);function I(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var y=n(1422),B=n(9169),w=n(8774),L=n(2303);function E(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function M(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,L.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),g=(0,B.ys)(x,i),{collapsed:A,setCollapsed:C}=(0,y.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:k,setExpandedItem:I}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),I(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=k&&k!==c&&f&&C(!0)}),[h,k,c,C,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(E,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(V,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var H=n(6654),G=n(3186);const P="menuExternalLink_NmtK";function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,H.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!x&&P,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(G.A,{})]})},u)}const W="menuHtmlItem_M9Kj";function D(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function F(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(M,{item:t,...n});case"html":return(0,b.jsx)(D,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(I,{children:a.map(((e,t)=>(0,b.jsx)(F,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,l&&K,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,s&&O,i&&J),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:t,sidebar:n}),l&&(0,b.jsx)(C,{onClick:a})]})}const Z=a.memo(X);var $=n(5600),ee=n(2069);const te=e=>{let{sidebar:t,path:n}=e;const a=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ie.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ie.expandButtonIcon})})}const le={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function re(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,le.docSidebarContainer,n&&le.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(le.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(re,{children:(0,b.jsxs)("div",{className:(0,o.A)(le.sidebarViewport,r&&le.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:d})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(t||!a)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced),children:n})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ue,{hiddenSidebarContainer:o,children:t})]})]})}var he=n(3363);function pe(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(be,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(8215),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.fa816e76.js b/assets/js/a94703ab.fa816e76.js new file mode 100644 index 00000000..114a4c05 --- /dev/null +++ b/assets/js/a94703ab.fa816e76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9048],{1841:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(8215),i=n(9144),s=n(204),l=n(3751),r=n(2306),c=n(539),d=n(5627),u=n(7685);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(4924),x=n(6347),f=n(6682),j=n(3115),v=n(2862);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:t,children:(0,b.jsx)(_,{className:A})})}var k=n(3380),S=n(6849);const T=Symbol("EmptyContext"),N=a.createContext(T);function I(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var y=n(3535),B=n(214),w=n(6289),L=n(9136);function E(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function M(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,L.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),g=(0,B.ys)(x,i),{collapsed:A,setCollapsed:C}=(0,y.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:k,setExpandedItem:I}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),I(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=k&&k!==c&&f&&C(!0)}),[h,k,c,C,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(E,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(V,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var H=n(2887),G=n(5891);const P="menuExternalLink_NmtK";function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,H.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!x&&P,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(G.A,{})]})},u)}const W="menuHtmlItem_M9Kj";function D(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function F(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(M,{item:t,...n});case"html":return(0,b.jsx)(D,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(I,{children:a.map(((e,t)=>(0,b.jsx)(F,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,l&&K,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,s&&O,i&&J),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:t,sidebar:n}),l&&(0,b.jsx)(C,{onClick:a})]})}const Z=a.memo(X);var $=n(3065),ee=n(5528);const te=e=>{let{sidebar:t,path:n}=e;const a=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ie.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ie.expandButtonIcon})})}const le={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function re(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,le.docSidebarContainer,n&&le.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(le.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(re,{children:(0,b.jsxs)("div",{className:(0,o.A)(le.sidebarViewport,r&&le.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:d})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(t||!a)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced),children:n})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ue,{hiddenSidebarContainer:o,children:t})]})]})}var he=n(5932);function pe(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(be,{children:n})})})}},5932:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(8215),o=n(539),i=n(9303),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/aad6478e.8dd329a2.js b/assets/js/aad6478e.3d3869e2.js similarity index 97% rename from assets/js/aad6478e.8dd329a2.js rename to assets/js/aad6478e.3d3869e2.js index 94fb14c8..b2ae96da 100644 --- a/assets/js/aad6478e.8dd329a2.js +++ b/assets/js/aad6478e.3d3869e2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1769],{9429:(e,s,r)=>{r.d(s,{Ay:()=>i,RM:()=>o});var n=r(4848),t=r(8453);const o=[];function c(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function i(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},4889:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","source":"@site/../docs/concepts/sharing-private.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-private","permalink":"/docs/concepts/sharing-private","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-private.mdx","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Concepts","permalink":"/docs/concepts/"},"next":{"title":"Public Shares","permalink":"/docs/concepts/sharing-public"}}');var t=r(4848),o=r(8453),c=r(9429);const i={sidebar_position:0},a="Private Shares",d={},h=[{value:"Peer to Peer",id:"peer-to-peer",level:2},{value:"Private Backend Modes",id:"private-backend-modes",level:2},...c.RM];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"private-shares",children:"Private Shares"})}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," was built to share and access digital resources. A ",(0,t.jsx)(s.code,{children:"private"})," share allows a resource to be\naccessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another ",(0,t.jsx)(s.code,{children:"zrok"})," user who has the details of your unique share. You are in control of who can access your ",(0,t.jsx)(s.code,{children:"private"})," shares by sharing the share token."]}),"\n",(0,t.jsxs)(s.p,{children:["Peer-to-peer private resource sharing is one of the things that makes ",(0,t.jsx)(s.code,{children:"zrok"})," unique."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," also provides ",(0,t.jsx)(s.code,{children:"public"})," sharing of resources with non-",(0,t.jsx)(s.code,{children:"zrok"})," users. Public resource sharing is limited to only resources that can be accessed over ",(0,t.jsx)(s.code,{children:"HTTP"})," or ",(0,t.jsx)(s.code,{children:"HTTPS"}),". ",(0,t.jsx)(s.code,{children:"private"})," sharing works with all of the resources types that ",(0,t.jsx)(s.code,{children:"zrok"})," supports."]}),"\n",(0,t.jsx)(s.p,{children:"Here's how private sharing works:"}),"\n",(0,t.jsx)(s.h2,{id:"peer-to-peer",children:"Peer to Peer"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"zrok_public_share",src:r(683).A+"",width:"2200",height:"922"})}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"private"})," shares are accessed using the ",(0,t.jsx)(s.code,{children:"zrok access"})," command, and require the accessing user to have a ",(0,t.jsx)(s.code,{children:"zrok enable"}),"-d account on the same service instance where the share was created."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"private"})," share is identified by a ",(0,t.jsx)(s.em,{children:"share token"}),". The accessing user will use the share token, along with the ",(0,t.jsx)(s.code,{children:"zrok access"})," command to create a local endpoint on their system, which lets them use the shared resource as if it were local to their system."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," does not require you to open any firewall ports or otherwise compromise the security of your local system; there is never an attack surface open to the public internet. As soon as you terminate the ",(0,t.jsx)(s.code,{children:"zrok share"})," process, you immediately terminate any possible access to your shared resource."]}),"\n",(0,t.jsxs)(s.p,{children:["The shared resource can be a development web server to share with friends and colleagues, a webhook from a server running in the cloud which has ",(0,t.jsx)(s.code,{children:"zrok"})," running and has been instructed to ",(0,t.jsx)(s.code,{children:"access"})," the private resource. ",(0,t.jsx)(s.code,{children:"zrok"})," can also share files, websites, and low-level TCP and UDP network connections using the ",(0,t.jsx)(s.code,{children:"tunnel"})," backend. What matters is that the access to the shared resource is not done in a public way, and can only be accessed by other ",(0,t.jsx)(s.code,{children:"zrok"})," users that have access to your share token."]}),"\n",(0,t.jsxs)(s.p,{children:["The peer-to-peer capabilities of ",(0,t.jsx)(s.code,{children:"zrok"})," are an important property of the underlying ",(0,t.jsx)(s.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"OpenZiti"})," network that ",(0,t.jsx)(s.code,{children:"zrok"})," uses to provide connectivity between users and resources."]}),"\n",(0,t.jsxs)(s.p,{children:["Creating ",(0,t.jsx)(s.code,{children:"private"})," shares is easy and is accomplished using the ",(0,t.jsx)(s.code,{children:"zrok share private"})," command. Run ",(0,t.jsx)(s.code,{children:"zrok share private"})," to see the usage output and to further learn how to use the command."]}),"\n",(0,t.jsx)(s.h2,{id:"private-backend-modes",children:"Private Backend Modes"}),"\n",(0,t.jsxs)(s.p,{children:["The default backend mode is ",(0,t.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share private 80\n"})}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"tcpTunnel"}),", ",(0,t.jsx)(s.code,{children:"udpTunnel"})," modes forward the data payload to the target server (",(0,t.jsx)(s.a,{href:"/docs/concepts/tunnels",children:"more"}),")"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"socks"})," mode provides a SOCKS5 dynamic proxy on the private access bind port that tunnels TCP payloads to the share backend where they are forwarded to their destinations (",(0,t.jsx)(s.a,{href:"https://blog.openziti.io/the-zrok-socks-backend",children:"blog"}),")"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"vpn"})," mode provides a network layer tunnel between the private access and the share backend (",(0,t.jsx)(s.a,{href:"/docs/guides/vpn/",children:"guide"}),")"]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},683:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_private_share-3b4b2f89f7b5e6704d0b9078a701161e.png"},8453:(e,s,r)=>{r.d(s,{R:()=>c,x:()=>i});var n=r(6540);const t={},o=n.createContext(t);function c(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1769],{9216:(e,s,r)=>{r.d(s,{Ay:()=>i,RM:()=>o});var n=r(4848),t=r(8453);const o=[];function c(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function i(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},7602:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","source":"@site/../docs/concepts/sharing-private.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-private","permalink":"/docs/concepts/sharing-private","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/sharing-private.mdx","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Concepts","permalink":"/docs/concepts/"},"next":{"title":"Public Shares","permalink":"/docs/concepts/sharing-public"}}');var t=r(4848),o=r(8453),c=r(9216);const i={sidebar_position:0},a="Private Shares",d={},h=[{value:"Peer to Peer",id:"peer-to-peer",level:2},{value:"Private Backend Modes",id:"private-backend-modes",level:2},...c.RM];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"private-shares",children:"Private Shares"})}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," was built to share and access digital resources. A ",(0,t.jsx)(s.code,{children:"private"})," share allows a resource to be\naccessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another ",(0,t.jsx)(s.code,{children:"zrok"})," user who has the details of your unique share. You are in control of who can access your ",(0,t.jsx)(s.code,{children:"private"})," shares by sharing the share token."]}),"\n",(0,t.jsxs)(s.p,{children:["Peer-to-peer private resource sharing is one of the things that makes ",(0,t.jsx)(s.code,{children:"zrok"})," unique."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," also provides ",(0,t.jsx)(s.code,{children:"public"})," sharing of resources with non-",(0,t.jsx)(s.code,{children:"zrok"})," users. Public resource sharing is limited to only resources that can be accessed over ",(0,t.jsx)(s.code,{children:"HTTP"})," or ",(0,t.jsx)(s.code,{children:"HTTPS"}),". ",(0,t.jsx)(s.code,{children:"private"})," sharing works with all of the resources types that ",(0,t.jsx)(s.code,{children:"zrok"})," supports."]}),"\n",(0,t.jsx)(s.p,{children:"Here's how private sharing works:"}),"\n",(0,t.jsx)(s.h2,{id:"peer-to-peer",children:"Peer to Peer"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"zrok_public_share",src:r(683).A+"",width:"2200",height:"922"})}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"private"})," shares are accessed using the ",(0,t.jsx)(s.code,{children:"zrok access"})," command, and require the accessing user to have a ",(0,t.jsx)(s.code,{children:"zrok enable"}),"-d account on the same service instance where the share was created."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"private"})," share is identified by a ",(0,t.jsx)(s.em,{children:"share token"}),". The accessing user will use the share token, along with the ",(0,t.jsx)(s.code,{children:"zrok access"})," command to create a local endpoint on their system, which lets them use the shared resource as if it were local to their system."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"zrok"})," does not require you to open any firewall ports or otherwise compromise the security of your local system; there is never an attack surface open to the public internet. As soon as you terminate the ",(0,t.jsx)(s.code,{children:"zrok share"})," process, you immediately terminate any possible access to your shared resource."]}),"\n",(0,t.jsxs)(s.p,{children:["The shared resource can be a development web server to share with friends and colleagues, a webhook from a server running in the cloud which has ",(0,t.jsx)(s.code,{children:"zrok"})," running and has been instructed to ",(0,t.jsx)(s.code,{children:"access"})," the private resource. ",(0,t.jsx)(s.code,{children:"zrok"})," can also share files, websites, and low-level TCP and UDP network connections using the ",(0,t.jsx)(s.code,{children:"tunnel"})," backend. What matters is that the access to the shared resource is not done in a public way, and can only be accessed by other ",(0,t.jsx)(s.code,{children:"zrok"})," users that have access to your share token."]}),"\n",(0,t.jsxs)(s.p,{children:["The peer-to-peer capabilities of ",(0,t.jsx)(s.code,{children:"zrok"})," are an important property of the underlying ",(0,t.jsx)(s.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"OpenZiti"})," network that ",(0,t.jsx)(s.code,{children:"zrok"})," uses to provide connectivity between users and resources."]}),"\n",(0,t.jsxs)(s.p,{children:["Creating ",(0,t.jsx)(s.code,{children:"private"})," shares is easy and is accomplished using the ",(0,t.jsx)(s.code,{children:"zrok share private"})," command. Run ",(0,t.jsx)(s.code,{children:"zrok share private"})," to see the usage output and to further learn how to use the command."]}),"\n",(0,t.jsx)(s.h2,{id:"private-backend-modes",children:"Private Backend Modes"}),"\n",(0,t.jsxs)(s.p,{children:["The default backend mode is ",(0,t.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share private 80\n"})}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"tcpTunnel"}),", ",(0,t.jsx)(s.code,{children:"udpTunnel"})," modes forward the data payload to the target server (",(0,t.jsx)(s.a,{href:"/docs/concepts/tunnels",children:"more"}),")"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"socks"})," mode provides a SOCKS5 dynamic proxy on the private access bind port that tunnels TCP payloads to the share backend where they are forwarded to their destinations (",(0,t.jsx)(s.a,{href:"https://blog.openziti.io/the-zrok-socks-backend",children:"blog"}),")"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.code,{children:"vpn"})," mode provides a network layer tunnel between the private access and the share backend (",(0,t.jsx)(s.a,{href:"/docs/guides/vpn/",children:"guide"}),")"]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},683:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_private_share-3b4b2f89f7b5e6704d0b9078a701161e.png"},8453:(e,s,r)=>{r.d(s,{R:()=>c,x:()=>i});var n=r(6540);const t={},o=n.createContext(t);function c(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/adf8dca1.b0b219c1.js b/assets/js/adf8dca1.2569ff33.js similarity index 98% rename from assets/js/adf8dca1.b0b219c1.js rename to assets/js/adf8dca1.2569ff33.js index 5ae64c9a..0908c1dd 100644 --- a/assets/js/adf8dca1.b0b219c1.js +++ b/assets/js/adf8dca1.2569ff33.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8051],{3626:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/instance-configuration","permalink":"/docs/0.4/guides/self-hosting/instance-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Use Another zrok Instance","sidebar_label":"Instance Config"},"sidebar":"tutorialSidebar","previous":{"title":"OAuth Public Frontend Configuration","permalink":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth"},"next":{"title":"Invitations","permalink":"/docs/0.4/guides/self-hosting/self-service-invite"}}');var s=o(4848),i=o(8453);const r={title:"Use Another zrok Instance",sidebar_label:"Instance Config"},c=void 0,a={},d=[];function l(e){const n={admonition:"admonition",code:"code",em:"em",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["This guide is relevant if you are self-hosting or using a friend's ",(0,s.jsx)(n.code,{children:"zrok"})," instance instead of using zrok-as-a-service from ",(0,s.jsx)(n.code,{children:"zrok.io"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"command"})," on your computer uses a ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"instance"})," over the network."]}),"\n",(0,s.jsxs)(n.p,{children:["The default instance API endpoint for the ",(0,s.jsx)(n.code,{children:"zrok"})," command is ",(0,s.jsx)(n.code,{children:"api.zrok.io"}),". Set the API endpoint to another instance's API endpoint:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok config set apiEndpoint https://zrok.example.com\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[WARNING]: unable to open environment metadata; ignoring\n\nzrok configuration updated\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"WARNING"})," about ",(0,s.jsx)(n.code,{children:"environment metadata"})," is expected when you run ",(0,s.jsx)(n.code,{children:"zrok config set"})," before ",(0,s.jsx)(n.code,{children:"zrok enable"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"zrok status"})," command to inspect the state of your local ",(0,s.jsx)(n.em,{children:"environment"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," refers to each shell where you install and ",(0,s.jsx)(n.code,{children:"enable"})," a copy of ",(0,s.jsx)(n.code,{children:"zrok"})," as an ",(0,s.jsx)(n.em,{children:"environment"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok status\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://zrok.mydomain.com config \n\n[WARNING]: Unable to load your local environment!\n\nTo create a local environment use the zrok enable command.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok status"})," command shows the configured API service that your environment is using, as well as the ",(0,s.jsx)(n.code,{children:"SOURCE"})," where the setting was retrieved. In this case, ",(0,s.jsx)(n.code,{children:"config"})," means that the setting was set into the environment using the ",(0,s.jsx)(n.code,{children:"zrok config"})," command."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8051],{7773:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/self-hosting/instance-configuration","title":"Use Another zrok Instance","description":"This guide is relevant if you are self-hosting or using a friend\'s zrok instance instead of using zrok-as-a-service from zrok.io.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/instance-configuration","permalink":"/docs/0.4/guides/self-hosting/instance-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Use Another zrok Instance","sidebar_label":"Instance Config"},"sidebar":"tutorialSidebar","previous":{"title":"OAuth Public Frontend Configuration","permalink":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth"},"next":{"title":"Invitations","permalink":"/docs/0.4/guides/self-hosting/self-service-invite"}}');var s=o(4848),i=o(8453);const r={title:"Use Another zrok Instance",sidebar_label:"Instance Config"},c=void 0,a={},d=[];function l(e){const n={admonition:"admonition",code:"code",em:"em",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["This guide is relevant if you are self-hosting or using a friend's ",(0,s.jsx)(n.code,{children:"zrok"})," instance instead of using zrok-as-a-service from ",(0,s.jsx)(n.code,{children:"zrok.io"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"command"})," on your computer uses a ",(0,s.jsx)(n.code,{children:"zrok"})," ",(0,s.jsx)(n.em,{children:"instance"})," over the network."]}),"\n",(0,s.jsxs)(n.p,{children:["The default instance API endpoint for the ",(0,s.jsx)(n.code,{children:"zrok"})," command is ",(0,s.jsx)(n.code,{children:"api.zrok.io"}),". Set the API endpoint to another instance's API endpoint:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok config set apiEndpoint https://zrok.example.com\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"[WARNING]: unable to open environment metadata; ignoring\n\nzrok configuration updated\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"WARNING"})," about ",(0,s.jsx)(n.code,{children:"environment metadata"})," is expected when you run ",(0,s.jsx)(n.code,{children:"zrok config set"})," before ",(0,s.jsx)(n.code,{children:"zrok enable"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"zrok status"})," command to inspect the state of your local ",(0,s.jsx)(n.em,{children:"environment"}),". ",(0,s.jsx)(n.code,{children:"zrok"})," refers to each shell where you install and ",(0,s.jsx)(n.code,{children:"enable"})," a copy of ",(0,s.jsx)(n.code,{children:"zrok"})," as an ",(0,s.jsx)(n.em,{children:"environment"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"zrok status\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"Config:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://zrok.mydomain.com config \n\n[WARNING]: Unable to load your local environment!\n\nTo create a local environment use the zrok enable command.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"zrok status"})," command shows the configured API service that your environment is using, as well as the ",(0,s.jsx)(n.code,{children:"SOURCE"})," where the setting was retrieved. In this case, ",(0,s.jsx)(n.code,{children:"config"})," means that the setting was set into the environment using the ",(0,s.jsx)(n.code,{children:"zrok config"})," command."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b36bb0c9.32b884d9.js b/assets/js/b36bb0c9.32b884d9.js deleted file mode 100644 index cf804ef0..00000000 --- a/assets/js/b36bb0c9.32b884d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4504],{548:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/organizations.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/organizations","permalink":"/docs/0.4/guides/self-hosting/organizations","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/organizations.md","tags":[],"version":"0.4","sidebarPosition":21,"frontMatter":{"sidebar_position":21,"sidebar_label":"Organizations"},"sidebar":"tutorialSidebar","previous":{"title":"Interstitial Pages","permalink":"/docs/0.4/guides/self-hosting/interstitial-page"},"next":{"title":"Personalized Frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend"}}');var o=i(4848),r=i(8453);const t={sidebar_position:21,sidebar_label:"Organizations"},s="Organizations",d={},c=[{value:"Configuring an Organization",id:"configuring-an-organization",level:2},{value:"Create an Organization",id:"create-an-organization",level:3},{value:"List Organizations",id:"list-organizations",level:3},{value:"Add a Member to an Organization",id:"add-a-member-to-an-organization",level:3},{value:"List Members of an Organization",id:"list-members-of-an-organization",level:3},{value:"Removing Organizations and Members",id:"removing-organizations-and-members",level:3},{value:"End-user Organization Administrator Commands",id:"end-user-organization-administrator-commands",level:2},{value:"End-user Organization Commands",id:"end-user-organization-commands",level:2}];function l(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"organizations",children:"Organizations"})}),"\n",(0,o.jsxs)(e.p,{children:["zrok (starting with ",(0,o.jsx)(e.code,{children:"v0.4.45"}),') includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of ',(0,o.jsx)(e.code,{children:"v0.4.45"}),' organization admins are able to retrieve an "overview" (',(0,o.jsx)(e.code,{children:"zrok overview"}),") from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account."]}),"\n",(0,o.jsxs)(e.p,{children:["Future zrok releases will include additional organization features, including ",(0,o.jsx)(e.code,{children:"--closed"})," permission sharing functions."]}),"\n",(0,o.jsx)(e.h2,{id:"configuring-an-organization",children:"Configuring an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The API endpoints used to manage organizations and their members require a site-level ",(0,o.jsx)(e.code,{children:"ZROK_ADMIN_TOKEN"})," to access. See the ",(0,o.jsx)(e.a,{href:"/docs/0.4/guides/self-hosting/linux/#configure-the-controller",children:"self-hosting guide"})," for details on configuring admin tokens."]}),"\n",(0,o.jsx)(e.h3,{id:"create-an-organization",children:"Create an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin create organization"})," command is used to create organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization --help\nCreate a new organization\n\nUsage:\n zrok admin create organization [flags]\n\nAliases:\n organization, org\n\nFlags:\n -d, --description string Organization description\n -h, --help help for organization\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsxs)(e.p,{children:["Use the ",(0,o.jsx)(e.code,{children:"-d"})," flag to add a description that shows up in end-user membership listings."]}),"\n",(0,o.jsx)(e.p,{children:"We'll create an example organization:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization -d \"documentation\"\n[ 0.006] INFO main.(*adminCreateOrganizationCommand).run: created new organization with token 'gK1XRvthq7ci'\n"})}),"\n",(0,o.jsx)(e.h3,{id:"list-organizations",children:"List Organizations"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin list organizations"})," command to list our organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list organizations\n\n ORGANIZATION TOKEN DESCRIPTION \n gK1XRvthq7ci documentation \n"})}),"\n",(0,o.jsx)(e.h3,{id:"add-a-member-to-an-organization",children:"Add a Member to an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to add members to organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member \nError: accepts 2 arg(s), received 0\nUsage:\n zrok admin create org-member <organizationToken> <accountEmail> [flags]\n\nAliases:\n org-member, member\n\nFlags:\n --admin Make the new account an admin of the organization\n -h, --help help for org-member\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsx)(e.p,{children:"Like this:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member gK1XRvthq7ci michael.quigley@netfoundry.io\n[ 0.006] INFO main.(*adminCreateOrgMemberCommand).run: added 'michael.quigley@netfoundry.io' to organization 'gK1XRvthq7ci\n"})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"--admin"})," flag can be added to the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to mark the member as an administrator of the organization."]}),"\n",(0,o.jsx)(e.h3,{id:"list-members-of-an-organization",children:"List Members of an Organization"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list org-members gK1XRvthq7ci\n\n ACCOUNT EMAIL ADMIN? \n michael.quigley@netfoundry.io false \n"})}),"\n",(0,o.jsx)(e.h3,{id:"removing-organizations-and-members",children:"Removing Organizations and Members"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin delete org-member"})," and ",(0,o.jsx)(e.code,{children:"zrok admin delete organization"})," commands are available to clean up organizations and their membership lists."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-administrator-commands",children:"End-user Organization Administrator Commands"}),"\n",(0,o.jsxs)(e.p,{children:["When a zrok account is added to an organization as an administrator it allows them to use the ",(0,o.jsx)(e.code,{children:"zrok organization admin"})," commands, which include:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:'$ zrok organization admin\nOrganization admin commands\n\nUsage:\n zrok organization admin [command]\n\nAvailable Commands:\n list List the members of an organization\n overview Retrieve account overview for organization member account\n\nFlags:\n -h, --help help for admin\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\nUse "zrok organization admin [command] --help" for more information about a command.\n'})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin list"})," command is used to list the members of an organization."]}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin overview"})," command is used to retrieve an overview of an organization member account. This is functionally equivalent to what the ",(0,o.jsx)(e.code,{children:"zrok overview"})," command does, but it allows an organization admin to retrieve the overview for another zrok account."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-commands",children:"End-user Organization Commands"}),"\n",(0,o.jsxs)(e.p,{children:["All zrok accounts can use the ",(0,o.jsx)(e.code,{children:"zrok organization memberships"})," command to list the organizations they're a member of:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok organization memberships\n\n ORGANIZATION TOKEN DESCRIPTION ADMIN? \n gK1XRvthq7ci documentation false \n\n"})})]})}function m(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(l,{...n})}):l(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>t,x:()=>s});var a=i(6540);const o={},r=a.createContext(o);function t(n){const e=a.useContext(r);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:t(n.components),a.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/b36bb0c9.40225a52.js b/assets/js/b36bb0c9.40225a52.js new file mode 100644 index 00000000..f1d7945c --- /dev/null +++ b/assets/js/b36bb0c9.40225a52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4504],{5318:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"guides/self-hosting/organizations","title":"Organizations","description":"zrok (starting with v0.4.45) includes support for \\"organizations\\". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an \\"admin\\" permission. As of v0.4.45 organization admins are able to retrieve an \\"overview\\" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/organizations.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/organizations","permalink":"/docs/0.4/guides/self-hosting/organizations","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/organizations.md","tags":[],"version":"0.4","sidebarPosition":21,"frontMatter":{"sidebar_position":21,"sidebar_label":"Organizations"},"sidebar":"tutorialSidebar","previous":{"title":"Interstitial Pages","permalink":"/docs/0.4/guides/self-hosting/interstitial-page"},"next":{"title":"Personalized Frontend","permalink":"/docs/0.4/guides/self-hosting/personalized-frontend"}}');var o=i(4848),r=i(8453);const t={sidebar_position:21,sidebar_label:"Organizations"},s="Organizations",d={},c=[{value:"Configuring an Organization",id:"configuring-an-organization",level:2},{value:"Create an Organization",id:"create-an-organization",level:3},{value:"List Organizations",id:"list-organizations",level:3},{value:"Add a Member to an Organization",id:"add-a-member-to-an-organization",level:3},{value:"List Members of an Organization",id:"list-members-of-an-organization",level:3},{value:"Removing Organizations and Members",id:"removing-organizations-and-members",level:3},{value:"End-user Organization Administrator Commands",id:"end-user-organization-administrator-commands",level:2},{value:"End-user Organization Commands",id:"end-user-organization-commands",level:2}];function l(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"organizations",children:"Organizations"})}),"\n",(0,o.jsxs)(e.p,{children:["zrok (starting with ",(0,o.jsx)(e.code,{children:"v0.4.45"}),') includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of ',(0,o.jsx)(e.code,{children:"v0.4.45"}),' organization admins are able to retrieve an "overview" (',(0,o.jsx)(e.code,{children:"zrok overview"}),") from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account."]}),"\n",(0,o.jsxs)(e.p,{children:["Future zrok releases will include additional organization features, including ",(0,o.jsx)(e.code,{children:"--closed"})," permission sharing functions."]}),"\n",(0,o.jsx)(e.h2,{id:"configuring-an-organization",children:"Configuring an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The API endpoints used to manage organizations and their members require a site-level ",(0,o.jsx)(e.code,{children:"ZROK_ADMIN_TOKEN"})," to access. See the ",(0,o.jsx)(e.a,{href:"/docs/0.4/guides/self-hosting/linux/#configure-the-controller",children:"self-hosting guide"})," for details on configuring admin tokens."]}),"\n",(0,o.jsx)(e.h3,{id:"create-an-organization",children:"Create an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin create organization"})," command is used to create organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization --help\nCreate a new organization\n\nUsage:\n zrok admin create organization [flags]\n\nAliases:\n organization, org\n\nFlags:\n -d, --description string Organization description\n -h, --help help for organization\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsxs)(e.p,{children:["Use the ",(0,o.jsx)(e.code,{children:"-d"})," flag to add a description that shows up in end-user membership listings."]}),"\n",(0,o.jsx)(e.p,{children:"We'll create an example organization:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create organization -d \"documentation\"\n[ 0.006] INFO main.(*adminCreateOrganizationCommand).run: created new organization with token 'gK1XRvthq7ci'\n"})}),"\n",(0,o.jsx)(e.h3,{id:"list-organizations",children:"List Organizations"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin list organizations"})," command to list our organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list organizations\n\n ORGANIZATION TOKEN DESCRIPTION \n gK1XRvthq7ci documentation \n"})}),"\n",(0,o.jsx)(e.h3,{id:"add-a-member-to-an-organization",children:"Add a Member to an Organization"}),"\n",(0,o.jsxs)(e.p,{children:["We use the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to add members to organizations:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member \nError: accepts 2 arg(s), received 0\nUsage:\n zrok admin create org-member <organizationToken> <accountEmail> [flags]\n\nAliases:\n org-member, member\n\nFlags:\n --admin Make the new account an admin of the organization\n -h, --help help for org-member\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n"})}),"\n",(0,o.jsx)(e.p,{children:"Like this:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin create org-member gK1XRvthq7ci michael.quigley@netfoundry.io\n[ 0.006] INFO main.(*adminCreateOrgMemberCommand).run: added 'michael.quigley@netfoundry.io' to organization 'gK1XRvthq7ci\n"})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"--admin"})," flag can be added to the ",(0,o.jsx)(e.code,{children:"zrok admin create org-member"})," command to mark the member as an administrator of the organization."]}),"\n",(0,o.jsx)(e.h3,{id:"list-members-of-an-organization",children:"List Members of an Organization"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok admin list org-members gK1XRvthq7ci\n\n ACCOUNT EMAIL ADMIN? \n michael.quigley@netfoundry.io false \n"})}),"\n",(0,o.jsx)(e.h3,{id:"removing-organizations-and-members",children:"Removing Organizations and Members"}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok admin delete org-member"})," and ",(0,o.jsx)(e.code,{children:"zrok admin delete organization"})," commands are available to clean up organizations and their membership lists."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-administrator-commands",children:"End-user Organization Administrator Commands"}),"\n",(0,o.jsxs)(e.p,{children:["When a zrok account is added to an organization as an administrator it allows them to use the ",(0,o.jsx)(e.code,{children:"zrok organization admin"})," commands, which include:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:'$ zrok organization admin\nOrganization admin commands\n\nUsage:\n zrok organization admin [command]\n\nAvailable Commands:\n list List the members of an organization\n overview Retrieve account overview for organization member account\n\nFlags:\n -h, --help help for admin\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n\nUse "zrok organization admin [command] --help" for more information about a command.\n'})}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin list"})," command is used to list the members of an organization."]}),"\n",(0,o.jsxs)(e.p,{children:["The ",(0,o.jsx)(e.code,{children:"zrok organization admin overview"})," command is used to retrieve an overview of an organization member account. This is functionally equivalent to what the ",(0,o.jsx)(e.code,{children:"zrok overview"})," command does, but it allows an organization admin to retrieve the overview for another zrok account."]}),"\n",(0,o.jsx)(e.h2,{id:"end-user-organization-commands",children:"End-user Organization Commands"}),"\n",(0,o.jsxs)(e.p,{children:["All zrok accounts can use the ",(0,o.jsx)(e.code,{children:"zrok organization memberships"})," command to list the organizations they're a member of:"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"$ zrok organization memberships\n\n ORGANIZATION TOKEN DESCRIPTION ADMIN? \n gK1XRvthq7ci documentation false \n\n"})})]})}function m(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(l,{...n})}):l(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>t,x:()=>s});var a=i(6540);const o={},r=a.createContext(o);function t(n){const e=a.useContext(r);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:t(n.components),a.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/b6569025.6245889e.js b/assets/js/b6569025.6245889e.js deleted file mode 100644 index 06fea55c..00000000 --- a/assets/js/b6569025.6245889e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[714],{8477:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),t=s(8453),r=s(8151),a=s(595),i=s(1342);const l=[];function d(e){return(0,o.jsx)(r.F,{children:(0,o.jsxs)("div",{className:i.A.downloadContainer,children:[(0,o.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,o.jsx)(a.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,o.jsx)(a.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d()}},9579:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"guides/install/index","title":"Install","description":"","source":"@site/../docs/guides/install/index.mdx","sourceDirName":"guides/install","slug":"/guides/install/","permalink":"/docs/guides/install/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Install"},"sidebar":"tutorialSidebar","previous":{"title":"Guides","permalink":"/docs/category/guides"},"next":{"title":"Linux","permalink":"/docs/guides/install/linux"}}');var t=s(4848),r=s(8453),a=s(8477);const i={title:"Install"},l=void 0,d={},c=[...a.RM];function u(e){return(0,t.jsx)(a.Ay,{})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u()}},8151:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var o=s(6540),t=s(4848);const r=(0,o.createContext)([]),a=()=>(0,o.useContext)(r),i=e=>{let{children:n}=e;const[s,a]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(r.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var o=s(8151),t=s(1342),r=s(5293),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,r.G)(),u=(0,o.d)();console.log("Assets in DownloadCard:",u);const m=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),x=u.filter((e=>e.name.includes(m)));return console.log("Filtered assets for",n,"in DownloadCard:",x),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),x.length>0&&(0,a.jsx)("ul",{children:x.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),d&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:d,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>o});const o={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var o=s(6540);const t={},r=o.createContext(t);function a(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b6569025.fe4b9c1c.js b/assets/js/b6569025.fe4b9c1c.js new file mode 100644 index 00000000..bc15468d --- /dev/null +++ b/assets/js/b6569025.fe4b9c1c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[714],{2390:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),t=s(8453),r=s(3070),a=s(3484),i=s(3769);const l=[];function d(e){return(0,o.jsx)(r.F,{children:(0,o.jsxs)("div",{className:i.A.downloadContainer,children:[(0,o.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,o.jsx)(a.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,o.jsx)(a.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d()}},6984:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"guides/install/index","title":"Install","description":"","source":"@site/../docs/guides/install/index.mdx","sourceDirName":"guides/install","slug":"/guides/install/","permalink":"/docs/guides/install/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/index.mdx","tags":[],"version":"current","frontMatter":{"title":"Install"},"sidebar":"tutorialSidebar","previous":{"title":"Guides","permalink":"/docs/category/guides"},"next":{"title":"Linux","permalink":"/docs/guides/install/linux"}}');var t=s(4848),r=s(8453),a=s(2390);const i={title:"Install"},l=void 0,d={},c=[...a.RM];function u(e){return(0,t.jsx)(a.Ay,{})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u()}},3070:(e,n,s)=>{s.d(n,{F:()=>i,d:()=>a});var o=s(6540),t=s(4848);const r=(0,o.createContext)([]),a=()=>(0,o.useContext)(r),i=e=>{let{children:n}=e;const[s,a]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),a(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,t.jsx)(r.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>l});s(6540);var o=s(3070),t=s(3769),r=s(8532),a=s(4848);const i=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:s,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,r.G)(),u=(0,o.d)();console.log("Assets in DownloadCard:",u);const m=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),x=u.filter((e=>e.name.includes(m)));return console.log("Filtered assets for",n,"in DownloadCard:",x),(0,a.jsxs)("div",{className:t.A.downloadCard,children:[(0,a.jsx)("div",{className:t.A.imgContainer,children:(0,a.jsx)("img",{src:s,alt:`${n} logo`})}),(0,a.jsx)("h3",{children:n}),x.length>0&&(0,a.jsx)("ul",{children:x.map(((e,n)=>(0,a.jsx)("li",{className:t.A.downloadButtons,children:(0,a.jsx)("a",{href:e.url,className:t.A.downloadLinks,children:i(e.arch)})},n)))}),d&&(0,a.jsxs)("div",{className:t.A.cardFooter,children:[(0,a.jsx)("p",{children:l}),(0,a.jsx)("a",{href:d,children:"GUIDE"}),(0,a.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>o});const o={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var o=s(6540);const t={},r=o.createContext(t);function a(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bbbe662c.b37b0a59.js b/assets/js/bbbe662c.9639f5d7.js similarity index 99% rename from assets/js/bbbe662c.b37b0a59.js rename to assets/js/bbbe662c.9639f5d7.js index a26ffb66..2dc65397 100644 --- a/assets/js/bbbe662c.b37b0a59.js +++ b/assets/js/bbbe662c.9639f5d7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1057],{942:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","source":"@site/../docs/guides/docker-share/docker_private_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_private_share_guide","permalink":"/docs/guides/docker-share/docker_private_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/docker_private_share_guide.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"Docker Private Share","sidebar_position":20,"sidebar_label":"Private Share"},"sidebar":"tutorialSidebar","previous":{"title":"Public Share","permalink":"/docs/guides/docker-share/docker_public_share_guide"},"next":{"title":"Self Hosting","permalink":"/docs/category/self-hosting"}}');var o=n(4848),i=n(8453);const t={title:"Docker Private Share",sidebar_position:20,sidebar_label:"Private Share"},a=void 0,c={},l=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Begin Sharing Privately with zrok in Docker",id:"begin-sharing-privately-with-zrok-in-docker",level:2},{value:"Access the Private Share",id:"access-the-private-share",level:2},{value:"Closed Permission Mode",id:"closed-permission-mode",level:2},{value:"Going Further with Private Access",id:"going-further-with-private-access",level:2},{value:"Cleaning Up",id:"cleaning-up",level:2}];function h(e){const r={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/concepts/sharing-private",children:"private sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/HxyvtFAvwUE",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a private share token and keep sharing the backend target."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a private share token for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(r.p,{children:["To follow this guide you will need ",(0,o.jsx)(r.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,o.jsx)(r.p,{children:"If you have installed Docker Desktop on macOS or Windows then you are all set."}),"\n",(0,o.jsx)(r.h2,{id:"begin-sharing-privately-with-zrok-in-docker",children:"Begin Sharing Privately with zrok in Docker"}),"\n",(0,o.jsx)(r.p,{children:"First, let's create the private share."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private share."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsx)(r.a,{href:"pathname:///zrok-private-share/compose.yml",children:"the zrok-private-share Docker Compose project file"})," into your new project folder and make sure it's named ",(0,o.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"If you are self-hosting zrok then it's important to set your API endpoint URL too. If you're using the hosted zrok service then you can skip this step."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_API_ENDPOINT="https://zrok.example.com"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run your Compose project to start sharing the built-in demo web server:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Read the private share token from the output. One of the last lines is like this:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"zrok-private-share-1 | zrok access private wr3hpf2z5fiy\n"})}),"\n",(0,o.jsx)(r.p,{children:"Keep track of this token so you can use it in your zrok private access project."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"access-the-private-share",children:"Access the Private Share"}),"\n",(0,o.jsx)(r.p,{children:"Now that we have a private share we can access it with the zrok command or by running a separate Docker Compose project."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private access."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsx)(r.a,{href:"pathname:///zrok-private-access/compose.yml",children:"the zrok-private-access Docker Compose project file"})," into your new project folder and make sure it's named ",(0,o.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Now copy the zrok private access token from the zrok private share project's output to your clipboard and paste it in the same file named ",(0,o.jsx)(r.code,{children:".env"})," here in your private share project folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\nZROK_ACCESS_TOKEN="wr3hpf2z5fiy"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run your Compose project to start accessing the private share:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up zrok-access\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Now your zrok private access proxy is ready on ",(0,o.jsx)(r.a,{href:"http://127.0.0.1:9191",children:"http://127.0.0.1:9191"}),". You can visit the demo web server in your browser."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"closed-permission-mode",children:"Closed Permission Mode"}),"\n",(0,o.jsx)(r.p,{children:'Normally, you need only the share token to access a private share. You can further restrict access with "closed" permission mode.'}),"\n",(0,o.jsx)(r.p,{children:"You must set the permission mode before you reserve the share."}),"\n",(0,o.jsx)(r.p,{children:"Only your own account can access the private share."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'ZROK_PERMISSION_MODE="closed"\n'})}),"\n",(0,o.jsx)(r.p,{children:"Grant access to additional zrok accounts."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'ZROK_ACCESS_GRANTS="bob@example.com alice@example.org"\n'})}),"\n",(0,o.jsxs)(r.p,{children:["You can adjust the access grants by running the CLI inside the ",(0,o.jsx)(r.code,{children:"zrok-share"})," container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose exec zrok-share zrok modify ${ZROK_UNIQUE_NAME} --remove-access-grant bob@example.com\n"})}),"\n",(0,o.jsx)(r.h2,{id:"going-further-with-private-access",children:"Going Further with Private Access"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Try changing the demo web server used in the private share project. One alternative demo server is provided: ",(0,o.jsx)(r.code,{children:"httpbin"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Try accessing the private share from ",(0,o.jsx)(r.em,{children:"inside"})," a container running in the private access project. One demo client is provided: ",(0,o.jsx)(r.code,{children:"demo-client"}),". You can run it like this."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up demo-client\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["You'll see in the terminal output that the demo-client container is getting a response from the private share indicating the source IP of the request from the perspective of the demo server: ",(0,o.jsx)(r.code,{children:"httpbin"})," that's running in the private share project."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,o.jsx)(r.p,{children:'Run the "down" command in both Compose projects to destroy them when you\'re all done. This will stop the running containers and delete zrok environments\' storage volumes. Then delete the selected zrok environment by clicking "Actions" in the web console.'}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --remove-orphans --volumes\n"})})]})}function d(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1057],{511:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","source":"@site/../docs/guides/docker-share/docker_private_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_private_share_guide","permalink":"/docs/guides/docker-share/docker_private_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/docker-share/docker_private_share_guide.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"Docker Private Share","sidebar_position":20,"sidebar_label":"Private Share"},"sidebar":"tutorialSidebar","previous":{"title":"Public Share","permalink":"/docs/guides/docker-share/docker_public_share_guide"},"next":{"title":"Self Hosting","permalink":"/docs/category/self-hosting"}}');var o=n(4848),i=n(8453);const t={title:"Docker Private Share",sidebar_position:20,sidebar_label:"Private Share"},a=void 0,c={},l=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Begin Sharing Privately with zrok in Docker",id:"begin-sharing-privately-with-zrok-in-docker",level:2},{value:"Access the Private Share",id:"access-the-private-share",level:2},{value:"Closed Permission Mode",id:"closed-permission-mode",level:2},{value:"Going Further with Private Access",id:"going-further-with-private-access",level:2},{value:"Cleaning Up",id:"cleaning-up",level:2}];function h(e){const r={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/concepts/sharing-private",children:"private sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/HxyvtFAvwUE",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a private share token and keep sharing the backend target."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a private share token for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(r.p,{children:["To follow this guide you will need ",(0,o.jsx)(r.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n",(0,o.jsx)(r.p,{children:"If you have installed Docker Desktop on macOS or Windows then you are all set."}),"\n",(0,o.jsx)(r.h2,{id:"begin-sharing-privately-with-zrok-in-docker",children:"Begin Sharing Privately with zrok in Docker"}),"\n",(0,o.jsx)(r.p,{children:"First, let's create the private share."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private share."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsx)(r.a,{href:"pathname:///zrok-private-share/compose.yml",children:"the zrok-private-share Docker Compose project file"})," into your new project folder and make sure it's named ",(0,o.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"If you are self-hosting zrok then it's important to set your API endpoint URL too. If you're using the hosted zrok service then you can skip this step."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_API_ENDPOINT="https://zrok.example.com"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run your Compose project to start sharing the built-in demo web server:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Read the private share token from the output. One of the last lines is like this:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"zrok-private-share-1 | zrok access private wr3hpf2z5fiy\n"})}),"\n",(0,o.jsx)(r.p,{children:"Keep track of this token so you can use it in your zrok private access project."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"access-the-private-share",children:"Access the Private Share"}),"\n",(0,o.jsx)(r.p,{children:"Now that we have a private share we can access it with the zrok command or by running a separate Docker Compose project."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok private access."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"In your terminal, change directory to your newly-created project folder."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsx)(r.a,{href:"pathname:///zrok-private-access/compose.yml",children:"the zrok-private-access Docker Compose project file"})," into your new project folder and make sure it's named ",(0,o.jsx)(r.code,{children:"compose.yml"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok environment token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Now copy the zrok private access token from the zrok private share project's output to your clipboard and paste it in the same file named ",(0,o.jsx)(r.code,{children:".env"})," here in your private share project folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'# file name ".env"\nZROK_ENABLE_TOKEN="8UL9-48rN0ua"\nZROK_ACCESS_TOKEN="wr3hpf2z5fiy"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run your Compose project to start accessing the private share:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up zrok-access\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Now your zrok private access proxy is ready on ",(0,o.jsx)(r.a,{href:"http://127.0.0.1:9191",children:"http://127.0.0.1:9191"}),". You can visit the demo web server in your browser."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"closed-permission-mode",children:"Closed Permission Mode"}),"\n",(0,o.jsx)(r.p,{children:'Normally, you need only the share token to access a private share. You can further restrict access with "closed" permission mode.'}),"\n",(0,o.jsx)(r.p,{children:"You must set the permission mode before you reserve the share."}),"\n",(0,o.jsx)(r.p,{children:"Only your own account can access the private share."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'ZROK_PERMISSION_MODE="closed"\n'})}),"\n",(0,o.jsx)(r.p,{children:"Grant access to additional zrok accounts."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:'ZROK_ACCESS_GRANTS="bob@example.com alice@example.org"\n'})}),"\n",(0,o.jsxs)(r.p,{children:["You can adjust the access grants by running the CLI inside the ",(0,o.jsx)(r.code,{children:"zrok-share"})," container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose exec zrok-share zrok modify ${ZROK_UNIQUE_NAME} --remove-access-grant bob@example.com\n"})}),"\n",(0,o.jsx)(r.h2,{id:"going-further-with-private-access",children:"Going Further with Private Access"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Try changing the demo web server used in the private share project. One alternative demo server is provided: ",(0,o.jsx)(r.code,{children:"httpbin"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Try accessing the private share from ",(0,o.jsx)(r.em,{children:"inside"})," a container running in the private access project. One demo client is provided: ",(0,o.jsx)(r.code,{children:"demo-client"}),". You can run it like this."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up demo-client\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["You'll see in the terminal output that the demo-client container is getting a response from the private share indicating the source IP of the request from the perspective of the demo server: ",(0,o.jsx)(r.code,{children:"httpbin"})," that's running in the private share project."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,o.jsx)(r.p,{children:'Run the "down" command in both Compose projects to destroy them when you\'re all done. This will stop the running containers and delete zrok environments\' storage volumes. Then delete the selected zrok environment by clicking "Actions" in the web console.'}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --remove-orphans --volumes\n"})})]})}function d(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc32cbb6.ac399eaf.js b/assets/js/bc32cbb6.9999155a.js similarity index 99% rename from assets/js/bc32cbb6.ac399eaf.js rename to assets/js/bc32cbb6.9999155a.js index 6bfe829b..d1181122 100644 --- a/assets/js/bc32cbb6.ac399eaf.js +++ b/assets/js/bc32cbb6.9999155a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[826],{6272:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/interstitial-page","permalink":"/docs/0.4/guides/self-hosting/interstitial-page","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md","tags":[],"version":"0.4","sidebarPosition":18,"frontMatter":{"title":"Interstitial Pages","sidebar_label":"Interstitial Pages","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"NGINX TLS","permalink":"/docs/0.4/guides/self-hosting/linux/nginx"},"next":{"title":"Organizations","permalink":"/docs/0.4/guides/self-hosting/organizations"}}');var s=i(4848),r=i(8453);const a={title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},o=void 0,l={},h=[{value:"Bypassing the Interstitial",id:"bypassing-the-interstitial",level:2}];function c(e){const t={code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution."}),"\n",(0,s.jsx)(t.p,{children:"Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use)."}),"\n",(0,s.jsx)(t.p,{children:"The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges."}),"\n",(0,s.jsx)(t.p,{children:"By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them."}),"\n",(0,s.jsx)(t.p,{children:"Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"zrok_interstitial_rendezvous",src:i(6990).A+"",width:"631",height:"362"})}),"\n",(0,s.jsxs)(t.p,{children:["Every zrok share has a ",(0,s.jsx)(t.em,{children:"config"})," recorded in the underlying OpenZiti network. The config is of type ",(0,s.jsx)(t.code,{children:"zrok.proxy.v1"}),". The frontend uses the information in this config to understand the disposition of the share. The config can contain an ",(0,s.jsx)(t.code,{children:"interstitial: true"})," setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit."]}),"\n",(0,s.jsxs)(t.p,{children:["By default the zrok controller will record ",(0,s.jsx)(t.code,{children:"interstitial: true"})," in the share config ",(0,s.jsx)(t.em,{children:"unless"})," a row is present in the ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table in the underlying database for the account creating the share. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table is a basic SQL structure that allows inserting a row per account."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"create table skip_interstitial_grants (\n id serial primary key,\n\n account_id integer references accounts (id) not null,\n\n created_at timestamptz not null default(current_timestamp),\n updated_at timestamptz not null default(current_timestamp),\n deleted boolean not null default(false)\n);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["If an account has a row present in this table when creating a share, then the controller will write ",(0,s.jsx)(t.code,{children:"interstitial: false"})," into the config for the share, which will bypass the interstitial regardless of frontend configuration. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," controls what the zrok controller will store in the share config when creating the share."]}),"\n",(0,s.jsx)(t.p,{children:"The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'# Configure interstitial pages for this frontend. The interstitial page presents a warning to internet users, alerting\n# them to the fact that they\'re visiting a zrok share.\n#\n#interstitial:\n# # Enable or disable interstitial pages on this frontend.\n# #\n# enabled: true\n#\n# # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled\n# # and this list is not set, all user agents will receive an interstitial page.\n# #\n# user_agent_prefixes:\n# - "Mozilla/5.0"\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Setting ",(0,s.jsx)(t.code,{children:"enabled: true"})," in the ",(0,s.jsx)(t.code,{children:"interstitial"})," stanza of the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share. The ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," array can be used to specify which specific ",(0,s.jsx)(t.code,{children:"User-Agent"})," types receive the interstitial. User agents that match a prefix in the list will receive the interstitial, while others will not. If the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list is omitted, ",(0,s.jsx)(t.em,{children:"all"})," user agents will receive the interstitial page."]}),"\n",(0,s.jsx)(t.h2,{id:"bypassing-the-interstitial",children:"Bypassing the Interstitial"}),"\n",(0,s.jsxs)(t.p,{children:["The interstitial page will be presented unless the client shows up with a ",(0,s.jsx)(t.code,{children:"zrok_interstitial"})," cookie (depending on ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," configuration). When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week."]}),"\n",(0,s.jsxs)(t.p,{children:["Typically the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list contains ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"}),", which matches all typical interactive mobile and desktop browsers. Setting a non-standard ",(0,s.jsx)(t.code,{children:"User-Agent"})," in an interactive browser will bypass the interstitial pages for frontends configured with the usual ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"})," prefix."]}),"\n",(0,s.jsxs)(t.p,{children:["End users can offer an HTTP header of ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"}),", set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"})," header is especially useful for API clients (like ",(0,s.jsx)(t.code,{children:"curl"}),") and other types of non-interactive clients."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"drive"})," backend mode does not currently support ",(0,s.jsx)(t.code,{children:"GET"})," requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},6990:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>o});var n=i(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[826],{1651:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/self-hosting/interstitial-page","title":"Interstitial Pages","description":"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn\'t their financial institution.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/interstitial-page","permalink":"/docs/0.4/guides/self-hosting/interstitial-page","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md","tags":[],"version":"0.4","sidebarPosition":18,"frontMatter":{"title":"Interstitial Pages","sidebar_label":"Interstitial Pages","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"NGINX TLS","permalink":"/docs/0.4/guides/self-hosting/linux/nginx"},"next":{"title":"Organizations","permalink":"/docs/0.4/guides/self-hosting/organizations"}}');var s=i(4848),r=i(8453);const a={title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},o=void 0,l={},h=[{value:"Bypassing the Interstitial",id:"bypassing-the-interstitial",level:2}];function c(e){const t={code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution."}),"\n",(0,s.jsx)(t.p,{children:"Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use)."}),"\n",(0,s.jsx)(t.p,{children:"The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges."}),"\n",(0,s.jsx)(t.p,{children:"By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them."}),"\n",(0,s.jsx)(t.p,{children:"Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"zrok_interstitial_rendezvous",src:i(6990).A+"",width:"631",height:"362"})}),"\n",(0,s.jsxs)(t.p,{children:["Every zrok share has a ",(0,s.jsx)(t.em,{children:"config"})," recorded in the underlying OpenZiti network. The config is of type ",(0,s.jsx)(t.code,{children:"zrok.proxy.v1"}),". The frontend uses the information in this config to understand the disposition of the share. The config can contain an ",(0,s.jsx)(t.code,{children:"interstitial: true"})," setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit."]}),"\n",(0,s.jsxs)(t.p,{children:["By default the zrok controller will record ",(0,s.jsx)(t.code,{children:"interstitial: true"})," in the share config ",(0,s.jsx)(t.em,{children:"unless"})," a row is present in the ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table in the underlying database for the account creating the share. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," table is a basic SQL structure that allows inserting a row per account."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"create table skip_interstitial_grants (\n id serial primary key,\n\n account_id integer references accounts (id) not null,\n\n created_at timestamptz not null default(current_timestamp),\n updated_at timestamptz not null default(current_timestamp),\n deleted boolean not null default(false)\n);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["If an account has a row present in this table when creating a share, then the controller will write ",(0,s.jsx)(t.code,{children:"interstitial: false"})," into the config for the share, which will bypass the interstitial regardless of frontend configuration. The ",(0,s.jsx)(t.code,{children:"skip_interstitial_grants"})," controls what the zrok controller will store in the share config when creating the share."]}),"\n",(0,s.jsx)(t.p,{children:"The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:'# Configure interstitial pages for this frontend. The interstitial page presents a warning to internet users, alerting\n# them to the fact that they\'re visiting a zrok share.\n#\n#interstitial:\n# # Enable or disable interstitial pages on this frontend.\n# #\n# enabled: true\n#\n# # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled\n# # and this list is not set, all user agents will receive an interstitial page.\n# #\n# user_agent_prefixes:\n# - "Mozilla/5.0"\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Setting ",(0,s.jsx)(t.code,{children:"enabled: true"})," in the ",(0,s.jsx)(t.code,{children:"interstitial"})," stanza of the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share. The ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," array can be used to specify which specific ",(0,s.jsx)(t.code,{children:"User-Agent"})," types receive the interstitial. User agents that match a prefix in the list will receive the interstitial, while others will not. If the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list is omitted, ",(0,s.jsx)(t.em,{children:"all"})," user agents will receive the interstitial page."]}),"\n",(0,s.jsx)(t.h2,{id:"bypassing-the-interstitial",children:"Bypassing the Interstitial"}),"\n",(0,s.jsxs)(t.p,{children:["The interstitial page will be presented unless the client shows up with a ",(0,s.jsx)(t.code,{children:"zrok_interstitial"})," cookie (depending on ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," configuration). When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week."]}),"\n",(0,s.jsxs)(t.p,{children:["Typically the ",(0,s.jsx)(t.code,{children:"user_agent_prefixes"})," list contains ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"}),", which matches all typical interactive mobile and desktop browsers. Setting a non-standard ",(0,s.jsx)(t.code,{children:"User-Agent"})," in an interactive browser will bypass the interstitial pages for frontends configured with the usual ",(0,s.jsx)(t.code,{children:"Mozilla/5.0"})," prefix."]}),"\n",(0,s.jsxs)(t.p,{children:["End users can offer an HTTP header of ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"}),", set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"skip_zrok_interstitial"})," header is especially useful for API clients (like ",(0,s.jsx)(t.code,{children:"curl"}),") and other types of non-interactive clients."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"drive"})," backend mode does not currently support ",(0,s.jsx)(t.code,{children:"GET"})," requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},6990:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>o});var n=i(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc747cac.47cf4617.js b/assets/js/bc747cac.47cf4617.js new file mode 100644 index 00000000..18364463 --- /dev/null +++ b/assets/js/bc747cac.47cf4617.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4909],{2731:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","source":"@site/../docs/concepts/index.md","sourceDirName":"concepts","slug":"/concepts/","permalink":"/docs/concepts/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/index.md","tags":[],"version":"current","sidebarPosition":25,"frontMatter":{"sidebar_title":"Core Features","sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/getting-started"},"next":{"title":"Private Shares","permalink":"/docs/concepts/sharing-private"}}');var o=t(4848),r=t(8453);const c={sidebar_title:"Core Features",sidebar_position:25},i="Concepts",a={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," was designed to make sharing local resources both secure and easy. In this section of the ",(0,o.jsx)(n.code,{children:"zrok"})," documentation, we'll tour through all of the most important features."]}),"\n",(0,o.jsxs)(n.p,{children:["Sharing with ",(0,o.jsx)(n.code,{children:"zrok"})," can be either ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:(0,o.jsx)(n.code,{children:"public"})})," or ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:(0,o.jsx)(n.code,{children:"private"})}),".\nNaturally, regular web-based resources can be shared but ",(0,o.jsx)(n.code,{children:"zrok"})," also includes support for sharing raw ",(0,o.jsx)(n.a,{href:"/docs/concepts/tunnels",children:"TCP"})," and ",(0,o.jsx)(n.a,{href:"/docs/concepts/tunnels",children:"UDP"})," network connections, and also includes a ",(0,o.jsx)(n.a,{href:"/docs/concepts/files",children:"website and file sharing"})," feature."]}),"\n",(0,o.jsxs)(n.p,{children:["Learn about ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.a,{href:"/docs/concepts/hosting",children:"hosting here"}),", including instructions on how to ",(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/linux/",children:["install your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc747cac.7ee6980c.js b/assets/js/bc747cac.7ee6980c.js deleted file mode 100644 index 96278b61..00000000 --- a/assets/js/bc747cac.7ee6980c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4909],{487:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","source":"@site/../docs/concepts/index.md","sourceDirName":"concepts","slug":"/concepts/","permalink":"/docs/concepts/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/index.md","tags":[],"version":"current","sidebarPosition":25,"frontMatter":{"sidebar_title":"Core Features","sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/getting-started"},"next":{"title":"Private Shares","permalink":"/docs/concepts/sharing-private"}}');var o=t(4848),r=t(8453);const c={sidebar_title:"Core Features",sidebar_position:25},i="Concepts",a={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," was designed to make sharing local resources both secure and easy. In this section of the ",(0,o.jsx)(n.code,{children:"zrok"})," documentation, we'll tour through all of the most important features."]}),"\n",(0,o.jsxs)(n.p,{children:["Sharing with ",(0,o.jsx)(n.code,{children:"zrok"})," can be either ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:(0,o.jsx)(n.code,{children:"public"})})," or ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:(0,o.jsx)(n.code,{children:"private"})}),".\nNaturally, regular web-based resources can be shared but ",(0,o.jsx)(n.code,{children:"zrok"})," also includes support for sharing raw ",(0,o.jsx)(n.a,{href:"/docs/concepts/tunnels",children:"TCP"})," and ",(0,o.jsx)(n.a,{href:"/docs/concepts/tunnels",children:"UDP"})," network connections, and also includes a ",(0,o.jsx)(n.a,{href:"/docs/concepts/files",children:"website and file sharing"})," feature."]}),"\n",(0,o.jsxs)(n.p,{children:["Learn about ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.a,{href:"/docs/concepts/hosting",children:"hosting here"}),", including instructions on how to ",(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/linux/",children:["install your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf372175.6ce3604a.js b/assets/js/bf372175.b4ab81db.js similarity index 97% rename from assets/js/bf372175.6ce3604a.js rename to assets/js/bf372175.b4ab81db.js index 41588698..43faf2b2 100644 --- a/assets/js/bf372175.6ce3604a.js +++ b/assets/js/bf372175.b4ab81db.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6974],{6603:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","source":"@site/versioned_docs/version-0.4/concepts/hosting.md","sourceDirName":"concepts","slug":"/concepts/hosting","permalink":"/docs/0.4/concepts/hosting","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/hosting.md","tags":[],"version":"0.4","sidebarPosition":200,"frontMatter":{"sidebar_position":200},"sidebar":"tutorialSidebar","previous":{"title":"Open Source","permalink":"/docs/0.4/concepts/opensource"},"next":{"title":"Guides","permalink":"/docs/0.4/category/guides"}}');var t=s(4848),i=s(8453);const r={sidebar_position:200},c="Hosting",d={},a=[{value:"Self-Hosted",id:"self-hosted",level:2},{value:"Managed Service",id:"managed-service",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"hosting",children:"Hosting"})}),"\n",(0,t.jsx)(o.h2,{id:"self-hosted",children:"Self-Hosted"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is not limited to a managed offering. You can ",(0,t.jsx)(o.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:"host your own"})," instance of ",(0,t.jsx)(o.code,{children:"zrok"})," as well. ",(0,t.jsx)(o.code,{children:"zrok"})," is\nalso freely available as open source software hosted by GitHub under a very permissive Apache v2 license."]}),"\n",(0,t.jsx)(o.h2,{id:"managed-service",children:"Managed Service"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is also offered as a cloud service, making it instantly accessible to a large population immediately.\nNetFoundry provides a manged version of ",(0,t.jsx)(o.code,{children:"zrok"})," at ",(0,t.jsx)(o.a,{href:"https://zrok.io",children:"https://zrok.io"}),". This provides the easy-to-use,\nquick to demonstrate features of ",(0,t.jsx)(o.code,{children:"zrok"})," without needing to deploy and host ",(0,t.jsx)(o.code,{children:"zrok"})," yourself."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>c});var n=s(6540);const t={},i=n.createContext(t);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6974],{9620:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","source":"@site/versioned_docs/version-0.4/concepts/hosting.md","sourceDirName":"concepts","slug":"/concepts/hosting","permalink":"/docs/0.4/concepts/hosting","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/hosting.md","tags":[],"version":"0.4","sidebarPosition":200,"frontMatter":{"sidebar_position":200},"sidebar":"tutorialSidebar","previous":{"title":"Open Source","permalink":"/docs/0.4/concepts/opensource"},"next":{"title":"Guides","permalink":"/docs/0.4/category/guides"}}');var t=s(4848),i=s(8453);const r={sidebar_position:200},c="Hosting",d={},a=[{value:"Self-Hosted",id:"self-hosted",level:2},{value:"Managed Service",id:"managed-service",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"hosting",children:"Hosting"})}),"\n",(0,t.jsx)(o.h2,{id:"self-hosted",children:"Self-Hosted"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is not limited to a managed offering. You can ",(0,t.jsx)(o.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:"host your own"})," instance of ",(0,t.jsx)(o.code,{children:"zrok"})," as well. ",(0,t.jsx)(o.code,{children:"zrok"})," is\nalso freely available as open source software hosted by GitHub under a very permissive Apache v2 license."]}),"\n",(0,t.jsx)(o.h2,{id:"managed-service",children:"Managed Service"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"zrok"})," is also offered as a cloud service, making it instantly accessible to a large population immediately.\nNetFoundry provides a manged version of ",(0,t.jsx)(o.code,{children:"zrok"})," at ",(0,t.jsx)(o.a,{href:"https://zrok.io",children:"https://zrok.io"}),". This provides the easy-to-use,\nquick to demonstrate features of ",(0,t.jsx)(o.code,{children:"zrok"})," without needing to deploy and host ",(0,t.jsx)(o.code,{children:"zrok"})," yourself."]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>c});var n=s(6540);const t={},i=n.createContext(t);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bfe99541.bd20f5d0.js b/assets/js/bfe99541.bd20f5d0.js deleted file mode 100644 index 11083810..00000000 --- a/assets/js/bfe99541.bd20f5d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3434],{5937:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md","sourceDirName":"guides/self-hosting/oauth","slug":"/guides/self-hosting/oauth/configuring-oauth","permalink":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md","tags":[],"version":"0.4","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"OAuth","permalink":"/docs/0.4/category/oauth"},"next":{"title":"Instance Config","permalink":"/docs/0.4/guides/self-hosting/instance-configuration"}}');var o=n(4848),s=n(8453);const r={},a="OAuth Public Frontend Configuration",c={},h=[{value:"Planning for the OAuth Frontend",id:"planning-for-the-oauth-frontend",level:2},{value:"Configuring a Google OAuth Client ID",id:"configuring-a-google-oauth-client-id",level:2},{value:"OAuth Content Screen",id:"oauth-content-screen",level:3},{value:"Create the OAuth 2.0 Client ID",id:"create-the-oauth-20-client-id",level:3},{value:"Configuring a GitHub Client ID",id:"configuring-a-github-client-id",level:2},{value:"Configuring your Public Frontend",id:"configuring-your-public-frontend",level:2},{value:"Enabling OAuth on a Public Share",id:"enabling-oauth-on-a-public-share",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oauth-public-frontend-configuration",children:"OAuth Public Frontend Configuration"})}),"\n",(0,o.jsxs)(t.p,{children:["As of ",(0,o.jsx)(t.code,{children:"v0.4.7"}),", ",(0,o.jsx)(t.code,{children:"zrok"})," includes OAuth integration for both Google and GitHub for ",(0,o.jsx)(t.code,{children:"zrok access public"})," public frontends."]}),"\n",(0,o.jsx)(t.p,{children:"This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share."}),"\n",(0,o.jsxs)(t.p,{children:["This is a first step towards a more comprehensive portfolio of user authentication strategies in future ",(0,o.jsx)(t.code,{children:"zrok"})," releases."]}),"\n",(0,o.jsx)(t.h2,{id:"planning-for-the-oauth-frontend",children:"Planning for the OAuth Frontend"}),"\n",(0,o.jsx)(t.p,{children:"The current implementation of the OAuth public frontend uses a HTTP listener to handle redirects from OAuth providers. You'll need to configure a DNS name and a port for this listener that is accessible by your end users. We'll refer to this listener as the \"OAuth frontend\" in this guide."}),"\n",(0,o.jsx)(t.p,{children:'We\'ll use the public DNS address of the OAuth frontend when creating the Google and GitHub OAuth clients below. This address is typically configured into these clients as the "redirect URL" where these clients will send the authenticated users after authentication.'}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend will capture the successful authentication and forward the user back to their original destination."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-google-oauth-client-id",children:"Configuring a Google OAuth Client ID"}),"\n",(0,o.jsx)(t.h3,{id:"oauth-content-screen",children:"OAuth Content Screen"}),"\n",(0,o.jsx)(t.p,{children:'Before you can configure an OAuth Client ID in Google Cloud, you have to configure the "OAuth content screen".'}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > OAuth content screen"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7700).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsxs)(t.p,{children:["Here you can give your ",(0,o.jsx)(t.code,{children:"zrok"})," public frontend an identity and branding to match your deployment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(941).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsx)(t.p,{children:"Describe what domains are authorized to access your public frontend and establish contact information."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(962).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Add a non-sensitive scope for ",(0,o.jsx)(t.code,{children:"../auth/userinfo.email"}),". This is important as it allows the ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend to receive the email address of the authenticated user."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2507).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4944).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Now your OAuth content screen is configured."}),"\n",(0,o.jsx)(t.h3,{id:"create-the-oauth-20-client-id",children:"Create the OAuth 2.0 Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Next we create the OAuth Client ID for your public frontend."}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud Console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > + Create Credentials"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1390).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Select ",(0,o.jsx)(t.code,{children:"OAuth client ID"})," from the ",(0,o.jsx)(t.code,{children:"+ Create Credentials"})," dropdown."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7141).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Application type is ",(0,o.jsx)(t.code,{children:"Web Application"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(604).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The most important bit here is the "Authorized redirect URIs". You\'re going to want to put a URL here that matches the ',(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend address that you configured at the start of this guide, but at the end of the URL you're going to append ",(0,o.jsx)(t.code,{children:"/google/oauth"})," to the URL."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4419).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"With this your Google OAuth client should be configured and ready."}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-github-client-id",children:"Configuring a GitHub Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Register a new OAuth application through the GitHub settings for the account that owns the application."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to:",(0,o.jsx)(t.code,{children:"Settings > Developer Settings > OAuth Apps > Register a new application"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2306).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7449).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The "Authorized callback URL" should be configured to match the OAuth frontend address you configured at the start of this guide, with ',(0,o.jsx)(t.code,{children:"/github/oauth"})," appended to the end."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(3891).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Create a new client secret."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4927).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-your-public-frontend",children:"Configuring your Public Frontend"}),"\n",(0,o.jsxs)(t.p,{children:["The public frontend configuration includes a new ",(0,o.jsx)(t.code,{children:"oauth"})," section:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'oauth:\n bind_address: 0.0.0.0:8181\n redirect_url: https://oauth.zrok.io\n cookie_domain: zrok.io\n hash_key: "the quick brown fox jumped over the lazy dog"\n providers:\n - name: google\n client_id: "<client id from google>"\n client_secret: "<client secret from google>"\n - name: github\n client_id: "<client id from github>"\n client_secret: "<client secret from github>"\n \n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"bind_address"})," parameter determines where the OAuth frontend will bind. Should be in ",(0,o.jsx)(t.code,{children:"ip:port"})," format."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"redirect_url"})," parameter determines the base URL where OAuth frontend requests will be redirected."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"cookie_domain"})," is the domain where authentication cookies should be stored."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"hash_key"})," is a unique string for your installation that is used to secure the authentication payloads for your public frontend."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"providers"})," is a list of configured providers for this public frontend. The current implementation supports ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," as options."]}),"\n",(0,o.jsxs)(t.p,{children:["Both the ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," providers accept a ",(0,o.jsx)(t.code,{children:"client_id"})," and ",(0,o.jsx)(t.code,{children:"client_secret"})," parameter. These values are provided when you configure the OAuth clients at Google or GitHub."]}),"\n",(0,o.jsx)(t.h2,{id:"enabling-oauth-on-a-public-share",children:"Enabling OAuth on a Public Share"}),"\n",(0,o.jsx)(t.p,{children:"With your public frontend configured to support OAuth, you can test this by creating a public share. There are new command line options to support this:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:'$ zrok share public --help\nShare a target resource publicly\n\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n -b, --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n --oauth-check-interval duration Maximum lifetime for OAuth authentication; reauthenticate after expiry (default 3h0m0s)\n --oauth-email-address-patterns stringArray Allow only these email domain globs to authenticate via OAuth\n --oauth-provider string Enable OAuth provider [google, github]\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-provider"})," flag enables OAuth for the share using the specified provider."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-email-address-patterns"})," flag accepts a single glob pattern that matches an authenticated email address that is allowed to access the share. Use this flag multiple times to allow different patterns."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-check-interval"})," flag specifies how frequently the authentication must be checked."]}),"\n",(0,o.jsx)(t.p,{children:"An example public share:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:"zrok share public --backend-mode web --oauth-provider github --oauth-email-address-patterns '*@zrok.io' ~/public\n"})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},2306:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_1-dbb289a694d0c99b50cb949654d818f8.png"},7449:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_2-bc9d4c3f25853d608870eb220d00e5ee.png"},3891:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_3-7973d63cd117eaba72fbaeb4ff119a39.png"},4927:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_4-6fed398013c9e6c3a31e5721adac4a4c.png"},1390:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_1-e61ee7e8fa51bdc93feab84235a90673.png"},7141:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_2-60cf4edb52f453d605907c17400e0800.png"},604:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_3-1b3db3f9057d8626d64c5466dbb05ec7.png"},4419:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_4-f720031df1d09f997a18842745e9ea0d.png"},7700:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_2-b94a6456ce9b13e053b4c07d8f233e84.png"},941:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_3-edf62ea2b291b58093289d31c2dae58d.png"},962:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_4-4bc7e07b06c8a9a3c1e8f766f6f1c5a6.png"},2507:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_5-7c375cf49d8e2e392ca12b584462ab59.png"},4944:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_6-9b0fe216a782ef378313650e99ea52a1.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bfe99541.ebbc647d.js b/assets/js/bfe99541.ebbc647d.js new file mode 100644 index 00000000..baa9ff19 --- /dev/null +++ b/assets/js/bfe99541.ebbc647d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3434],{364:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/self-hosting/oauth/configuring-oauth","title":"OAuth Public Frontend Configuration","description":"As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.","source":"@site/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md","sourceDirName":"guides/self-hosting/oauth","slug":"/guides/self-hosting/oauth/configuring-oauth","permalink":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md","tags":[],"version":"0.4","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"OAuth","permalink":"/docs/0.4/category/oauth"},"next":{"title":"Instance Config","permalink":"/docs/0.4/guides/self-hosting/instance-configuration"}}');var o=n(4848),s=n(8453);const r={},a="OAuth Public Frontend Configuration",c={},h=[{value:"Planning for the OAuth Frontend",id:"planning-for-the-oauth-frontend",level:2},{value:"Configuring a Google OAuth Client ID",id:"configuring-a-google-oauth-client-id",level:2},{value:"OAuth Content Screen",id:"oauth-content-screen",level:3},{value:"Create the OAuth 2.0 Client ID",id:"create-the-oauth-20-client-id",level:3},{value:"Configuring a GitHub Client ID",id:"configuring-a-github-client-id",level:2},{value:"Configuring your Public Frontend",id:"configuring-your-public-frontend",level:2},{value:"Enabling OAuth on a Public Share",id:"enabling-oauth-on-a-public-share",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oauth-public-frontend-configuration",children:"OAuth Public Frontend Configuration"})}),"\n",(0,o.jsxs)(t.p,{children:["As of ",(0,o.jsx)(t.code,{children:"v0.4.7"}),", ",(0,o.jsx)(t.code,{children:"zrok"})," includes OAuth integration for both Google and GitHub for ",(0,o.jsx)(t.code,{children:"zrok access public"})," public frontends."]}),"\n",(0,o.jsx)(t.p,{children:"This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share."}),"\n",(0,o.jsxs)(t.p,{children:["This is a first step towards a more comprehensive portfolio of user authentication strategies in future ",(0,o.jsx)(t.code,{children:"zrok"})," releases."]}),"\n",(0,o.jsx)(t.h2,{id:"planning-for-the-oauth-frontend",children:"Planning for the OAuth Frontend"}),"\n",(0,o.jsx)(t.p,{children:"The current implementation of the OAuth public frontend uses a HTTP listener to handle redirects from OAuth providers. You'll need to configure a DNS name and a port for this listener that is accessible by your end users. We'll refer to this listener as the \"OAuth frontend\" in this guide."}),"\n",(0,o.jsx)(t.p,{children:'We\'ll use the public DNS address of the OAuth frontend when creating the Google and GitHub OAuth clients below. This address is typically configured into these clients as the "redirect URL" where these clients will send the authenticated users after authentication.'}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend will capture the successful authentication and forward the user back to their original destination."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-google-oauth-client-id",children:"Configuring a Google OAuth Client ID"}),"\n",(0,o.jsx)(t.h3,{id:"oauth-content-screen",children:"OAuth Content Screen"}),"\n",(0,o.jsx)(t.p,{children:'Before you can configure an OAuth Client ID in Google Cloud, you have to configure the "OAuth content screen".'}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > OAuth content screen"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7700).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsxs)(t.p,{children:["Here you can give your ",(0,o.jsx)(t.code,{children:"zrok"})," public frontend an identity and branding to match your deployment."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(941).A+"",width:"1469",height:"1141"})}),"\n",(0,o.jsx)(t.p,{children:"Describe what domains are authorized to access your public frontend and establish contact information."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(962).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Add a non-sensitive scope for ",(0,o.jsx)(t.code,{children:"../auth/userinfo.email"}),". This is important as it allows the ",(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend to receive the email address of the authenticated user."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(2507).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4944).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Now your OAuth content screen is configured."}),"\n",(0,o.jsx)(t.h3,{id:"create-the-oauth-20-client-id",children:"Create the OAuth 2.0 Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Next we create the OAuth Client ID for your public frontend."}),"\n",(0,o.jsxs)(t.p,{children:["In the Google Cloud Console, navigate to: ",(0,o.jsx)(t.code,{children:"APIs & Services > Credentials > + Create Credentials"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(1390).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Select ",(0,o.jsx)(t.code,{children:"OAuth client ID"})," from the ",(0,o.jsx)(t.code,{children:"+ Create Credentials"})," dropdown."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7141).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Application type is ",(0,o.jsx)(t.code,{children:"Web Application"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(8223).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The most important bit here is the "Authorized redirect URIs". You\'re going to want to put a URL here that matches the ',(0,o.jsx)(t.code,{children:"zrok"})," OAuth frontend address that you configured at the start of this guide, but at the end of the URL you're going to append ",(0,o.jsx)(t.code,{children:"/google/oauth"})," to the URL."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4419).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"With this your Google OAuth client should be configured and ready."}),"\n",(0,o.jsx)(t.h2,{id:"configuring-a-github-client-id",children:"Configuring a GitHub Client ID"}),"\n",(0,o.jsx)(t.p,{children:"Register a new OAuth application through the GitHub settings for the account that owns the application."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to:",(0,o.jsx)(t.code,{children:"Settings > Developer Settings > OAuth Apps > Register a new application"})]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(9925).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(7449).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:['The "Authorized callback URL" should be configured to match the OAuth frontend address you configured at the start of this guide, with ',(0,o.jsx)(t.code,{children:"/github/oauth"})," appended to the end."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(6272).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsx)(t.p,{children:"Create a new client secret."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{src:n(4927).A+"",width:"1469",height:"1179"})}),"\n",(0,o.jsxs)(t.p,{children:["Save the client ID and the client secret. You'll configure these into your ",(0,o.jsx)(t.code,{children:"frontend.yml"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"configuring-your-public-frontend",children:"Configuring your Public Frontend"}),"\n",(0,o.jsxs)(t.p,{children:["The public frontend configuration includes a new ",(0,o.jsx)(t.code,{children:"oauth"})," section:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'oauth:\n bind_address: 0.0.0.0:8181\n redirect_url: https://oauth.zrok.io\n cookie_domain: zrok.io\n hash_key: "the quick brown fox jumped over the lazy dog"\n providers:\n - name: google\n client_id: "<client id from google>"\n client_secret: "<client secret from google>"\n - name: github\n client_id: "<client id from github>"\n client_secret: "<client secret from github>"\n \n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"bind_address"})," parameter determines where the OAuth frontend will bind. Should be in ",(0,o.jsx)(t.code,{children:"ip:port"})," format."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"redirect_url"})," parameter determines the base URL where OAuth frontend requests will be redirected."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"cookie_domain"})," is the domain where authentication cookies should be stored."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"hash_key"})," is a unique string for your installation that is used to secure the authentication payloads for your public frontend."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"providers"})," is a list of configured providers for this public frontend. The current implementation supports ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," as options."]}),"\n",(0,o.jsxs)(t.p,{children:["Both the ",(0,o.jsx)(t.code,{children:"google"})," and ",(0,o.jsx)(t.code,{children:"github"})," providers accept a ",(0,o.jsx)(t.code,{children:"client_id"})," and ",(0,o.jsx)(t.code,{children:"client_secret"})," parameter. These values are provided when you configure the OAuth clients at Google or GitHub."]}),"\n",(0,o.jsx)(t.h2,{id:"enabling-oauth-on-a-public-share",children:"Enabling OAuth on a Public Share"}),"\n",(0,o.jsx)(t.p,{children:"With your public frontend configured to support OAuth, you can test this by creating a public share. There are new command line options to support this:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:'$ zrok share public --help\nShare a target resource publicly\n\nUsage:\n zrok share public <target> [flags]\n\nFlags:\n -b, --backend-mode string The backend mode {proxy, web, caddy, drive} (default "proxy")\n --basic-auth stringArray Basic authentication users (<username:password>,...)\n --frontends stringArray Selected frontends to use for the share (default [public])\n --headless Disable TUI and run headless\n -h, --help help for public\n --insecure Enable insecure TLS certificate validation for <target>\n --oauth-check-interval duration Maximum lifetime for OAuth authentication; reauthenticate after expiry (default 3h0m0s)\n --oauth-email-address-patterns stringArray Allow only these email domain globs to authenticate via OAuth\n --oauth-provider string Enable OAuth provider [google, github]\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-provider"})," flag enables OAuth for the share using the specified provider."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-email-address-patterns"})," flag accepts a single glob pattern that matches an authenticated email address that is allowed to access the share. Use this flag multiple times to allow different patterns."]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"--oauth-check-interval"})," flag specifies how frequently the authentication must be checked."]}),"\n",(0,o.jsx)(t.p,{children:"An example public share:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-text",children:"zrok share public --backend-mode web --oauth-provider github --oauth-email-address-patterns '*@zrok.io' ~/public\n"})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},9925:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_1-dbb289a694d0c99b50cb949654d818f8.png"},7449:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_2-bc9d4c3f25853d608870eb220d00e5ee.png"},6272:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_3-7973d63cd117eaba72fbaeb4ff119a39.png"},4927:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/github_create_oauth_application_4-6fed398013c9e6c3a31e5721adac4a4c.png"},1390:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_1-e61ee7e8fa51bdc93feab84235a90673.png"},7141:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_2-60cf4edb52f453d605907c17400e0800.png"},8223:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_3-1b3db3f9057d8626d64c5466dbb05ec7.png"},4419:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_create_credentials_4-f720031df1d09f997a18842745e9ea0d.png"},7700:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_2-b94a6456ce9b13e053b4c07d8f233e84.png"},941:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_3-edf62ea2b291b58093289d31c2dae58d.png"},962:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_4-4bc7e07b06c8a9a3c1e8f766f6f1c5a6.png"},2507:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_5-7c375cf49d8e2e392ca12b584462ab59.png"},4944:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/google_oauth_content_screen_6-9b0fe216a782ef378313650e99ea52a1.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c015c796.32854b4b.js b/assets/js/c015c796.72c3baed.js similarity index 98% rename from assets/js/c015c796.32854b4b.js rename to assets/js/c015c796.72c3baed.js index cd3a1fa4..aaece46a 100644 --- a/assets/js/c015c796.32854b4b.js +++ b/assets/js/c015c796.72c3baed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[887],{2711:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","source":"@site/../docs/concepts/files.md","sourceDirName":"concepts","slug":"/concepts/files","permalink":"/docs/concepts/files","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/files.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"Sharing Websites and Files","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/concepts/tunnels"},"next":{"title":"Open Source","permalink":"/docs/concepts/opensource"}}');var r=n(4848),t=n(8453);const o={title:"Sharing Websites and Files",sidebar_position:30},c=void 0,l={},a=[];function d(e){const s={code:"code",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:["With ",(0,r.jsx)(s.code,{children:"zrok"})," it is possible to share files quickly and easily as well. To share files using ",(0,r.jsx)(s.code,{children:"zrok"})," use\nthe ",(0,r.jsx)(s.code,{children:"--backend-mode web"}),", for example: ",(0,r.jsx)(s.code,{children:"zrok share private . --backend-mode web"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Running with this mode will make it trivially easy to share files from the directory which the command\nwas run from."}),"\n",(0,r.jsx)(s.p,{children:"For example if you have a directory with a structure like this:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-r--r--+ 1 Michael None 7090 Apr 17 12:53 CHANGELOG.md\n-rw-r--r--+ 1 Michael None 11346 Apr 17 12:53 LICENSE\n-rw-r--r--+ 1 Michael None 2885 Apr 17 12:53 README.md\n-rwxr-xr-x+ 1 Michael None 44250624 Apr 17 13:00 zrok.exe*\n"})}),"\n",(0,r.jsx)(s.p,{children:"The files can be shared using a command such as:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"zrok share public --backend-mode web .\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Then the files can be access with a ",(0,r.jsx)(s.code,{children:"private"})," or ",(0,r.jsx)(s.code,{children:"public"})," share, for example as shown:"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_files",src:n(3112).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," will automatically provide a stock website, which will allow the accessing user to browse and navigate the file tree. Clicking the files allows the user to download them."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," can also share a pre-rendered static HTML website. If you have a directory like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-rw-r--+ 1 Michael None 56 Jun 26 13:23 index.html\n"})}),"\n",(0,r.jsxs)(s.p,{children:["If ",(0,r.jsx)(s.code,{children:"index.html"})," contains valid HTML, like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-html",children:"<html>\n<body>\n <h1>Hello <code>zrok</code></h1>\n</html>\n"})}),"\n",(0,r.jsx)(s.p,{children:"Sharing the directory will result in the following when you access the share in a web browser:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_website",src:n(3514).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," contains a built-in web server, which you can use to serve static websites as a share."]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3112:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_files-936de420b39b071d71a8e275fe84e63d.png"},3514:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_website-5d4c550374b118d1992e488bb319e230.png"},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>c});var i=n(6540);const r={},t=i.createContext(r);function o(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[887],{8167:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","source":"@site/../docs/concepts/files.md","sourceDirName":"concepts","slug":"/concepts/files","permalink":"/docs/concepts/files","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/concepts/files.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"Sharing Websites and Files","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Sharing TCP and UDP Servers","permalink":"/docs/concepts/tunnels"},"next":{"title":"Open Source","permalink":"/docs/concepts/opensource"}}');var r=n(4848),t=n(8453);const o={title:"Sharing Websites and Files",sidebar_position:30},c=void 0,l={},a=[];function d(e){const s={code:"code",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:["With ",(0,r.jsx)(s.code,{children:"zrok"})," it is possible to share files quickly and easily as well. To share files using ",(0,r.jsx)(s.code,{children:"zrok"})," use\nthe ",(0,r.jsx)(s.code,{children:"--backend-mode web"}),", for example: ",(0,r.jsx)(s.code,{children:"zrok share private . --backend-mode web"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Running with this mode will make it trivially easy to share files from the directory which the command\nwas run from."}),"\n",(0,r.jsx)(s.p,{children:"For example if you have a directory with a structure like this:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-r--r--+ 1 Michael None 7090 Apr 17 12:53 CHANGELOG.md\n-rw-r--r--+ 1 Michael None 11346 Apr 17 12:53 LICENSE\n-rw-r--r--+ 1 Michael None 2885 Apr 17 12:53 README.md\n-rwxr-xr-x+ 1 Michael None 44250624 Apr 17 13:00 zrok.exe*\n"})}),"\n",(0,r.jsx)(s.p,{children:"The files can be shared using a command such as:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"zrok share public --backend-mode web .\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Then the files can be access with a ",(0,r.jsx)(s.code,{children:"private"})," or ",(0,r.jsx)(s.code,{children:"public"})," share, for example as shown:"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_files",src:n(3112).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," will automatically provide a stock website, which will allow the accessing user to browse and navigate the file tree. Clicking the files allows the user to download them."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," can also share a pre-rendered static HTML website. If you have a directory like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"-rw-rw-r--+ 1 Michael None 56 Jun 26 13:23 index.html\n"})}),"\n",(0,r.jsxs)(s.p,{children:["If ",(0,r.jsx)(s.code,{children:"index.html"})," contains valid HTML, like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-html",children:"<html>\n<body>\n <h1>Hello <code>zrok</code></h1>\n</html>\n"})}),"\n",(0,r.jsx)(s.p,{children:"Sharing the directory will result in the following when you access the share in a web browser:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"zrok_share_web_website",src:n(3514).A+"",width:"952",height:"723"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"zrok"})," contains a built-in web server, which you can use to serve static websites as a share."]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3112:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_files-936de420b39b071d71a8e275fe84e63d.png"},3514:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/zrok_share_web_website-5d4c550374b118d1992e488bb319e230.png"},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>c});var i=n(6540);const r={},t=i.createContext(r);function o(e){const s=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c304be44.338d89b1.js b/assets/js/c304be44.338d89b1.js deleted file mode 100644 index d764b38b..00000000 --- a/assets/js/c304be44.338d89b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3786],{6143:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>w,frontMatter:()=>d,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","source":"@site/../docs/guides/install/windows.mdx","sourceDirName":"guides/install","slug":"/guides/install/windows","permalink":"/docs/guides/install/windows","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/windows.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in Windows","sidebar_label":"Windows"},"sidebar":"tutorialSidebar","previous":{"title":"macOS","permalink":"/docs/guides/install/macos"},"next":{"title":"Agent","permalink":"/docs/guides/agent/"}}');var r=t(4848),o=t(8453),i=t(8151),a=t(595),l=t(1342);const d={title:"Install zrok in Windows",sidebar_label:"Windows"},c=void 0,u={},h=[{value:"Windows Binary",id:"windows-binary",level:2},{value:"Wintun for zrok VPN",id:"wintun-for-zrok-vpn",level:2}];function m(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"windows-binary",children:"Windows Binary"}),"\n",(0,r.jsx)(i.F,{children:(0,r.jsx)("div",{className:l.A.downloadContainer,children:(0,r.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg"})})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In PowerShell, change to the directory where you downloaded zrok."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:'cd "$env:USERPROFILE\\Downloads"\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In PowerShell, install zrok in your home directory (",(0,r.jsx)(n.code,{children:"bin\\zrok.exe"}),"), and permanently set the executable search path."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:'$binDir = Join-Path -Path $env:USERPROFILE -ChildPath "bin"\nNew-Item -Path $binDir -ItemType Directory -ErrorAction SilentlyContinue\n$latest = Get-ChildItem -Path .\\zrok*windows*.tar.gz | Sort-Object LastWriteTime | Select-Object -Last 1\ntar -xf $latest.FullName -C $binDir zrok.exe\n$currentPath = [System.Environment]::GetEnvironmentVariable(\'PATH\', [System.EnvironmentVariableTarget]::User)\nif ($currentPath -notlike "*$binDir*") {\n $newPath = "$currentPath;$binDir"\n [System.Environment]::SetEnvironmentVariable(\'PATH\', $newPath, [System.EnvironmentVariableTarget]::User)\n $env:Path = $newPath\n}\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["With the ",(0,r.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,r.jsx)(n.code,{children:"zrok"})," directly."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"\n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | <\n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"wintun-for-zrok-vpn",children:"Wintun for zrok VPN"}),"\n",(0,r.jsxs)(n.p,{children:["On Windows, you must install Wintun to use zrok's VPN backend mode. See the ",(0,r.jsx)(n.a,{href:"/docs/guides/vpn/",children:"VPN guide"})," for more details."]})]})}function w(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}},8151:(e,n,t)=>{t.d(n,{F:()=>a,d:()=>i});var s=t(6540),r=t(4848);const o=(0,s.createContext)([]),i=()=>(0,s.useContext)(o),a=e=>{let{children:n}=e;const[t,i]=(0,s.useState)([]);return(0,s.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,r.jsx)(o.Provider,{value:t,children:n})}},595:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var s=t(8151),r=t(1342),o=t(5293),i=t(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:t,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,o.G)(),u=(0,s.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,i.jsxs)("div",{className:r.A.downloadCard,children:[(0,i.jsx)("div",{className:r.A.imgContainer,children:(0,i.jsx)("img",{src:t,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),m.length>0&&(0,i.jsx)("ul",{children:m.map(((e,n)=>(0,i.jsx)("li",{className:r.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:r.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:r.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},1342:(e,n,t)=>{t.d(n,{A:()=>s});const s={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c304be44.9bdbc4e1.js b/assets/js/c304be44.9bdbc4e1.js new file mode 100644 index 00000000..460c554e --- /dev/null +++ b/assets/js/c304be44.9bdbc4e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3786],{6028:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>w,frontMatter:()=>d,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"guides/install/windows","title":"Install zrok in Windows","description":"Windows Binary","source":"@site/../docs/guides/install/windows.mdx","sourceDirName":"guides/install","slug":"/guides/install/windows","permalink":"/docs/guides/install/windows","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/install/windows.mdx","tags":[],"version":"current","frontMatter":{"title":"Install zrok in Windows","sidebar_label":"Windows"},"sidebar":"tutorialSidebar","previous":{"title":"macOS","permalink":"/docs/guides/install/macos"},"next":{"title":"Agent","permalink":"/docs/guides/agent/"}}');var r=t(4848),o=t(8453),i=t(3070),a=t(3484),l=t(3769);const d={title:"Install zrok in Windows",sidebar_label:"Windows"},c=void 0,u={},h=[{value:"Windows Binary",id:"windows-binary",level:2},{value:"Wintun for zrok VPN",id:"wintun-for-zrok-vpn",level:2}];function m(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"windows-binary",children:"Windows Binary"}),"\n",(0,r.jsx)(i.F,{children:(0,r.jsx)("div",{className:l.A.downloadContainer,children:(0,r.jsx)(a.A,{osName:"Windows",osLogo:"/img/logo-windows.svg"})})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In PowerShell, change to the directory where you downloaded zrok."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:'cd "$env:USERPROFILE\\Downloads"\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In PowerShell, install zrok in your home directory (",(0,r.jsx)(n.code,{children:"bin\\zrok.exe"}),"), and permanently set the executable search path."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:'$binDir = Join-Path -Path $env:USERPROFILE -ChildPath "bin"\nNew-Item -Path $binDir -ItemType Directory -ErrorAction SilentlyContinue\n$latest = Get-ChildItem -Path .\\zrok*windows*.tar.gz | Sort-Object LastWriteTime | Select-Object -Last 1\ntar -xf $latest.FullName -C $binDir zrok.exe\n$currentPath = [System.Environment]::GetEnvironmentVariable(\'PATH\', [System.EnvironmentVariableTarget]::User)\nif ($currentPath -notlike "*$binDir*") {\n $newPath = "$currentPath;$binDir"\n [System.Environment]::SetEnvironmentVariable(\'PATH\', $newPath, [System.EnvironmentVariableTarget]::User)\n $env:Path = $newPath\n}\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["With the ",(0,r.jsx)(n.code,{children:"zrok"})," executable in your path, you can then execute the ",(0,r.jsx)(n.code,{children:"zrok"})," directly."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"zrok version\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"\n _____ __ ___ | | __\n|_ / '__/ _ \\| |/ /\n / /| | | (_) | <\n/___|_| \\___/|_|\\_\\\n\nv0.4.0 [c889005]\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"wintun-for-zrok-vpn",children:"Wintun for zrok VPN"}),"\n",(0,r.jsxs)(n.p,{children:["On Windows, you must install Wintun to use zrok's VPN backend mode. See the ",(0,r.jsx)(n.a,{href:"/docs/guides/vpn/",children:"VPN guide"})," for more details."]})]})}function w(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}},3070:(e,n,t)=>{t.d(n,{F:()=>a,d:()=>i});var s=t(6540),r=t(4848);const o=(0,s.createContext)([]),i=()=>(0,s.useContext)(o),a=e=>{let{children:n}=e;const[t,i]=(0,s.useState)([]);return(0,s.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),i(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,r.jsx)(o.Provider,{value:t,children:n})}},3484:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var s=t(3070),r=t(3769),o=t(8532),i=t(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},l=e=>{let{osName:n,osLogo:t,infoText:l,guideLink:d}=e;const{colorMode:c}=(0,o.G)(),u=(0,s.d)();console.log("Assets in DownloadCard:",u);const h=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=u.filter((e=>e.name.includes(h)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,i.jsxs)("div",{className:r.A.downloadCard,children:[(0,i.jsx)("div",{className:r.A.imgContainer,children:(0,i.jsx)("img",{src:t,alt:`${n} logo`})}),(0,i.jsx)("h3",{children:n}),m.length>0&&(0,i.jsx)("ul",{children:m.map(((e,n)=>(0,i.jsx)("li",{className:r.A.downloadButtons,children:(0,i.jsx)("a",{href:e.url,className:r.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,i.jsxs)("div",{className:r.A.cardFooter,children:[(0,i.jsx)("p",{children:l}),(0,i.jsx)("a",{href:d,children:"GUIDE"}),(0,i.jsx)("p",{})]})]})}},3769:(e,n,t)=>{t.d(n,{A:()=>s});const s={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.e72ebafa.js b/assets/js/c4f5d8e4.e72ebafa.js new file mode 100644 index 00000000..04fb8c6e --- /dev/null +++ b/assets/js/c4f5d8e4.e72ebafa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2634],{9179:(e,t,s)=>{s.r(t),s.d(t,{default:()=>n});s(6540);var r=s(6347),u=s(4848);function n(){return(0,u.jsx)(r.rd,{to:"/docs/getting-started"})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.ff3bb442.js b/assets/js/c4f5d8e4.ff3bb442.js deleted file mode 100644 index 42d6bf4e..00000000 --- a/assets/js/c4f5d8e4.ff3bb442.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2634],{192:(e,t,s)=>{s.r(t),s.d(t,{default:()=>n});s(6540);var r=s(6347),u=s(4848);function n(){return(0,u.jsx)(r.rd,{to:"/docs/getting-started"})}}}]); \ No newline at end of file diff --git a/assets/js/c88279fc.70a81d0d.js b/assets/js/c88279fc.70a81d0d.js deleted file mode 100644 index cfe59b46..00000000 --- a/assets/js/c88279fc.70a81d0d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3165],{3154:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","source":"@site/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_public_share_guide","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"title":"Docker Compose Public Share","sidebar_position":10,"sidebar_label":"Public Share"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started with Docker","permalink":"/docs/0.4/guides/docker-share/"},"next":{"title":"Private Share","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide"}}');var o=n(4848),i=n(8453);const t={title:"Docker Compose Public Share",sidebar_position:10,sidebar_label:"Public Share"},a=void 0,c={},d=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Create the Docker Project",id:"create-the-docker-project",level:2},{value:"Proxy Any Web Server",id:"proxy-any-web-server",level:2},{value:"Require Authentication",id:"require-authentication",level:2},{value:"OAuth Email",id:"oauth-email",level:3},{value:"Caddy is Powerful",id:"caddy-is-powerful",level:2}];function l(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-public",children:"public sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/ycov--9ZtB4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a public subdomain and keep sharing the backend\ntarget."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"create-the-docker-project",children:"Create the Docker Project"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok public share with a reserved subdomain and switch to the new directory in your terminal."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsxs)(r.a,{href:"pathname:///zrok-public-reserved/compose.yml",children:["the reserved public share ",(0,o.jsx)(r.code,{children:"compose.yml"})," project file"]})," into the same directory."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok account's enable token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Name the Share"}),"\n",(0,o.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,o.jsx)(r.code,{children:"https://my-prod-app.in.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_UNIQUE_NAME="my-prod-app"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Run the Compose project to start sharing the built-in demo web server. Be sure to ",(0,o.jsx)(r.code,{children:"--detach"})," so the project runs in the background if you want it to auto-restart when your computer reboots."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Get the public share URL from the output of the ",(0,o.jsx)(r.code,{children:"zrok-share"})," service or by peeking in the zrok console where the share will appear in the graph."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"This concludes the minimum steps to begin sharing the demo web server. Read on to learn how to pivot to sharing any website or web service by leveraging additional zrok backend modes."}),"\n",(0,o.jsx)(r.h2,{id:"proxy-any-web-server",children:"Proxy Any Web Server"}),"\n",(0,o.jsxs)(r.p,{children:["The simplest way to share your existing HTTP server is to set ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (e.g. ",(0,o.jsx)(r.code,{children:"https://example.com"}),") in the environment of the ",(0,o.jsx)(r.code,{children:"docker compose up"})," command. When you restart the share will auto-configure for that URL."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_TARGET="http://example.com:8080"\n'})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down && docker compose up\n"})}),"\n",(0,o.jsx)(r.h2,{id:"require-authentication",children:"Require Authentication"}),"\n",(0,o.jsx)(r.p,{children:"You can require a password or an OAuth login with certain email addresses."}),"\n",(0,o.jsx)(r.h3,{id:"oauth-email",children:"OAuth Email"}),"\n",(0,o.jsxs)(r.p,{children:["You can allow specific email addresse patterns by setting ",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_PROVIDER"})," to ",(0,o.jsx)(r.code,{children:"github"})," or ",(0,o.jsx)(r.code,{children:"google"})," and\n",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_EMAILS"}),". Read more about the OAuth features in ",(0,o.jsx)(r.a,{href:"https://blog.openziti.io/the-zrok-oauth-public-frontend",children:"this blog\npost"}),"."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_OAUTH_PROVIDER="github"\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,o.jsx)(r.h2,{id:"caddy-is-powerful",children:"Caddy is Powerful"}),"\n",(0,o.jsxs)(r.p,{children:["The reserved public share project uses zrok's default backend mode, ",(0,o.jsx)(r.code,{children:"proxy"}),". Another backend mode, ",(0,o.jsx)(r.code,{children:"caddy"}),", accepts a path to ",(0,o.jsx)(r.a,{href:"https://caddyserver.com/docs/caddyfile",children:"a Caddyfile"})," as the value of ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (",(0,o.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/etc/caddy",children:"zrok Caddyfile examples"}),")."]}),"\n",(0,o.jsxs)(r.p,{children:["Caddy is the most powerful and flexible backend mode in zrok. You must reserve a new public subdomain whenever you switch the backend mode, so using ",(0,o.jsx)(r.code,{children:"caddy"})," reduces the risk that you'll have to share a new frontend URL with your users."]}),"\n",(0,o.jsx)(r.p,{children:"With Caddy, you can balance the workload for websites or web services or share static sites and files or all of the above at the same time. You can update the Caddyfile and restart the Docker Compose project to start sharing the new configuration with the same reserved public subdomain."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Create a Caddyfile. This example demonstrates proxying two HTTP servers with a weighted round-robin load balancer."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-console",metastring:'title="Caddyfile"',children:"http:// {\n # zrok requires this bind address template\n bind {{ .ZrokBindAddress }}\n reverse_proxy /* {\n to http://httpbin1:8080 http://httpbin2:8080\n lb_policy weighted_round_robin 3 2\n }\n}\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Create a file ",(0,o.jsx)(r.code,{children:"compose.override.yml"}),". This example adds two ",(0,o.jsx)(r.code,{children:"httpbin"})," containers for load balancing, and mounts the Caddyfile into the container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-yaml",metastring:'title="compose.override.yml"',children:"services:\n httpbin1:\n image: mccutchen/go-httpbin\n expose: 8080\n httpbin2:\n image: mccutchen/go-httpbin\n expose: 8080\n zrok-share:\n volumes:\n - ./Caddyfile:/mnt/.zrok/Caddyfile\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Start a new Docker Compose project or delete the existing state volume."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --volumes\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(r.p,{children:["If you prefer to keep using the same zrok environment with the new share then delete ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," instead of the entire volume."]}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run the project to load the new configuration."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Note the new reserved share URL from the log."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"INFO: zrok public URL: https://88s803f2qvao.in.zrok.io/\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c88279fc.e4590d8c.js b/assets/js/c88279fc.e4590d8c.js new file mode 100644 index 00000000..84a7744c --- /dev/null +++ b/assets/js/c88279fc.e4590d8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3165],{466:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","source":"@site/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md","sourceDirName":"guides/docker-share","slug":"/guides/docker-share/docker_public_share_guide","permalink":"/docs/0.4/guides/docker-share/docker_public_share_guide","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md","tags":[],"version":"0.4","sidebarPosition":10,"frontMatter":{"title":"Docker Compose Public Share","sidebar_position":10,"sidebar_label":"Public Share"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started with Docker","permalink":"/docs/0.4/guides/docker-share/"},"next":{"title":"Private Share","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide"}}');var o=n(4848),i=n(8453);const t={title:"Docker Compose Public Share",sidebar_position:10,sidebar_label:"Public Share"},a=void 0,c={},d=[{value:"Goal",id:"goal",level:2},{value:"Overview",id:"overview",level:2},{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Create the Docker Project",id:"create-the-docker-project",level:2},{value:"Proxy Any Web Server",id:"proxy-any-web-server",level:2},{value:"Require Authentication",id:"require-authentication",level:2},{value:"OAuth Email",id:"oauth-email",level:3},{value:"Caddy is Powerful",id:"caddy-is-powerful",level:2}];function l(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h2,{id:"goal",children:"Goal"}),"\n",(0,o.jsx)(r.p,{children:"Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL."}),"\n",(0,o.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(r.p,{children:"With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service."}),"\n",(0,o.jsxs)(r.p,{children:["Here's a short article with an overview of ",(0,o.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-public",children:"public sharing with zrok"}),"."]}),"\n",(0,o.jsx)(r.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/ycov--9ZtB4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(r.p,{children:"The Docker Compose project uses your zrok account token to reserve a public subdomain and keep sharing the backend\ntarget."}),"\n",(0,o.jsx)(r.p,{children:"When the project runs it will:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["enable a zrok environment unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/environment.json"})," exists in the ",(0,o.jsx)(r.code,{children:"zrok_env"})," volume"]}),"\n",(0,o.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," exists"]}),"\n",(0,o.jsxs)(r.li,{children:["start sharing the target specified in the ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," environment variable"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"create-the-docker-project",children:"Create the Docker Project"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Make a folder on your computer to use as a Docker Compose project for your zrok public share with a reserved subdomain and switch to the new directory in your terminal."}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Download ",(0,o.jsxs)(r.a,{href:"pathname:///zrok-public-reserved/compose.yml",children:["the reserved public share ",(0,o.jsx)(r.code,{children:"compose.yml"})," project file"]})," into the same directory."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Copy your zrok account's enable token from the zrok web console to your clipboard and paste it in a file named ",(0,o.jsx)(r.code,{children:".env"})," in the same folder like this:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_ENABLE_TOKEN="8UL9-48rN0ua"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Name the Share"}),"\n",(0,o.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,o.jsx)(r.code,{children:"https://my-prod-app.in.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_UNIQUE_NAME="my-prod-app"\n'})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Run the Compose project to start sharing the built-in demo web server. Be sure to ",(0,o.jsx)(r.code,{children:"--detach"})," so the project runs in the background if you want it to auto-restart when your computer reboots."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Get the public share URL from the output of the ",(0,o.jsx)(r.code,{children:"zrok-share"})," service or by peeking in the zrok console where the share will appear in the graph."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"zrok-public-share-1 | https://w6r1vesearkj.in.zrok.io/\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"This concludes the minimum steps to begin sharing the demo web server. Read on to learn how to pivot to sharing any website or web service by leveraging additional zrok backend modes."}),"\n",(0,o.jsx)(r.h2,{id:"proxy-any-web-server",children:"Proxy Any Web Server"}),"\n",(0,o.jsxs)(r.p,{children:["The simplest way to share your existing HTTP server is to set ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (e.g. ",(0,o.jsx)(r.code,{children:"https://example.com"}),") in the environment of the ",(0,o.jsx)(r.code,{children:"docker compose up"})," command. When you restart the share will auto-configure for that URL."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_TARGET="http://example.com:8080"\n'})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down && docker compose up\n"})}),"\n",(0,o.jsx)(r.h2,{id:"require-authentication",children:"Require Authentication"}),"\n",(0,o.jsx)(r.p,{children:"You can require a password or an OAuth login with certain email addresses."}),"\n",(0,o.jsx)(r.h3,{id:"oauth-email",children:"OAuth Email"}),"\n",(0,o.jsxs)(r.p,{children:["You can allow specific email addresse patterns by setting ",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_PROVIDER"})," to ",(0,o.jsx)(r.code,{children:"github"})," or ",(0,o.jsx)(r.code,{children:"google"})," and\n",(0,o.jsx)(r.code,{children:"ZROK_OAUTH_EMAILS"}),". Read more about the OAuth features in ",(0,o.jsx)(r.a,{href:"https://blog.openziti.io/the-zrok-oauth-public-frontend",children:"this blog\npost"}),"."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",metastring:'title=".env"',children:'ZROK_OAUTH_PROVIDER="github"\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,o.jsx)(r.h2,{id:"caddy-is-powerful",children:"Caddy is Powerful"}),"\n",(0,o.jsxs)(r.p,{children:["The reserved public share project uses zrok's default backend mode, ",(0,o.jsx)(r.code,{children:"proxy"}),". Another backend mode, ",(0,o.jsx)(r.code,{children:"caddy"}),", accepts a path to ",(0,o.jsx)(r.a,{href:"https://caddyserver.com/docs/caddyfile",children:"a Caddyfile"})," as the value of ",(0,o.jsx)(r.code,{children:"ZROK_TARGET"})," (",(0,o.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/etc/caddy",children:"zrok Caddyfile examples"}),")."]}),"\n",(0,o.jsxs)(r.p,{children:["Caddy is the most powerful and flexible backend mode in zrok. You must reserve a new public subdomain whenever you switch the backend mode, so using ",(0,o.jsx)(r.code,{children:"caddy"})," reduces the risk that you'll have to share a new frontend URL with your users."]}),"\n",(0,o.jsx)(r.p,{children:"With Caddy, you can balance the workload for websites or web services or share static sites and files or all of the above at the same time. You can update the Caddyfile and restart the Docker Compose project to start sharing the new configuration with the same reserved public subdomain."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Create a Caddyfile. This example demonstrates proxying two HTTP servers with a weighted round-robin load balancer."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-console",metastring:'title="Caddyfile"',children:"http:// {\n # zrok requires this bind address template\n bind {{ .ZrokBindAddress }}\n reverse_proxy /* {\n to http://httpbin1:8080 http://httpbin2:8080\n lb_policy weighted_round_robin 3 2\n }\n}\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:["Create a file ",(0,o.jsx)(r.code,{children:"compose.override.yml"}),". This example adds two ",(0,o.jsx)(r.code,{children:"httpbin"})," containers for load balancing, and mounts the Caddyfile into the container."]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-yaml",metastring:'title="compose.override.yml"',children:"services:\n httpbin1:\n image: mccutchen/go-httpbin\n expose: 8080\n httpbin2:\n image: mccutchen/go-httpbin\n expose: 8080\n zrok-share:\n volumes:\n - ./Caddyfile:/mnt/.zrok/Caddyfile\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Start a new Docker Compose project or delete the existing state volume."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose down --volumes\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(r.p,{children:["If you prefer to keep using the same zrok environment with the new share then delete ",(0,o.jsx)(r.code,{children:"/mnt/.zrok/reserved.json"})," instead of the entire volume."]}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Run the project to load the new configuration."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose up --detach\n"})}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsx)(r.p,{children:"Note the new reserved share URL from the log."}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"docker compose logs zrok-share\n"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-buttonless",metastring:'title="Output"',children:"INFO: zrok public URL: https://88s803f2qvao.in.zrok.io/\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>t,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function t(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cda0d2e5.2230e891.js b/assets/js/cda0d2e5.2230e891.js new file mode 100644 index 00000000..e6bc153e --- /dev/null +++ b/assets/js/cda0d2e5.2230e891.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2757],{2926:(e,r,n)=>{n.d(r,{Ay:()=>a,RM:()=>t});var s=n(4848),i=n(8453);const t=[];function o(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Set up ",(0,s.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,s.jsx)(r.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,s.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},2832:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>v,contentTitle:()=>x,default:()=>f,frontMatter:()=>b,metadata:()=>s,toc:()=>k});const s=JSON.parse('{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","source":"@site/../docs/guides/frontdoor.mdx","sourceDirName":"guides","slug":"/guides/frontdoor","permalink":"/docs/guides/frontdoor","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/frontdoor.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"zrok frontdoor","sidebar_label":"frontdoor","sidebar_position":20,"hide_table_of_contents":true},"sidebar":"tutorialSidebar","previous":{"title":"Windows Agent Service","permalink":"/docs/guides/agent/windows-service/"},"next":{"title":"Permission Modes","permalink":"/docs/guides/permission-modes"}}');var i=n(4848),t=n(8453),o=n(9009),a=n(9329),l=n(2926),d=n(397),c=n(4119);const h=[{value:"Installation",id:"installation",level:2},...l.RM,{value:"Enable",id:"enable",level:2},{value:"Name your Share",id:"name-your-share",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Proxy a Web Server",id:"proxy-a-web-server",level:3},{value:"Serve Static Files",id:"serve-static-files",level:3},{value:"Caddy Server",id:"caddy-server",level:3},{value:"Network Drive",id:"network-drive",level:3},{value:"Authentication",id:"authentication",level:2},{value:"OAuth",id:"oauth",level:3},{value:"Password",id:"password",level:3},{value:"Start the Service",id:"start-the-service",level:2},{value:"Compatibility",id:"compatibility",level:2},{value:"Package Contents",id:"package-contents",level:2}];function u(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(l.Ay,{}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Ansible Playbook"}),(0,i.jsxs)(c.A,{title:"Set up package repository and install zrok-share",children:[d.A,"\n- name: Install zrok-share package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok-share\n ansible.builtin.package:\n name: zrok-share\n state: present\n\n- name: Copy env config from Ansible controller to target\n copy:\n dest: /opt/openziti/etc/zrok/zrok-share.env\n src: /opt/openziti/etc/zrok/zrok-share.env\n\n- name: Enable and restart service\n systemd:\n name: zrok-share\n enabled: yes\n state: restarted\n daemon_reload: yes\n\n- name: Wait for service\n systemd:\n name: zrok-share\n state: started\n register: service_status\n until: service_status.status.ActiveState == 'active'\n retries: 30\n delay: 1\n"]})]}),"\n",(0,i.jsx)(r.h2,{id:"enable",children:"Enable"}),"\n",(0,i.jsx)(r.p,{children:"Save the enable token from the zrok console in the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_ENABLE_TOKEN="14cbfca9772f"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"name-your-share",children:"Name your Share"}),"\n",(0,i.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,i.jsx)(r.code,{children:"https://toaster.share.zrok.io"}),". A random name is generated if you don't specify one. The name must be lowercase alphanumeric, between 4 and 32 characters in length."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_UNIQUE_NAME="toaster"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(r.p,{children:["You may change the target for the current backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"}),", by editing the configuration file and restarting the service. The reserved subdomain will remain the same."]}),"\n",(0,i.jsxs)(r.p,{children:["You may switch between backend modes or change authentication options by deleting ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," and restarting the service. A new subdomain will be reserved."]}),"\n",(0,i.jsx)(r.h3,{id:"proxy-a-web-server",children:"Proxy a Web Server"}),"\n",(0,i.jsx)(r.p,{children:"Proxy a reserved subdomain to an existing web server. The web server could be on a private network or on the same host as zrok."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="http://127.0.0.1:3000"\nZROK_BACKEND_MODE="proxy"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["If your HTTPS server has an unverifiable TLS server certificate then you must set ",(0,i.jsx)(r.code,{children:"--insecure"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_INSECURE="--insecure"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"serve-static-files",children:"Serve Static Files"}),"\n",(0,i.jsxs)(r.p,{children:["Run zrok's embedded web server to serve the files in a directory. If there's an ",(0,i.jsx)(r.code,{children:"index.html"})," file in the directory then visitors will see that web page in their browser, otherwise they'll see a generated index of the files. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /var/www/html"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/var/www/html"\nZROK_BACKEND_MODE="web"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"caddy-server",children:"Caddy Server"}),"\n",(0,i.jsx)(r.p,{children:"Use zrok's built-in Caddy server to serve static files or as a reverse proxy to multiple web servers with various HTTP routes or as a load-balanced set. A sample Caddyfile is available in the path shown."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/opt/openziti/etc/zrok/multiple_upstream.Caddyfile"\nZROK_BACKEND_MODE="caddy"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"network-drive",children:"Network Drive"}),"\n",(0,i.jsxs)(r.p,{children:["This uses zrok's ",(0,i.jsx)(r.code,{children:"drive"})," backend mode to serve a directory of static files as a virtual network drive. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /usr/share/doc"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/usr/share/doc"\nZROK_BACKEND_MODE="drive"\n'})}),"\n",(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.a,{href:"https://blog.openziti.io/zrok-drives-an-early-preview",children:"Learn more about this feature in this blog post"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(r.p,{children:"You can limit access to certain email addresses with OAuth or require a password."}),"\n",(0,i.jsx)(r.h3,{id:"oauth",children:"OAuth"}),"\n",(0,i.jsx)(r.p,{children:"You can require that visitors authenticate with an email address that matches at least one of the suffixes you specify. Add the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_OAUTH_PROVIDER="github" # or google\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"password",children:"Password"}),"\n",(0,i.jsx)(r.p,{children:"Enable HTTP basic authentication by adding the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_BASIC_AUTH="user:passwd"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(r.p,{children:"Start the service, and check the zrok console or the service log for the reserved subdomain."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now and at startup"',children:"sudo systemctl enable --now zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now"',children:"sudo systemctl restart zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl -u zrok-share.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,i.jsxs)(r.p,{children:["The Linux distribution must have a package manager that understands the ",(0,i.jsx)(r.code,{children:".deb"})," or ",(0,i.jsx)(r.code,{children:".rpm"})," format and be running systemd v232 or newer. The service was tested with:"]}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsx)(r.li,{children:"Ubuntu 20.04, 22.04, 23.04"}),"\n",(0,i.jsx)(r.li,{children:"Debian 11 12"}),"\n",(0,i.jsx)(r.li,{children:"Rocky 8, 9"}),"\n",(0,i.jsx)(r.li,{children:"Fedora 37, 38"}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"package-contents",children:"Package Contents"}),"\n",(0,i.jsxs)(r.p,{children:["The files included in the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package are sourced ",(0,i.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/nfpm",children:"here in GitHub"}),"."]})]})}function p(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}var m=n(9324),g=n(9030);const b={title:"zrok frontdoor",sidebar_label:"frontdoor",sidebar_position:20,hide_table_of_contents:!0},x=void 0,v={},k=[{value:"Overview",id:"overview",level:2},{value:"Choose your OS",id:"choose-your-os",level:2},{value:"Goal",id:"goal",level:2},{value:"How it Works",id:"how-it-works",level:2},...h,{value:"Concepts",id:"concepts",level:2}];function j(e){const r={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.strong,{children:"zrok frontdoor"})," is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends."]}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/5Vi8GKuTi_I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a ",(0,i.jsx)(r.code,{children:"zrok.io"})," frontend, you're using ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),". ",(0,i.jsx)(r.code,{children:"zrok.io"})," is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),"."]}),"\n",(0,i.jsx)(m.A,{alt:"frontdoor diagram",sources:{light:(0,g.Ay)("/img/zrok-frontdoor-light-mode.svg"),dark:(0,g.Ay)("/img/zrok-frontdoor-dark-mode.svg")}}),"\n",(0,i.jsx)(r.h2,{id:"choose-your-os",children:"Choose your OS"}),"\n",(0,i.jsx)(r.p,{children:"Choose between installing the Linux package or running zrok with Docker (Linux, macOS, or Windows)."}),"\n","\n",(0,i.jsxs)(o.A,{queryString:"os",values:[{label:"Linux",value:"Linux"},{label:"Docker",value:"Docker"}],children:[(0,i.jsxs)(a.A,{value:"Linux",children:[(0,i.jsxs)(r.p,{children:["On Linux, zrok frontdoor is implemented natively as a system service provided by the ",(0,i.jsx)(r.code,{children:"zrok-share"})," DEB or RPM package."]}),(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),(0,i.jsx)(r.p,{children:"Proxy a reserved public subdomain to a backend target with an always-on Linux system service."}),(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.code,{children:"zrok-share"})," package creates a ",(0,i.jsx)(r.code,{children:"zrok-share.service"})," unit in systemd. The administrator edits the service's configuration file to specify the:"]}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsx)(r.li,{children:"zrok account token"}),"\n",(0,i.jsxs)(r.li,{children:["target URL or files to be shared and backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"})]}),"\n",(0,i.jsx)(r.li,{children:"authentication options, if wanted"}),"\n"]}),(0,i.jsx)(r.p,{children:"When the service starts it will:"}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable the zrok environment unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/environment.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified as ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," in the environment file"]}),"\n"]}),(0,i.jsx)(p,{})]}),(0,i.jsx)(a.A,{value:"Docker",children:(0,i.jsxs)(r.p,{children:["On macOS and Windows, zrok frontdoor is implemented as a Docker Compose project which reserves a public subdomain for your website or service and manages a zrok environment that's separate from the Docker host. ",(0,i.jsx)(r.a,{href:"/docs/guides/docker-share/docker_public_share_guide",children:"Link to the Docker Public Share Guide"})]})})]}),"\n",(0,i.jsx)(r.h2,{id:"concepts",children:"Concepts"}),"\n",(0,i.jsxs)(r.p,{children:["Overview of ",(0,i.jsx)(r.a,{href:"/docs/concepts/sharing-reserved",children:"zrok reserved shares"})]})]})}function f(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(j,{...e})}):j(e)}},4119:(e,r,n)=>{n.d(r,{A:()=>o});n(6540);var s=n(382),i=n(8069),t=n(4848);const o=e=>{let{title:r,children:n}=e;const o=n.map((e=>"string"==typeof e?e.trim():s.Ay.dump(e).trim())).join("\n\n");return(0,t.jsx)("div",{children:(0,t.jsx)(i.A,{language:"yaml",title:r,children:o})})}},9009:(e,r,n)=>{n.d(r,{A:()=>a});var s=n(6540),i=n(5537),t=n(159),o=n(4848);const a=function(e){const[r,n]=(0,s.useState)(null);return(0,s.useEffect)((()=>{["Mac OS","Windows"].includes(t.wH)?n("Docker"):n("Linux")}),[]),(0,o.jsx)(o.Fragment,{children:(0,o.jsx)(i.A,{...e,defaultValue:r,children:e.children})})}},397:(e,r,n)=>{n.d(r,{A:()=>s});const s=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/cda0d2e5.a558c3ba.js b/assets/js/cda0d2e5.a558c3ba.js deleted file mode 100644 index a84f1472..00000000 --- a/assets/js/cda0d2e5.a558c3ba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2757],{633:(e,r,n)=>{n.d(r,{Ay:()=>a,RM:()=>t});var s=n(4848),i=n(8453);const t=[];function o(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Set up ",(0,s.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,s.jsx)(r.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,s.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},4888:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>v,contentTitle:()=>x,default:()=>f,frontMatter:()=>b,metadata:()=>s,toc:()=>k});const s=JSON.parse('{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","source":"@site/../docs/guides/frontdoor.mdx","sourceDirName":"guides","slug":"/guides/frontdoor","permalink":"/docs/guides/frontdoor","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/frontdoor.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"zrok frontdoor","sidebar_label":"frontdoor","sidebar_position":20,"hide_table_of_contents":true},"sidebar":"tutorialSidebar","previous":{"title":"Windows Agent Service","permalink":"/docs/guides/agent/windows-service/"},"next":{"title":"Permission Modes","permalink":"/docs/guides/permission-modes"}}');var i=n(4848),t=n(8453),o=n(9028),a=n(9365),l=n(633),d=n(397),c=n(3902);const h=[{value:"Installation",id:"installation",level:2},...l.RM,{value:"Enable",id:"enable",level:2},{value:"Name your Share",id:"name-your-share",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Proxy a Web Server",id:"proxy-a-web-server",level:3},{value:"Serve Static Files",id:"serve-static-files",level:3},{value:"Caddy Server",id:"caddy-server",level:3},{value:"Network Drive",id:"network-drive",level:3},{value:"Authentication",id:"authentication",level:2},{value:"OAuth",id:"oauth",level:3},{value:"Password",id:"password",level:3},{value:"Start the Service",id:"start-the-service",level:2},{value:"Compatibility",id:"compatibility",level:2},{value:"Package Contents",id:"package-contents",level:2}];function u(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(l.Ay,{}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Ansible Playbook"}),(0,i.jsxs)(c.A,{title:"Set up package repository and install zrok-share",children:[d.A,"\n- name: Install zrok-share package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok-share\n ansible.builtin.package:\n name: zrok-share\n state: present\n\n- name: Copy env config from Ansible controller to target\n copy:\n dest: /opt/openziti/etc/zrok/zrok-share.env\n src: /opt/openziti/etc/zrok/zrok-share.env\n\n- name: Enable and restart service\n systemd:\n name: zrok-share\n enabled: yes\n state: restarted\n daemon_reload: yes\n\n- name: Wait for service\n systemd:\n name: zrok-share\n state: started\n register: service_status\n until: service_status.status.ActiveState == 'active'\n retries: 30\n delay: 1\n"]})]}),"\n",(0,i.jsx)(r.h2,{id:"enable",children:"Enable"}),"\n",(0,i.jsx)(r.p,{children:"Save the enable token from the zrok console in the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_ENABLE_TOKEN="14cbfca9772f"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"name-your-share",children:"Name your Share"}),"\n",(0,i.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,i.jsx)(r.code,{children:"https://toaster.share.zrok.io"}),". A random name is generated if you don't specify one. The name must be lowercase alphanumeric, between 4 and 32 characters in length."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_UNIQUE_NAME="toaster"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(r.p,{children:["You may change the target for the current backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"}),", by editing the configuration file and restarting the service. The reserved subdomain will remain the same."]}),"\n",(0,i.jsxs)(r.p,{children:["You may switch between backend modes or change authentication options by deleting ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," and restarting the service. A new subdomain will be reserved."]}),"\n",(0,i.jsx)(r.h3,{id:"proxy-a-web-server",children:"Proxy a Web Server"}),"\n",(0,i.jsx)(r.p,{children:"Proxy a reserved subdomain to an existing web server. The web server could be on a private network or on the same host as zrok."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="http://127.0.0.1:3000"\nZROK_BACKEND_MODE="proxy"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["If your HTTPS server has an unverifiable TLS server certificate then you must set ",(0,i.jsx)(r.code,{children:"--insecure"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_INSECURE="--insecure"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"serve-static-files",children:"Serve Static Files"}),"\n",(0,i.jsxs)(r.p,{children:["Run zrok's embedded web server to serve the files in a directory. If there's an ",(0,i.jsx)(r.code,{children:"index.html"})," file in the directory then visitors will see that web page in their browser, otherwise they'll see a generated index of the files. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /var/www/html"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/var/www/html"\nZROK_BACKEND_MODE="web"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"caddy-server",children:"Caddy Server"}),"\n",(0,i.jsx)(r.p,{children:"Use zrok's built-in Caddy server to serve static files or as a reverse proxy to multiple web servers with various HTTP routes or as a load-balanced set. A sample Caddyfile is available in the path shown."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/opt/openziti/etc/zrok/multiple_upstream.Caddyfile"\nZROK_BACKEND_MODE="caddy"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"network-drive",children:"Network Drive"}),"\n",(0,i.jsxs)(r.p,{children:["This uses zrok's ",(0,i.jsx)(r.code,{children:"drive"})," backend mode to serve a directory of static files as a virtual network drive. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /usr/share/doc"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/usr/share/doc"\nZROK_BACKEND_MODE="drive"\n'})}),"\n",(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.a,{href:"https://blog.openziti.io/zrok-drives-an-early-preview",children:"Learn more about this feature in this blog post"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(r.p,{children:"You can limit access to certain email addresses with OAuth or require a password."}),"\n",(0,i.jsx)(r.h3,{id:"oauth",children:"OAuth"}),"\n",(0,i.jsx)(r.p,{children:"You can require that visitors authenticate with an email address that matches at least one of the suffixes you specify. Add the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_OAUTH_PROVIDER="github" # or google\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"password",children:"Password"}),"\n",(0,i.jsx)(r.p,{children:"Enable HTTP basic authentication by adding the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_BASIC_AUTH="user:passwd"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(r.p,{children:"Start the service, and check the zrok console or the service log for the reserved subdomain."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now and at startup"',children:"sudo systemctl enable --now zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now"',children:"sudo systemctl restart zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl -u zrok-share.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,i.jsxs)(r.p,{children:["The Linux distribution must have a package manager that understands the ",(0,i.jsx)(r.code,{children:".deb"})," or ",(0,i.jsx)(r.code,{children:".rpm"})," format and be running systemd v232 or newer. The service was tested with:"]}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsx)(r.li,{children:"Ubuntu 20.04, 22.04, 23.04"}),"\n",(0,i.jsx)(r.li,{children:"Debian 11 12"}),"\n",(0,i.jsx)(r.li,{children:"Rocky 8, 9"}),"\n",(0,i.jsx)(r.li,{children:"Fedora 37, 38"}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"package-contents",children:"Package Contents"}),"\n",(0,i.jsxs)(r.p,{children:["The files included in the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package are sourced ",(0,i.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/nfpm",children:"here in GitHub"}),"."]})]})}function p(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}var m=n(1122),g=n(6025);const b={title:"zrok frontdoor",sidebar_label:"frontdoor",sidebar_position:20,hide_table_of_contents:!0},x=void 0,v={},k=[{value:"Overview",id:"overview",level:2},{value:"Choose your OS",id:"choose-your-os",level:2},{value:"Goal",id:"goal",level:2},{value:"How it Works",id:"how-it-works",level:2},...h,{value:"Concepts",id:"concepts",level:2}];function j(e){const r={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.strong,{children:"zrok frontdoor"})," is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends."]}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/5Vi8GKuTi_I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a ",(0,i.jsx)(r.code,{children:"zrok.io"})," frontend, you're using ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),". ",(0,i.jsx)(r.code,{children:"zrok.io"})," is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),"."]}),"\n",(0,i.jsx)(m.A,{alt:"frontdoor diagram",sources:{light:(0,g.Ay)("/img/zrok-frontdoor-light-mode.svg"),dark:(0,g.Ay)("/img/zrok-frontdoor-dark-mode.svg")}}),"\n",(0,i.jsx)(r.h2,{id:"choose-your-os",children:"Choose your OS"}),"\n",(0,i.jsx)(r.p,{children:"Choose between installing the Linux package or running zrok with Docker (Linux, macOS, or Windows)."}),"\n","\n",(0,i.jsxs)(o.A,{queryString:"os",values:[{label:"Linux",value:"Linux"},{label:"Docker",value:"Docker"}],children:[(0,i.jsxs)(a.A,{value:"Linux",children:[(0,i.jsxs)(r.p,{children:["On Linux, zrok frontdoor is implemented natively as a system service provided by the ",(0,i.jsx)(r.code,{children:"zrok-share"})," DEB or RPM package."]}),(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),(0,i.jsx)(r.p,{children:"Proxy a reserved public subdomain to a backend target with an always-on Linux system service."}),(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.code,{children:"zrok-share"})," package creates a ",(0,i.jsx)(r.code,{children:"zrok-share.service"})," unit in systemd. The administrator edits the service's configuration file to specify the:"]}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsx)(r.li,{children:"zrok account token"}),"\n",(0,i.jsxs)(r.li,{children:["target URL or files to be shared and backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"})]}),"\n",(0,i.jsx)(r.li,{children:"authentication options, if wanted"}),"\n"]}),(0,i.jsx)(r.p,{children:"When the service starts it will:"}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable the zrok environment unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/environment.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified as ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," in the environment file"]}),"\n"]}),(0,i.jsx)(p,{})]}),(0,i.jsx)(a.A,{value:"Docker",children:(0,i.jsxs)(r.p,{children:["On macOS and Windows, zrok frontdoor is implemented as a Docker Compose project which reserves a public subdomain for your website or service and manages a zrok environment that's separate from the Docker host. ",(0,i.jsx)(r.a,{href:"/docs/guides/docker-share/docker_public_share_guide",children:"Link to the Docker Public Share Guide"})]})})]}),"\n",(0,i.jsx)(r.h2,{id:"concepts",children:"Concepts"}),"\n",(0,i.jsxs)(r.p,{children:["Overview of ",(0,i.jsx)(r.a,{href:"/docs/concepts/sharing-reserved",children:"zrok reserved shares"})]})]})}function f(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(j,{...e})}):j(e)}},3902:(e,r,n)=>{n.d(r,{A:()=>o});n(6540);var s=n(382),i=n(1432),t=n(4848);const o=e=>{let{title:r,children:n}=e;const o=n.map((e=>"string"==typeof e?e.trim():s.Ay.dump(e).trim())).join("\n\n");return(0,t.jsx)("div",{children:(0,t.jsx)(i.A,{language:"yaml",title:r,children:o})})}},9028:(e,r,n)=>{n.d(r,{A:()=>a});var s=n(6540),i=n(1470),t=n(159),o=n(4848);const a=function(e){const[r,n]=(0,s.useState)(null);return(0,s.useEffect)((()=>{["Mac OS","Windows"].includes(t.wH)?n("Docker"):n("Linux")}),[]),(0,o.jsx)(o.Fragment,{children:(0,o.jsx)(i.A,{...e,defaultValue:r,children:e.children})})}},397:(e,r,n)=>{n.d(r,{A:()=>s});const s=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/ce04f2ae.4cc27842.js b/assets/js/ce04f2ae.4cc27842.js deleted file mode 100644 index 6b68635f..00000000 --- a/assets/js/ce04f2ae.4cc27842.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6289],{9429:(e,s,r)=>{r.d(s,{Ay:()=>c,RM:()=>t});var n=r(4848),o=r(8453);const t=[];function i(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function c(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},3222:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>c,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","source":"@site/versioned_docs/version-0.4/concepts/sharing-private.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-private","permalink":"/docs/0.4/concepts/sharing-private","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-private.mdx","tags":[],"version":"0.4","sidebarPosition":0,"frontMatter":{"sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Concepts","permalink":"/docs/0.4/concepts/"},"next":{"title":"Public Shares","permalink":"/docs/0.4/concepts/sharing-public"}}');var o=r(4848),t=r(8453),i=r(9429);const c={sidebar_position:0},a="Private Shares",d={},h=[{value:"Peer to Peer",id:"peer-to-peer",level:2},{value:"Private Backend Modes",id:"private-backend-modes",level:2},...i.RM];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"private-shares",children:"Private Shares"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," was built to share and access digital resources. A ",(0,o.jsx)(s.code,{children:"private"})," share allows a resource to be\naccessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another ",(0,o.jsx)(s.code,{children:"zrok"})," user who has the details of your unique share. You are in control of who can access your ",(0,o.jsx)(s.code,{children:"private"})," shares by sharing the share token."]}),"\n",(0,o.jsxs)(s.p,{children:["Peer-to-peer private resource sharing is one of the things that makes ",(0,o.jsx)(s.code,{children:"zrok"})," unique."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," also provides ",(0,o.jsx)(s.code,{children:"public"})," sharing of resources with non-",(0,o.jsx)(s.code,{children:"zrok"})," users. Public resource sharing is limited to only resources that can be accessed over ",(0,o.jsx)(s.code,{children:"HTTP"})," or ",(0,o.jsx)(s.code,{children:"HTTPS"}),". ",(0,o.jsx)(s.code,{children:"private"})," sharing works with all of the resources types that ",(0,o.jsx)(s.code,{children:"zrok"})," supports."]}),"\n",(0,o.jsx)(s.p,{children:"Here's how private sharing works:"}),"\n",(0,o.jsx)(s.h2,{id:"peer-to-peer",children:"Peer to Peer"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"zrok_public_share",src:r(7827).A+"",width:"2200",height:"922"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"private"})," shares are accessed using the ",(0,o.jsx)(s.code,{children:"zrok access"})," command, and require the accessing user to have a ",(0,o.jsx)(s.code,{children:"zrok enable"}),"-d account on the same service instance where the share was created."]}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"private"})," share is identified by a ",(0,o.jsx)(s.em,{children:"share token"}),". The accessing user will use the share token, along with the ",(0,o.jsx)(s.code,{children:"zrok access"})," command to create a local endpoint on their system, which lets them use the shared resource as if it were local to their system."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," does not require you to open any firewall ports or otherwise compromise the security of your local system; there is never an attack surface open to the public internet. As soon as you terminate the ",(0,o.jsx)(s.code,{children:"zrok share"})," process, you immediately terminate any possible access to your shared resource."]}),"\n",(0,o.jsxs)(s.p,{children:["The shared resource can be a development web server to share with friends and colleagues, a webhook from a server running in the cloud which has ",(0,o.jsx)(s.code,{children:"zrok"})," running and has been instructed to ",(0,o.jsx)(s.code,{children:"access"})," the private resource. ",(0,o.jsx)(s.code,{children:"zrok"})," can also share files, websites, and low-level TCP and UDP network connections using the ",(0,o.jsx)(s.code,{children:"tunnel"})," backend. What matters is that the access to the shared resource is not done in a public way, and can only be accessed by other ",(0,o.jsx)(s.code,{children:"zrok"})," users that have access to your share token."]}),"\n",(0,o.jsxs)(s.p,{children:["The peer-to-peer capabilities of ",(0,o.jsx)(s.code,{children:"zrok"})," are an important property of the underlying ",(0,o.jsx)(s.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"OpenZiti"})," network that ",(0,o.jsx)(s.code,{children:"zrok"})," uses to provide connectivity between users and resources."]}),"\n",(0,o.jsxs)(s.p,{children:["Creating ",(0,o.jsx)(s.code,{children:"private"})," shares is easy and is accomplished using the ",(0,o.jsx)(s.code,{children:"zrok share private"})," command. Run ",(0,o.jsx)(s.code,{children:"zrok share private"})," to see the usage output and to further learn how to use the command."]}),"\n",(0,o.jsx)(s.h2,{id:"private-backend-modes",children:"Private Backend Modes"}),"\n",(0,o.jsxs)(s.p,{children:["The default backend mode is ",(0,o.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share private 80\n"})}),"\n",(0,o.jsx)(i.Ay,{}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"tcpTunnel"}),", ",(0,o.jsx)(s.code,{children:"udpTunnel"})," modes forward the data payload to the target server (",(0,o.jsx)(s.a,{href:"/docs/0.4/concepts/tunnels",children:"more"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"socks"})," mode provides a SOCKS5 dynamic proxy on the private access bind port that tunnels TCP payloads to the share backend where they are forwarded to their destinations (",(0,o.jsx)(s.a,{href:"https://blog.openziti.io/the-zrok-socks-backend",children:"blog"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"vpn"})," mode provides a network layer tunnel between the private access and the share backend (",(0,o.jsx)(s.a,{href:"/docs/0.4/guides/vpn/",children:"guide"}),")"]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},7827:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_private_share-3b4b2f89f7b5e6704d0b9078a701161e.png"},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>c});var n=r(6540);const o={},t=n.createContext(o);function i(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce04f2ae.7967717a.js b/assets/js/ce04f2ae.7967717a.js new file mode 100644 index 00000000..9c860ef1 --- /dev/null +++ b/assets/js/ce04f2ae.7967717a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6289],{9216:(e,s,r)=>{r.d(s,{Ay:()=>c,RM:()=>t});var n=r(4848),o=r(8453);const t=[];function i(e){const s={a:"a",code:"code",li:"li",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"proxy"})," mode forwards requests received by the frontend to the target server (",(0,n.jsx)(s.a,{href:"/docs/concepts/http",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"web"})," mode serves a target folder as a file index web page (",(0,n.jsx)(s.a,{href:"/docs/concepts/files",children:"more"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"drive"})," mode serves a target folder with WebDAV (",(0,n.jsx)(s.a,{href:"/docs/guides/drives",children:"guide"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"caddy"})," mode runs the built-in Caddy server with the targeted Caddyfile (",(0,n.jsx)(s.a,{href:"pathname:///simple_reverse_proxy.Caddyfile",children:"example"}),")"]}),"\n"]})}function c(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},518:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>c,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","source":"@site/versioned_docs/version-0.4/concepts/sharing-private.mdx","sourceDirName":"concepts","slug":"/concepts/sharing-private","permalink":"/docs/0.4/concepts/sharing-private","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/sharing-private.mdx","tags":[],"version":"0.4","sidebarPosition":0,"frontMatter":{"sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Concepts","permalink":"/docs/0.4/concepts/"},"next":{"title":"Public Shares","permalink":"/docs/0.4/concepts/sharing-public"}}');var o=r(4848),t=r(8453),i=r(9216);const c={sidebar_position:0},a="Private Shares",d={},h=[{value:"Peer to Peer",id:"peer-to-peer",level:2},{value:"Private Backend Modes",id:"private-backend-modes",level:2},...i.RM];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"private-shares",children:"Private Shares"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," was built to share and access digital resources. A ",(0,o.jsx)(s.code,{children:"private"})," share allows a resource to be\naccessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another ",(0,o.jsx)(s.code,{children:"zrok"})," user who has the details of your unique share. You are in control of who can access your ",(0,o.jsx)(s.code,{children:"private"})," shares by sharing the share token."]}),"\n",(0,o.jsxs)(s.p,{children:["Peer-to-peer private resource sharing is one of the things that makes ",(0,o.jsx)(s.code,{children:"zrok"})," unique."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," also provides ",(0,o.jsx)(s.code,{children:"public"})," sharing of resources with non-",(0,o.jsx)(s.code,{children:"zrok"})," users. Public resource sharing is limited to only resources that can be accessed over ",(0,o.jsx)(s.code,{children:"HTTP"})," or ",(0,o.jsx)(s.code,{children:"HTTPS"}),". ",(0,o.jsx)(s.code,{children:"private"})," sharing works with all of the resources types that ",(0,o.jsx)(s.code,{children:"zrok"})," supports."]}),"\n",(0,o.jsx)(s.p,{children:"Here's how private sharing works:"}),"\n",(0,o.jsx)(s.h2,{id:"peer-to-peer",children:"Peer to Peer"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"zrok_public_share",src:r(7827).A+"",width:"2200",height:"922"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"private"})," shares are accessed using the ",(0,o.jsx)(s.code,{children:"zrok access"})," command, and require the accessing user to have a ",(0,o.jsx)(s.code,{children:"zrok enable"}),"-d account on the same service instance where the share was created."]}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"private"})," share is identified by a ",(0,o.jsx)(s.em,{children:"share token"}),". The accessing user will use the share token, along with the ",(0,o.jsx)(s.code,{children:"zrok access"})," command to create a local endpoint on their system, which lets them use the shared resource as if it were local to their system."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"zrok"})," does not require you to open any firewall ports or otherwise compromise the security of your local system; there is never an attack surface open to the public internet. As soon as you terminate the ",(0,o.jsx)(s.code,{children:"zrok share"})," process, you immediately terminate any possible access to your shared resource."]}),"\n",(0,o.jsxs)(s.p,{children:["The shared resource can be a development web server to share with friends and colleagues, a webhook from a server running in the cloud which has ",(0,o.jsx)(s.code,{children:"zrok"})," running and has been instructed to ",(0,o.jsx)(s.code,{children:"access"})," the private resource. ",(0,o.jsx)(s.code,{children:"zrok"})," can also share files, websites, and low-level TCP and UDP network connections using the ",(0,o.jsx)(s.code,{children:"tunnel"})," backend. What matters is that the access to the shared resource is not done in a public way, and can only be accessed by other ",(0,o.jsx)(s.code,{children:"zrok"})," users that have access to your share token."]}),"\n",(0,o.jsxs)(s.p,{children:["The peer-to-peer capabilities of ",(0,o.jsx)(s.code,{children:"zrok"})," are an important property of the underlying ",(0,o.jsx)(s.a,{href:"https://docs.openziti.io/docs/learn/introduction/",children:"OpenZiti"})," network that ",(0,o.jsx)(s.code,{children:"zrok"})," uses to provide connectivity between users and resources."]}),"\n",(0,o.jsxs)(s.p,{children:["Creating ",(0,o.jsx)(s.code,{children:"private"})," shares is easy and is accomplished using the ",(0,o.jsx)(s.code,{children:"zrok share private"})," command. Run ",(0,o.jsx)(s.code,{children:"zrok share private"})," to see the usage output and to further learn how to use the command."]}),"\n",(0,o.jsx)(s.h2,{id:"private-backend-modes",children:"Private Backend Modes"}),"\n",(0,o.jsxs)(s.p,{children:["The default backend mode is ",(0,o.jsx)(s.code,{children:"proxy"})," which targets an HTTP URL that must be reachable by the backend."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",metastring:'title="proxy example"',children:"zrok share private 80\n"})}),"\n",(0,o.jsx)(i.Ay,{}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"tcpTunnel"}),", ",(0,o.jsx)(s.code,{children:"udpTunnel"})," modes forward the data payload to the target server (",(0,o.jsx)(s.a,{href:"/docs/0.4/concepts/tunnels",children:"more"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"socks"})," mode provides a SOCKS5 dynamic proxy on the private access bind port that tunnels TCP payloads to the share backend where they are forwarded to their destinations (",(0,o.jsx)(s.a,{href:"https://blog.openziti.io/the-zrok-socks-backend",children:"blog"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"vpn"})," mode provides a network layer tunnel between the private access and the share backend (",(0,o.jsx)(s.a,{href:"/docs/0.4/guides/vpn/",children:"guide"}),")"]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},7827:(e,s,r)=>{r.d(s,{A:()=>n});const n=r.p+"assets/images/zrok_private_share-3b4b2f89f7b5e6704d0b9078a701161e.png"},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>c});var n=r(6540);const o={},t=n.createContext(o);function i(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d3a54718.adbe71c6.js b/assets/js/d3a54718.cf229226.js similarity index 99% rename from assets/js/d3a54718.adbe71c6.js rename to assets/js/d3a54718.cf229226.js index d757d507..3c2d02e4 100644 --- a/assets/js/d3a54718.adbe71c6.js +++ b/assets/js/d3a54718.cf229226.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1346],{2758:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","source":"@site/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/nginx","permalink":"/docs/0.4/guides/self-hosting/linux/nginx","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx","tags":[],"version":"0.4","sidebarPosition":50,"frontMatter":{"sidebar_position":50,"sidebar_label":"NGINX TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/0.4/guides/self-hosting/linux/"},"next":{"title":"Interstitial Pages","permalink":"/docs/0.4/guides/self-hosting/interstitial-page"}}');var o=r(4848),i=r(8453);const s={sidebar_position:50,sidebar_label:"NGINX TLS"},l="NGINX Reverse Proxy for zrok",a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"})}),"\n",(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(n.p,{children:["I'll assume you have a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,o.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,o.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,o.jsxs)(n.p,{children:["I'll use ",(0,o.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,o.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,o.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install certbot: ",(0,o.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,o.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-nginx",children:(0,o.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,o.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,o.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,o.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,o.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,o.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var t=r(6540);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1346],{9565:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","source":"@site/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/nginx","permalink":"/docs/0.4/guides/self-hosting/linux/nginx","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx","tags":[],"version":"0.4","sidebarPosition":50,"frontMatter":{"sidebar_position":50,"sidebar_label":"NGINX TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/0.4/guides/self-hosting/linux/"},"next":{"title":"Interstitial Pages","permalink":"/docs/0.4/guides/self-hosting/interstitial-page"}}');var o=r(4848),i=r(8453);const s={sidebar_position:50,sidebar_label:"NGINX TLS"},l="NGINX Reverse Proxy for zrok",a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"})}),"\n",(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(n.p,{children:["I'll assume you have a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,o.jsx)(n.a,{href:"/docs/0.4/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,o.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,o.jsxs)(n.p,{children:["I'll use ",(0,o.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,o.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,o.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install certbot: ",(0,o.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,o.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-nginx",children:(0,o.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,o.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,o.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,o.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,o.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,o.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var t=r(6540);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d768dc0f.7eb1170c.js b/assets/js/d768dc0f.3a416f3d.js similarity index 99% rename from assets/js/d768dc0f.7eb1170c.js rename to assets/js/d768dc0f.3a416f3d.js index 405bb114..19860673 100644 --- a/assets/js/d768dc0f.7eb1170c.js +++ b/assets/js/d768dc0f.3a416f3d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4247],{1916:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","source":"@site/../docs/guides/self-hosting/linux/index.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/","permalink":"/docs/guides/self-hosting/linux/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/index.mdx","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"sidebar_position":40,"title":"Self-Hosting Guide for Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Self Hosting","permalink":"/docs/category/self-hosting"},"next":{"title":"NGINX TLS","permalink":"/docs/guides/self-hosting/linux/nginx"}}');var t=r(4848),i=r(8453);const s={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},l=void 0,c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,t.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,t.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,t.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,t.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the controller service (",(0,t.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p <password>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the router service (",(0,t.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,t.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,t.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Follow ",(0,t.jsx)(n.a,{href:"/docs/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,t.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"store"})," section defines the local ",(0,t.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,t.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,t.jsx)(n.code,{children:"password"})," in the ",(0,t.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsxs)(n.p,{children:["Be sure to see the ",(0,t.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(9873).A+"",children:["reference configuration at ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,t.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,t.jsxs)(n.p,{children:["See the separate guides on ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,t.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,t.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,t.jsx)(n.code,{children:"api-v1.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,t.jsxs)(n.p,{children:["To work with a self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,t.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,t.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"/docs/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,t.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,t.jsxs)(n.p,{children:["Use the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,t.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,t.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,t.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,t.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,t.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,t.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,t.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,t.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,t.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,t.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,t.jsxs)(n.p,{children:["Nice work! The ",(0,t.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,t.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,t.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This frontend config file has a ",(0,t.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,t.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,t.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. The reverse proxy must forward the ",(0,t.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,t.jsxs)(n.p,{children:["You can also specify an ",(0,t.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,t.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,t.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,t.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,t.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok admin create account <email> <password>\n"})}),"\n",(0,t.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,t.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you look at the console output from your ",(0,t.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can access your ",(0,t.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,t.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,t.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,t.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,t.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,t.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,t.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,t.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},9873:(e,n,r)=>{r.d(n,{A:()=>o});const o=r.p+"assets/files/ctrl-11e5352ac4fe52a7c8e6d2d290c7c29c.yml"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var o=r(6540);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4247],{1115:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"guides/self-hosting/linux/index","title":"Self-Hosting Guide for Linux","description":"Walkthrough Video","source":"@site/../docs/guides/self-hosting/linux/index.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/","permalink":"/docs/guides/self-hosting/linux/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/index.mdx","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"sidebar_position":40,"title":"Self-Hosting Guide for Linux","sidebar_label":"Linux"},"sidebar":"tutorialSidebar","previous":{"title":"Self Hosting","permalink":"/docs/category/self-hosting"},"next":{"title":"NGINX TLS","permalink":"/docs/guides/self-hosting/linux/nginx"}}');var t=r(4848),i=r(8453);const s={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},l=void 0,c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,t.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,t.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,t.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,t.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the controller service (",(0,t.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p <password>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,t.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure your answer file (",(0,t.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start the router service (",(0,t.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,t.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,t.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Follow ",(0,t.jsx)(n.a,{href:"/docs/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,t.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"store"})," section defines the local ",(0,t.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,t.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,t.jsx)(n.code,{children:"password"})," in the ",(0,t.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsxs)(n.p,{children:["Be sure to see the ",(0,t.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(9873).A+"",children:["reference configuration at ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,t.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,t.jsxs)(n.p,{children:["See the separate guides on ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,t.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,t.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,t.jsx)(n.code,{children:"api-v1.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,t.jsxs)(n.p,{children:["To work with a self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,t.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,t.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,t.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"/docs/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,t.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,t.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,t.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,t.jsxs)(n.p,{children:["Use the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,t.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,t.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,t.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,t.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,t.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,t.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,t.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,t.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,t.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,t.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,t.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,t.jsxs)(n.p,{children:["Nice work! The ",(0,t.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,t.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,t.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,t.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This frontend config file has a ",(0,t.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,t.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,t.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,t.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. The reverse proxy must forward the ",(0,t.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,t.jsxs)(n.p,{children:["You can also specify an ",(0,t.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,t.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,t.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,t.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,t.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,t.jsxs)(n.p,{children:["With our ",(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok admin create account <email> <password>\n"})}),"\n",(0,t.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,t.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,t.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you look at the console output from your ",(0,t.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can access your ",(0,t.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,t.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,t.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,t.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,t.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,t.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,t.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,t.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},9873:(e,n,r)=>{r.d(n,{A:()=>o});const o=r.p+"assets/files/ctrl-11e5352ac4fe52a7c8e6d2d290c7c29c.yml"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var o=r(6540);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1dfe4fe.557c1d76.js b/assets/js/e1dfe4fe.6a8817d7.js similarity index 99% rename from assets/js/e1dfe4fe.557c1d76.js rename to assets/js/e1dfe4fe.6a8817d7.js index af26bdb5..39ea26a0 100644 --- a/assets/js/e1dfe4fe.557c1d76.js +++ b/assets/js/e1dfe4fe.6a8817d7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3423],{1181:(e,n,o)=>{o.d(n,{Ay:()=>c,RM:()=>t});var i=o(4848),r=o(8453);const t=[{value:"Docker Instance",id:"docker-instance",level:2},{value:"Create the Docker Compose Project",id:"create-the-docker-compose-project",level:3},{value:"YOLO",id:"yolo",level:4},{value:"I'll Do it Myself",id:"ill-do-it-myself",level:4},{value:"Basic Configuration (No TLS, Localhost Only)",id:"basic-configuration-no-tls-localhost-only",level:3},{value:"DNS Configuration (Optional for localhost-only setup)",id:"dns-configuration-optional-for-localhost-only-setup",level:4},{value:"Configure the Docker Compose Project Environment",id:"configure-the-docker-compose-project-environment",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project",level:4},{value:"Expanded Configuration with TLS (Caddy or Traefik)",id:"expanded-configuration-with-tls-caddy-or-traefik",level:3},{value:"DNS Configuration for TLS",id:"dns-configuration-for-tls",level:4},{value:"Configure the Docker Compose File",id:"configure-the-docker-compose-file",level:4},{value:"Caddy Configuration",id:"caddy-configuration",level:4},{value:"Traefik Configuration",id:"traefik-configuration",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project-1",level:4},{value:"Set up a User Account",id:"set-up-a-user-account",level:3},{value:"Enable the User Environment",id:"enable-the-user-environment",level:3},{value:"Firewall Configuration",id:"firewall-configuration",level:3},{value:"Additional Configuration Options",id:"additional-configuration-options",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function s(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"docker-instance",children:"Docker Instance"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/70zJ_h4uiD8",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(n.p,{children:"This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Basic Configuration"}),": Services exposed on localhost only (no TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Caddy"}),": Services published using Caddy (TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Traefik"}),": Services published using Traefik (TLS)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Create a working directory on your Docker host and save these Docker Compose project files."}),"\n",(0,i.jsx)(n.h4,{id:"yolo",children:"YOLO"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ill-do-it-myself",children:"I'll Do it Myself"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-configuration-no-tls-localhost-only",children:"Basic Configuration (No TLS, Localhost Only)"}),"\n",(0,i.jsx)(n.p,{children:"This is the simplest way to get started with zrok, exposing services on localhost only, without TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-optional-for-localhost-only-setup",children:"DNS Configuration (Optional for localhost-only setup)"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["If you plan to use this beyond localhost, set up a wildcard record for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Create an ",(0,i.jsx)(n.code,{children:".env"})," file in the working directory with the minimal required configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env minimal configuration"',children:"# Required settings\nZROK_DNS_ZONE=share.example.com\nZROK_USER_EMAIL=me@example.com\nZROK_USER_PWD=zrokuserpw\nZITI_PWD=zitiadminpw\nZROK_ADMIN_TOKEN=zroktoken\n\n# Expose services only on localhost (default)\nZROK_INSECURE_INTERFACE=127.0.0.1\n\n# Service ports\nZROK_CTRL_PORT=18080\nZROK_FRONTEND_PORT=8080\nZROK_OAUTH_PORT=8081\nZITI_CTRL_ADVERTISED_PORT=80\nZITI_ROUTER_PORT=3022\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"expanded-configuration-with-tls-caddy-or-traefik",children:"Expanded Configuration with TLS (Caddy or Traefik)"}),"\n",(0,i.jsx)(n.p,{children:"For production deployments, you should use TLS. You can choose between Caddy or Traefik for TLS termination and reverse proxy to the zrok services. The ziti services are always published directly, not proxied, and they bring their own TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-for-tls",children:"DNS Configuration for TLS"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Ensure a wildcard record exists for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Choose a DNS provider that supports automatic DNS challenge for obtaining wildcard certificates and for which a plugin is available in Caddy or Traefik."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-file",children:"Configure the Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Add this setting to your ",(0,i.jsx)(n.code,{children:".env"})," file to select which TLS provider to use:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Use one of the following:\nCOMPOSE_FILE=compose.yml:compose.caddy.yml # For Caddy\n# OR\nCOMPOSE_FILE=compose.yml:compose.traefik.yml # For Traefik\n"})}),"\n",(0,i.jsx)(n.h4,{id:"caddy-configuration",children:"Caddy Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Caddy, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Caddy"',children:"# Caddy TLS configuration\nCADDY_DNS_PLUGIN=cloudflare # Plugin name for your DNS provider (see github.com/caddy-dns)\nCADDY_DNS_PLUGIN_TOKEN=abcd1234 # API token from your DNS provider\nCADDY_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nCADDY_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nCADDY_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of CADDY_DNS_PLUGIN_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"traefik-configuration",children:"Traefik Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Traefik, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Traefik"',children:"# Traefik TLS configuration\nTRAEFIK_DNS_PROVIDER=digitalocean # DNS provider for Traefik\nTRAEFIK_DNS_PROVIDER_TOKEN=abcd1234 # API token from your DNS provider\nTRAEFIK_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nTRAEFIK_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nTRAEFIK_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of TRAEFIK_DNS_PROVIDER_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project-1",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance with TLS support:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,i.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The ZROK_USER_EMAIL and ZROK_USER_PWD variables are set in the ",(0,i.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create the first user account"',children:"docker compose exec zrok-controller bash -xc 'zrok admin create account ${ZROK_USER_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,i.jsx)(n.p,{children:"Create additional users by running the command again with a different email and password."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create another user"',children:"docker compose exec zrok-controller zrok admin create account <email> <password>\n"})}),"\n",(0,i.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,i.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,i.jsxs)(n.p,{children:["Follow ",(0,i.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure the environment with the zrok API endpoint:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# If using TLS (Caddy or Traefik)\nzrok config set apiEndpoint https://zrok.share.example.com\n\n# If using basic configuration (localhost, no TLS)\nzrok config set apiEndpoint http://localhost:18080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"443/tcp"})," - HTTPS for all services (Caddy or Traefik)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"80/tcp"})," - ziti ctrl plane"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"additional-configuration-options",children:"Additional Configuration Options"}),"\n",(0,i.jsxs)(n.p,{children:["You can add these additional settings to your ",(0,i.jsx)(n.code,{children:".env"})," file for more customization:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# OAuth configuration for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n"})}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the service logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# View logs for a specific service\ndocker compose logs zrok-controller\ndocker compose logs zrok-frontend\ndocker compose logs ziti-quickstart\n\n# View logs for Caddy (if using)\ndocker compose logs caddy\n\n# View logs for Traefik (if using)\ndocker compose logs traefik\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Validate TLS configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# For Caddy\ndocker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n\n# For Traefik\ndocker compose exec traefik traefik healthcheck\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check certificate status:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# For Caddy\ndocker compose exec caddy curl -s "http://localhost:2019/certificates"\n\n# For Traefik - view the ACME certificate file directly\ndocker compose exec traefik cat /etc/traefik/acme/acme.json | grep -A 5 "Certificates"\n'})}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},2465:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","source":"@site/../docs/guides/self-hosting/docker.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/docker","permalink":"/docs/guides/self-hosting/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/docker.mdx","tags":[],"version":"current","sidebarPosition":45,"frontMatter":{"title":"Self-hosting guide for Docker","sidebar_label":"Docker","sidebar_position":45},"sidebar":"tutorialSidebar","previous":{"title":"Personalized Frontend","permalink":"/docs/guides/self-hosting/personalized-frontend"},"next":{"title":"Kubernetes","permalink":"/docs/guides/self-hosting/kubernetes"}}');var r=o(4848),t=o(8453),s=o(1181);const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,l={},d=[...s.RM];function h(e){return(0,r.jsx)(s.Ay,{})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h()}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var i=o(6540);const r={},t=i.createContext(r);function s(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3423],{1181:(e,n,o)=>{o.d(n,{Ay:()=>c,RM:()=>t});var i=o(4848),r=o(8453);const t=[{value:"Docker Instance",id:"docker-instance",level:2},{value:"Create the Docker Compose Project",id:"create-the-docker-compose-project",level:3},{value:"YOLO",id:"yolo",level:4},{value:"I'll Do it Myself",id:"ill-do-it-myself",level:4},{value:"Basic Configuration (No TLS, Localhost Only)",id:"basic-configuration-no-tls-localhost-only",level:3},{value:"DNS Configuration (Optional for localhost-only setup)",id:"dns-configuration-optional-for-localhost-only-setup",level:4},{value:"Configure the Docker Compose Project Environment",id:"configure-the-docker-compose-project-environment",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project",level:4},{value:"Expanded Configuration with TLS (Caddy or Traefik)",id:"expanded-configuration-with-tls-caddy-or-traefik",level:3},{value:"DNS Configuration for TLS",id:"dns-configuration-for-tls",level:4},{value:"Configure the Docker Compose File",id:"configure-the-docker-compose-file",level:4},{value:"Caddy Configuration",id:"caddy-configuration",level:4},{value:"Traefik Configuration",id:"traefik-configuration",level:4},{value:"Start the Docker Compose Project",id:"start-the-docker-compose-project-1",level:4},{value:"Set up a User Account",id:"set-up-a-user-account",level:3},{value:"Enable the User Environment",id:"enable-the-user-environment",level:3},{value:"Firewall Configuration",id:"firewall-configuration",level:3},{value:"Additional Configuration Options",id:"additional-configuration-options",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function s(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"docker-instance",children:"Docker Instance"}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/70zJ_h4uiD8",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(n.p,{children:"This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Basic Configuration"}),": Services exposed on localhost only (no TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Caddy"}),": Services published using Caddy (TLS)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"With Traefik"}),": Services published using Traefik (TLS)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"create-the-docker-compose-project",children:"Create the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Create a working directory on your Docker host and save these Docker Compose project files."}),"\n",(0,i.jsx)(n.h4,{id:"yolo",children:"YOLO"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Run this script to download the files in the current directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:"Or, specify the Compose project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl https://get.openziti.io/zrok-instance/fetch.bash | bash -s /path/to/compose/project/dir\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ill-do-it-myself",children:"I'll Do it Myself"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Get the zrok repo ZIP file."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"wget https://github.com/openziti/zrok/archive/refs/heads/main.zip\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Unzip the zrok-instance files into the project directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"unzip -j -d . main.zip '*/docker/compose/zrok-instance/*'\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-configuration-no-tls-localhost-only",children:"Basic Configuration (No TLS, Localhost Only)"}),"\n",(0,i.jsx)(n.p,{children:"This is the simplest way to get started with zrok, exposing services on localhost only, without TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-optional-for-localhost-only-setup",children:"DNS Configuration (Optional for localhost-only setup)"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["If you plan to use this beyond localhost, set up a wildcard record for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-project-environment",children:"Configure the Docker Compose Project Environment"}),"\n",(0,i.jsxs)(n.p,{children:["Create an ",(0,i.jsx)(n.code,{children:".env"})," file in the working directory with the minimal required configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env minimal configuration"',children:"# Required settings\nZROK_DNS_ZONE=share.example.com\nZROK_USER_EMAIL=me@example.com\nZROK_USER_PWD=zrokuserpw\nZITI_PWD=zitiadminpw\nZROK_ADMIN_TOKEN=zroktoken\n\n# Expose services only on localhost (default)\nZROK_INSECURE_INTERFACE=127.0.0.1\n\n# Service ports\nZROK_CTRL_PORT=18080\nZROK_FRONTEND_PORT=8080\nZROK_OAUTH_PORT=8081\nZITI_CTRL_ADVERTISED_PORT=80\nZITI_ROUTER_PORT=3022\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"expanded-configuration-with-tls-caddy-or-traefik",children:"Expanded Configuration with TLS (Caddy or Traefik)"}),"\n",(0,i.jsx)(n.p,{children:"For production deployments, you should use TLS. You can choose between Caddy or Traefik for TLS termination and reverse proxy to the zrok services. The ziti services are always published directly, not proxied, and they bring their own TLS."}),"\n",(0,i.jsx)(n.h4,{id:"dns-configuration-for-tls",children:"DNS Configuration for TLS"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Ensure a wildcard record exists for the IP address where the zrok instance will run\n(e.g., if your DNS zone is ",(0,i.jsx)(n.code,{children:"share.example.com"}),", then your wildcard record is ",(0,i.jsx)(n.code,{children:"*.share.example.com"}),")."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Choose a DNS provider that supports automatic DNS challenge for obtaining wildcard certificates and for which a plugin is available in Caddy or Traefik."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-the-docker-compose-file",children:"Configure the Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Add this setting to your ",(0,i.jsx)(n.code,{children:".env"})," file to select which TLS provider to use:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Use one of the following:\nCOMPOSE_FILE=compose.yml:compose.caddy.yml # For Caddy\n# OR\nCOMPOSE_FILE=compose.yml:compose.traefik.yml # For Traefik\n"})}),"\n",(0,i.jsx)(n.h4,{id:"caddy-configuration",children:"Caddy Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Caddy, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Caddy"',children:"# Caddy TLS configuration\nCADDY_DNS_PLUGIN=cloudflare # Plugin name for your DNS provider (see github.com/caddy-dns)\nCADDY_DNS_PLUGIN_TOKEN=abcd1234 # API token from your DNS provider\nCADDY_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nCADDY_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nCADDY_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of CADDY_DNS_PLUGIN_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"traefik-configuration",children:"Traefik Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["If using Traefik, add these settings to your ",(0,i.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title=".env for Traefik"',children:"# Traefik TLS configuration\nTRAEFIK_DNS_PROVIDER=digitalocean # DNS provider for Traefik\nTRAEFIK_DNS_PROVIDER_TOKEN=abcd1234 # API token from your DNS provider\nTRAEFIK_ACME_API=https://acme-v02.api.letsencrypt.org/directory # ACME API endpoint\nTRAEFIK_HTTPS_PORT=443 # HTTPS port (optional, defaults to 443)\nTRAEFIK_INTERFACE=0.0.0.0 # Interface to bind to (optional, defaults to all interfaces)\n\n# For AWS Route53, uncomment and set these instead of TRAEFIK_DNS_PROVIDER_TOKEN:\n# AWS_ACCESS_KEY_ID=your-access-key\n# AWS_SECRET_ACCESS_KEY=your-secret-key\n# AWS_REGION=your-region\n# AWS_SESSION_TOKEN=your-session-token # Only if using temporary credentials\n"})}),"\n",(0,i.jsx)(n.h4,{id:"start-the-docker-compose-project-1",children:"Start the Docker Compose Project"}),"\n",(0,i.jsx)(n.p,{children:"Start the zrok instance with TLS support:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --detach\n"})}),"\n",(0,i.jsx)(n.h3,{id:"set-up-a-user-account",children:"Set up a User Account"}),"\n",(0,i.jsxs)(n.p,{children:["This step creates a user account. You will log in to the zrok web console with the account password created in this step. The ZROK_USER_EMAIL and ZROK_USER_PWD variables are set in the ",(0,i.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create the first user account"',children:"docker compose exec zrok-controller bash -xc 'zrok admin create account ${ZROK_USER_EMAIL} ${ZROK_USER_PWD}'\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"+ zrok admin create account me@example.com zrokuserpw\n[ 0.000] INFO zrok/controller/store.Open: database connected\n[ 0.002] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\nheMqncCyxZcx\n"})}),"\n",(0,i.jsx)(n.p,{children:"Create additional users by running the command again with a different email and password."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Create another user"',children:"docker compose exec zrok-controller zrok admin create account <email> <password>\n"})}),"\n",(0,i.jsx)(n.h3,{id:"enable-the-user-environment",children:"Enable the User Environment"}),"\n",(0,i.jsx)(n.p,{children:"You must enable each device environment with the account token obtained when the account was created. This is separate from the account password that's used to log in to the web console."}),"\n",(0,i.jsxs)(n.p,{children:["Follow ",(0,i.jsx)(n.a,{href:"/docs/getting-started#installing-the-zrok-command",children:"the getting started guide"})," to install the zrok CLI on some device and enable a zrok environment."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure the environment with the zrok API endpoint:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# If using TLS (Caddy or Traefik)\nzrok config set apiEndpoint https://zrok.share.example.com\n\n# If using basic configuration (localhost, no TLS)\nzrok config set apiEndpoint http://localhost:18080\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enable an environment on this device with the account token from the previous step."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"zrok enable heMqncCyxZcx\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"firewall-configuration",children:"Firewall Configuration"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"443/tcp"})," - HTTPS for all services (Caddy or Traefik)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"80/tcp"})," - ziti ctrl plane"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"3022/tcp"})," - ziti data plane"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"additional-configuration-options",children:"Additional Configuration Options"}),"\n",(0,i.jsxs)(n.p,{children:["You can add these additional settings to your ",(0,i.jsx)(n.code,{children:".env"})," file for more customization:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# OAuth configuration for public shares\nZROK_OAUTH_HASH_KEY=oauthhashkeysecret\nZROK_OAUTH_GITHUB_CLIENT_ID=abcd1234\nZROK_OAUTH_GITHUB_CLIENT_SECRET=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_ID=abcd1234\nZROK_OAUTH_GOOGLE_CLIENT_SECRET=abcd1234\n"})}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the service logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# View logs for a specific service\ndocker compose logs zrok-controller\ndocker compose logs zrok-frontend\ndocker compose logs ziti-quickstart\n\n# View logs for Caddy (if using)\ndocker compose logs caddy\n\n# View logs for Traefik (if using)\ndocker compose logs traefik\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Validate TLS configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# For Caddy\ndocker compose exec caddy caddy validate --config /etc/caddy/Caddyfile\n\n# For Traefik\ndocker compose exec traefik traefik healthcheck\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check certificate status:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# For Caddy\ndocker compose exec caddy curl -s "http://localhost:2019/certificates"\n\n# For Traefik - view the ACME certificate file directly\ndocker compose exec traefik cat /etc/traefik/acme/acme.json | grep -A 5 "Certificates"\n'})}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},5011:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/self-hosting/docker","title":"Self-hosting guide for Docker","description":"","source":"@site/../docs/guides/self-hosting/docker.mdx","sourceDirName":"guides/self-hosting","slug":"/guides/self-hosting/docker","permalink":"/docs/guides/self-hosting/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/docker.mdx","tags":[],"version":"current","sidebarPosition":45,"frontMatter":{"title":"Self-hosting guide for Docker","sidebar_label":"Docker","sidebar_position":45},"sidebar":"tutorialSidebar","previous":{"title":"Personalized Frontend","permalink":"/docs/guides/self-hosting/personalized-frontend"},"next":{"title":"Kubernetes","permalink":"/docs/guides/self-hosting/kubernetes"}}');var r=o(4848),t=o(8453),s=o(1181);const c={title:"Self-hosting guide for Docker",sidebar_label:"Docker",sidebar_position:45},a=void 0,l={},d=[...s.RM];function h(e){return(0,r.jsx)(s.Ay,{})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h()}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var i=o(6540);const r={},t=i.createContext(r);function s(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ebc0e2a0.2fd8a7d5.js b/assets/js/ebc0e2a0.2fd8a7d5.js new file mode 100644 index 00000000..da91f1cf --- /dev/null +++ b/assets/js/ebc0e2a0.2fd8a7d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[37],{8903:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>k,contentTitle:()=>v,default:()=>y,frontMatter:()=>x,metadata:()=>s,toc:()=>j});const s=JSON.parse('{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","source":"@site/versioned_docs/version-0.4/guides/frontdoor.mdx","sourceDirName":"guides","slug":"/guides/frontdoor","permalink":"/docs/0.4/guides/frontdoor","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/frontdoor.mdx","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"title":"zrok frontdoor","sidebar_label":"frontdoor","sidebar_position":20,"hide_table_of_contents":true},"sidebar":"tutorialSidebar","previous":{"title":"Windows","permalink":"/docs/0.4/guides/install/windows"},"next":{"title":"Permission Modes","permalink":"/docs/0.4/guides/permission-modes"}}');var i=n(4848),t=n(8453),o=n(9009),a=n(9329);function l(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Set up ",(0,i.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function d(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}var c=n(6559),h=n(4119);const p=[{value:"Installation",id:"installation",level:2},{value:"Enable",id:"enable",level:2},{value:"Name your Share",id:"name-your-share",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Proxy a Web Server",id:"proxy-a-web-server",level:3},{value:"Serve Static Files",id:"serve-static-files",level:3},{value:"Caddy Server",id:"caddy-server",level:3},{value:"Network Drive",id:"network-drive",level:3},{value:"Authentication",id:"authentication",level:2},{value:"OAuth",id:"oauth",level:3},{value:"Password",id:"password",level:3},{value:"Start the Service",id:"start-the-service",level:2},{value:"Compatibility",id:"compatibility",level:2},{value:"Package Contents",id:"package-contents",level:2}];function u(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(d,{}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Ansible Playbook"}),(0,i.jsxs)(h.A,{title:"Set up package repository and install zrok-share",children:[c.A,"\n- name: Install zrok-share package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok-share\n ansible.builtin.package:\n name: zrok-share\n state: present\n\n- name: Copy env config from Ansible controller to target\n copy:\n dest: /opt/openziti/etc/zrok/zrok-share.env\n src: /opt/openziti/etc/zrok/zrok-share.env\n\n- name: Enable and restart service\n systemd:\n name: zrok-share\n enabled: yes\n state: restarted\n daemon_reload: yes\n\n- name: Wait for service\n systemd:\n name: zrok-share\n state: started\n register: service_status\n until: service_status.status.ActiveState == 'active'\n retries: 30\n delay: 1\n"]})]}),"\n",(0,i.jsx)(r.h2,{id:"enable",children:"Enable"}),"\n",(0,i.jsx)(r.p,{children:"Save the enable token from the zrok console in the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_ENABLE_TOKEN="14cbfca9772f"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"name-your-share",children:"Name your Share"}),"\n",(0,i.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,i.jsx)(r.code,{children:"https://my-prod-app.in.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_UNIQUE_NAME="my-prod-app"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(r.p,{children:["You may change the target for the current backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"}),", by editing the configuration file and restarting the service. The reserved subdomain will remain the same."]}),"\n",(0,i.jsxs)(r.p,{children:["You may switch between backend modes or change authentication options by deleting ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," and restarting the service. A new subdomain will be reserved."]}),"\n",(0,i.jsx)(r.h3,{id:"proxy-a-web-server",children:"Proxy a Web Server"}),"\n",(0,i.jsx)(r.p,{children:"Proxy a reserved subdomain to an existing web server. The web server could be on a private network or on the same host as zrok."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="http://127.0.0.1:3000"\nZROK_BACKEND_MODE="proxy"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["If your HTTPS server has an unverifiable TLS server certificate then you must set ",(0,i.jsx)(r.code,{children:"--insecure"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_INSECURE="--insecure"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"serve-static-files",children:"Serve Static Files"}),"\n",(0,i.jsxs)(r.p,{children:["Run zrok's embedded web server to serve the files in a directory. If there's an ",(0,i.jsx)(r.code,{children:"index.html"})," file in the directory then visitors will see that web page in their browser, otherwise they'll see a generated index of the files. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /var/www/html"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/var/www/html"\nZROK_BACKEND_MODE="web"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"caddy-server",children:"Caddy Server"}),"\n",(0,i.jsx)(r.p,{children:"Use zrok's built-in Caddy server to serve static files or as a reverse proxy to multiple web servers with various HTTP routes or as a load-balanced set. A sample Caddyfile is available in the path shown."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/opt/openziti/etc/zrok/multiple_upstream.Caddyfile"\nZROK_BACKEND_MODE="caddy"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"network-drive",children:"Network Drive"}),"\n",(0,i.jsxs)(r.p,{children:["This uses zrok's ",(0,i.jsx)(r.code,{children:"drive"})," backend mode to serve a directory of static files as a virtual network drive. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /usr/share/doc"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/usr/share/doc"\nZROK_BACKEND_MODE="drive"\n'})}),"\n",(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.a,{href:"https://blog.openziti.io/zrok-drives-an-early-preview",children:"Learn more about this feature in this blog post"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(r.p,{children:"You can limit access to certain email addresses with OAuth or require a password."}),"\n",(0,i.jsx)(r.h3,{id:"oauth",children:"OAuth"}),"\n",(0,i.jsx)(r.p,{children:"You can require that visitors authenticate with an email address that matches at least one of the suffixes you specify. Add the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_OAUTH_PROVIDER="github" # or google\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"password",children:"Password"}),"\n",(0,i.jsx)(r.p,{children:"Enable HTTP basic authentication by adding the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_BASIC_AUTH="user:passwd"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(r.p,{children:"Start the service, and check the zrok console or the service log for the reserved subdomain."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now and at startup"',children:"sudo systemctl enable --now zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now"',children:"sudo systemctl restart zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl -u zrok-share.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,i.jsxs)(r.p,{children:["The Linux distribution must have a package manager that understands the ",(0,i.jsx)(r.code,{children:".deb"})," or ",(0,i.jsx)(r.code,{children:".rpm"})," format and be running systemd v232 or newer. The service was tested with:"]}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsx)(r.li,{children:"Ubuntu 20.04, 22.04, 23.04"}),"\n",(0,i.jsx)(r.li,{children:"Debian 11 12"}),"\n",(0,i.jsx)(r.li,{children:"Rocky 8, 9"}),"\n",(0,i.jsx)(r.li,{children:"Fedora 37, 38"}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"package-contents",children:"Package Contents"}),"\n",(0,i.jsxs)(r.p,{children:["The files included in the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package are sourced ",(0,i.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/nfpm",children:"here in GitHub"}),"."]})]})}function m(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}var g=n(9324),b=n(9030);const x={title:"zrok frontdoor",sidebar_label:"frontdoor",sidebar_position:20,hide_table_of_contents:!0},v=void 0,k={},j=[{value:"Overview",id:"overview",level:2},{value:"Choose your OS",id:"choose-your-os",level:2},{value:"Goal",id:"goal",level:2},{value:"How it Works",id:"how-it-works",level:2},...p,{value:"Concepts",id:"concepts",level:2}];function f(e){const r={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.strong,{children:"zrok frontdoor"})," is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends."]}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/5Vi8GKuTi_I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a ",(0,i.jsx)(r.code,{children:"zrok.io"})," frontend, you're using ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),". ",(0,i.jsx)(r.code,{children:"zrok.io"})," is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),"."]}),"\n",(0,i.jsx)(g.A,{alt:"frontdoor diagram",sources:{light:(0,b.Ay)("/img/zrok-frontdoor-light-mode.svg"),dark:(0,b.Ay)("/img/zrok-frontdoor-dark-mode.svg")}}),"\n",(0,i.jsx)(r.h2,{id:"choose-your-os",children:"Choose your OS"}),"\n",(0,i.jsx)(r.p,{children:"Choose between installing the Linux package or running zrok with Docker (Linux, macOS, or Windows)."}),"\n","\n",(0,i.jsxs)(o.A,{queryString:"os",values:[{label:"Linux",value:"Linux"},{label:"Docker",value:"Docker"}],children:[(0,i.jsxs)(a.A,{value:"Linux",children:[(0,i.jsxs)(r.p,{children:["On Linux, zrok frontdoor is implemented natively as a system service provided by the ",(0,i.jsx)(r.code,{children:"zrok-share"})," DEB or RPM package."]}),(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),(0,i.jsx)(r.p,{children:"Proxy a reserved public subdomain to a backend target with an always-on Linux system service."}),(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.code,{children:"zrok-share"})," package creates a ",(0,i.jsx)(r.code,{children:"zrok-share.service"})," unit in systemd. The administrator edits the service's configuration file to specify the:"]}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsx)(r.li,{children:"zrok account token"}),"\n",(0,i.jsxs)(r.li,{children:["target URL or files to be shared and backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"})]}),"\n",(0,i.jsx)(r.li,{children:"authentication options, if wanted"}),"\n"]}),(0,i.jsx)(r.p,{children:"When the service starts it will:"}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable the zrok environment unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/environment.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified as ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," in the environment file"]}),"\n"]}),(0,i.jsx)(m,{})]}),(0,i.jsx)(a.A,{value:"Docker",children:(0,i.jsxs)(r.p,{children:["On macOS and Windows, zrok frontdoor is implemented as a Docker Compose project which reserves a public subdomain for your website or service and manages a zrok environment that's separate from the Docker host. ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/docker-share/docker_public_share_guide",children:"Link to the Docker Public Share Guide"})]})})]}),"\n",(0,i.jsx)(r.h2,{id:"concepts",children:"Concepts"}),"\n",(0,i.jsxs)(r.p,{children:["Overview of ",(0,i.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"zrok reserved shares"})]})]})}function y(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(f,{...e})}):f(e)}},4119:(e,r,n)=>{n.d(r,{A:()=>o});n(6540);var s=n(382),i=n(8069),t=n(4848);const o=e=>{let{title:r,children:n}=e;const o=n.map((e=>"string"==typeof e?e.trim():s.Ay.dump(e).trim())).join("\n\n");return(0,t.jsx)("div",{children:(0,t.jsx)(i.A,{language:"yaml",title:r,children:o})})}},9009:(e,r,n)=>{n.d(r,{A:()=>a});var s=n(6540),i=n(5537),t=n(159),o=n(4848);const a=function(e){const[r,n]=(0,s.useState)(null);return(0,s.useEffect)((()=>{["Mac OS","Windows"].includes(t.wH)?n("Docker"):n("Linux")}),[]),(0,o.jsx)(o.Fragment,{children:(0,o.jsx)(i.A,{...e,defaultValue:r,children:e.children})})}},6559:(e,r,n)=>{n.d(r,{A:()=>s});const s=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/ebc0e2a0.5671cf6f.js b/assets/js/ebc0e2a0.5671cf6f.js deleted file mode 100644 index 529be411..00000000 --- a/assets/js/ebc0e2a0.5671cf6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[37],{834:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>k,contentTitle:()=>v,default:()=>y,frontMatter:()=>x,metadata:()=>s,toc:()=>j});const s=JSON.parse('{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","source":"@site/versioned_docs/version-0.4/guides/frontdoor.mdx","sourceDirName":"guides","slug":"/guides/frontdoor","permalink":"/docs/0.4/guides/frontdoor","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/frontdoor.mdx","tags":[],"version":"0.4","sidebarPosition":20,"frontMatter":{"title":"zrok frontdoor","sidebar_label":"frontdoor","sidebar_position":20,"hide_table_of_contents":true},"sidebar":"tutorialSidebar","previous":{"title":"Windows","permalink":"/docs/0.4/guides/install/windows"},"next":{"title":"Permission Modes","permalink":"/docs/0.4/guides/permission-modes"}}');var i=n(4848),t=n(8453),o=n(9028),a=n(9365);function l(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["Set up ",(0,i.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,i.jsxs)(r.li,{children:["\n",(0,i.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function d(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}var c=n(6559),h=n(3902);const p=[{value:"Installation",id:"installation",level:2},{value:"Enable",id:"enable",level:2},{value:"Name your Share",id:"name-your-share",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Proxy a Web Server",id:"proxy-a-web-server",level:3},{value:"Serve Static Files",id:"serve-static-files",level:3},{value:"Caddy Server",id:"caddy-server",level:3},{value:"Network Drive",id:"network-drive",level:3},{value:"Authentication",id:"authentication",level:2},{value:"OAuth",id:"oauth",level:3},{value:"Password",id:"password",level:3},{value:"Start the Service",id:"start-the-service",level:2},{value:"Compatibility",id:"compatibility",level:2},{value:"Package Contents",id:"package-contents",level:2}];function u(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(d,{}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Ansible Playbook"}),(0,i.jsxs)(h.A,{title:"Set up package repository and install zrok-share",children:[c.A,"\n- name: Install zrok-share package\ngather_facts: false\nhosts: all \nbecome: true\ntasks:\n- name: Install zrok-share\n ansible.builtin.package:\n name: zrok-share\n state: present\n\n- name: Copy env config from Ansible controller to target\n copy:\n dest: /opt/openziti/etc/zrok/zrok-share.env\n src: /opt/openziti/etc/zrok/zrok-share.env\n\n- name: Enable and restart service\n systemd:\n name: zrok-share\n enabled: yes\n state: restarted\n daemon_reload: yes\n\n- name: Wait for service\n systemd:\n name: zrok-share\n state: started\n register: service_status\n until: service_status.status.ActiveState == 'active'\n retries: 30\n delay: 1\n"]})]}),"\n",(0,i.jsx)(r.h2,{id:"enable",children:"Enable"}),"\n",(0,i.jsx)(r.p,{children:"Save the enable token from the zrok console in the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_ENABLE_TOKEN="14cbfca9772f"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"name-your-share",children:"Name your Share"}),"\n",(0,i.jsxs)(r.p,{children:["This unique name becomes part of the domain name of the share, e.g. ",(0,i.jsx)(r.code,{children:"https://my-prod-app.in.zrok.io"}),". A random name is generated if you don't specify one."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_UNIQUE_NAME="my-prod-app"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(r.p,{children:["You may change the target for the current backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"}),", by editing the configuration file and restarting the service. The reserved subdomain will remain the same."]}),"\n",(0,i.jsxs)(r.p,{children:["You may switch between backend modes or change authentication options by deleting ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," and restarting the service. A new subdomain will be reserved."]}),"\n",(0,i.jsx)(r.h3,{id:"proxy-a-web-server",children:"Proxy a Web Server"}),"\n",(0,i.jsx)(r.p,{children:"Proxy a reserved subdomain to an existing web server. The web server could be on a private network or on the same host as zrok."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="http://127.0.0.1:3000"\nZROK_BACKEND_MODE="proxy"\n'})}),"\n",(0,i.jsxs)(r.p,{children:["If your HTTPS server has an unverifiable TLS server certificate then you must set ",(0,i.jsx)(r.code,{children:"--insecure"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_INSECURE="--insecure"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"serve-static-files",children:"Serve Static Files"}),"\n",(0,i.jsxs)(r.p,{children:["Run zrok's embedded web server to serve the files in a directory. If there's an ",(0,i.jsx)(r.code,{children:"index.html"})," file in the directory then visitors will see that web page in their browser, otherwise they'll see a generated index of the files. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /var/www/html"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/var/www/html"\nZROK_BACKEND_MODE="web"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"caddy-server",children:"Caddy Server"}),"\n",(0,i.jsx)(r.p,{children:"Use zrok's built-in Caddy server to serve static files or as a reverse proxy to multiple web servers with various HTTP routes or as a load-balanced set. A sample Caddyfile is available in the path shown."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/opt/openziti/etc/zrok/multiple_upstream.Caddyfile"\nZROK_BACKEND_MODE="caddy"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"network-drive",children:"Network Drive"}),"\n",(0,i.jsxs)(r.p,{children:["This uses zrok's ",(0,i.jsx)(r.code,{children:"drive"})," backend mode to serve a directory of static files as a virtual network drive. The directory must be readable by 'other', e.g. ",(0,i.jsx)(r.code,{children:"chmod -R o+rX /usr/share/doc"}),"."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_TARGET="/usr/share/doc"\nZROK_BACKEND_MODE="drive"\n'})}),"\n",(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.a,{href:"https://blog.openziti.io/zrok-drives-an-early-preview",children:"Learn more about this feature in this blog post"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(r.p,{children:"You can limit access to certain email addresses with OAuth or require a password."}),"\n",(0,i.jsx)(r.h3,{id:"oauth",children:"OAuth"}),"\n",(0,i.jsx)(r.p,{children:"You can require that visitors authenticate with an email address that matches at least one of the suffixes you specify. Add the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_OAUTH_PROVIDER="github" # or google\nZROK_OAUTH_EMAILS="alice@example.com *@acme.example.com"\n'})}),"\n",(0,i.jsx)(r.h3,{id:"password",children:"Password"}),"\n",(0,i.jsx)(r.p,{children:"Enable HTTP basic authentication by adding the following to the configuration file."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="/opt/openziti/etc/zrok/zrok-share.env"',children:'ZROK_BASIC_AUTH="user:passwd"\n'})}),"\n",(0,i.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,i.jsx)(r.p,{children:"Start the service, and check the zrok console or the service log for the reserved subdomain."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now and at startup"',children:"sudo systemctl enable --now zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",metastring:'title="run now"',children:"sudo systemctl restart zrok-share.service\n"})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl -u zrok-share.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,i.jsxs)(r.p,{children:["The Linux distribution must have a package manager that understands the ",(0,i.jsx)(r.code,{children:".deb"})," or ",(0,i.jsx)(r.code,{children:".rpm"})," format and be running systemd v232 or newer. The service was tested with:"]}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsx)(r.li,{children:"Ubuntu 20.04, 22.04, 23.04"}),"\n",(0,i.jsx)(r.li,{children:"Debian 11 12"}),"\n",(0,i.jsx)(r.li,{children:"Rocky 8, 9"}),"\n",(0,i.jsx)(r.li,{children:"Fedora 37, 38"}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"package-contents",children:"Package Contents"}),"\n",(0,i.jsxs)(r.p,{children:["The files included in the ",(0,i.jsx)(r.code,{children:"zrok-share"})," package are sourced ",(0,i.jsx)(r.a,{href:"https://github.com/openziti/zrok/tree/main/nfpm",children:"here in GitHub"}),"."]})]})}function m(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}var g=n(1122),b=n(6025);const x={title:"zrok frontdoor",sidebar_label:"frontdoor",sidebar_position:20,hide_table_of_contents:!0},v=void 0,k={},j=[{value:"Overview",id:"overview",level:2},{value:"Choose your OS",id:"choose-your-os",level:2},{value:"Goal",id:"goal",level:2},{value:"How it Works",id:"how-it-works",level:2},...p,{value:"Concepts",id:"concepts",level:2}];function f(e){const r={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(r.p,{children:[(0,i.jsx)(r.strong,{children:"zrok frontdoor"})," is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends."]}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/5Vi8GKuTi_I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a ",(0,i.jsx)(r.code,{children:"zrok.io"})," frontend, you're using ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),". ",(0,i.jsx)(r.code,{children:"zrok.io"})," is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use ",(0,i.jsx)(r.strong,{children:"zrok frontdoor"}),"."]}),"\n",(0,i.jsx)(g.A,{alt:"frontdoor diagram",sources:{light:(0,b.Ay)("/img/zrok-frontdoor-light-mode.svg"),dark:(0,b.Ay)("/img/zrok-frontdoor-dark-mode.svg")}}),"\n",(0,i.jsx)(r.h2,{id:"choose-your-os",children:"Choose your OS"}),"\n",(0,i.jsx)(r.p,{children:"Choose between installing the Linux package or running zrok with Docker (Linux, macOS, or Windows)."}),"\n","\n",(0,i.jsxs)(o.A,{queryString:"os",values:[{label:"Linux",value:"Linux"},{label:"Docker",value:"Docker"}],children:[(0,i.jsxs)(a.A,{value:"Linux",children:[(0,i.jsxs)(r.p,{children:["On Linux, zrok frontdoor is implemented natively as a system service provided by the ",(0,i.jsx)(r.code,{children:"zrok-share"})," DEB or RPM package."]}),(0,i.jsx)(r.h2,{id:"goal",children:"Goal"}),(0,i.jsx)(r.p,{children:"Proxy a reserved public subdomain to a backend target with an always-on Linux system service."}),(0,i.jsx)(r.h2,{id:"how-it-works",children:"How it Works"}),(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.code,{children:"zrok-share"})," package creates a ",(0,i.jsx)(r.code,{children:"zrok-share.service"})," unit in systemd. The administrator edits the service's configuration file to specify the:"]}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsx)(r.li,{children:"zrok account token"}),"\n",(0,i.jsxs)(r.li,{children:["target URL or files to be shared and backend mode, e.g. ",(0,i.jsx)(r.code,{children:"proxy"})]}),"\n",(0,i.jsx)(r.li,{children:"authentication options, if wanted"}),"\n"]}),(0,i.jsx)(r.p,{children:"When the service starts it will:"}),(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:["enable the zrok environment unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/environment.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["reserve a public subdomain for the service unless ",(0,i.jsx)(r.code,{children:"/var/lib/zrok-share/.zrok/reserved.json"})," exists"]}),"\n",(0,i.jsxs)(r.li,{children:["start sharing the target specified as ",(0,i.jsx)(r.code,{children:"ZROK_TARGET"})," in the environment file"]}),"\n"]}),(0,i.jsx)(m,{})]}),(0,i.jsx)(a.A,{value:"Docker",children:(0,i.jsxs)(r.p,{children:["On macOS and Windows, zrok frontdoor is implemented as a Docker Compose project which reserves a public subdomain for your website or service and manages a zrok environment that's separate from the Docker host. ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/docker-share/docker_public_share_guide",children:"Link to the Docker Public Share Guide"})]})})]}),"\n",(0,i.jsx)(r.h2,{id:"concepts",children:"Concepts"}),"\n",(0,i.jsxs)(r.p,{children:["Overview of ",(0,i.jsx)(r.a,{href:"/docs/0.4/concepts/sharing-reserved",children:"zrok reserved shares"})]})]})}function y(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(f,{...e})}):f(e)}},3902:(e,r,n)=>{n.d(r,{A:()=>o});n(6540);var s=n(382),i=n(1432),t=n(4848);const o=e=>{let{title:r,children:n}=e;const o=n.map((e=>"string"==typeof e?e.trim():s.Ay.dump(e).trim())).join("\n\n");return(0,t.jsx)("div",{children:(0,t.jsx)(i.A,{language:"yaml",title:r,children:o})})}},9028:(e,r,n)=>{n.d(r,{A:()=>a});var s=n(6540),i=n(1470),t=n(159),o=n(4848);const a=function(e){const[r,n]=(0,s.useState)(null);return(0,s.useEffect)((()=>{["Mac OS","Windows"].includes(t.wH)?n("Docker"):n("Linux")}),[]),(0,o.jsx)(o.Fragment,{children:(0,o.jsx)(i.A,{...e,defaultValue:r,children:e.children})})}},6559:(e,r,n)=>{n.d(r,{A:()=>s});const s=[{name:"Set up zrok Package Repo",gather_facts:!0,hosts:"all",become:!0,tasks:[{name:"Set up apt repo",when:'ansible_os_family == "Debian"',block:[{name:"Install playbook dependencies","ansible.builtin.package":{name:["gnupg"],state:"present"}},{name:"Fetch armored pubkey","ansible.builtin.uri":{url:"https://get.openziti.io/tun/package-repos.gpg",return_content:"yes"},register:"armored_pubkey"},{name:"Dearmor pubkey","ansible.builtin.shell":'gpg --dearmor --output /usr/share/keyrings/openziti.gpg <<< "{{ armored_pubkey.content }}"\n',args:{creates:"/usr/share/keyrings/openziti.gpg",executable:"/bin/bash"}},{name:"Set pubkey filemode","ansible.builtin.file":{path:"/usr/share/keyrings/openziti.gpg",mode:"a+rX"}},{name:"Install OpenZiti repo deb source","ansible.builtin.copy":{dest:"/etc/apt/sources.list.d/openziti-release.list",content:"deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main\n"}},{name:"Refresh Repo Sources","ansible.builtin.apt":{update_cache:"yes",cache_valid_time:3600}}]},{name:"Set up yum repo",when:'ansible_os_family == "RedHat"',block:[{name:"Install OpenZiti repo rpm source","ansible.builtin.yum_repository":{name:"OpenZitiRelease",description:"OpenZiti Release",baseurl:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch",enabled:"yes",gpgkey:"https://packages.openziti.org/zitipax-openziti-rpm-stable/redhat/$basearch/repodata/repomd.xml.key",repo_gpgcheck:"yes",gpgcheck:"no"}}]}]}]}}]); \ No newline at end of file diff --git a/assets/js/ecf841c3.7d4c9847.js b/assets/js/ecf841c3.55fddec0.js similarity index 99% rename from assets/js/ecf841c3.7d4c9847.js rename to assets/js/ecf841c3.55fddec0.js index 7f304cd1..cad3bf58 100644 --- a/assets/js/ecf841c3.7d4c9847.js +++ b/assets/js/ecf841c3.55fddec0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9002],{3964:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","source":"@site/versioned_docs/version-0.4/concepts/tunnels.md","sourceDirName":"concepts","slug":"/concepts/tunnels","permalink":"/docs/0.4/concepts/tunnels","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/tunnels.md","tags":[],"version":"0.4","sidebarPosition":25,"frontMatter":{"sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Sharing HTTP Servers","permalink":"/docs/0.4/concepts/http"},"next":{"title":"Sharing Websites and Files","permalink":"/docs/0.4/concepts/files"}}');var c=s(4848),t=s(8453);const o={sidebar_position:25},i="Sharing TCP and UDP Servers",d={},a=[];function l(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"sharing-tcp-and-udp-servers",children:"Sharing TCP and UDP Servers"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.code,{children:"zrok"})," includes support for sharing low-level TCP and UDP network resources using the ",(0,c.jsx)(n.code,{children:"tcpTunnel"})," and ",(0,c.jsx)(n.code,{children:"udpTunnel"})," backend modes."]}),"\n",(0,c.jsxs)(n.p,{children:["As of version ",(0,c.jsx)(n.code,{children:"v0.4"}),", ",(0,c.jsx)(n.code,{children:"zrok"})," supports sharing TCP and UDP network resources using ",(0,c.jsx)(n.code,{children:"private"})," sharing."]}),"\n",(0,c.jsxs)(n.p,{children:["To share a raw network resource using ",(0,c.jsx)(n.code,{children:"zrok"}),", you'll want to use the ",(0,c.jsx)(n.code,{children:"zrok share private"})," command from your ",(0,c.jsx)(n.code,{children:"enable"}),"-d environment, like this:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok share private --backend-mode tcpTunnel 192.168.9.1:22\n"})}),"\n",(0,c.jsx)(n.p,{children:"This will result in a share client starting, which looks like this:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE][TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an ",(0,c.jsx)(n.code,{children:"enable"}),"-d ",(0,c.jsx)(n.code,{children:"zrok"})," environment. Run the following command (shown in the banner at the top of the ",(0,c.jsx)(n.code,{children:"zrok share"})," client above):"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok access private 5adagwfl888k\n"})}),"\n",(0,c.jsxs)(n.p,{children:["This will start an ",(0,c.jsx)(n.code,{children:"access"})," client on this system:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"access"})," client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to ",(0,c.jsx)(n.code,{children:"127.0.0.1:9191"}),". We'll just use ",(0,c.jsx)(n.code,{children:"nc"})," (netcat) to access the shared TCP port:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ nc 127.0.0.1 9191\nSSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1\n"})}),"\n",(0,c.jsxs)(n.p,{children:["And both the ",(0,c.jsx)(n.code,{children:"share"})," client and the ",(0,c.jsx)(n.code,{children:"access"})," client show the traffic:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE] [TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router \u2502\n\u2502connId=2147483648, logical=ziti- \u2502\n\u2502sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Exit the ",(0,c.jsx)(n.code,{children:"access"})," client to remove the local access to the shared TCP port. Exit the ",(0,c.jsx)(n.code,{children:"share"})," client to disable further accesses to the shared resource."]}),"\n",(0,c.jsxs)(n.p,{children:["For UDP network resources just use the ",(0,c.jsx)(n.code,{children:"zrok share private --backend-mode udpTunnel"})," instead of ",(0,c.jsx)(n.code,{children:"tcpTunnel"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const c={},t=r.createContext(c);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9002],{1311:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","source":"@site/versioned_docs/version-0.4/concepts/tunnels.md","sourceDirName":"concepts","slug":"/concepts/tunnels","permalink":"/docs/0.4/concepts/tunnels","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/concepts/tunnels.md","tags":[],"version":"0.4","sidebarPosition":25,"frontMatter":{"sidebar_position":25},"sidebar":"tutorialSidebar","previous":{"title":"Sharing HTTP Servers","permalink":"/docs/0.4/concepts/http"},"next":{"title":"Sharing Websites and Files","permalink":"/docs/0.4/concepts/files"}}');var c=s(4848),t=s(8453);const o={sidebar_position:25},i="Sharing TCP and UDP Servers",d={},a=[];function l(e){const n={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"sharing-tcp-and-udp-servers",children:"Sharing TCP and UDP Servers"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.code,{children:"zrok"})," includes support for sharing low-level TCP and UDP network resources using the ",(0,c.jsx)(n.code,{children:"tcpTunnel"})," and ",(0,c.jsx)(n.code,{children:"udpTunnel"})," backend modes."]}),"\n",(0,c.jsxs)(n.p,{children:["As of version ",(0,c.jsx)(n.code,{children:"v0.4"}),", ",(0,c.jsx)(n.code,{children:"zrok"})," supports sharing TCP and UDP network resources using ",(0,c.jsx)(n.code,{children:"private"})," sharing."]}),"\n",(0,c.jsxs)(n.p,{children:["To share a raw network resource using ",(0,c.jsx)(n.code,{children:"zrok"}),", you'll want to use the ",(0,c.jsx)(n.code,{children:"zrok share private"})," command from your ",(0,c.jsx)(n.code,{children:"enable"}),"-d environment, like this:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok share private --backend-mode tcpTunnel 192.168.9.1:22\n"})}),"\n",(0,c.jsx)(n.p,{children:"This will result in a share client starting, which looks like this:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE][TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an ",(0,c.jsx)(n.code,{children:"enable"}),"-d ",(0,c.jsx)(n.code,{children:"zrok"})," environment. Run the following command (shown in the banner at the top of the ",(0,c.jsx)(n.code,{children:"zrok share"})," client above):"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ zrok access private 5adagwfl888k\n"})}),"\n",(0,c.jsxs)(n.p,{children:["This will start an ",(0,c.jsx)(n.code,{children:"access"})," client on this system:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"access"})," client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to ",(0,c.jsx)(n.code,{children:"127.0.0.1:9191"}),". We'll just use ",(0,c.jsx)(n.code,{children:"nc"})," (netcat) to access the shared TCP port:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"$ nc 127.0.0.1 9191\nSSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1\n"})}),"\n",(0,c.jsxs)(n.p,{children:["And both the ",(0,c.jsx)(n.code,{children:"share"})," client and the ",(0,c.jsx)(n.code,{children:"access"})," client show the traffic:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 access your share with: zrok access private 5adagwfl888k \u2502\u2502[PRIVATE] [TCPTUNNEL]\u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router \u2502\n\u2502connId=2147483648, logical=ziti- \u2502\n\u2502sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 tcp://127.0.0.1:9191 -> 5adagwfl888k \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Exit the ",(0,c.jsx)(n.code,{children:"access"})," client to remove the local access to the shared TCP port. Exit the ",(0,c.jsx)(n.code,{children:"share"})," client to disable further accesses to the shared resource."]}),"\n",(0,c.jsxs)(n.p,{children:["For UDP network resources just use the ",(0,c.jsx)(n.code,{children:"zrok share private --backend-mode udpTunnel"})," instead of ",(0,c.jsx)(n.code,{children:"tcpTunnel"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const c={},t=r.createContext(c);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef8afbfd.adaf6ea9.js b/assets/js/ef8afbfd.adaf6ea9.js new file mode 100644 index 00000000..2cb9e7b1 --- /dev/null +++ b/assets/js/ef8afbfd.adaf6ea9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9905],{669:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","source":"@site/../docs/guides/self-hosting/linux/nginx.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/nginx","permalink":"/docs/guides/self-hosting/linux/nginx","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/nginx.mdx","tags":[],"version":"current","sidebarPosition":50,"frontMatter":{"sidebar_position":50,"sidebar_label":"NGINX TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/guides/self-hosting/linux/"},"next":{"title":"Interstitial Pages","permalink":"/docs/guides/self-hosting/interstitial-page"}}');var o=r(4848),i=r(8453);const s={sidebar_position:50,sidebar_label:"NGINX TLS"},l="NGINX Reverse Proxy for zrok",a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"})}),"\n",(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(n.p,{children:["I'll assume you have a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,o.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,o.jsxs)(n.p,{children:["I'll use ",(0,o.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,o.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,o.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install certbot: ",(0,o.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,o.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-nginx",children:(0,o.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,o.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,o.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,o.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,o.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,o.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var t=r(6540);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef8afbfd.dbcbe2ba.js b/assets/js/ef8afbfd.dbcbe2ba.js deleted file mode 100644 index 5ac69727..00000000 --- a/assets/js/ef8afbfd.dbcbe2ba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9905],{9530:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"guides/self-hosting/linux/nginx","title":"NGINX Reverse Proxy for zrok","description":"Walkthrough Video","source":"@site/../docs/guides/self-hosting/linux/nginx.mdx","sourceDirName":"guides/self-hosting/linux","slug":"/guides/self-hosting/linux/nginx","permalink":"/docs/guides/self-hosting/linux/nginx","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/nginx.mdx","tags":[],"version":"current","sidebarPosition":50,"frontMatter":{"sidebar_position":50,"sidebar_label":"NGINX TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Linux","permalink":"/docs/guides/self-hosting/linux/"},"next":{"title":"Interstitial Pages","permalink":"/docs/guides/self-hosting/interstitial-page"}}');var o=r(4848),i=r(8453);const s={sidebar_position:50,sidebar_label:"NGINX TLS"},l="NGINX Reverse Proxy for zrok",a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"})}),"\n",(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,o.jsxs)(n.p,{children:["I'll assume you have a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,o.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,o.jsxs)(n.p,{children:["I'll use ",(0,o.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,o.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,o.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install certbot: ",(0,o.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,o.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-nginx",children:(0,o.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,o.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,o.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,o.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,o.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,o.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>l});var t=r(6540);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f888b719.25860f0f.js b/assets/js/f888b719.25860f0f.js deleted file mode 100644 index 237fb4ec..00000000 --- a/assets/js/f888b719.25860f0f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4470],{2410:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"If you\'ve upgraded to v1.0.0 from a previous version and you receive an error message like this:","source":"@site/../docs/getting-started.mdx","sourceDirName":".","slug":"/getting-started","permalink":"/docs/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/getting-started.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Getting Started","sidebar_label":"Getting Started","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"Concepts","permalink":"/docs/concepts/"}}');var o=s(4848),i=s(8453),t=(s(8151),s(595),s(1342),s(8477));const a={title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:10},c=void 0,d={},l=[{value:"Your Secure Internet Sharing Perimeter",id:"your-secure-internet-sharing-perimeter",level:2},{value:"What's it for?",id:"whats-it-for",level:2},{value:"Your First Share",id:"your-first-share",level:3},{value:"Installing the zrok Command",id:"installing-the-zrok-command",level:2},...t.RM,{value:"Enabling Your zrok Environment",id:"enabling-your-zrok-environment",level:2},{value:"Sharing",id:"sharing",level:2},{value:"Ephemeral by Default",id:"ephemeral-by-default",level:3},{value:"Public Shares and Frontends",id:"public-shares-and-frontends",level:3},{value:"Private Shares",id:"private-shares",level:3},{value:"Proxy Backend Mode",id:"proxy-backend-mode",level:3},{value:"Web Backend Mode",id:"web-backend-mode",level:3},{value:"Reserved Shares",id:"reserved-shares",level:3},{value:"Concepts Review",id:"concepts-review",level:2},{value:"Instance and Account",id:"instance-and-account",level:3},{value:"Environment",id:"environment",level:3},{value:"Shares",id:"shares",level:3},{value:"Reserved Shares",id:"reserved-shares-1",level:3},{value:"Self-Hosting an Instance",id:"self-hosting-an-instance",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components},{Card:r,CardBody:a,CardFooter:c,CardHeader:d,Column:l,Columns:h}=n;return r||m("Card",!0),a||m("CardBody",!0),c||m("CardFooter",!0),d||m("CardHeader",!0),l||m("Column",!0),h||m("Columns",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsxs)(n.p,{children:["If you've upgraded to ",(0,o.jsx)(n.code,{children:"v1.0.0"})," from a previous version and you receive an error message like this:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ERROR]: unable to create share (error getting zrok client: client version error accessing api endpoint 'https://api.zrok.io': [POST /clientVersionCheck] clientVersionCheck (status 404): {}: [POST /clientVersionCheck] clientVersionCheck (status 404): {})\n"})}),(0,o.jsxs)(n.p,{children:["Use the command ",(0,o.jsx)(n.code,{children:"zrok rebase apiEndpoint https://api-v1.zrok.io/"})," to update your environment to the latest zrok endpoint."]})]}),"\n",(0,o.jsx)(n.h2,{id:"your-secure-internet-sharing-perimeter",children:"Your Secure Internet Sharing Perimeter"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," (",(0,o.jsx)(n.em,{children:"/zi\u02d0\u0279\u0252k/ ZEE-rock"}),") is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files.\nThere's a hardened zrok-as-a-service offering available at ",(0,o.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," with a generous free tier."]}),"\n",(0,o.jsx)(n.h2,{id:"whats-it-for",children:"What's it for?"}),"\n",(0,o.jsxs)(n.p,{children:["Use ",(0,o.jsx)(n.code,{children:"zrok"})," to share a running service, like a web server or a network socket, or to share a directory of static files. ",(0,o.jsx)(n.code,{children:"zrok"})," goes beyond simple tunneling to provide sharing solutions for a variety of network and storage use cases."]}),"\n",(0,o.jsxs)(n.p,{children:["When using ",(0,o.jsx)(n.code,{children:"zrok"})," to ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:"share publicly"}),", you can reserve a public hostname, enable authentication options, or both. Public shares proxy HTTPS to your service or files."]}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:"sharing privately"}),", only users with the share token (and the appropriate permission grants) can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services."]}),"\n",(0,o.jsxs)(n.p,{children:["Here's a quick overview of what's involved in getting started with ",(0,o.jsx)(n.code,{children:"zrok"}),":"]}),"\n",(0,o.jsx)(n.h3,{id:"your-first-share",children:"Your First Share"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Get an account token"}),"\n"]}),"\n",(0,o.jsxs)(h,{className:"text--center getting-started-cards",style:{marginLeft:1},children:[(0,o.jsx)(l,{style:{paddingBottom:20},children:(0,o.jsxs)(r,{shadow:"tl",children:[(0,o.jsx)(d,{children:(0,o.jsx)("h3",{children:"Hosted zrok"})}),(0,o.jsx)(a,{children:(0,o.jsx)(n.p,{children:"Use NetFoundry's public zrok instance."})}),(0,o.jsx)(c,{children:(0,o.jsx)("a",{href:"https://myzrok.io/",children:(0,o.jsx)("button",{className:"button button--secondary button--block",children:"Get an Account"})})})]})}),(0,o.jsx)(l,{style:{paddingBottom:20},children:(0,o.jsxs)(r,{shadow:"tl",children:[(0,o.jsx)(d,{children:(0,o.jsx)("h3",{children:"Self-Hosted zrok"})}),(0,o.jsx)(a,{children:(0,o.jsx)(n.p,{children:"Run a zrok instance on Linux, Docker, or Kubernetes."})}),(0,o.jsx)(c,{children:(0,o.jsx)("a",{href:"/docs/category/self-hosting/",children:(0,o.jsx)("button",{className:"button button--secondary button--block",children:"Guides"})})})]})})]}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"#installing-the-zrok-command",children:"Download the zrok binary"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Enable zrok for your ",(0,o.jsx)(n.a,{href:"#enabling-your-zrok-environment",children:"environment"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Share ",(0,o.jsx)(n.code,{children:"http://localhost:8080"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Visit the public URL displayed in your terminal"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok share public",src:s(7739).A+"",width:"697",height:"530"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h1,{id:"a-deeper-look-at-getting-started",children:"A Deeper Look at Getting Started"}),"\n",(0,o.jsxs)(n.p,{children:["Here's a deeper, more thorough look at getting started with ",(0,o.jsx)(n.code,{children:"zrok"}),":"]}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-zrok-command",children:"Installing the zrok Command"}),"\n",(0,o.jsx)(t.Ay,{}),"\n",(0,o.jsx)(n.h2,{id:"enabling-your-zrok-environment",children:"Enabling Your zrok Environment"}),"\n",(0,o.jsxs)(n.p,{children:["After you have ",(0,o.jsx)(n.a,{href:"#your-first-share",children:"an account"}),", you can enable your ",(0,o.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,o.jsxs)(n.p,{children:["A zrok environment usually refers to an enabled device where shares and accesses can be created, .e.g., ",(0,o.jsx)(n.code,{children:"~/.zrok"})," on a Unix machine. It can be a specific user's environment or a system-wide agent's environment owned by the administrator."]}),"\n",(0,o.jsxs)(n.p,{children:["When your ",(0,o.jsx)(n.code,{children:"zrok"})," account was created, the service generated an ",(0,o.jsx)(n.em,{children:"account token"})," that identifies and authenticates in a single step. Protect your account token as if it were a password, or an important account number; it's a ",(0,o.jsx)(n.em,{children:"secret"}),", protect it."]}),"\n",(0,o.jsxs)(n.p,{children:["When we left off you had downloaded, extracted, and configured your ",(0,o.jsx)(n.code,{children:"zrok"})," software. In order to use that environment with your account, you'll need to ",(0,o.jsx)(n.code,{children:"enable"})," an ",(0,o.jsx)(n.em,{children:"environment"})," on your system. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the ",(0,o.jsx)(n.code,{children:"zrok"})," service so that you can begin sharing."]}),"\n",(0,o.jsx)(n.p,{children:"Log into the API console at:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://api-v1.zrok.io/",children:"https://api-v1.zrok.io/"})}),"\n",(0,o.jsx)(n.p,{children:"When you first log into your account on the API console, your interface will look like this:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok API console, empty",src:s(2279).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsx)(n.p,{children:'In the toolbar, there is a big green button that says "CLICK HERE TO GET STARTED!". If you click that button, you\'ll see the getting started wizard, which looks like this:'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok getting started modal",src:s(312).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsx)(n.p,{children:"This wizard is broken into multiple steps. The first step we've already covered, which gets the zrok software installed onto your system."}),"\n",(0,o.jsxs)(n.p,{children:['Below "step 2" is a command: ',(0,o.jsx)(n.code,{children:"zrok enable 7g3K6gVKikWb"})," (your account will have a different account token, other than ",(0,o.jsx)(n.code,{children:"7g3K6gVKikWb"}),"). You'll want to copy this command into your shell and execute it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok enable 7g3K6gVKikWb \n\u28fb contacting the zrok service...\n"})}),"\n",(0,o.jsx)(n.p,{children:"After a few seconds, the message will change and indicate that the enable operation succeeded:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok enable 7g3K6gVKikWb \n\u28fb the zrok environment was successfully enabled...\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Now, if we run a ",(0,o.jsx)(n.code,{children:"zrok status"})," command, you will see the details of your environment:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok status\n\nConfig:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://api-v1.zrok.io env \n defaultFrontend public binary \n headless false binary \n\nEnvironment:\n\n PROPERTY VALUE \n Account Token <<SET>> \n Ziti Identity <<SET>> \n"})}),"\n",(0,o.jsx)(n.p,{children:"Excellent... our environment is now fully enabled."}),"\n",(0,o.jsxs)(n.p,{children:["If we return to the ",(0,o.jsx)(n.em,{children:"API console"}),", we'll now see the new environment reflected in the API console visualizer:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"New Environment in Web UI",src:s(7954).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["In my case, the environment is named ",(0,o.jsx)(n.code,{children:"michael@testing"}),", which is the username of my shell and the hostname of the system the shell is running on."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["Should you want to use a non-default name for your environment, you can pass the ",(0,o.jsx)(n.code,{children:"-d"})," option to the ",(0,o.jsx)(n.code,{children:"zrok enable"})," command. See ",(0,o.jsx)(n.code,{children:"zrok enable --help"})," for details."]})}),"\n",(0,o.jsxs)(n.p,{children:["If you click on the environment node in the explorer in the ",(0,o.jsx)(n.em,{children:"web console"}),", the details panel shown at the bottom of the page will change:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Empty Environment",src:s(7554).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["The visualizer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the visualizer, click the ",(0,o.jsx)(n.img,{alt:"Zoom to Fit",src:s(5203).A+"",width:"25",height:"23"})," ",(0,o.jsx)(n.em,{children:"zoom to fit"})," icon in the lower right corner of the explorer."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["With your ",(0,o.jsx)(n.code,{children:"zrok"})," account you can ",(0,o.jsx)(n.code,{children:"zrok enable"})," multiple environments. This will allow you to share (and access your shares) from multiple environments simultaneously."]})}),"\n",(0,o.jsx)(n.p,{children:"Your environment is fully ready to go. Now we can move on to the fun stuff..."}),"\n",(0,o.jsx)(n.h2,{id:"sharing",children:"Sharing"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," is designed to make sharing resources as effortless as possible, while providing a high degree of security and control."]}),"\n",(0,o.jsx)(n.h3,{id:"ephemeral-by-default",children:"Ephemeral by Default"}),"\n",(0,o.jsxs)(n.p,{children:["Shared resources are ",(0,o.jsx)(n.em,{children:"ephemeral"})," by default; as soon as you terminate the ",(0,o.jsx)(n.code,{children:"zrok share"})," command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created."]}),"\n",(0,o.jsx)(n.h3,{id:"public-shares-and-frontends",children:"Public Shares and Frontends"}),"\n",(0,o.jsxs)(n.p,{children:["Resources that are shared ",(0,o.jsx)(n.em,{children:"publicly"})," are exposed to any users on the internet who have access to the ",(0,o.jsx)(n.code,{children:"zrok"}),' instance\'s "frontend".']}),"\n",(0,o.jsx)(n.p,{children:"A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources."}),"\n",(0,o.jsxs)(n.p,{children:["For example, I might create a public share using the ",(0,o.jsx)(n.code,{children:"zrok share public"})," command, which results in my ",(0,o.jsx)(n.code,{children:"zrok"})," instance exposing a URL like ",(0,o.jsx)(n.code,{children:"https://xxr2b7tzfx64.share.zrok.io"})," to access my resources."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public --backend-mode web .\n"})}),"\n",(0,o.jsxs)(n.p,{children:['In this case, my share was given the "share token" of ',(0,o.jsx)(n.code,{children:"xxr2b7tzfx64"}),". That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources."]}),"\n",(0,o.jsx)(n.p,{children:"If we return to the web console, we see our share in the explorer:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Web Console Share",src:s(3588).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["If we click on the ",(0,o.jsx)(n.em,{children:"frontend endpoint"})," a new browser tab opens and we see the content of our share:\n",(0,o.jsx)(n.img,{alt:"Share Frontend",src:s(9635).A+"",width:"1669",height:"1033"})]}),"\n",(0,o.jsxs)(n.p,{children:["When we start accessing our share, notice the ",(0,o.jsx)(n.em,{children:"sparkline"})," graphs showing the activity:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Environment Spark Line",src:s(9921).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["And as soon as I terminate the ",(0,o.jsx)(n.code,{children:"zrok share"})," client, the resources are removed from the ",(0,o.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,o.jsx)(n.p,{children:"If we try to reload the frontend endpoint in our web browser, we'll see:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Not Found",src:s(8436).A+"",width:"1616",height:"1382"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:"More about public shares"})}),"\n",(0,o.jsx)(n.h3,{id:"private-shares",children:"Private Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," also provides a powerful ",(0,o.jsx)(n.em,{children:"private"})," sharing model. If I execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",children:"$ zrok share private http://localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," service will respond with the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"access your share with: zrok access private wvszln4dyz9q\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Rather than allowing access to your service through a public frontend, a ",(0,o.jsx)(n.em,{children:"private"})," share is only exposed to the underlying OpenZiti network, and can only be accessed using the ",(0,o.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok access private wvszln4dyz9q"})," command can be run by any ",(0,o.jsx)(n.code,{children:"zrok"})," user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:"More about private shares"})}),"\n",(0,o.jsx)(n.h3,{id:"proxy-backend-mode",children:"Proxy Backend Mode"}),"\n",(0,o.jsxs)(n.p,{children:["Without specifying a ",(0,o.jsx)(n.em,{children:"backend mode"}),", the ",(0,o.jsx)(n.code,{children:"zrok share"})," command will assume that you're trying to share a ",(0,o.jsx)(n.code,{children:"proxy"})," resource. A ",(0,o.jsx)(n.code,{children:"proxy"})," resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on ",(0,o.jsx)(n.code,{children:"localhost"}),", or only listening on a private LAN segment behind a firewall."]}),"\n",(0,o.jsxs)(n.p,{children:["For these services a ",(0,o.jsx)(n.code,{children:"proxy"})," share will allow those endpoints to be reached, either ",(0,o.jsx)(n.em,{children:"publicly"})," or ",(0,o.jsx)(n.em,{children:"privately"})," through the ",(0,o.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,o.jsx)(n.h3,{id:"web-backend-mode",children:"Web Backend Mode"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok share"})," command accepts a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," option. Besides ",(0,o.jsx)(n.code,{children:"proxy"}),", the current ",(0,o.jsx)(n.code,{children:"v0.3"})," release (as of this writing) also supports a ",(0,o.jsx)(n.code,{children:"web"})," mode. The ",(0,o.jsx)(n.code,{children:"web"})," mode allows you to specify a local folder on your filesystem, and instantly turns your ",(0,o.jsx)(n.code,{children:"zrok"})," client into a web server, exposing your web content either ",(0,o.jsx)(n.em,{children:"publicly"})," or ",(0,o.jsx)(n.em,{children:"privately"})," without having to a configure a web server."]}),"\n",(0,o.jsx)(n.h3,{id:"reserved-shares",children:"Reserved Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," shares are ",(0,o.jsx)(n.em,{children:"ephemeral"}),' unless you specifically create a "reserved" share.']}),"\n",(0,o.jsxs)(n.p,{children:["A reserved share can be re-used multiple times; it will survive termination of the ",(0,o.jsx)(n.code,{children:"zrok share"})," command, allowing for longer-lasting semi-permanent access to shared resources."]}),"\n",(0,o.jsx)(n.p,{children:"The first step is to create the reserved share:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok reserve public --backend-mode web v0.3_getting_started\n[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'\n[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io\n"})}),"\n",(0,o.jsxs)(n.p,{children:["I'm asking the ",(0,o.jsx)(n.code,{children:"zrok"})," service to reserve a share with a ",(0,o.jsx)(n.code,{children:"web"})," backend mode, pointing at my local ",(0,o.jsx)(n.code,{children:"docs"})," folder."]}),"\n",(0,o.jsxs)(n.p,{children:["You'll want to remember the share token (",(0,o.jsx)(n.code,{children:"mltwsinym1s2"})," in this case), and the frontend endpoint URL. If this were a ",(0,o.jsx)(n.em,{children:"private"})," reserved share, there would not be a frontend URL."]}),"\n",(0,o.jsx)(n.p,{children:"If we do nothing else, and then point a web browser at the frontend endpoint, we get:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Not Found",src:s(6837).A+"",width:"1659",height:"1397"})}),"\n",(0,o.jsxs)(n.p,{children:["This is the ",(0,o.jsx)(n.code,{children:"404"})," error message returned by the ",(0,o.jsx)(n.code,{children:"zrok"})," frontend. We're getting this because we haven't yet started up a ",(0,o.jsx)(n.code,{children:"zrok share"})," for the service. Let's do that:"]}),"\n",(0,o.jsx)(n.p,{children:"This command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok share reserved mltwsinym1s2\n"})}),"\n",(0,o.jsx)(n.p,{children:"...results in a new share backend starting up and connecting to the existing reserved share:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok share reserved",src:s(2504).A+"",width:"951",height:"706"})}),"\n",(0,o.jsxs)(n.p,{children:["And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the ",(0,o.jsx)(n.code,{children:"docs"})," directory:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok docs share",src:s(9635).A+"",width:"1669",height:"1033"})}),"\n",(0,o.jsxs)(n.p,{children:["With the reserved share, we're free to stop and restart the ",(0,o.jsx)(n.code,{children:"zrok share reserved"})," command as many times as we want, without losing the token for our share."]}),"\n",(0,o.jsxs)(n.p,{children:["When we're done with the reserved share, we can ",(0,o.jsx)(n.em,{children:"release"})," it using this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok release mltwsinym1s2\n[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-reserved",children:"More about reserved shares"})}),"\n",(0,o.jsx)(n.h2,{id:"concepts-review",children:"Concepts Review"}),"\n",(0,o.jsxs)(n.p,{children:["In summary, ",(0,o.jsx)(n.code,{children:"zrok"})," lets you easily and securely share resources with both general internet users (through ",(0,o.jsx)(n.em,{children:"public"})," sharing) and also with other ",(0,o.jsx)(n.code,{children:"zrok"})," users (through ",(0,o.jsx)(n.em,{children:"private"})," sharing)."]}),"\n",(0,o.jsxs)(n.p,{children:["Here's a quick review of the ",(0,o.jsx)(n.code,{children:"zrok"})," mental model and the vocabulary."]}),"\n",(0,o.jsx)(n.h3,{id:"instance-and-account",children:"Instance and Account"}),"\n",(0,o.jsxs)(n.p,{children:["You create an ",(0,o.jsx)(n.em,{children:"account"})," with a ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"}),". Your account is identified by a username and a password, which you use to log into the ",(0,o.jsx)(n.em,{children:"web console"}),". Your account also has a ",(0,o.jsx)(n.em,{children:"secret token"}),", which you will use to authenticate from the ",(0,o.jsx)(n.code,{children:"zrok"})," command-line to interact with the ",(0,o.jsx)(n.em,{children:"instance"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You create a new ",(0,o.jsx)(n.em,{children:"account"})," with NetFoundry's ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"})," by subscribing in ",(0,o.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," or in a self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"})," by running ",(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/self-service-invite",children:["the ",(0,o.jsx)(n.code,{children:"zrok invite"})," command"]})," or the ",(0,o.jsx)(n.code,{children:"zrok admin create account"})," command."]}),"\n",(0,o.jsx)(n.h3,{id:"environment",children:"Environment"}),"\n",(0,o.jsxs)(n.p,{children:["Using your ",(0,o.jsx)(n.em,{children:"secret token"})," you use the ",(0,o.jsx)(n.code,{children:"zrok"})," command-line interface to create an ",(0,o.jsx)(n.em,{children:"environment"}),". An ",(0,o.jsx)(n.em,{children:"environment"})," corresponds to a single command-line user on a specific ",(0,o.jsx)(n.em,{children:"host system"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You create a new ",(0,o.jsx)(n.em,{children:"environment"})," by using the ",(0,o.jsx)(n.code,{children:"zrok enable"})," command."]}),"\n",(0,o.jsx)(n.h3,{id:"shares",children:"Shares"}),"\n",(0,o.jsxs)(n.p,{children:["Once you've enabled an ",(0,o.jsx)(n.em,{children:"environment"}),", you then create one or more ",(0,o.jsx)(n.em,{children:"shares"}),". Shares have either a ",(0,o.jsx)(n.em,{children:"public"})," or ",(0,o.jsx)(n.em,{children:"private"})," ",(0,o.jsx)(n.em,{children:"sharing mode"}),". ",(0,o.jsx)(n.em,{children:"Shares"})," share a specific type of resource using a ",(0,o.jsx)(n.em,{children:"backend mode"}),". As of this writing ",(0,o.jsx)(n.code,{children:"zrok"})," supports a ",(0,o.jsx)(n.code,{children:"proxy"})," ",(0,o.jsx)(n.em,{children:"backend mode"})," to share local HTTP resources as a ",(0,o.jsx)(n.em,{children:"reverse proxy"}),". ",(0,o.jsx)(n.code,{children:"zrok"})," also supports a ",(0,o.jsx)(n.code,{children:"web"})," ",(0,o.jsx)(n.em,{children:"backend mode"})," to share local file and HTML resources by enabling a basic HTTP server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every ",(0,o.jsx)(n.em,{children:"share"})," is identified by a ",(0,o.jsx)(n.em,{children:"share token"}),". ",(0,o.jsx)(n.em,{children:"Public shares"})," can be accessed through either a ",(0,o.jsx)(n.em,{children:"frontend"})," instance offered through the ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"}),", or through the ",(0,o.jsx)(n.code,{children:"zrok access"})," command. ",(0,o.jsx)(n.em,{children:"Private shares"})," can only be accessed through the ",(0,o.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,o.jsxs)(n.p,{children:["You use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command to create and enable ",(0,o.jsx)(n.em,{children:"ephemeral shares"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"reserved-shares-1",children:"Reserved Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," supports creating ",(0,o.jsx)(n.em,{children:"shares"})," that have a consistent ",(0,o.jsx)(n.em,{children:"share token"})," that survives restarts of the ",(0,o.jsx)(n.code,{children:"zrok share"})," command. These are considered ",(0,o.jsx)(n.em,{children:"non-ephemeral"}),", and is callled a ",(0,o.jsx)(n.em,{children:"reserved share"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You use the ",(0,o.jsx)(n.code,{children:"zrok reserve"})," command to create ",(0,o.jsx)(n.em,{children:"reserved shares"}),". Reserved shares last until you use the ",(0,o.jsx)(n.code,{children:"zrok release"})," command to delete them."]}),"\n",(0,o.jsx)(n.h2,{id:"self-hosting-an-instance",children:"Self-Hosting an Instance"}),"\n",(0,o.jsxs)(n.p,{children:["Interested in self-hosting your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance? See the ",(0,o.jsx)(n.a,{href:"/docs/category/self-hosting/",children:"self-hosting guides"}),"!"]}),"\n",(0,o.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Learn about ",(0,o.jsx)(n.a,{href:"https://openziti.io/",children:"OpenZiti"})]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8477:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>c});var r=s(4848),o=s(8453),i=s(8151),t=s(595),a=s(1342);const c=[];function d(e){return(0,r.jsx)(i.F,{children:(0,r.jsxs)("div",{className:a.A.downloadContainer,children:[(0,r.jsx)(t.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,r.jsx)(t.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,r.jsx)(t.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d()}},8151:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>t});var r=s(6540),o=s(4848);const i=(0,r.createContext)([]),t=()=>(0,r.useContext)(i),a=e=>{let{children:n}=e;const[s,t]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),t(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,o.jsx)(i.Provider,{value:s,children:n})}},595:(e,n,s)=>{s.d(n,{A:()=>c});s(6540);var r=s(8151),o=s(1342),i=s(5293),t=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},c=e=>{let{osName:n,osLogo:s,infoText:c,guideLink:d}=e;const{colorMode:l}=(0,i.G)(),h=(0,r.d)();console.log("Assets in DownloadCard:",h);const u=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=h.filter((e=>e.name.includes(u)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,t.jsxs)("div",{className:o.A.downloadCard,children:[(0,t.jsx)("div",{className:o.A.imgContainer,children:(0,t.jsx)("img",{src:s,alt:`${n} logo`})}),(0,t.jsx)("h3",{children:n}),m.length>0&&(0,t.jsx)("ul",{children:m.map(((e,n)=>(0,t.jsx)("li",{className:o.A.downloadButtons,children:(0,t.jsx)("a",{href:e.url,className:o.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,t.jsxs)("div",{className:o.A.cardFooter,children:[(0,t.jsx)("p",{children:c}),(0,t.jsx)("a",{href:d,children:"GUIDE"}),(0,t.jsx)("p",{})]})]})}},1342:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},2279:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-getting-started-button-fd443990c600c5af5587c8ebabe0498b.png"},312:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-getting-started-modal-9c36a880534a3d25a7815f32020d5c29.png"},8436:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-not-found-afdfdf335c7b7e28e2439c70529eaf6f.png"},6837:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-reserved-not-found-d5a40367dcad5c1e39a1b24c6b959e8e.png"},7739:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-share-public-c8604a242bd6b3426f0658a91e2b0576.png"},7954:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-enabled-89357d3c376bbd310390602be618737a.png"},7554:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-environment-6415b27c0e27123e9f625d38de01afeb.png"},3588:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-public-share-bb329270aafdad77ddc58fddef0b8c0b.png"},9921:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-sparklines-2b56c37bce925c55d99c8f1fdb6d741c.png"},5203:(e,n,s)=>{s.d(n,{A:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAXCAYAAAD+4+QTAAAKtmlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU+kSgOfe9EYLREBK6E2QTgApoQdQerURkgChhBAIKDZUxBVcCyoiWFZ0RUTBVSmyVixYWBR7X5BFQF0XCzZUXoBDcPed9955c86f+c5k/pn559z/nrkANCZXLE5HlQAyRDmScH8vZmxcPJMwABhQA0XAgSOXly1mh4YGg0wm9N/l/R1ARvVNy9FY//7/fxVlviCbB4CEyjiRn83LkPEx2frME0tyADCHZXaDvBzxKN+SsapEVqCM+0c5eZy/jHLiGGOVxnwiw71lbAhApHK5kmQAqrXMzszlJcviUEdzWYv4QpGMC2TsnpGRyZfxGRmbynzEMh6Nz0r8Lk7y32ImymNyuclyHj/LmBB9hNnidO7C/7Md/1sy0qUTOUxki5oiCQiXaYasZ3+kZQbJWZQ4K2SChfwx/zFOkQZETTAv2zt+grPTIzgTzOf6BMnjpM8KnuAkoZ/cR5jDiZxgQbZvxARLMsPleZMk3uwJ5koma5CmRcntKQKOPH5+SmTMBOcKo2fJa0uLCJr08ZbbJdJw+VkEIn+vybx+8j5kZH93diFHvjcnJTJA3gfuZP0CEXsyZnasvDa+wMd30idK7i/O8ZLnEqeHyv0F6f5ye3ZuhHxvjuzhnNwbKu9hKjcwdIIhGPyBCQHgA+EyHQNhYww5ggU5o4fxzhQvlAiTU3KYbNmNEzA5Ip7VNKatta0DwOj9HX883oaN3UuE0T5pOygE8M8cGRlZPmkzl9kO9gAQDk3amBgAyiGAq994UknuuA07+oMDsuy9oAoaoAMGYAqWYAuO4Aqe4AuBEAKREAfzgAcpkAESyIPFsByKoAQ2wBaogF2wB/bDITgCTXACzsJFuArX4TY8hC7ohRcwCO9hGEEQAkJD6IgGoosYIRaILcJC3BFfJBgJR+KQBCQZESFSZDGyEilBSpEKZDdSg/yCHEfOIpeRTuQ+0o0MIG+QzygGpaKqqDZqjE5HWSgbDUIj0bloMpqF5qOF6Dq0HK1CD6KN6Fn0Knob7UJfoEMYwFAwDIwexhLDwnhjQjDxmCSMBLMUU4wpw1Rh6jAtmDbMTUwX5iXmExaPpWOZWEusKzYAG4XlYbOwS7FrsRXY/dhG7HnsTWw3dhD7DUfDaeEscC44Di4Wl4zLwxXhynD7cA24C7jbuF7cezwez8Cb4J3wAfg4fCp+EX4tfge+Hn8G34nvwQ8RCAQNggXBjRBC4BJyCEWEbYSDhNOEG4RewkcihahLtCX6EeOJIuIKYhnxAPEU8QaxjzhMUiIZkVxIISQ+aSFpPWkvqYV0jdRLGiYrk03IbuRIcip5ObmcXEe+QH5EfkuhUPQpzpQwipBSQCmnHKZconRTPlFVqOZUb+ocqpS6jlpNPUO9T31Lo9GMaZ60eFoObR2thnaO9oT2UYGuYKXAUeArLFOoVGhUuKHwSpGkaKTIVpynmK9YpnhU8ZriSyWSkrGStxJXaalSpdJxpbtKQ8p0ZRvlEOUM5bXKB5QvK/erEFSMVXxV+CqFKntUzqn00DF0A7o3nUdfSd9Lv0DvVcWrmqhyVFNVS1QPqXaoDqqpqNmrRastUKtUO6nWxcAwjBkcRjpjPeMI4w7j8xTtKewpgilrptRNuTHlg/pUdU91gXqxer36bfXPGkwNX400jY0aTRqPNbGa5pphmnmaOzUvaL6cqjrVdSpvavHUI1MfaKFa5lrhWou09mi1aw1p62j7a4u1t2mf036pw9Dx1EnV2axzSmdAl67rrivU3ax7Wvc5U43JZqYzy5nnmYN6WnoBelK93XodesP6JvpR+iv06/UfG5ANWAZJBpsNWg0GDXUNZxouNqw1fGBEMmIZpRhtNWoz+mBsYhxjvNq4ybjfRN2EY5JvUmvyyJRm6mGaZVplessMb8YySzPbYXbdHDV3ME8xrzS/ZoFaOFoILXZYdE7DTXOeJppWNe2uJdWSbZlrWWvZbcWwCrZaYdVk9Wq64fT46Runt03/Zu1gnW691/qhjYpNoM0KmxabN7bmtjzbSttbdjQ7P7tlds12r+0t7AX2O+3vOdAdZjqsdmh1+Oro5ChxrHMccDJ0SnDa7nSXpcoKZa1lXXLGOXs5L3M+4fzJxdElx+WIy1+ulq5prgdc+2eYzBDM2Dujx03fjeu2263Lneme4P6Te5eHngfXo8rjqaeBJ99zn2cf24ydyj7IfuVl7SXxavD64O3ivcT7jA/Gx9+n2KfDV8U3yrfC94mfvl+yX63foL+D/yL/MwG4gKCAjQF3OdocHqeGMxjoFLgk8HwQNSgiqCLoabB5sCS4ZSY6M3DmppmPZhnNEs1qCoEQTsimkMehJqFZob+G4cNCwyrDnoXbhC8Ob4ugR8yPOBDxPtIrcn3kwyjTKGlUa7Ri9JzomugPMT4xpTFdsdNjl8RejdOME8Y1xxPio+P3xQ/N9p29ZXbvHIc5RXPuzDWZu2Du5Xma89LnnZyvOJ87/2gCLiEm4UDCF24It4o7lMhJ3J44yPPmbeW94HvyN/MHBG6CUkFfkltSaVJ/slvypuSBFI+UspSXQm9hhfB1akDqrtQPaSFp1Wkj6THp9RnEjISM4yIVUZrofKZO5oLMTrGFuEjcleWStSVrUBIk2ZeNZM/Nbs5RlQ1K7VJT6Sppd657bmXux7zovKMLlBeIFrQvNF+4ZmFfvl/+z4uwi3iLWhfrLV6+uHsJe8nupcjSxKWtywyWFS7rLfAv2L+cvDxt+W8rrFeUrni3MmZlS6F2YUFhzyr/VbVFCkWSorurXVfv+gH7g/CHjjV2a7at+VbML75SYl1SVvJlLW/tlR9tfiz/cWRd0rqO9Y7rd27AbxBtuLPRY+P+UuXS/NKeTTM3NW5mbi7e/G7L/C2Xy+zLdm0lb5Vu7SoPLm/eZrhtw7YvFSkVtyu9Kuu3a21fs/3DDv6OGzs9d9bt0t5VsuvzT8Kf7u32391YZVxVtge/J3fPs73Re9t+Zv1cs09zX8m+r9Wi6q794fvP1zjV1BzQOrC+Fq2V1g4cnHPw+iGfQ811lnW76xn1JYfhsPTw818SfrlzJOhI61HW0bpjRse2N9AbihuRxoWNg00pTV3Ncc2dxwOPt7a4tjT8avVr9Qm9E5Un1U6uP0U+VXhq5HT+6aEz4jMvzyaf7Wmd3/rwXOy5W+fDzndcCLpw6aLfxXNt7LbTl9wunbjscvn4FdaVpquOVxvbHdobfnP4raHDsaPxmtO15uvO11s6Z3SeuuFx4+xNn5sXb3FuXb0963bnnag79+7Oudt1j3+v/376/dcPch8MPyx4hHtU/FjpcdkTrSdVv5v9Xt/l2HWy26e7/WnE04c9vJ4Xf2T/8aW38BntWVmfbl9Nv23/iQG/gevPZz/vfSF+Mfyy6E/lP7e/Mn117C/Pv9oHYwd7X0tej7xZ+1bjbfU7+3etQ6FDT95nvB/+UPxR4+P+T6xPbZ9jPvcN530hfCn/ava15VvQt0cjGSMjYq6EOzYKyKYDQJOSAN5UA9DiAOjXAcizx+frMUHGvwnGCP4Tj8/gY+II0OABEHgWwGIVQDsRQG+NbAZpAwilAUQ6A2pnJ18Ts/DY3D4qOrLvhrwoQKoLum8mFMA/ZHym/67uf2oYjWoP/9T/Ao1WD2wmydvWAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAAZoAMABAAAAAEAAAAXAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdERrfoIAAAHUaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjIzPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI1PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cp1dxrAAAAFESURBVEgN7VM9ioQwFH4j24u2WglWIhYWHkFrC0+hJ7AQCw8gHsXSZhC8gIWVN7CxElFx1gRGNmsy7M4wM7BsICT53vd+/HzvtK7rBZ68uCfHx+H/k/xKZaZceZ6DaZrAcRzeWZYdAo/juNtFUQTf9w8cBJxY3SXLMqAguq5jxyAIwHVdIsg0TWDbNsa6roOmaWCLR3DwAyWh7c148TyPaqPxi6JAo0DlM+U6lnM/8sFyjaIINE1jmQ+4oiiAfGiL+U9o5Huxl8j13iTn8xm35E8l6vsekA910doRYRv5j7Qwz/NQ1zXEcYwVcBwHLMsi1FiWBZIkwVjbtoSNeLDkCsMQS7aR8Zmm6WGah2EgONusHDgo/s05qaoK5nnGRamqCpIkfS8QyrLcMcMwQBCE/X293ExyJT16vndOHq3+q/9LvuQTGT1Wl0RY14cAAAAASUVORK5CYII="},2504:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_reserved-6bce67775ce2c41abb0ef13ee1fad972.png"},9635:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_frontend-d7c0d6495493c00b94ae237339f2dc2d.png"},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const o={},i=r.createContext(o);function t(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f888b719.5c9a422f.js b/assets/js/f888b719.5c9a422f.js new file mode 100644 index 00000000..43ca9b82 --- /dev/null +++ b/assets/js/f888b719.5c9a422f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4470],{7768:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"If you\'ve upgraded to v1.0.0 from a previous version and you receive an error message like this:","source":"@site/../docs/getting-started.mdx","sourceDirName":".","slug":"/getting-started","permalink":"/docs/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/../docs/getting-started.mdx","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Getting Started","sidebar_label":"Getting Started","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"Concepts","permalink":"/docs/concepts/"}}');var o=s(4848),i=s(8453),t=(s(3070),s(3484),s(3769),s(2390));const a={title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:10},c=void 0,d={},l=[{value:"Your Secure Internet Sharing Perimeter",id:"your-secure-internet-sharing-perimeter",level:2},{value:"What's it for?",id:"whats-it-for",level:2},{value:"Your First Share",id:"your-first-share",level:3},{value:"Installing the zrok Command",id:"installing-the-zrok-command",level:2},...t.RM,{value:"Enabling Your zrok Environment",id:"enabling-your-zrok-environment",level:2},{value:"Sharing",id:"sharing",level:2},{value:"Ephemeral by Default",id:"ephemeral-by-default",level:3},{value:"Public Shares and Frontends",id:"public-shares-and-frontends",level:3},{value:"Private Shares",id:"private-shares",level:3},{value:"Proxy Backend Mode",id:"proxy-backend-mode",level:3},{value:"Web Backend Mode",id:"web-backend-mode",level:3},{value:"Reserved Shares",id:"reserved-shares",level:3},{value:"Concepts Review",id:"concepts-review",level:2},{value:"Instance and Account",id:"instance-and-account",level:3},{value:"Environment",id:"environment",level:3},{value:"Shares",id:"shares",level:3},{value:"Reserved Shares",id:"reserved-shares-1",level:3},{value:"Self-Hosting an Instance",id:"self-hosting-an-instance",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components},{Card:r,CardBody:a,CardFooter:c,CardHeader:d,Column:l,Columns:h}=n;return r||m("Card",!0),a||m("CardBody",!0),c||m("CardFooter",!0),d||m("CardHeader",!0),l||m("Column",!0),h||m("Columns",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsxs)(n.p,{children:["If you've upgraded to ",(0,o.jsx)(n.code,{children:"v1.0.0"})," from a previous version and you receive an error message like this:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ERROR]: unable to create share (error getting zrok client: client version error accessing api endpoint 'https://api.zrok.io': [POST /clientVersionCheck] clientVersionCheck (status 404): {}: [POST /clientVersionCheck] clientVersionCheck (status 404): {})\n"})}),(0,o.jsxs)(n.p,{children:["Use the command ",(0,o.jsx)(n.code,{children:"zrok rebase apiEndpoint https://api-v1.zrok.io/"})," to update your environment to the latest zrok endpoint."]})]}),"\n",(0,o.jsx)(n.h2,{id:"your-secure-internet-sharing-perimeter",children:"Your Secure Internet Sharing Perimeter"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," (",(0,o.jsx)(n.em,{children:"/zi\u02d0\u0279\u0252k/ ZEE-rock"}),") is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files.\nThere's a hardened zrok-as-a-service offering available at ",(0,o.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," with a generous free tier."]}),"\n",(0,o.jsx)(n.h2,{id:"whats-it-for",children:"What's it for?"}),"\n",(0,o.jsxs)(n.p,{children:["Use ",(0,o.jsx)(n.code,{children:"zrok"})," to share a running service, like a web server or a network socket, or to share a directory of static files. ",(0,o.jsx)(n.code,{children:"zrok"})," goes beyond simple tunneling to provide sharing solutions for a variety of network and storage use cases."]}),"\n",(0,o.jsxs)(n.p,{children:["When using ",(0,o.jsx)(n.code,{children:"zrok"})," to ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:"share publicly"}),", you can reserve a public hostname, enable authentication options, or both. Public shares proxy HTTPS to your service or files."]}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:"sharing privately"}),", only users with the share token (and the appropriate permission grants) can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services."]}),"\n",(0,o.jsxs)(n.p,{children:["Here's a quick overview of what's involved in getting started with ",(0,o.jsx)(n.code,{children:"zrok"}),":"]}),"\n",(0,o.jsx)(n.h3,{id:"your-first-share",children:"Your First Share"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Get an account token"}),"\n"]}),"\n",(0,o.jsxs)(h,{className:"text--center getting-started-cards",style:{marginLeft:1},children:[(0,o.jsx)(l,{style:{paddingBottom:20},children:(0,o.jsxs)(r,{shadow:"tl",children:[(0,o.jsx)(d,{children:(0,o.jsx)("h3",{children:"Hosted zrok"})}),(0,o.jsx)(a,{children:(0,o.jsx)(n.p,{children:"Use NetFoundry's public zrok instance."})}),(0,o.jsx)(c,{children:(0,o.jsx)("a",{href:"https://myzrok.io/",children:(0,o.jsx)("button",{className:"button button--secondary button--block",children:"Get an Account"})})})]})}),(0,o.jsx)(l,{style:{paddingBottom:20},children:(0,o.jsxs)(r,{shadow:"tl",children:[(0,o.jsx)(d,{children:(0,o.jsx)("h3",{children:"Self-Hosted zrok"})}),(0,o.jsx)(a,{children:(0,o.jsx)(n.p,{children:"Run a zrok instance on Linux, Docker, or Kubernetes."})}),(0,o.jsx)(c,{children:(0,o.jsx)("a",{href:"/docs/category/self-hosting/",children:(0,o.jsx)("button",{className:"button button--secondary button--block",children:"Guides"})})})]})})]}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"#installing-the-zrok-command",children:"Download the zrok binary"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Enable zrok for your ",(0,o.jsx)(n.a,{href:"#enabling-your-zrok-environment",children:"environment"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok enable <your_account_token>\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Share ",(0,o.jsx)(n.code,{children:"http://localhost:8080"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok share public 8080\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Visit the public URL displayed in your terminal"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok share public",src:s(7739).A+"",width:"697",height:"530"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h1,{id:"a-deeper-look-at-getting-started",children:"A Deeper Look at Getting Started"}),"\n",(0,o.jsxs)(n.p,{children:["Here's a deeper, more thorough look at getting started with ",(0,o.jsx)(n.code,{children:"zrok"}),":"]}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-zrok-command",children:"Installing the zrok Command"}),"\n",(0,o.jsx)(t.Ay,{}),"\n",(0,o.jsx)(n.h2,{id:"enabling-your-zrok-environment",children:"Enabling Your zrok Environment"}),"\n",(0,o.jsxs)(n.p,{children:["After you have ",(0,o.jsx)(n.a,{href:"#your-first-share",children:"an account"}),", you can enable your ",(0,o.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,o.jsxs)(n.p,{children:["A zrok environment usually refers to an enabled device where shares and accesses can be created, .e.g., ",(0,o.jsx)(n.code,{children:"~/.zrok"})," on a Unix machine. It can be a specific user's environment or a system-wide agent's environment owned by the administrator."]}),"\n",(0,o.jsxs)(n.p,{children:["When your ",(0,o.jsx)(n.code,{children:"zrok"})," account was created, the service generated an ",(0,o.jsx)(n.em,{children:"account token"})," that identifies and authenticates in a single step. Protect your account token as if it were a password, or an important account number; it's a ",(0,o.jsx)(n.em,{children:"secret"}),", protect it."]}),"\n",(0,o.jsxs)(n.p,{children:["When we left off you had downloaded, extracted, and configured your ",(0,o.jsx)(n.code,{children:"zrok"})," software. In order to use that environment with your account, you'll need to ",(0,o.jsx)(n.code,{children:"enable"})," an ",(0,o.jsx)(n.em,{children:"environment"})," on your system. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the ",(0,o.jsx)(n.code,{children:"zrok"})," service so that you can begin sharing."]}),"\n",(0,o.jsx)(n.p,{children:"Log into the API console at:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://api-v1.zrok.io/",children:"https://api-v1.zrok.io/"})}),"\n",(0,o.jsx)(n.p,{children:"When you first log into your account on the API console, your interface will look like this:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok API console, empty",src:s(2279).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsx)(n.p,{children:'In the toolbar, there is a big green button that says "CLICK HERE TO GET STARTED!". If you click that button, you\'ll see the getting started wizard, which looks like this:'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok getting started modal",src:s(312).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsx)(n.p,{children:"This wizard is broken into multiple steps. The first step we've already covered, which gets the zrok software installed onto your system."}),"\n",(0,o.jsxs)(n.p,{children:['Below "step 2" is a command: ',(0,o.jsx)(n.code,{children:"zrok enable 7g3K6gVKikWb"})," (your account will have a different account token, other than ",(0,o.jsx)(n.code,{children:"7g3K6gVKikWb"}),"). You'll want to copy this command into your shell and execute it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok enable 7g3K6gVKikWb \n\u28fb contacting the zrok service...\n"})}),"\n",(0,o.jsx)(n.p,{children:"After a few seconds, the message will change and indicate that the enable operation succeeded:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok enable 7g3K6gVKikWb \n\u28fb the zrok environment was successfully enabled...\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Now, if we run a ",(0,o.jsx)(n.code,{children:"zrok status"})," command, you will see the details of your environment:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok status\n\nConfig:\n\n CONFIG VALUE SOURCE \n apiEndpoint https://api-v1.zrok.io env \n defaultFrontend public binary \n headless false binary \n\nEnvironment:\n\n PROPERTY VALUE \n Account Token <<SET>> \n Ziti Identity <<SET>> \n"})}),"\n",(0,o.jsx)(n.p,{children:"Excellent... our environment is now fully enabled."}),"\n",(0,o.jsxs)(n.p,{children:["If we return to the ",(0,o.jsx)(n.em,{children:"API console"}),", we'll now see the new environment reflected in the API console visualizer:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"New Environment in Web UI",src:s(7954).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["In my case, the environment is named ",(0,o.jsx)(n.code,{children:"michael@testing"}),", which is the username of my shell and the hostname of the system the shell is running on."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["Should you want to use a non-default name for your environment, you can pass the ",(0,o.jsx)(n.code,{children:"-d"})," option to the ",(0,o.jsx)(n.code,{children:"zrok enable"})," command. See ",(0,o.jsx)(n.code,{children:"zrok enable --help"})," for details."]})}),"\n",(0,o.jsxs)(n.p,{children:["If you click on the environment node in the explorer in the ",(0,o.jsx)(n.em,{children:"web console"}),", the details panel shown at the bottom of the page will change:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Empty Environment",src:s(7554).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["The visualizer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the visualizer, click the ",(0,o.jsx)(n.img,{alt:"Zoom to Fit",src:s(5203).A+"",width:"25",height:"23"})," ",(0,o.jsx)(n.em,{children:"zoom to fit"})," icon in the lower right corner of the explorer."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["With your ",(0,o.jsx)(n.code,{children:"zrok"})," account you can ",(0,o.jsx)(n.code,{children:"zrok enable"})," multiple environments. This will allow you to share (and access your shares) from multiple environments simultaneously."]})}),"\n",(0,o.jsx)(n.p,{children:"Your environment is fully ready to go. Now we can move on to the fun stuff..."}),"\n",(0,o.jsx)(n.h2,{id:"sharing",children:"Sharing"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," is designed to make sharing resources as effortless as possible, while providing a high degree of security and control."]}),"\n",(0,o.jsx)(n.h3,{id:"ephemeral-by-default",children:"Ephemeral by Default"}),"\n",(0,o.jsxs)(n.p,{children:["Shared resources are ",(0,o.jsx)(n.em,{children:"ephemeral"})," by default; as soon as you terminate the ",(0,o.jsx)(n.code,{children:"zrok share"})," command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created."]}),"\n",(0,o.jsx)(n.h3,{id:"public-shares-and-frontends",children:"Public Shares and Frontends"}),"\n",(0,o.jsxs)(n.p,{children:["Resources that are shared ",(0,o.jsx)(n.em,{children:"publicly"})," are exposed to any users on the internet who have access to the ",(0,o.jsx)(n.code,{children:"zrok"}),' instance\'s "frontend".']}),"\n",(0,o.jsx)(n.p,{children:"A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources."}),"\n",(0,o.jsxs)(n.p,{children:["For example, I might create a public share using the ",(0,o.jsx)(n.code,{children:"zrok share public"})," command, which results in my ",(0,o.jsx)(n.code,{children:"zrok"})," instance exposing a URL like ",(0,o.jsx)(n.code,{children:"https://xxr2b7tzfx64.share.zrok.io"})," to access my resources."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"$ zrok share public --backend-mode web .\n"})}),"\n",(0,o.jsxs)(n.p,{children:['In this case, my share was given the "share token" of ',(0,o.jsx)(n.code,{children:"xxr2b7tzfx64"}),". That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources."]}),"\n",(0,o.jsx)(n.p,{children:"If we return to the web console, we see our share in the explorer:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Web Console Share",src:s(3588).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["If we click on the ",(0,o.jsx)(n.em,{children:"frontend endpoint"})," a new browser tab opens and we see the content of our share:\n",(0,o.jsx)(n.img,{alt:"Share Frontend",src:s(9635).A+"",width:"1669",height:"1033"})]}),"\n",(0,o.jsxs)(n.p,{children:["When we start accessing our share, notice the ",(0,o.jsx)(n.em,{children:"sparkline"})," graphs showing the activity:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Environment Spark Line",src:s(9921).A+"",width:"1816",height:"1364"})}),"\n",(0,o.jsxs)(n.p,{children:["And as soon as I terminate the ",(0,o.jsx)(n.code,{children:"zrok share"})," client, the resources are removed from the ",(0,o.jsx)(n.code,{children:"zrok"})," environment."]}),"\n",(0,o.jsx)(n.p,{children:"If we try to reload the frontend endpoint in our web browser, we'll see:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Not Found",src:s(8436).A+"",width:"1616",height:"1382"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-public",children:"More about public shares"})}),"\n",(0,o.jsx)(n.h3,{id:"private-shares",children:"Private Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," also provides a powerful ",(0,o.jsx)(n.em,{children:"private"})," sharing model. If I execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",children:"$ zrok share private http://localhost:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," service will respond with the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Output"',children:"access your share with: zrok access private wvszln4dyz9q\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Rather than allowing access to your service through a public frontend, a ",(0,o.jsx)(n.em,{children:"private"})," share is only exposed to the underlying OpenZiti network, and can only be accessed using the ",(0,o.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok access private wvszln4dyz9q"})," command can be run by any ",(0,o.jsx)(n.code,{children:"zrok"})," user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-private",children:"More about private shares"})}),"\n",(0,o.jsx)(n.h3,{id:"proxy-backend-mode",children:"Proxy Backend Mode"}),"\n",(0,o.jsxs)(n.p,{children:["Without specifying a ",(0,o.jsx)(n.em,{children:"backend mode"}),", the ",(0,o.jsx)(n.code,{children:"zrok share"})," command will assume that you're trying to share a ",(0,o.jsx)(n.code,{children:"proxy"})," resource. A ",(0,o.jsx)(n.code,{children:"proxy"})," resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on ",(0,o.jsx)(n.code,{children:"localhost"}),", or only listening on a private LAN segment behind a firewall."]}),"\n",(0,o.jsxs)(n.p,{children:["For these services a ",(0,o.jsx)(n.code,{children:"proxy"})," share will allow those endpoints to be reached, either ",(0,o.jsx)(n.em,{children:"publicly"})," or ",(0,o.jsx)(n.em,{children:"privately"})," through the ",(0,o.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,o.jsx)(n.h3,{id:"web-backend-mode",children:"Web Backend Mode"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok share"})," command accepts a ",(0,o.jsx)(n.code,{children:"--backend-mode"})," option. Besides ",(0,o.jsx)(n.code,{children:"proxy"}),", the current ",(0,o.jsx)(n.code,{children:"v0.3"})," release (as of this writing) also supports a ",(0,o.jsx)(n.code,{children:"web"})," mode. The ",(0,o.jsx)(n.code,{children:"web"})," mode allows you to specify a local folder on your filesystem, and instantly turns your ",(0,o.jsx)(n.code,{children:"zrok"})," client into a web server, exposing your web content either ",(0,o.jsx)(n.em,{children:"publicly"})," or ",(0,o.jsx)(n.em,{children:"privately"})," without having to a configure a web server."]}),"\n",(0,o.jsx)(n.h3,{id:"reserved-shares",children:"Reserved Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," shares are ",(0,o.jsx)(n.em,{children:"ephemeral"}),' unless you specifically create a "reserved" share.']}),"\n",(0,o.jsxs)(n.p,{children:["A reserved share can be re-used multiple times; it will survive termination of the ",(0,o.jsx)(n.code,{children:"zrok share"})," command, allowing for longer-lasting semi-permanent access to shared resources."]}),"\n",(0,o.jsx)(n.p,{children:"The first step is to create the reserved share:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok reserve public --backend-mode web v0.3_getting_started\n[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'\n[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io\n"})}),"\n",(0,o.jsxs)(n.p,{children:["I'm asking the ",(0,o.jsx)(n.code,{children:"zrok"})," service to reserve a share with a ",(0,o.jsx)(n.code,{children:"web"})," backend mode, pointing at my local ",(0,o.jsx)(n.code,{children:"docs"})," folder."]}),"\n",(0,o.jsxs)(n.p,{children:["You'll want to remember the share token (",(0,o.jsx)(n.code,{children:"mltwsinym1s2"})," in this case), and the frontend endpoint URL. If this were a ",(0,o.jsx)(n.em,{children:"private"})," reserved share, there would not be a frontend URL."]}),"\n",(0,o.jsx)(n.p,{children:"If we do nothing else, and then point a web browser at the frontend endpoint, we get:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Not Found",src:s(6837).A+"",width:"1659",height:"1397"})}),"\n",(0,o.jsxs)(n.p,{children:["This is the ",(0,o.jsx)(n.code,{children:"404"})," error message returned by the ",(0,o.jsx)(n.code,{children:"zrok"})," frontend. We're getting this because we haven't yet started up a ",(0,o.jsx)(n.code,{children:"zrok share"})," for the service. Let's do that:"]}),"\n",(0,o.jsx)(n.p,{children:"This command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok share reserved mltwsinym1s2\n"})}),"\n",(0,o.jsx)(n.p,{children:"...results in a new share backend starting up and connecting to the existing reserved share:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok share reserved",src:s(2504).A+"",width:"951",height:"706"})}),"\n",(0,o.jsxs)(n.p,{children:["And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the ",(0,o.jsx)(n.code,{children:"docs"})," directory:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"zrok docs share",src:s(9635).A+"",width:"1669",height:"1033"})}),"\n",(0,o.jsxs)(n.p,{children:["With the reserved share, we're free to stop and restart the ",(0,o.jsx)(n.code,{children:"zrok share reserved"})," command as many times as we want, without losing the token for our share."]}),"\n",(0,o.jsxs)(n.p,{children:["When we're done with the reserved share, we can ",(0,o.jsx)(n.em,{children:"release"})," it using this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"$ zrok release mltwsinym1s2\n[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/docs/concepts/sharing-reserved",children:"More about reserved shares"})}),"\n",(0,o.jsx)(n.h2,{id:"concepts-review",children:"Concepts Review"}),"\n",(0,o.jsxs)(n.p,{children:["In summary, ",(0,o.jsx)(n.code,{children:"zrok"})," lets you easily and securely share resources with both general internet users (through ",(0,o.jsx)(n.em,{children:"public"})," sharing) and also with other ",(0,o.jsx)(n.code,{children:"zrok"})," users (through ",(0,o.jsx)(n.em,{children:"private"})," sharing)."]}),"\n",(0,o.jsxs)(n.p,{children:["Here's a quick review of the ",(0,o.jsx)(n.code,{children:"zrok"})," mental model and the vocabulary."]}),"\n",(0,o.jsx)(n.h3,{id:"instance-and-account",children:"Instance and Account"}),"\n",(0,o.jsxs)(n.p,{children:["You create an ",(0,o.jsx)(n.em,{children:"account"})," with a ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"}),". Your account is identified by a username and a password, which you use to log into the ",(0,o.jsx)(n.em,{children:"web console"}),". Your account also has a ",(0,o.jsx)(n.em,{children:"secret token"}),", which you will use to authenticate from the ",(0,o.jsx)(n.code,{children:"zrok"})," command-line to interact with the ",(0,o.jsx)(n.em,{children:"instance"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You create a new ",(0,o.jsx)(n.em,{children:"account"})," with NetFoundry's ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"})," by subscribing in ",(0,o.jsx)(n.a,{href:"https://myzrok.io",children:"myzrok.io"})," or in a self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"})," by running ",(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/self-service-invite",children:["the ",(0,o.jsx)(n.code,{children:"zrok invite"})," command"]})," or the ",(0,o.jsx)(n.code,{children:"zrok admin create account"})," command."]}),"\n",(0,o.jsx)(n.h3,{id:"environment",children:"Environment"}),"\n",(0,o.jsxs)(n.p,{children:["Using your ",(0,o.jsx)(n.em,{children:"secret token"})," you use the ",(0,o.jsx)(n.code,{children:"zrok"})," command-line interface to create an ",(0,o.jsx)(n.em,{children:"environment"}),". An ",(0,o.jsx)(n.em,{children:"environment"})," corresponds to a single command-line user on a specific ",(0,o.jsx)(n.em,{children:"host system"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You create a new ",(0,o.jsx)(n.em,{children:"environment"})," by using the ",(0,o.jsx)(n.code,{children:"zrok enable"})," command."]}),"\n",(0,o.jsx)(n.h3,{id:"shares",children:"Shares"}),"\n",(0,o.jsxs)(n.p,{children:["Once you've enabled an ",(0,o.jsx)(n.em,{children:"environment"}),", you then create one or more ",(0,o.jsx)(n.em,{children:"shares"}),". Shares have either a ",(0,o.jsx)(n.em,{children:"public"})," or ",(0,o.jsx)(n.em,{children:"private"})," ",(0,o.jsx)(n.em,{children:"sharing mode"}),". ",(0,o.jsx)(n.em,{children:"Shares"})," share a specific type of resource using a ",(0,o.jsx)(n.em,{children:"backend mode"}),". As of this writing ",(0,o.jsx)(n.code,{children:"zrok"})," supports a ",(0,o.jsx)(n.code,{children:"proxy"})," ",(0,o.jsx)(n.em,{children:"backend mode"})," to share local HTTP resources as a ",(0,o.jsx)(n.em,{children:"reverse proxy"}),". ",(0,o.jsx)(n.code,{children:"zrok"})," also supports a ",(0,o.jsx)(n.code,{children:"web"})," ",(0,o.jsx)(n.em,{children:"backend mode"})," to share local file and HTML resources by enabling a basic HTTP server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every ",(0,o.jsx)(n.em,{children:"share"})," is identified by a ",(0,o.jsx)(n.em,{children:"share token"}),". ",(0,o.jsx)(n.em,{children:"Public shares"})," can be accessed through either a ",(0,o.jsx)(n.em,{children:"frontend"})," instance offered through the ",(0,o.jsx)(n.code,{children:"zrok"})," ",(0,o.jsx)(n.em,{children:"instance"}),", or through the ",(0,o.jsx)(n.code,{children:"zrok access"})," command. ",(0,o.jsx)(n.em,{children:"Private shares"})," can only be accessed through the ",(0,o.jsx)(n.code,{children:"zrok access"})," command."]}),"\n",(0,o.jsxs)(n.p,{children:["You use the ",(0,o.jsx)(n.code,{children:"zrok share"})," command to create and enable ",(0,o.jsx)(n.em,{children:"ephemeral shares"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"reserved-shares-1",children:"Reserved Shares"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"zrok"})," supports creating ",(0,o.jsx)(n.em,{children:"shares"})," that have a consistent ",(0,o.jsx)(n.em,{children:"share token"})," that survives restarts of the ",(0,o.jsx)(n.code,{children:"zrok share"})," command. These are considered ",(0,o.jsx)(n.em,{children:"non-ephemeral"}),", and is callled a ",(0,o.jsx)(n.em,{children:"reserved share"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You use the ",(0,o.jsx)(n.code,{children:"zrok reserve"})," command to create ",(0,o.jsx)(n.em,{children:"reserved shares"}),". Reserved shares last until you use the ",(0,o.jsx)(n.code,{children:"zrok release"})," command to delete them."]}),"\n",(0,o.jsx)(n.h2,{id:"self-hosting-an-instance",children:"Self-Hosting an Instance"}),"\n",(0,o.jsxs)(n.p,{children:["Interested in self-hosting your own ",(0,o.jsx)(n.code,{children:"zrok"})," instance? See the ",(0,o.jsx)(n.a,{href:"/docs/category/self-hosting/",children:"self-hosting guides"}),"!"]}),"\n",(0,o.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Learn about ",(0,o.jsx)(n.a,{href:"https://openziti.io/",children:"OpenZiti"})]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2390:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>c});var r=s(4848),o=s(8453),i=s(3070),t=s(3484),a=s(3769);const c=[];function d(e){return(0,r.jsx)(i.F,{children:(0,r.jsxs)("div",{className:a.A.downloadContainer,children:[(0,r.jsx)(t.A,{osName:"Windows",osLogo:"/img/logo-windows.svg",infoText:"Download EXE",guideLink:"/docs/guides/install/windows"}),(0,r.jsx)(t.A,{osName:"macOS",osLogo:"/img/logo-apple.svg",infoText:"Homebrew or Download",guideLink:"/docs/guides/install/macos"}),(0,r.jsx)(t.A,{osName:"Linux",osLogo:"/img/logo-linux.svg",infoText:"RPM/DEB or Homebrew",guideLink:"/docs/guides/install/linux"})]})})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d()}},3070:(e,n,s)=>{s.d(n,{F:()=>a,d:()=>t});var r=s(6540),o=s(4848);const i=(0,r.createContext)([]),t=()=>(0,r.useContext)(i),a=e=>{let{children:n}=e;const[s,t]=(0,r.useState)([]);return(0,r.useEffect)((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/openziti/zrok/releases/latest");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const n=(await e.json()).assets.map((e=>({name:e.name,url:e.browser_download_url,arch:e.name.replace(".tar.gz","").split("_")[3]})));console.log("Fetched assets:",n),t(n)}catch(e){console.error("Error fetching the release assets:",e)}})()}),[]),(0,o.jsx)(i.Provider,{value:s,children:n})}},3484:(e,n,s)=>{s.d(n,{A:()=>c});s(6540);var r=s(3070),o=s(3769),i=s(8532),t=s(4848);const a=e=>{switch(e){case"amd64":return"x86_64";case"arm64":return"ARM64";case"armv7":return"ARM";default:return e.toUpperCase()}},c=e=>{let{osName:n,osLogo:s,infoText:c,guideLink:d}=e;const{colorMode:l}=(0,i.G)(),h=(0,r.d)();console.log("Assets in DownloadCard:",h);const u=(e=>{switch(e){case"Windows":return"windows";case"macOS":return"darwin";case"Linux":return"linux";default:return""}})(n),m=h.filter((e=>e.name.includes(u)));return console.log("Filtered assets for",n,"in DownloadCard:",m),(0,t.jsxs)("div",{className:o.A.downloadCard,children:[(0,t.jsx)("div",{className:o.A.imgContainer,children:(0,t.jsx)("img",{src:s,alt:`${n} logo`})}),(0,t.jsx)("h3",{children:n}),m.length>0&&(0,t.jsx)("ul",{children:m.map(((e,n)=>(0,t.jsx)("li",{className:o.A.downloadButtons,children:(0,t.jsx)("a",{href:e.url,className:o.A.downloadLinks,children:a(e.arch)})},n)))}),d&&(0,t.jsxs)("div",{className:o.A.cardFooter,children:[(0,t.jsx)("p",{children:c}),(0,t.jsx)("a",{href:d,children:"GUIDE"}),(0,t.jsx)("p",{})]})]})}},3769:(e,n,s)=>{s.d(n,{A:()=>r});const r={downloadContainer:"downloadContainer_nNgj",downloadCard:"downloadCard_D_EY",cardFooter:"cardFooter_Rhom",downloadButtons:"downloadButtons_NPAP",downloadLinks:"downloadLinks_thSu",imgContainer:"imgContainer_r0QA"}},2279:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-getting-started-button-fd443990c600c5af5587c8ebabe0498b.png"},312:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-getting-started-modal-9c36a880534a3d25a7815f32020d5c29.png"},8436:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-not-found-afdfdf335c7b7e28e2439c70529eaf6f.png"},6837:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-reserved-not-found-d5a40367dcad5c1e39a1b24c6b959e8e.png"},7739:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-share-public-c8604a242bd6b3426f0658a91e2b0576.png"},7954:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-enabled-89357d3c376bbd310390602be618737a.png"},7554:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-environment-6415b27c0e27123e9f625d38de01afeb.png"},3588:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-public-share-bb329270aafdad77ddc58fddef0b8c0b.png"},9921:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok-visualizer-sparklines-2b56c37bce925c55d99c8f1fdb6d741c.png"},5203:(e,n,s)=>{s.d(n,{A:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAXCAYAAAD+4+QTAAAKtmlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU+kSgOfe9EYLREBK6E2QTgApoQdQerURkgChhBAIKDZUxBVcCyoiWFZ0RUTBVSmyVixYWBR7X5BFQF0XCzZUXoBDcPed9955c86f+c5k/pn559z/nrkANCZXLE5HlQAyRDmScH8vZmxcPJMwABhQA0XAgSOXly1mh4YGg0wm9N/l/R1ARvVNy9FY//7/fxVlviCbB4CEyjiRn83LkPEx2frME0tyADCHZXaDvBzxKN+SsapEVqCM+0c5eZy/jHLiGGOVxnwiw71lbAhApHK5kmQAqrXMzszlJcviUEdzWYv4QpGMC2TsnpGRyZfxGRmbynzEMh6Nz0r8Lk7y32ImymNyuclyHj/LmBB9hNnidO7C/7Md/1sy0qUTOUxki5oiCQiXaYasZ3+kZQbJWZQ4K2SChfwx/zFOkQZETTAv2zt+grPTIzgTzOf6BMnjpM8KnuAkoZ/cR5jDiZxgQbZvxARLMsPleZMk3uwJ5koma5CmRcntKQKOPH5+SmTMBOcKo2fJa0uLCJr08ZbbJdJw+VkEIn+vybx+8j5kZH93diFHvjcnJTJA3gfuZP0CEXsyZnasvDa+wMd30idK7i/O8ZLnEqeHyv0F6f5ye3ZuhHxvjuzhnNwbKu9hKjcwdIIhGPyBCQHgA+EyHQNhYww5ggU5o4fxzhQvlAiTU3KYbNmNEzA5Ip7VNKatta0DwOj9HX883oaN3UuE0T5pOygE8M8cGRlZPmkzl9kO9gAQDk3amBgAyiGAq994UknuuA07+oMDsuy9oAoaoAMGYAqWYAuO4Aqe4AuBEAKREAfzgAcpkAESyIPFsByKoAQ2wBaogF2wB/bDITgCTXACzsJFuArX4TY8hC7ohRcwCO9hGEEQAkJD6IgGoosYIRaILcJC3BFfJBgJR+KQBCQZESFSZDGyEilBSpEKZDdSg/yCHEfOIpeRTuQ+0o0MIG+QzygGpaKqqDZqjE5HWSgbDUIj0bloMpqF5qOF6Dq0HK1CD6KN6Fn0Knob7UJfoEMYwFAwDIwexhLDwnhjQjDxmCSMBLMUU4wpw1Rh6jAtmDbMTUwX5iXmExaPpWOZWEusKzYAG4XlYbOwS7FrsRXY/dhG7HnsTWw3dhD7DUfDaeEscC44Di4Wl4zLwxXhynD7cA24C7jbuF7cezwez8Cb4J3wAfg4fCp+EX4tfge+Hn8G34nvwQ8RCAQNggXBjRBC4BJyCEWEbYSDhNOEG4RewkcihahLtCX6EeOJIuIKYhnxAPEU8QaxjzhMUiIZkVxIISQ+aSFpPWkvqYV0jdRLGiYrk03IbuRIcip5ObmcXEe+QH5EfkuhUPQpzpQwipBSQCmnHKZconRTPlFVqOZUb+ocqpS6jlpNPUO9T31Lo9GMaZ60eFoObR2thnaO9oT2UYGuYKXAUeArLFOoVGhUuKHwSpGkaKTIVpynmK9YpnhU8ZriSyWSkrGStxJXaalSpdJxpbtKQ8p0ZRvlEOUM5bXKB5QvK/erEFSMVXxV+CqFKntUzqn00DF0A7o3nUdfSd9Lv0DvVcWrmqhyVFNVS1QPqXaoDqqpqNmrRastUKtUO6nWxcAwjBkcRjpjPeMI4w7j8xTtKewpgilrptRNuTHlg/pUdU91gXqxer36bfXPGkwNX400jY0aTRqPNbGa5pphmnmaOzUvaL6cqjrVdSpvavHUI1MfaKFa5lrhWou09mi1aw1p62j7a4u1t2mf036pw9Dx1EnV2axzSmdAl67rrivU3ax7Wvc5U43JZqYzy5nnmYN6WnoBelK93XodesP6JvpR+iv06/UfG5ANWAZJBpsNWg0GDXUNZxouNqw1fGBEMmIZpRhtNWoz+mBsYhxjvNq4ybjfRN2EY5JvUmvyyJRm6mGaZVplessMb8YySzPbYXbdHDV3ME8xrzS/ZoFaOFoILXZYdE7DTXOeJppWNe2uJdWSbZlrWWvZbcWwCrZaYdVk9Wq64fT46Runt03/Zu1gnW691/qhjYpNoM0KmxabN7bmtjzbSttbdjQ7P7tlds12r+0t7AX2O+3vOdAdZjqsdmh1+Oro5ChxrHMccDJ0SnDa7nSXpcoKZa1lXXLGOXs5L3M+4fzJxdElx+WIy1+ulq5prgdc+2eYzBDM2Dujx03fjeu2263Lneme4P6Te5eHngfXo8rjqaeBJ99zn2cf24ydyj7IfuVl7SXxavD64O3ivcT7jA/Gx9+n2KfDV8U3yrfC94mfvl+yX63foL+D/yL/MwG4gKCAjQF3OdocHqeGMxjoFLgk8HwQNSgiqCLoabB5sCS4ZSY6M3DmppmPZhnNEs1qCoEQTsimkMehJqFZob+G4cNCwyrDnoXbhC8Ob4ugR8yPOBDxPtIrcn3kwyjTKGlUa7Ri9JzomugPMT4xpTFdsdNjl8RejdOME8Y1xxPio+P3xQ/N9p29ZXbvHIc5RXPuzDWZu2Du5Xma89LnnZyvOJ87/2gCLiEm4UDCF24It4o7lMhJ3J44yPPmbeW94HvyN/MHBG6CUkFfkltSaVJ/slvypuSBFI+UspSXQm9hhfB1akDqrtQPaSFp1Wkj6THp9RnEjISM4yIVUZrofKZO5oLMTrGFuEjcleWStSVrUBIk2ZeNZM/Nbs5RlQ1K7VJT6Sppd657bmXux7zovKMLlBeIFrQvNF+4ZmFfvl/+z4uwi3iLWhfrLV6+uHsJe8nupcjSxKWtywyWFS7rLfAv2L+cvDxt+W8rrFeUrni3MmZlS6F2YUFhzyr/VbVFCkWSorurXVfv+gH7g/CHjjV2a7at+VbML75SYl1SVvJlLW/tlR9tfiz/cWRd0rqO9Y7rd27AbxBtuLPRY+P+UuXS/NKeTTM3NW5mbi7e/G7L/C2Xy+zLdm0lb5Vu7SoPLm/eZrhtw7YvFSkVtyu9Kuu3a21fs/3DDv6OGzs9d9bt0t5VsuvzT8Kf7u32391YZVxVtge/J3fPs73Re9t+Zv1cs09zX8m+r9Wi6q794fvP1zjV1BzQOrC+Fq2V1g4cnHPw+iGfQ811lnW76xn1JYfhsPTw818SfrlzJOhI61HW0bpjRse2N9AbihuRxoWNg00pTV3Ncc2dxwOPt7a4tjT8avVr9Qm9E5Un1U6uP0U+VXhq5HT+6aEz4jMvzyaf7Wmd3/rwXOy5W+fDzndcCLpw6aLfxXNt7LbTl9wunbjscvn4FdaVpquOVxvbHdobfnP4raHDsaPxmtO15uvO11s6Z3SeuuFx4+xNn5sXb3FuXb0963bnnag79+7Oudt1j3+v/376/dcPch8MPyx4hHtU/FjpcdkTrSdVv5v9Xt/l2HWy26e7/WnE04c9vJ4Xf2T/8aW38BntWVmfbl9Nv23/iQG/gevPZz/vfSF+Mfyy6E/lP7e/Mn117C/Pv9oHYwd7X0tej7xZ+1bjbfU7+3etQ6FDT95nvB/+UPxR4+P+T6xPbZ9jPvcN530hfCn/ava15VvQt0cjGSMjYq6EOzYKyKYDQJOSAN5UA9DiAOjXAcizx+frMUHGvwnGCP4Tj8/gY+II0OABEHgWwGIVQDsRQG+NbAZpAwilAUQ6A2pnJ18Ts/DY3D4qOrLvhrwoQKoLum8mFMA/ZHym/67uf2oYjWoP/9T/Ao1WD2wmydvWAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAAZoAMABAAAAAEAAAAXAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdERrfoIAAAHUaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjIzPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI1PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cp1dxrAAAAFESURBVEgN7VM9ioQwFH4j24u2WglWIhYWHkFrC0+hJ7AQCw8gHsXSZhC8gIWVN7CxElFx1gRGNmsy7M4wM7BsICT53vd+/HzvtK7rBZ68uCfHx+H/k/xKZaZceZ6DaZrAcRzeWZYdAo/juNtFUQTf9w8cBJxY3SXLMqAguq5jxyAIwHVdIsg0TWDbNsa6roOmaWCLR3DwAyWh7c148TyPaqPxi6JAo0DlM+U6lnM/8sFyjaIINE1jmQ+4oiiAfGiL+U9o5Huxl8j13iTn8xm35E8l6vsekA910doRYRv5j7Qwz/NQ1zXEcYwVcBwHLMsi1FiWBZIkwVjbtoSNeLDkCsMQS7aR8Zmm6WGah2EgONusHDgo/s05qaoK5nnGRamqCpIkfS8QyrLcMcMwQBCE/X293ExyJT16vndOHq3+q/9LvuQTGT1Wl0RY14cAAAAASUVORK5CYII="},2504:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_share_reserved-6bce67775ce2c41abb0ef13ee1fad972.png"},9635:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/zrok_web_console_share_frontend-d7c0d6495493c00b94ae237339f2dc2d.png"},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const o={},i=r.createContext(o);function t(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8f494be.6cdbf166.js b/assets/js/f8f494be.6cdbf166.js new file mode 100644 index 00000000..e6aa936e --- /dev/null +++ b/assets/js/f8f494be.6cdbf166.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5695],{2926:(e,r,s)=>{s.d(r,{Ay:()=>o,RM:()=>a});var n=s(4848),i=s(8453);const a=[];function t(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Set up ",(0,n.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,n.jsx)(r.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,n.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function o(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(t,{...e})}):t(e)}},3078:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/linux-user-share/index","title":"Linux User Share","description":"Overview","source":"@site/versioned_docs/version-0.4/guides/linux-user-share/index.mdx","sourceDirName":"guides/linux-user-share","slug":"/guides/linux-user-share/","permalink":"/docs/0.4/guides/linux-user-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/linux-user-share/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Linux User Share"},"sidebar":"tutorialSidebar","previous":{"title":"Private Share","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide"},"next":{"title":"Self Hosting","permalink":"/docs/0.4/category/self-hosting"}}');var i=s(4848),a=s(8453),t=s(2926);const o={title:"Linux User Share"},l=void 0,c={},h=[{value:"Overview",id:"overview",level:2},{value:"Install the Linux Package",id:"install-the-linux-package",level:2},...t.RM,{value:"Create a User Share Configuration File",id:"create-a-user-share-configuration-file",level:2},{value:"Edit the User Share Configuration File",id:"edit-the-user-share-configuration-file",level:2},{value:"Start the User Share Service",id:"start-the-user-share-service",level:2},{value:"Check the User Share Journal",id:"check-the-user-share-journal",level:2},{value:"Add Another User Share",id:"add-another-user-share",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["You can run any number of zrok share services as ",(0,i.jsx)(r.code,{children:"systemd --user"})," units with your Linux user's zrok environment in ",(0,i.jsx)(r.code,{children:"~/.zrok"}),". This is like ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/frontdoor",children:"zrok frontdoor"})," except that frontdoor is a system service managed by root separately from your user's login. Linux user shares, Linux system services, and Docker shares all use the same configuration environment variables."]}),"\n",(0,i.jsx)(r.h2,{id:"install-the-linux-package",children:"Install the Linux Package"}),"\n",(0,i.jsxs)(r.p,{children:["The package provides the ",(0,i.jsx)(r.code,{children:"zrok"})," executable and service unit template."]}),"\n",(0,i.jsx)(t.Ay,{}),"\n",(0,i.jsx)(r.h2,{id:"create-a-user-share-configuration-file",children:"Create a User Share Configuration File"}),"\n",(0,i.jsxs)(r.p,{children:["Substitute a name for your instance in place of ",(0,i.jsx)(r.code,{children:"my-instance"})," in the following example. To avoid character escaping problems, use only letters, numbers, hyphens, and underscores in the instance name, not spaces or other special characters."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_INSTANCE="my-instance"\ncp /opt/openziti/etc/zrok/zrok-share.env ~/.zrok/zrok-share@${ZROK_INSTANCE}.env\n'})}),"\n",(0,i.jsx)(r.h2,{id:"edit-the-user-share-configuration-file",children:"Edit the User Share Configuration File"}),"\n",(0,i.jsxs)(r.p,{children:["Edit the configuration file in ",(0,i.jsx)(r.code,{children:"~/.zrok/zrok-share@${ZROK_INSTANCE}.env"})," as you would for ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/frontdoor",children:"zrok frontdoor"}),', except ignore the first section "ZROK ENVIRONMENT" because user shares re-use ',(0,i.jsx)(r.code,{children:"~/.zrok"})," and do not need a separate zrok environment."]}),"\n",(0,i.jsx)(r.h2,{id:"start-the-user-share-service",children:"Start the User Share Service"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"systemctl --user enable --now zrok-share@${ZROK_INSTANCE}.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"check-the-user-share-journal",children:"Check the User Share Journal"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl --user -lfu zrok-share@${ZROK_INSTANCE}.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"add-another-user-share",children:"Add Another User Share"}),"\n",(0,i.jsxs)(r.p,{children:["To create another user share, choose another instance name, copy the ",(0,i.jsx)(r.code,{children:"zrok-share.env"})," file, edit the configuration file, and start the service."]})]})}function u(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>t,x:()=>o});var n=s(6540);const i={},a=n.createContext(i);function t(e){const r=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),n.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8f494be.f6c4378a.js b/assets/js/f8f494be.f6c4378a.js deleted file mode 100644 index a12719ec..00000000 --- a/assets/js/f8f494be.f6c4378a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5695],{633:(e,r,s)=>{s.d(r,{Ay:()=>o,RM:()=>a});var n=s(4848),i=s(8453);const a=[];function t(e){const r={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Set up ",(0,n.jsx)(r.code,{children:"zrok"}),"'s Linux package repository by following ",(0,n.jsx)(r.a,{href:"/docs/guides/install/linux#install-zrok-from-the-repository",children:"the Linux install guide"}),", or run this one-liner to complete the repo setup and install packages."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",children:"curl -sSLf https://get.openziti.io/install.bash \\\n| sudo bash -s zrok-share\n"})}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["If you set up the repository by following the guide, then also install the ",(0,n.jsx)(r.code,{children:"zrok-share"})," package. This package provides the systemd service."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",metastring:'title="Ubuntu, Debian"',children:"sudo apt install zrok-share\n"})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-bash",metastring:'title="Fedora, Rocky"',children:"sudo dnf install zrok-share\n"})}),"\n"]}),"\n"]})}function o(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(t,{...e})}):t(e)}},9438:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"guides/linux-user-share/index","title":"Linux User Share","description":"Overview","source":"@site/versioned_docs/version-0.4/guides/linux-user-share/index.mdx","sourceDirName":"guides/linux-user-share","slug":"/guides/linux-user-share/","permalink":"/docs/0.4/guides/linux-user-share/","draft":false,"unlisted":false,"editUrl":"https://github.com/openziti/zrok/blob/main/docs/versioned_docs/version-0.4/guides/linux-user-share/index.mdx","tags":[],"version":"0.4","frontMatter":{"title":"Linux User Share"},"sidebar":"tutorialSidebar","previous":{"title":"Private Share","permalink":"/docs/0.4/guides/docker-share/docker_private_share_guide"},"next":{"title":"Self Hosting","permalink":"/docs/0.4/category/self-hosting"}}');var i=s(4848),a=s(8453),t=s(633);const o={title:"Linux User Share"},l=void 0,c={},h=[{value:"Overview",id:"overview",level:2},{value:"Install the Linux Package",id:"install-the-linux-package",level:2},...t.RM,{value:"Create a User Share Configuration File",id:"create-a-user-share-configuration-file",level:2},{value:"Edit the User Share Configuration File",id:"edit-the-user-share-configuration-file",level:2},{value:"Start the User Share Service",id:"start-the-user-share-service",level:2},{value:"Check the User Share Journal",id:"check-the-user-share-journal",level:2},{value:"Add Another User Share",id:"add-another-user-share",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(r.p,{children:["You can run any number of zrok share services as ",(0,i.jsx)(r.code,{children:"systemd --user"})," units with your Linux user's zrok environment in ",(0,i.jsx)(r.code,{children:"~/.zrok"}),". This is like ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/frontdoor",children:"zrok frontdoor"})," except that frontdoor is a system service managed by root separately from your user's login. Linux user shares, Linux system services, and Docker shares all use the same configuration environment variables."]}),"\n",(0,i.jsx)(r.h2,{id:"install-the-linux-package",children:"Install the Linux Package"}),"\n",(0,i.jsxs)(r.p,{children:["The package provides the ",(0,i.jsx)(r.code,{children:"zrok"})," executable and service unit template."]}),"\n",(0,i.jsx)(t.Ay,{}),"\n",(0,i.jsx)(r.h2,{id:"create-a-user-share-configuration-file",children:"Create a User Share Configuration File"}),"\n",(0,i.jsxs)(r.p,{children:["Substitute a name for your instance in place of ",(0,i.jsx)(r.code,{children:"my-instance"})," in the following example. To avoid character escaping problems, use only letters, numbers, hyphens, and underscores in the instance name, not spaces or other special characters."]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'ZROK_INSTANCE="my-instance"\ncp /opt/openziti/etc/zrok/zrok-share.env ~/.zrok/zrok-share@${ZROK_INSTANCE}.env\n'})}),"\n",(0,i.jsx)(r.h2,{id:"edit-the-user-share-configuration-file",children:"Edit the User Share Configuration File"}),"\n",(0,i.jsxs)(r.p,{children:["Edit the configuration file in ",(0,i.jsx)(r.code,{children:"~/.zrok/zrok-share@${ZROK_INSTANCE}.env"})," as you would for ",(0,i.jsx)(r.a,{href:"/docs/0.4/guides/frontdoor",children:"zrok frontdoor"}),', except ignore the first section "ZROK ENVIRONMENT" because user shares re-use ',(0,i.jsx)(r.code,{children:"~/.zrok"})," and do not need a separate zrok environment."]}),"\n",(0,i.jsx)(r.h2,{id:"start-the-user-share-service",children:"Start the User Share Service"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"systemctl --user enable --now zrok-share@${ZROK_INSTANCE}.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"check-the-user-share-journal",children:"Check the User Share Journal"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"journalctl --user -lfu zrok-share@${ZROK_INSTANCE}.service\n"})}),"\n",(0,i.jsx)(r.h2,{id:"add-another-user-share",children:"Add Another User Share"}),"\n",(0,i.jsxs)(r.p,{children:["To create another user share, choose another instance name, copy the ",(0,i.jsx)(r.code,{children:"zrok-share.env"})," file, edit the configuration file, and start the service."]})]})}function u(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>t,x:()=>o});var n=s(6540);const i={},a=n.createContext(i);function t(e){const r=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),n.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.35a8599c.js b/assets/js/main.35a8599c.js deleted file mode 100644 index 3bae2a69..00000000 --- a/assets/js/main.35a8599c.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.35a8599c.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8792],{3219:(e,t,n)=>{"use strict";n.d(t,{Bc:()=>C,E8:()=>Zn,a1:()=>Yn});var r=n(6540);n(961);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){a(i,r,o,s,l,"next",e)}function l(e){a(i,r,o,s,l,"throw",e)}s(void 0)}))}}function s(e,t,n){return t=f(t),function(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,m()?Reflect.construct(t,n||[],f(e).constructor):t.apply(e,n))}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t,n){return Object.defineProperty(e,"prototype",{writable:!1}),e}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d.apply(null,arguments)}function f(e){return f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},f(e)}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}function m(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(m=function(){return!!e})()}function h(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?h(Object(n),!0).forEach((function(t){u(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):h(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function y(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function b(){b=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var a=t&&t.prototype instanceof y?t:y,i=Object.create(a.prototype),s=new P(r||[]);return o(i,"_invoke",{value:O(e,n,s)}),i}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var f="suspendedStart",p="suspendedYield",m="executing",h="completed",g={};function y(){}function v(){}function w(){}var S={};c(S,i,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(I([])));x&&x!==n&&r.call(x,i)&&(S=x);var E=w.prototype=y.prototype=Object.create(S);function _(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function j(e,t){function n(o,a,i,s){var l=d(e[o],e,a);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==typeof u&&r.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,i,s)}),(function(e){n("throw",e,i,s)})):t.resolve(u).then((function(e){c.value=e,i(c)}),(function(e){return n("throw",e,i,s)}))}s(l.arg)}var a;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return a=a?a.then(o,o):o()}})}function O(t,n,r){var o=f;return function(a,i){if(o===m)throw Error("Generator is already running");if(o===h){if("throw"===a)throw i;return{value:e,done:!0}}for(r.method=a,r.arg=i;;){var s=r.delegate;if(s){var l=C(s,r);if(l){if(l===g)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===f)throw o=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=m;var c=d(t,n,r);if("normal"===c.type){if(o=r.done?h:p,c.arg===g)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=h,r.method="throw",r.arg=c.arg)}}}function C(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,C(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var a=d(o,t.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,g;var i=a.arg;return i?i.done?(n[t.resultName]=i.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):i:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function A(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(A,this),this.reset(!0)}function I(t){if(t||""===t){var n=t[i];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return a.next=a}}throw new TypeError(typeof t+" is not iterable")}return v.prototype=w,o(E,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:v,configurable:!0}),v.displayName=c(w,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,w):(e.__proto__=w,c(e,l,"GeneratorFunction")),e.prototype=Object.create(E),e},t.awrap=function(e){return{__await:e}},_(j.prototype),c(j.prototype,s,(function(){return this})),t.AsyncIterator=j,t.async=function(e,n,r,o,a){void 0===a&&(a=Promise);var i=new j(u(e,n,r,o),a);return t.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},_(E),c(E,l,"Generator"),c(E,i,(function(){return this})),c(E,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=I,P.prototype={constructor:P,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return s.type="throw",s.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],s=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var l=r.call(i,"catchLoc"),c=r.call(i,"finallyLoc");if(l&&c){if(this.prev<i.catchLoc)return o(i.catchLoc,!0);if(this.prev<i.finallyLoc)return o(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return o(i.catchLoc,!0)}else{if(!c)throw Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return o(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var a=o;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method="next",this.next=a.finallyLoc,g):this.complete(i)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;T(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:I(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function v(e,t){return v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},v(e,t)}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}(e,t)||k(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||k(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function x(e){var t="function"==typeof Map?new Map:void 0;return x=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(m())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&v(o,n.prototype),o}(e,arguments,f(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),v(n,e)},x(e)}function E(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function _(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("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",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var j=["translations"],O="Ctrl",C=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=y(e,j),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=w((0,r.useState)(null),2),f=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(O))}),[]),r.createElement("button",d({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(_,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==f&&r.createElement(r.Fragment,null,r.createElement(A,{reactsToKey:f===O?O:"Meta"},f===O?r.createElement(E,null):f),r.createElement(A,{reactsToKey:"k"},"K"))))}));function A(e){var t=e.reactsToKey,n=e.children,o=w((0,r.useState)(!1),2),a=o[0],i=o[1];return(0,r.useEffect)((function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&i(!0)}function n(e){e.key!==t&&"Meta"!==e.key||i(!1)}}),[t]),r.createElement("kbd",{className:a?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}function T(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];n&&clearTimeout(n),n=setTimeout((function(){return e.apply(void 0,o)}),t)}}function P(e){return e.reduce((function(e,t){return e.concat(t)}),[])}var I=0;function R(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}function N(e){return e!==Object(e)}function D(e,t){if(e===t)return!0;if(N(e)||N(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n=0,r=Object.keys(e);n<r.length;n++){var o=r[n];if(!(o in t))return!1;if(!D(e[o],t[o]))return!1}return!0}var L=function(){},M=[{segment:"autocomplete-core",version:"1.17.6"}];function F(e){var t=e.item,n=e.items,r=void 0===n?[]:n;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var B=["items"],U=["items"];function q(e){return q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},q(e)}function $(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function G(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function W(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?G(Object(n),!0).forEach((function(t){K(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):G(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function K(e,t,n){return(t=function(e){var t=function(e){if("object"!==q(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==q(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===q(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Q(e){return e.map((function(e){var t=e.items,n=V(e,B);return W(W({},n),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||n.objectIDs})}))}function Y(e){var t,n,r,o=(t=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return z(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}((e.version||"").split(".").map(Number),2),n=t[0],r=t[1],n>=3||2===n&&r>=4||1===n&&r>=10);function a(t,n,r){if(o&&void 0!==r){var a=r[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[t].concat($(n),[{headers:i}]))}else e.apply(void 0,[t].concat($(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDsAfterSearch",Q(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDs",Q(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDsAfterSearch",Q(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDs",Q(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&t.reduce((function(e,t){var n=t.items,r=V(t,U);return[].concat($(e),$(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r<e.objectIDs.length;r+=t)n.push(W(W({},e),{},{objectIDs:e.objectIDs.slice(r,r+t)}));return n}(W(W({},r),{},{objectIDs:(null==n?void 0:n.map((function(e){return e.objectID})))||r.objectIDs})).map((function(e){return{items:n,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return a("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Z(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function J(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function ee(e){return function(e){if(Array.isArray(e))return te(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?te(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function ne(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ne(Object(n),!0).forEach((function(t){oe(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ne(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function oe(e,t,n){return(t=function(e){var t=function(e){if("object"!==X(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==X(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===X(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ae="2.15.0",ie="https://cdn.jsdelivr.net/npm/search-insights@".concat(ae,"/dist/search-insights.min.js"),se=T((function(e){var t=e.onItemsChange,n=e.items,r=e.insights,o=e.state;t({insights:r,insightsEvents:Z({items:n}).map((function(e){return re({eventName:"Items Viewed"},e)})),state:o})}),400);function le(e){var t=function(e){return re({onItemsChange:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.viewedObjectIDs.apply(t,ee(n.map((function(e){return re(re({},e),{},{algoliaSource:ce(e.algoliaSource,r.context)})}))))},onSelect:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.clickedObjectIDsAfterSearch.apply(t,ee(n.map((function(e){return re(re({},e),{},{algoliaSource:ce(e.algoliaSource,r.context)})}))))},onActive:L,__autocomplete_clickAnalytics:!0},e)}(e),n=t.insightsClient,r=t.insightsInitParams,o=t.onItemsChange,a=t.onSelect,i=t.onActive,s=t.__autocomplete_clickAnalytics,l=n;if(n||"undefined"!=typeof window&&function(e){var t=e.window,n=t.AlgoliaAnalyticsObject||"aa";"string"==typeof n&&(l=t[n]),l||(t.AlgoliaAnalyticsObject=n,t[n]||(t[n]=function(){t[n].queue||(t[n].queue=[]);for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];t[n].queue.push(r)}),t[n].version=ae,l=t[n],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var n=e.document.createElement("script");n.async=!0,n.src=ie,n.onerror=function(){console.error(t)},document.body.appendChild(n)}catch(e){console.error(t)}}(t))}({window:window}),!l)return{};r&&l("init",re({partial:!0},r));var c=Y(l),u={current:[]},d=T((function(e){var t=e.state;if(t.isOpen){var n=t.collections.reduce((function(e,t){return[].concat(ee(e),ee(t.items))}),[]).filter(J);D(u.current.map((function(e){return e.objectID})),n.map((function(e){return e.objectID})))||(u.current=n,n.length>0&&se({onItemsChange:o,items:n,insights:c,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive,o=!1;function u(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:re(re({},s?{clickAnalytics:!0}:{}),e?{userToken:ue(e)}:{}),insights:c}})}l("addAlgoliaAgent","insights-plugin"),u(),l("onUserTokenChange",(function(e){o||u(e)})),l("getUserToken",null,(function(e,t){o||u(t)})),l("onAuthenticatedUserTokenChange",(function(e){e?(o=!0,u(e)):(o=!1,l("getUserToken",null,(function(e,t){return u(t)})))})),l("getAuthenticatedUserToken",null,(function(e,t){t&&(o=!0,u(t))})),n((function(e){var t=e.item,n=e.state,r=e.event,o=e.source;J(t)&&a({state:n,event:r,insights:c,item:t,insightsEvents:[re({eventName:"Item Selected"},F({item:t,items:o.getItems().filter(J)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;J(t)&&i({state:r,event:o,insights:c,item:t,insightsEvents:[re({eventName:"Item Active"},F({item:t,items:n.getItems().filter(J)}))]})}))},onStateChange:function(e){var t=e.state;d({state:t})},__autocomplete_pluginOptions:e}}function ce(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(ee(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],ee(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function ue(e){return"number"==typeof e?e.toString():e}function de(e,t){var n=t;return{then:function(t,r){return de(e.then(pe(t,n,e),pe(r,n,e)),n)},catch:function(t){return de(e.catch(pe(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),de(e.finally(pe(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function fe(e){return de(e,{isCanceled:!1,onCancelList:[]})}function pe(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function me(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function he(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ge(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?he(Object(n),!0).forEach((function(t){ye(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):he(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ye(e,t,n){return(t=function(e){var t=function(e){if("object"!==be(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==be(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===be(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function be(e){return be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},be(e)}function ve(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,n){var r=(e[n-1]||0)+t;return e.push(r),e}),[]).reduce((function(t,n){return n<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var n=t.items[function(e){for(var t=e.state,n=e.collection,r=!1,o=0,a=0;!1===r;){var i=t.collections[o];if(i===n){r=!0;break}a+=i.items.length,o++}return t.activeItemId-a}({state:e,collection:t})],r=t.source;return{item:n,itemInputValue:r.getItemInputValue({item:n,state:e}),itemUrl:r.getItemUrl({item:n,state:e}),source:r}}function we(e,t,n){return[e,null==n?void 0:n.sourceId,t].filter(Boolean).join("-").replace(/\s/g,"")}var Se=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function ke(e){return e.nativeEvent||e}function xe(e){return xe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},xe(e)}function Ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _e(e,t,n){return(t=function(e){var t=function(e){if("object"!==xe(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==xe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===xe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function je(e){return je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},je(e)}function Oe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ce(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Oe(Object(n),!0).forEach((function(t){Ae(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Oe(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Ae(e,t,n){return(t=function(e){var t=function(e){if("object"!==je(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==je(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===je(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Te(e){return Te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Te(e)}function Pe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ie(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ie(Object(n),!0).forEach((function(t){Ne(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ie(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Ne(e,t,n){return(t=function(e){var t=function(e){if("object"!==Te(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function De(e,t){var n,r="undefined"!=typeof window?window:{},o=e.plugins||[];return Re(Re({debug:!1,openOnFocus:!1,enterKeyHint:void 0,ignoreCompositionEvents:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:void 0,environment:r,shouldPanelOpen:function(e){return R(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(I++),plugins:o,initialState:Re({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return Pe(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Pe(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Pe(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:L,onResolve:L};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=ge(ge({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return P(e)})).then((function(e){return e.map((function(e){return Re(Re({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:Re({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Le(e){return Le="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Le(e)}function Me(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Fe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Me(Object(n),!0).forEach((function(t){ze(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Me(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ze(e,t,n){return(t=function(e){var t=function(e){if("object"!==Le(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Le(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Le(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Be(e){return Be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Be(e)}function Ue(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function qe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ue(Object(n),!0).forEach((function(t){$e(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ue(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function $e(e,t,n){return(t=function(e){var t=function(e){if("object"!==Be(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Be(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Be(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function He(e){return function(e){if(Array.isArray(e))return Ve(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Ve(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ve(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ge(e){return Boolean(e.execute)}function We(e){var t=e.reduce((function(e,t){if(!Ge(t))return e.push(t),e;var n=t.searchClient,r=t.execute,o=t.requesterId,a=t.requests,i=e.find((function(e){return Ge(t)&&Ge(e)&&e.searchClient===n&&Boolean(o)&&e.requesterId===o}));if(i){var s;(s=i.items).push.apply(s,He(a))}else{var l={execute:r,requesterId:o,items:a,searchClient:n};e.push(l)}return e}),[]).map((function(e){if(!Ge(e))return Promise.resolve(e);var t=e,n=t.execute,r=t.items;return n({searchClient:t.searchClient,requests:r})}));return Promise.all(t).then((function(e){return P(e)}))}function Ke(e){return Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ke(e)}var Qe=["event","nextState","props","query","refresh","store"];function Ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ze(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ye(Object(n),!0).forEach((function(t){Je(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ye(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Je(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ke(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ke(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ke(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Xe,et,tt,nt=null,rt=(Xe=-1,et=-1,tt=void 0,function(e){var t=++Xe;return Promise.resolve(e).then((function(e){return tt&&t<et?tt:(et=t,tt=e,e)}))});function ot(e){var t=e.event,n=e.nextState,r=void 0===n?{}:n,o=e.props,a=e.query,i=e.refresh,s=e.store,l=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Qe);nt&&o.environment.clearTimeout(nt);var c=l.setCollections,u=l.setIsOpen,d=l.setQuery,f=l.setActiveItemId,p=l.setStatus,m=l.setContext;if(d(a),f(o.defaultActiveItemId),!a&&!1===o.openOnFocus){var h,g=s.getState().collections.map((function(e){return Ze(Ze({},e),{},{items:[]})}));p("idle"),c(g),u(null!==(h=r.isOpen)&&void 0!==h?h:o.shouldPanelOpen({state:s.getState()}));var y=fe(rt(g).then((function(){return Promise.resolve()})));return s.pendingRequests.add(y)}p("loading"),nt=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var b=fe(rt(o.getSources(Ze({query:a,refresh:i,state:s.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(Ze({query:a,refresh:i,state:s.getState()},l))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(He(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return qe(qe({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?qe(qe({},n),{},{params:qe(qe({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,s.getState())}))}))).then(We).then((function(t){var n,r=t.some((function(e){return function(e){return!Array.isArray(e)&&Boolean(null==e?void 0:e._automaticInsights)}(e.items)}));return r&&m({algoliaInsightsPlugin:Ze(Ze({},(null===(n=s.getState().context)||void 0===n?void 0:n.algoliaInsightsPlugin)||{}),{},{__automaticInsights:r})}),function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),a=o.map((function(e){return e.items})),i=o[0].transformResponse,s=i?i({results:r=a,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):a;return t.onResolve({source:t,results:a,items:s,state:n.getState()}),s.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:s}}))}(t,e,s)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Fe(Fe({},e),{},ze({},t.source.sourceId,Fe(Fe({},t.source),{},{getItems:function(){return P(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return P(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:s.getState()})}))})))).then((function(e){var n;p("idle"),c(e);var d=o.shouldPanelOpen({state:s.getState()});u(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!a&&d||d);var f=ve(s.getState());if(null!==s.getState().activeItemId&&f){var m=f.item,h=f.itemInputValue,g=f.itemUrl,y=f.source;y.onActive(Ze({event:t,item:m,itemInputValue:h,itemUrl:g,refresh:i,source:y,state:s.getState()},l))}})).finally((function(){p("idle"),nt&&o.environment.clearTimeout(nt)}));return s.pendingRequests.add(b)}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}var it=["event","props","refresh","store"];function st(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?st(Object(n),!0).forEach((function(t){ct(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):st(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ct(e,t,n){return(t=function(e){var t=function(e){if("object"!==at(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ut(e){return ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ut(e)}var dt=["props","refresh","store"],ft=["inputElement","formElement","panelElement"],pt=["inputElement"],mt=["inputElement","maxLength"],ht=["source"],gt=["item","source"];function yt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function bt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?yt(Object(n),!0).forEach((function(t){vt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):yt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function vt(e,t,n){return(t=function(e){var t=function(e){if("object"!==ut(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==ut(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===ut(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wt(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function St(e){var t=e.props,n=e.refresh,r=e.store,o=wt(e,dt);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return(n=t)===(r=e.target)||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return bt({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},wt(e,ft))},getRootProps:function(e){return bt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return we(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":we(t.id,"label")},e)},getFormProps:function(e){return e.inputElement,bt({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(bt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(bt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},wt(e,pt))},getLabelProps:function(e){return bt({htmlFor:we(t.id,"input"),id:we(t.id,"label")},e)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&ot(bt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{};s.inputElement;var l=s.maxLength,c=void 0===l?512:l,u=wt(s,mt),d=ve(r.getState()),f=function(e){return Boolean(e&&e.match(Se))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),p=t.enterKeyHint||(null!=d&&d.itemUrl&&!f?"go":"search");return bt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?we(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return we(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":we(t.id,"label"),value:r.getState().completion||r.getState().query,id:we(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:p,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){var a=e.currentTarget.value;t.ignoreCompositionEvents&&ke(e).isComposing?o.setQuery(a):ot(bt({event:e,props:t,query:a.slice(0,c),refresh:n,store:r},o))},onCompositionEnd:function(e){ot(bt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){ke(e).isComposing||function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,it);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=ve(o.getState()),t=n.environment.document.getElementById(we(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},s=function(){var e=ve(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(lt({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?ot(lt({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ve(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,f=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});ot(lt({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a))}))}}}(bt({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:L,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return bt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=wt(n,ht);return bt({role:"listbox","aria-labelledby":we(t.id,"label"),id:we(t.id,"list",r)},o)},getItemProps:function(e){var a=e.item,i=e.source,s=wt(e,gt);return bt({id:we(t.id,"item-".concat(a.__autocomplete_id),i),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=ve(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(bt({event:e,item:i,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var s=i.getItemInputValue({item:a,state:r.getState()}),l=i.getItemUrl({item:a,state:r.getState()});(l?Promise.resolve():ot(bt({event:e,nextState:{isOpen:!1},props:t,query:s,refresh:n,store:r},o))).then((function(){i.onSelect(bt({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:i,state:r.getState()},o))}))}},s)}}}function kt(e){return kt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},kt(e)}function xt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Et(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?xt(Object(n),!0).forEach((function(t){_t(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):xt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function _t(e,t,n){return(t=function(e){var t=function(e){if("object"!==kt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==kt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===kt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function jt(e){var t,n,r,o,a=e.plugins,i=e.options,s=null===(t=((null===(n=i.__autocomplete_metadata)||void 0===n?void 0:n.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=s?_t({},s,Object.keys((null===(r=i.__autocomplete_metadata)||void 0===r?void 0:r.options)||{})):{};return{plugins:a.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:Et({"autocomplete-core":Object.keys(i)},l),ua:M.concat((null===(o=i.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function Ot(e){var t,n=e.state;return!1===n.isOpen||null===n.activeItemId?null:(null===(t=ve(n))||void 0===t?void 0:t.itemInputValue)||null}function Ct(e){return Ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ct(e)}function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Tt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?At(Object(n),!0).forEach((function(t){Pt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):At(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Pt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ct(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ct(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ct(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var It=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return Tt(Tt({},e),{},{activeItemId:t.payload});case"setQuery":return Tt(Tt({},e),{},{query:t.payload,completion:null});case"setCollections":return Tt(Tt({},e),{},{collections:t.payload});case"setIsOpen":return Tt(Tt({},e),{},{isOpen:t.payload});case"setStatus":return Tt(Tt({},e),{},{status:t.payload});case"setContext":return Tt(Tt({},e),{},{context:Tt(Tt({},e.context),t.payload)});case"ArrowDown":var n=Tt(Tt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:me(1,e.activeItemId,R(e),t.props.defaultActiveItemId)});return Tt(Tt({},n),{},{completion:Ot({state:n})});case"ArrowUp":var r=Tt(Tt({},e),{},{activeItemId:me(-1,e.activeItemId,R(e),t.props.defaultActiveItemId)});return Tt(Tt({},r),{},{completion:Ot({state:r})});case"Escape":return e.isOpen?Tt(Tt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):Tt(Tt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return Tt(Tt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return Tt(Tt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",completion:null,query:""});case"focus":return Tt(Tt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:Tt(Tt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return Tt(Tt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function Rt(e){return Rt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rt(e)}function Nt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Dt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Nt(Object(n),!0).forEach((function(t){Lt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Nt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Lt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Rt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Rt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Rt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Mt(e){var t=[],n=De(e,t),r=function(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ee(Object(n),!0).forEach((function(t){_e(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ee(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},o);o=e(o,{type:r,props:t,payload:a}),n({state:o,prevState:i})},pendingRequests:(r=[],{add:function(e){return r.push(e),e.finally((function(){r=r.filter((function(t){return t!==e}))}))},cancelAll:function(){r.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===r.length}})}}(It,n,(function(e){var t,r,a=e.prevState,c=e.state;if(n.onStateChange(Dt({prevState:a,state:c,refresh:i,navigator:n.navigator},o)),!l()&&null!==(t=c.context)&&void 0!==t&&null!==(r=t.algoliaInsightsPlugin)&&void 0!==r&&r.__automaticInsights&&!1!==n.insights){var u=le({__autocomplete_clickAnalytics:!1});n.plugins.push(u),s([u])}})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var n=0,r=e.map((function(e){return Ce(Ce({},e),{},{items:P(e.items).map((function(e){return Ce(Ce({},e),{},{__autocomplete_id:n++})}))})}));t.dispatch("setCollections",r)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:r}),a=St(Dt({props:n,refresh:i,store:r,navigator:n.navigator},o));function i(){return ot(Dt({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,navigator:n.navigator,query:r.getState().query,refresh:i,store:r},o))}function s(e){e.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Dt(Dt({},o),{},{navigator:n.navigator,refresh:i,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))}))}function l(){return n.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))}if(n.insights&&!l()){var c="boolean"==typeof n.insights?{}:n.insights;n.plugins.push(le(c))}return s(n.plugins),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var a=o.document.createElement("meta"),i=o.document.querySelector("head");a.name="algolia:metadata",setTimeout((function(){a.content=JSON.stringify(r),i.appendChild(a)}),0)}}({metadata:jt({plugins:n.plugins,options:e}),environment:n.environment}),Dt(Dt({refresh:i,navigator:n.navigator},a),o)}function Ft(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,o=void 0===n?"Search by":n;return r.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},r.createElement("span",{className:"DocSearch-Label"},o),r.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},r.createElement("defs",null,r.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),r.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),r.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),r.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),r.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),r.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function zt(e){return r.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},r.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Bt(e){var t=e.translations,n=void 0===t?{}:t,o=n.selectText,a=void 0===o?"to select":o,i=n.selectKeyAriaLabel,s=void 0===i?"Enter key":i,l=n.navigateText,c=void 0===l?"to navigate":l,u=n.navigateUpKeyAriaLabel,d=void 0===u?"Arrow up":u,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,h=void 0===m?"to close":m,g=n.closeKeyAriaLabel,y=void 0===g?"Escape key":g,b=n.searchByText,v=void 0===b?"Search by":b;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Logo"},r.createElement(Ft,{translations:{searchByText:v}})),r.createElement("ul",{className:"DocSearch-Commands"},r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:s},r.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),r.createElement("span",{className:"DocSearch-Label"},a)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:p},r.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:d},r.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),r.createElement("span",{className:"DocSearch-Label"},c)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:y},r.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),r.createElement("span",{className:"DocSearch-Label"},h))))}function Ut(e){var t=e.hit,n=e.children;return r.createElement("a",{href:t.url},n)}function qt(){return r.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},r.createElement("g",{fill:"none",fillRule:"evenodd"},r.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),r.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},r.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function $t(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),r.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Ht(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Vt(){return r.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),r.createElement("path",{d:"M8 17l-6-6 6-6"})))}var Gt=function(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Wt(e){switch(e.type){case"lvl1":return r.createElement(Gt,null);case"content":return r.createElement(Qt,null);default:return r.createElement(Kt,null)}}function Kt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Qt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Yt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Zt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function Jt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function Xt(e){var t=e.translations,n=void 0===t?{}:t,o=n.titleText,a=void 0===o?"Unable to fetch results":o,i=n.helpText,s=void 0===i?"You might want to check your network connection.":i;return r.createElement("div",{className:"DocSearch-ErrorScreen"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Zt,null)),r.createElement("p",{className:"DocSearch-Title"},a),r.createElement("p",{className:"DocSearch-Help"},s))}var en=["translations"];function tn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,en),a=n.noResultsText,i=void 0===a?"No results for":a,s=n.suggestedQueryText,l=void 0===s?"Try searching for":s,c=n.reportMissingResultsText,u=void 0===c?"Believe this query should return results?":c,d=n.reportMissingResultsLinkText,f=void 0===d?"Let us know.":d,p=o.state.context.searchSuggestions;return r.createElement("div",{className:"DocSearch-NoResults"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Jt,null)),r.createElement("p",{className:"DocSearch-Title"},i,' "',r.createElement("strong",null,o.state.query),'"'),p&&p.length>0&&r.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},r.createElement("p",{className:"DocSearch-Help"},l,":"),r.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(S(e),[r.createElement("li",{key:t},r.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){o.setQuery(t.toLowerCase()+" "),o.refresh(),o.inputRef.current.focus()}},t))])}),[]))),o.getMissingResultsUrl&&r.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),r.createElement("a",{href:o.getMissingResultsUrl({query:o.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var nn=["hit","attribute","tagName"];function rn(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function on(e){var t=e.hit,n=e.attribute,o=e.tagName,a=void 0===o?"span":o,i=y(e,nn);return(0,r.createElement)(a,g(g({},i),{},{dangerouslySetInnerHTML:{__html:rn(t,"_snippetResult.".concat(n,".value"))||rn(t,n)}}))}function an(e){return e.collection&&0!==e.collection.items.length?r.createElement("section",{className:"DocSearch-Hits"},r.createElement("div",{className:"DocSearch-Hit-source"},e.title),r.createElement("ul",e.getListProps(),e.collection.items.map((function(t,n){return r.createElement(sn,d({key:[e.title,t.objectID].join(":"),item:t,index:n},e))})))):null}function sn(e){var t=e.item,n=e.index,o=e.renderIcon,a=e.renderAction,i=e.getItemProps,s=e.onItemClick,l=e.collection,c=e.hitComponent,u=w(r.useState(!1),2),f=u[0],p=u[1],m=w(r.useState(!1),2),h=m[0],g=m[1],y=r.useRef(null),b=c;return r.createElement("li",d({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",f&&"DocSearch-Hit--deleting",h&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){y.current&&y.current()}},i({item:t,source:l.source,onClick:function(e){s(t,e)}})),r.createElement(b,{hit:t},r.createElement("div",{className:"DocSearch-Hit-Container"},o({item:t,index:n}),t.hierarchy[t.type]&&"lvl1"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),a({item:t,runDeleteTransition:function(e){p(!0),y.current=e},runFavoriteTransition:function(e){g(!0),y.current=e}}))))}function ln(e,t,n){return e.reduce((function(e,r){var o=t(r);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(n||5)&&e[o].push(r),e}),{})}function cn(e){return e}function un(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function dn(){}var fn=/(<mark>|<\/mark>)/g,pn=RegExp(fn.source);function mn(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0;return o?o.value&&pn.test(o.value)?o.value.replace(fn,""):o.value:e.hierarchy.lvl0}function hn(e){return r.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var n=mn(t.items[0]);return r.createElement(an,d({},e,{key:t.source.sourceId,title:n,collection:t,renderIcon:function(e){var n,o=e.item,a=e.index;return r.createElement(r.Fragment,null,o.__docsearch_parent&&r.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},o.__docsearch_parent!==(null===(n=t.items[a+1])||void 0===n?void 0:n.__docsearch_parent)?r.createElement("path",{d:"M8 6v21M20 27H8.3"}):r.createElement("path",{d:"M8 6v42M20 27H8.3"}))),r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Wt,{type:o.type})))},renderAction:function(){return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement(Vt,null))}}))})),e.resultsFooterComponent&&r.createElement("section",{className:"DocSearch-HitsFooter"},r.createElement(e.resultsFooterComponent,{state:e.state})))}var gn=["translations"];function yn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,gn),a=n.recentSearchesTitle,i=void 0===a?"Recent":a,s=n.noRecentSearchesText,l=void 0===s?"No recent searches":s,c=n.saveRecentSearchButtonTitle,u=void 0===c?"Save this search":c,f=n.removeRecentSearchButtonTitle,p=void 0===f?"Remove this search from history":f,m=n.favoriteSearchesTitle,h=void 0===m?"Favorite":m,g=n.removeFavoriteSearchButtonTitle,b=void 0===g?"Remove this search from favorites":g;return"idle"===o.state.status&&!1===o.hasCollections?o.disableUserPersonalization?null:r.createElement("div",{className:"DocSearch-StartScreen"},r.createElement("p",{className:"DocSearch-Help"},l)):!1===o.hasCollections?null:r.createElement("div",{className:"DocSearch-Dropdown-Container"},r.createElement(an,d({},o,{title:i,collection:o.state.collections[0],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement($t,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,a=e.runDeleteTransition;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.add(t),o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Yt,null))),r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:p,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),a((function(){o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Ht,null))))}})),r.createElement(an,d({},o,{title:h,collection:o.state.collections[1],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Yt,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:b,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.remove(t),o.refresh()}))}},r.createElement(Ht,null)))}})))}var bn=["translations"],vn=r.memo((function(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,bn);if("error"===o.state.status)return r.createElement(Xt,{translations:null==n?void 0:n.errorScreen});var a=o.state.collections.some((function(e){return e.items.length>0}));return o.state.query?!1===a?r.createElement(tn,d({},o,{translations:null==n?void 0:n.noResultsScreen})):r.createElement(hn,o):r.createElement(yn,d({},o,{hasCollections:a,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),wn=["translations"];function Sn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,wn),a=n.resetButtonTitle,i=void 0===a?"Clear the query":a,s=n.resetButtonAriaLabel,l=void 0===s?"Clear the query":s,c=n.cancelButtonText,u=void 0===c?"Cancel":c,f=n.cancelButtonAriaLabel,p=void 0===f?"Cancel":f,m=n.searchInputLabel,h=void 0===m?"Search":m,g=o.getFormProps({inputElement:o.inputRef.current}).onReset;return r.useEffect((function(){o.autoFocus&&o.inputRef.current&&o.inputRef.current.focus()}),[o.autoFocus,o.inputRef]),r.useEffect((function(){o.isFromSelection&&o.inputRef.current&&o.inputRef.current.select()}),[o.isFromSelection,o.inputRef]),r.createElement(r.Fragment,null,r.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:g},r.createElement("label",d({className:"DocSearch-MagnifierLabel"},o.getLabelProps()),r.createElement(_,null),r.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},h)),r.createElement("div",{className:"DocSearch-LoadingIndicator"},r.createElement(qt,null)),r.createElement("input",d({className:"DocSearch-Input",ref:o.inputRef},o.getInputProps({inputElement:o.inputRef.current,autoFocus:o.autoFocus,maxLength:64}))),r.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":l,hidden:!o.state.query},r.createElement(Ht,null))),r.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":p,onClick:o.onClose},u))}var kn=["_highlightResult","_snippetResult"];function xn(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),a=o.getItem().slice(0,r);return{add:function(e){var t=e;t._highlightResult,t._snippetResult;var n=y(t,kn),i=a.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&a.splice(i,1),a.unshift(n),a=a.slice(0,r),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function En(e){var t,n="algolia-client-js-".concat(e.key);function r(){return void 0===t&&(t=e.localStorage||window.localStorage),t}function o(){return JSON.parse(r().getItem(n)||"{}")}function a(e){r().setItem(n,JSON.stringify(e))}return{get:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var n,r,i;return n=e.timeToLive?1e3*e.timeToLive:null,r=o(),a(i=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==w(e,2)[1].timestamp})))),n&&a(Object.fromEntries(Object.entries(i).filter((function(e){var t=w(e,2)[1],r=(new Date).getTime();return!(t.timestamp+n<r)})))),o()[JSON.stringify(t)]})).then((function(e){return Promise.all([e?e.value:n(),void 0!==e])})).then((function(e){var t=w(e,2),n=t[0],o=t[1];return Promise.all([n,o||r.miss(n)])})).then((function(e){return w(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var a=o();return a[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(a)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function _n(e){var t=S(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return w(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return _n({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return _n({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return _n({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return _n({caches:t}).clear()}))}}}function jn(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var i=r();return i.then((function(e){return o.miss(e)})).then((function(){return i}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function On(e){var t=e.algoliaAgents,n=e.client,r=e.version,o=function(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}(r).add({segment:n,version:r});return t.forEach((function(e){return o.add(e)})),o}var Cn=12e4;function An(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"up",n=Date.now();return g(g({},e),{},{status:t,lastUpdate:n,isUp:function(){return"up"===t||Date.now()-n>Cn},isTimedOut:function(){return"timed out"===t&&Date.now()-n<=Cn}})}var Tn=function(){function e(t,n){var r;return l(this,e),u(r=s(this,e,[t]),"name","AlgoliaError"),n&&(r.name=n),r}return p(e,x(Error)),c(e)}(),Pn=function(){function e(t,n,r){var o;return l(this,e),u(o=s(this,e,[t,r]),"stackTrace",void 0),o.stackTrace=n,o}return p(e,Tn),c(e)}(),In=function(){function e(t){return l(this,e),s(this,e,["Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",t,"RetryError"])}return p(e,Pn),c(e)}(),Rn=function(){function e(t,n,r){var o,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"ApiError";return l(this,e),u(o=s(this,e,[t,r,a]),"status",void 0),o.status=n,o}return p(e,Pn),c(e)}(),Nn=function(){function e(t,n){var r;return l(this,e),u(r=s(this,e,[t,"DeserializationError"]),"response",void 0),r.response=n,r}return p(e,Tn),c(e)}(),Dn=function(){function e(t,n,r,o){var a;return l(this,e),u(a=s(this,e,[t,n,o,"DetailedApiError"]),"error",void 0),a.error=r,a}return p(e,Rn),c(e)}();function Ln(e,t,n){var r,o=(r=n,Object.keys(r).filter((function(e){return void 0!==r[e]})).sort().map((function(e){return"".concat(e,"=").concat(encodeURIComponent("[object Array]"===Object.prototype.toString.call(r[e])?r[e].join(","):r[e]).replace(/\+/g,"%20"))})).join("&")),a="".concat(e.protocol,"://").concat(e.url).concat(e.port?":".concat(e.port):"","/").concat("/"===t.charAt(0)?t.substring(1):t);return o.length&&(a+="?".concat(o)),a}function Mn(e,t){if("GET"!==e.method&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:g(g({},e.data),t.data);return JSON.stringify(n)}}function Fn(e,t,n){var r=g(g(g({Accept:"application/json"},e),t),n),o={};return Object.keys(r).forEach((function(e){var t=r[e];o[e.toLowerCase()]=t})),o}function zn(e){try{return JSON.parse(e.content)}catch(t){throw new Nn(t.message,e)}}function Bn(e,t){var n=e.content,r=e.status;try{var o=JSON.parse(n);return"error"in o?new Dn(o.message,r,o.error,t):new Rn(o.message,r,t)}catch(e){}return new Rn(n,r,t)}function Un(e){return e.map((function(e){return qn(e)}))}function qn(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return g(g({},e),{},{request:g(g({},e.request),{},{headers:g(g({},e.request.headers),t)})})}var $n=["appId","apiKey","authMode","algoliaAgents"],Hn=["params"],Vn="5.12.0";function Gn(e){return[{url:"".concat(e,"-dsn.algolia.net"),accept:"read",protocol:"https"},{url:"".concat(e,".algolia.net"),accept:"write",protocol:"https"}].concat(function(e){for(var t=e,n=e.length-1;n>0;n--){var r=Math.floor(Math.random()*(n+1)),o=e[n];t[n]=e[r],t[r]=o}return t}([{url:"".concat(e,"-1.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-2.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-3.algolianet.com"),accept:"readWrite",protocol:"https"}]))}var Wn="3.7.0";function Kn(e,t,n){return r.useMemo((function(){var r=function(e,t){if(!e||"string"!=typeof e)throw new Error("`appId` is missing.");if(!t||"string"!=typeof t)throw new Error("`apiKey` is missing.");return function(e){var t=e.appId,n=e.apiKey,r=e.authMode,o=e.algoliaAgents,a=y(e,$n),s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"WithinHeaders",r={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers:function(){return"WithinHeaders"===n?r:{}},queryParameters:function(){return"WithinQueryParameters"===n?r:{}}}}(t,n,r),l=function(e){var t=e.hosts,n=e.hostsCache,r=e.baseHeaders,o=e.logger,a=e.baseQueryParameters,s=e.algoliaAgent,l=e.timeouts,c=e.requester,u=e.requestsCache,d=e.responsesCache;function f(e){return p.apply(this,arguments)}function p(){return(p=i(b().mark((function e(t){var r,o,a,i,s;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all(t.map((function(e){return n.get(e,(function(){return Promise.resolve(An(e))}))})));case 2:return r=e.sent,o=r.filter((function(e){return e.isUp()})),a=r.filter((function(e){return e.isTimedOut()})),i=[].concat(S(o),S(a)),s=i.length>0?i:t,e.abrupt("return",{hosts:s,getTimeout:function(e,t){return(0===a.length&&0===e?1:a.length+3+e)*t}});case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function m(e,t){return h.apply(this,arguments)}function h(){return h=i(b().mark((function e(u,d){var p,m,h,y,v,w,k,x,E,_,j,O,C,A=arguments;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=!(A.length>2&&void 0!==A[2])||A[2],m=[],h=Mn(u,d),y=Fn(r,u.headers,d.headers),v="GET"===u.method?g(g({},u.data),d.data):{},w=g(g(g({},a),u.queryParameters),v),s.value&&(w["x-algolia-agent"]=s.value),d&&d.queryParameters)for(k=0,x=Object.keys(d.queryParameters);k<x.length;k++)E=x[k],d.queryParameters[E]&&"[object Object]"!==Object.prototype.toString.call(d.queryParameters[E])?w[E]=d.queryParameters[E].toString():w[E]=d.queryParameters[E];return _=0,j=function(){var e=i(b().mark((function e(t,r){var a,i,s,f,v,S;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(a=t.pop())){e.next=3;break}throw new In(Un(m));case 3:return i=g(g({},l),d.timeouts),s={data:h,headers:y,method:u.method,url:Ln(a,u.path,w),connectTimeout:r(_,i.connect),responseTimeout:r(_,p?i.read:i.write)},f=function(e){var n={request:s,response:e,host:a,triesLeft:t.length};return m.push(n),n},e.next=8,c.send(s);case 8:if(k=(b=v=e.sent).isTimedOut,x=b.status,!(k||function(e){return!e.isTimedOut&&!~~e.status}({isTimedOut:k,status:x})||2!=~~(x/100)&&4!=~~(x/100))){e.next=16;break}return S=f(v),v.isTimedOut&&_++,o.info("Retryable failure",qn(S)),e.next=15,n.set(a,An(a,v.isTimedOut?"timed out":"down"));case 15:return e.abrupt("return",j(t,r));case 16:if(2!=~~(v.status/100)){e.next=18;break}return e.abrupt("return",zn(v));case 18:throw f(v),Bn(v,m);case 20:case"end":return e.stop()}var b,k,x}),e)})));return function(t,n){return e.apply(this,arguments)}}(),O=t.filter((function(e){return"readWrite"===e.accept||(p?"read"===e.accept:"write"===e.accept)})),e.next=13,f(O);case 13:return C=e.sent,e.abrupt("return",j(S(C.hosts).reverse(),C.getTimeout));case 15:case"end":return e.stop()}}),e)}))),h.apply(this,arguments)}return{hostsCache:n,requester:c,timeouts:l,logger:o,algoliaAgent:s,baseHeaders:r,baseQueryParameters:a,hosts:t,request:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.useReadTransporter||"GET"===e.method;if(!n)return m(e,t,n);var o=function(){return m(e,t)};if(!0!==(t.cacheable||e.cacheable))return o();var i={request:e,requestOptions:t,transporter:{queryParameters:a,headers:r}};return d.get(i,(function(){return u.get(i,(function(){return u.set(i,o()).then((function(e){return Promise.all([u.delete(i),e])}),(function(e){return Promise.all([u.delete(i),Promise.reject(e)])})).then((function(e){var t=w(e,2);return t[0],t[1]}))}))}),{miss:function(e){return d.set(i,e)}})},requestsCache:u,responsesCache:d}}(g(g({hosts:Gn(t)},a),{},{algoliaAgent:On({algoliaAgents:o,client:"Lite",version:Vn}),baseHeaders:g(g({"content-type":"text/plain"},s.headers()),a.baseHeaders),baseQueryParameters:g(g({},s.queryParameters()),a.baseQueryParameters)}));return{transporter:l,appId:t,clearCache:function(){return Promise.all([l.requestsCache.clear(),l.responsesCache.clear()]).then((function(){}))},get _ua(){return l.algoliaAgent.value},addAlgoliaAgent:function(e,t){l.algoliaAgent.add({segment:e,version:t})},setClientApiKey:function(e){var t=e.apiKey;r&&"WithinHeaders"!==r?l.baseQueryParameters["x-algolia-api-key"]=t:l.baseHeaders["x-algolia-api-key"]=t},searchForHits:function(e,t){return this.search(e,t)},searchForFacets:function(e,t){return this.search(e,t)},customPost:function(e,t){var n=e.path,r=e.parameters,o=e.body;if(!n)throw new Error("Parameter `path` is required when calling `customPost`.");var a={method:"POST",path:"/{path}".replace("{path}",n),queryParameters:r||{},headers:{},data:o||{}};return l.request(a,t)},getRecommendations:function(e,t){if(e&&Array.isArray(e)&&(e={requests:e}),!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");var n={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return l.request(n,t)},search:function(e,t){if(e&&Array.isArray(e)){var n={requests:e.map((function(e){var t=e.params,n=y(e,Hn);return"facet"===n.type?g(g(g({},n),t),{},{type:"facet"}):g(g(g({},n),t),{},{facet:void 0,maxFacetHits:void 0,facetQuery:void 0})}))};e=n}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");var r={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return l.request(r,t)}}}(g({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:function(e,t){return Promise.resolve()},info:function(e,t){return Promise.resolve()},error:function(e,t){return Promise.resolve()}},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),e)},a=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(a),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(a),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(a),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:jn(),requestsCache:jn({serializable:!1}),hostsCache:_n({caches:[En({key:"".concat(Vn,"-").concat(e)}),jn()]})},void 0))}(e,t);return r.addAlgoliaAgent("docsearch",Wn),!1===/docsearch.js \(.*\)/.test(r.transporter.algoliaAgent.value)&&r.addAlgoliaAgent("docsearch-react",Wn),n(r)}),[e,t,n])}var Qn=["footer","searchBox"];function Yn(e){var t=e.appId,n=e.apiKey,o=e.indexName,a=e.placeholder,i=void 0===a?"Search docs":a,s=e.searchParameters,l=e.maxResultsPerGroup,c=e.onClose,u=void 0===c?dn:c,f=e.transformItems,p=void 0===f?cn:f,m=e.hitComponent,h=void 0===m?Ut:m,b=e.resultsFooterComponent,v=void 0===b?function(){return null}:b,S=e.navigator,k=e.initialScrollY,x=void 0===k?0:k,E=e.transformSearchClient,_=void 0===E?cn:E,j=e.disableUserPersonalization,O=void 0!==j&&j,C=e.initialQuery,A=void 0===C?"":C,T=e.translations,P=void 0===T?{}:T,I=e.getMissingResultsUrl,R=e.insights,N=void 0!==R&&R,D=P.footer,L=P.searchBox,M=y(P,Qn),F=w(r.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),z=F[0],B=F[1],U=r.useRef(null),q=r.useRef(null),$=r.useRef(null),H=r.useRef(null),V=r.useRef(null),G=r.useRef(10),W=r.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,K=r.useRef(A||W).current,Q=Kn(t,n,_),Y=r.useRef(xn({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(o),limit:10})).current,Z=r.useRef(xn({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(o),limit:0===Y.getAll().length?7:4})).current,J=r.useCallback((function(e){if(!O){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===Y.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&Z.add(t)}}),[Y,Z,O]),X=r.useCallback((function(e){if(z.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};z.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[z.context.algoliaInsightsPlugin]),ee=r.useMemo((function(){return Mt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:K,context:{searchSuggestions:[]}},insights:N,navigator:S,onStateChange:function(e){B(e.state)},getSources:function(e){var r=e.query,a=e.state,i=e.setContext,c=e.setStatus;if(!r)return O?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Y.getAll()}}];var d=Boolean(N);return Q.search({requests:[g({query:r,indexName:o,attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(G.current),"hierarchy.lvl2:".concat(G.current),"hierarchy.lvl3:".concat(G.current),"hierarchy.lvl4:".concat(G.current),"hierarchy.lvl5:".concat(G.current),"hierarchy.lvl6:".concat(G.current),"content:".concat(G.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:d},s)]}).catch((function(e){throw"RetryError"===e.name&&c("error"),e})).then((function(e){var r=e.results[0],s=r.hits,c=r.nbHits,f=ln(s,(function(e){return mn(e)}),l);a.context.searchSuggestions.length<Object.keys(f).length&&i({searchSuggestions:Object.keys(f)}),i({nbHits:c});var m={};return d&&(m={__autocomplete_indexName:o,__autocomplete_queryID:r.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:n}}),Object.values(f).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(ln(e,(function(e){return e.hierarchy.lvl1}),l)).map(p).map((function(e){return e.map((function(t){var n=null,r=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&r&&(n=r),g(g({},t),{},{__docsearch_parent:n},m)}))})).flat()}}}))}))}})}),[o,s,l,Q,u,Z,Y,J,K,i,S,p,O,N,t,n]),te=ee.getEnvironmentProps,ne=ee.getRootProps,re=ee.refresh;return function(e){var t=e.getEnvironmentProps,n=e.panelElement,o=e.formElement,a=e.inputElement;r.useEffect((function(){if(n&&o&&a){var e=t({panelElement:n,formElement:o,inputElement:a}),r=e.onTouchStart,i=e.onTouchMove;return window.addEventListener("touchstart",r),window.addEventListener("touchmove",i),function(){window.removeEventListener("touchstart",r),window.removeEventListener("touchmove",i)}}}),[t,n,o,a])}({getEnvironmentProps:te,panelElement:H.current,formElement:$.current,inputElement:V.current}),function(e){var t=e.container;r.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),n=e[0],r=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus()))}}),[t])}({container:U.current}),r.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,x)}}),[]),r.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(G.current=5)}),[]),r.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[z.query]),r.useEffect((function(){K.length>0&&(re(),V.current&&V.current.focus())}),[K,re]),r.useEffect((function(){function e(){if(q.current){var e=.01*window.innerHeight;q.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),r.createElement("div",d({ref:U},ne({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===z.status&&"DocSearch-Container--Stalled","error"===z.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),r.createElement("div",{className:"DocSearch-Modal",ref:q},r.createElement("header",{className:"DocSearch-SearchBar",ref:$},r.createElement(Sn,d({},ee,{state:z,autoFocus:0===K.length,inputRef:V,isFromSelection:Boolean(K)&&K===W,translations:L,onClose:u}))),r.createElement("div",{className:"DocSearch-Dropdown",ref:H},r.createElement(vn,d({},ee,{indexName:o,state:z,hitComponent:h,resultsFooterComponent:v,disableUserPersonalization:O,recentSearches:Z,favoriteSearches:Y,inputRef:V,translations:M,getMissingResultsUrl:I,onItemClick:function(e,t){X(e),J(e),un(t)||u()}}))),r.createElement("footer",{className:"DocSearch-Footer"},r.createElement(Bt,{translations:D}))))}function Zn(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;if("Escape"===e.code&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)return e.preventDefault(),void(t?o():document.body.classList.contains("DocSearch--active")||n());i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}},8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"01cb08ea":[()=>n.e(3747).then(n.bind(n,2264)),"@site/../docs/myzrok/custom-domains/index.mdx",2264],"033e8fc8":[()=>n.e(6475).then(n.bind(n,2729)),"@site/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx",2729],"07d0b302":[()=>n.e(7499).then(n.bind(n,6793)),"@site/../docs/concepts/http.md",6793],"0c1cdb3d":[()=>Promise.all([n.e(1869),n.e(6595)]).then(n.bind(n,6762)),"@site/versioned_docs/version-0.4/guides/docker-share/index.mdx",6762],"0c66edb9":[()=>n.e(7216).then(n.bind(n,4291)),"@site/../docs/guides/permission-modes.md",4291],"0efac3c3":[()=>Promise.all([n.e(1869),n.e(5394),n.e(382),n.e(8173)]).then(n.bind(n,898)),"@site/versioned_docs/version-0.4/guides/install/linux.mdx",898],"11b43341":[()=>n.e(2256).then(n.t.bind(n,7674,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-7fc.json",7674],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,4136)),"@theme/DocCategoryGeneratedIndexPage",4136],17896441:[()=>Promise.all([n.e(1869),n.e(5394),n.e(8585),n.e(8401)]).then(n.bind(n,5587)),"@theme/DocItem",5587],"17f4c24e":[()=>Promise.all([n.e(1869),n.e(8875)]).then(n.bind(n,4185)),"@site/versioned_docs/version-0.4/guides/install/macos.mdx",4185],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,673)),"@theme/SearchPage",673],"1ba5bc99":[()=>Promise.all([n.e(1869),n.e(2759)]).then(n.bind(n,3865)),"@site/../docs/guides/install/macos.mdx",3865],"1dd31738":[()=>n.e(6878).then(n.bind(n,7394)),"@site/versioned_docs/version-0.4/concepts/http.md",7394],"1ddd36f2":[()=>Promise.all([n.e(1869),n.e(1595)]).then(n.bind(n,6974)),"@site/versioned_docs/version-0.4/guides/install/index.mdx",6974],"1f91e8db":[()=>n.e(6381).then(n.t.bind(n,1922,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-self-hosting-a07.json",1922],20595907:[()=>n.e(8582).then(n.bind(n,7445)),"@site/../docs/guides/self-hosting/kubernetes.mdx",7445],"21880a4d":[()=>n.e(749).then(n.bind(n,7392)),"@site/../docs/guides/vpn/vpn.md",7392],"25ef1bb8":[()=>n.e(8746).then(n.bind(n,4505)),"@site/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md",4505],"27b0284c":[()=>n.e(4277).then(n.bind(n,5269)),"@site/versioned_docs/version-0.4/concepts/sharing-reserved.md",5269],"288b1075":[()=>n.e(3588).then(n.bind(n,3998)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md",3998],"28f20845":[()=>n.e(8240).then(n.t.bind(n,6933,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-metrics-and-limits-d40.json",6933],"2c440c24":[()=>n.e(3979).then(n.t.bind(n,1209,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-self-hosting-4be.json",1209],"2cc2e835":[()=>Promise.all([n.e(1869),n.e(6946)]).then(n.bind(n,1613)),"@site/versioned_docs/version-0.4/guides/install/windows.mdx",1613],"2da89d45":[()=>Promise.all([n.e(1869),n.e(6332)]).then(n.bind(n,2452)),"@site/../docs/guides/docker-share/index.mdx",2452],"2e812224":[()=>n.e(8471).then(n.bind(n,8611)),"@site/../docs/guides/docker-share/docker_public_share_guide.md",8611],"2fede397":[()=>n.e(7120).then(n.bind(n,1308)),"@site/../docs/guides/agent/linux-service.mdx",1308],"339d500a":[()=>n.e(7752).then(n.bind(n,82)),"@site/../docs/concepts/tunnels.md",82],"35a60099":[()=>n.e(9148).then(n.bind(n,8808)),"@site/versioned_docs/version-0.4/concepts/sharing-public.mdx",8808],"36b94792":[()=>n.e(3921).then(n.bind(n,3160)),"@site/../docs/guides/drives.mdx",3160],"392083ed":[()=>n.e(4717).then(n.bind(n,9471)),"@site/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx",9471],"3fab0acb":[()=>n.e(351).then(n.bind(n,3822)),"@site/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx",3822],"4277b6a0":[()=>n.e(8436).then(n.bind(n,7552)),"@site/versioned_docs/version-0.4/guides/permission-modes.md",7552],"43e1c8e4":[()=>n.e(8528).then(n.bind(n,7994)),"@site/../docs/guides/agent/windows-service/index.mdx",7994],"47881d5c":[()=>Promise.all([n.e(1869),n.e(5394),n.e(382),n.e(4927)]).then(n.bind(n,1574)),"@site/../docs/guides/install/linux.mdx",1574],48341697:[()=>n.e(9471).then(n.bind(n,4392)),"@site/versioned_docs/version-0.4/guides/vpn/vpn.md",4392],"4cb7be2f":[()=>n.e(3574).then(n.t.bind(n,9264,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-metrics-and-limits-6f7.json",9264],"4f1777fd":[()=>n.e(277).then(n.bind(n,7513)),"@site/../docs/guides/self-hosting/self-service-invite.mdx",7513],"50ef9c44":[()=>n.e(429).then(n.bind(n,7928)),"@site/../docs/concepts/hosting.md",7928],"54fa7005":[()=>n.e(8675).then(n.bind(n,1806)),"@site/../docs/concepts/sharing-public.mdx",1806],"5cd0a723":[()=>n.e(4074).then(n.bind(n,2388)),"@site/../docs/guides/self-hosting/instance-configuration.mdx",2388],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"600b2345":[()=>n.e(9355).then(n.bind(n,3989)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md",3989],"61ea36d9":[()=>n.e(9576).then(n.bind(n,9140)),"@site/versioned_docs/version-0.4/concepts/opensource.md",9140],"6272ba0e":[()=>n.e(7242).then(n.bind(n,2816)),"@site/../docs/concepts/sharing-reserved.md",2816],"685bed1a":[()=>n.e(5689).then(n.bind(n,654)),"@site/versioned_docs/version-0.4/guides/self-hosting/docker.mdx",654],"6a6a5bbc":[()=>n.e(2867).then(n.bind(n,2468)),"@site/versioned_docs/version-0.4/concepts/files.md",2468],"6ad1709d":[()=>n.e(6063).then(n.t.bind(n,9345,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-b8d.json",9345],"6e881e32":[()=>n.e(3373).then(n.bind(n,9864)),"@site/../docs/guides/self-hosting/oauth/configuring-oauth.md",9864],"71c8a211":[()=>n.e(1421).then(n.bind(n,4999)),"@site/../docs/guides/agent/index.mdx",4999],"7452427d":[()=>n.e(9476).then(n.bind(n,4674)),"@site/../docs/guides/self-hosting/personalized-frontend.md",4674],"75b20590":[()=>n.e(9025).then(n.bind(n,6992)),"@site/../docs/concepts/opensource.md",6992],"7d0a541a":[()=>n.e(4466).then(n.bind(n,2454)),"@site/versioned_docs/version-0.4/concepts/index.md",2454],"7dd0c8d0":[()=>n.e(471).then(n.bind(n,1796)),"@site/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx",1796],"7f5ec875":[()=>n.e(1939).then(n.bind(n,7433)),"@site/../docs/guides/self-hosting/organizations.md",7433],80941509:[()=>n.e(1831).then(n.t.bind(n,3799,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-oauth-b74.json",3799],"81fb89b8":[()=>n.e(8301).then(n.bind(n,599)),"@site/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md",599],"8a9ffb5d":[()=>Promise.all([n.e(1869),n.e(1864)]).then(n.bind(n,2158)),"@site/versioned_docs/version-0.4/getting-started.mdx",2158],"8b4ddd1a":[()=>n.e(5955).then(n.bind(n,1770)),"@site/versioned_docs/version-0.4/guides/drives.mdx",1770],"8dbf8f84":[()=>n.e(5117).then(n.bind(n,9754)),"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md",9754],"901ef07d":[()=>n.e(9033).then(n.bind(n,8628)),"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md",8628],"9939c4f4":[()=>n.e(598).then(n.bind(n,4551)),"@site/../docs/guides/self-hosting/interstitial-page.md",4551],"9af26a4e":[()=>n.e(9631).then(n.t.bind(n,773,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-guides-95a.json",773],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,2151)),"@theme/DocVersionRoot",2151],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aad6478e:[()=>n.e(1769).then(n.bind(n,4889)),"@site/../docs/concepts/sharing-private.mdx",4889],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],adf8dca1:[()=>n.e(8051).then(n.bind(n,3626)),"@site/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx",3626],b36bb0c9:[()=>n.e(4504).then(n.bind(n,548)),"@site/versioned_docs/version-0.4/guides/self-hosting/organizations.md",548],b6569025:[()=>Promise.all([n.e(1869),n.e(714)]).then(n.bind(n,9579)),"@site/../docs/guides/install/index.mdx",9579],bbbe662c:[()=>n.e(1057).then(n.bind(n,942)),"@site/../docs/guides/docker-share/docker_private_share_guide.md",942],bc32cbb6:[()=>n.e(826).then(n.bind(n,6272)),"@site/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md",6272],bc747cac:[()=>n.e(4909).then(n.bind(n,487)),"@site/../docs/concepts/index.md",487],bf372175:[()=>n.e(6974).then(n.bind(n,6603)),"@site/versioned_docs/version-0.4/concepts/hosting.md",6603],bfe99541:[()=>n.e(3434).then(n.bind(n,5937)),"@site/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md",5937],c015c796:[()=>n.e(887).then(n.bind(n,2711)),"@site/../docs/concepts/files.md",2711],c141421f:[()=>n.e(957).then(n.t.bind(n,936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",936],c304be44:[()=>Promise.all([n.e(1869),n.e(3786)]).then(n.bind(n,6143)),"@site/../docs/guides/install/windows.mdx",6143],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,192)),"@site/src/pages/index.js",192],c88279fc:[()=>n.e(3165).then(n.bind(n,3154)),"@site/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md",3154],cda0d2e5:[()=>Promise.all([n.e(1869),n.e(5394),n.e(382),n.e(962),n.e(2757)]).then(n.bind(n,4888)),"@site/../docs/guides/frontdoor.mdx",4888],ce04f2ae:[()=>n.e(6289).then(n.bind(n,3222)),"@site/versioned_docs/version-0.4/concepts/sharing-private.mdx",3222],d087459a:[()=>n.e(627).then(n.t.bind(n,892,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-myzrok-95a.json",892],d3a54718:[()=>n.e(1346).then(n.bind(n,2758)),"@site/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx",2758],d768dc0f:[()=>n.e(4247).then(n.bind(n,1916)),"@site/../docs/guides/self-hosting/linux/index.mdx",1916],e1dfe4fe:[()=>n.e(3423).then(n.bind(n,2465)),"@site/../docs/guides/self-hosting/docker.mdx",2465],e2c4d679:[()=>n.e(9253).then(n.t.bind(n,9166,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-oauth-81c.json",9166],e3e0bfdc:[()=>n.e(9851).then(n.t.bind(n,1349,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-guides-4f1.json",1349],ebc0e2a0:[()=>Promise.all([n.e(1869),n.e(5394),n.e(382),n.e(962),n.e(37)]).then(n.bind(n,834)),"@site/versioned_docs/version-0.4/guides/frontdoor.mdx",834],ecf841c3:[()=>n.e(9002).then(n.bind(n,3964)),"@site/versioned_docs/version-0.4/concepts/tunnels.md",3964],ef8afbfd:[()=>n.e(9905).then(n.bind(n,9530)),"@site/../docs/guides/self-hosting/linux/nginx.mdx",9530],f7af5a99:[()=>n.e(7599).then(n.t.bind(n,2144,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-myzrok-735.json",2144],f888b719:[()=>Promise.all([n.e(1869),n.e(4470)]).then(n.bind(n,2410)),"@site/../docs/getting-started.mdx",2410],f8f494be:[()=>n.e(5695).then(n.bind(n,9438)),"@site/versioned_docs/version-0.4/guides/linux-user-share/index.mdx",9438]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const f=[{path:"/search/",component:d("/search/","21e"),exact:!0},{path:"/docs/",component:d("/docs/","f20"),routes:[{path:"/docs/0.4/",component:d("/docs/0.4/","81e"),routes:[{path:"/docs/0.4/",component:d("/docs/0.4/","33b"),routes:[{path:"/docs/0.4/category/guides/",component:d("/docs/0.4/category/guides/","038"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/metrics-and-limits/",component:d("/docs/0.4/category/metrics-and-limits/","011"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/myzrok/",component:d("/docs/0.4/category/myzrok/","66c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/oauth/",component:d("/docs/0.4/category/oauth/","491"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/self-hosting/",component:d("/docs/0.4/category/self-hosting/","eab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/",component:d("/docs/0.4/concepts/","5db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/files/",component:d("/docs/0.4/concepts/files/","c0e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/hosting/",component:d("/docs/0.4/concepts/hosting/","ea5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/http/",component:d("/docs/0.4/concepts/http/","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/opensource/",component:d("/docs/0.4/concepts/opensource/","050"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-private/",component:d("/docs/0.4/concepts/sharing-private/","ab6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-public/",component:d("/docs/0.4/concepts/sharing-public/","361"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-reserved/",component:d("/docs/0.4/concepts/sharing-reserved/","4c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/tunnels/",component:d("/docs/0.4/concepts/tunnels/","241"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/getting-started/",component:d("/docs/0.4/getting-started/","acc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/",component:d("/docs/0.4/guides/docker-share/","4d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/docker_private_share_guide/",component:d("/docs/0.4/guides/docker-share/docker_private_share_guide/","e49"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/docker_public_share_guide/",component:d("/docs/0.4/guides/docker-share/docker_public_share_guide/","b4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/drives/",component:d("/docs/0.4/guides/drives/","186"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/frontdoor/",component:d("/docs/0.4/guides/frontdoor/","107"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/",component:d("/docs/0.4/guides/install/","4db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/linux/",component:d("/docs/0.4/guides/install/linux/","1df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/macos/",component:d("/docs/0.4/guides/install/macos/","8c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/windows/",component:d("/docs/0.4/guides/install/windows/","d0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/linux-user-share/",component:d("/docs/0.4/guides/linux-user-share/","a76"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/permission-modes/",component:d("/docs/0.4/guides/permission-modes/","895"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/docker/",component:d("/docs/0.4/guides/self-hosting/docker/","e7e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/instance-configuration/",component:d("/docs/0.4/guides/self-hosting/instance-configuration/","fe9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/interstitial-page/",component:d("/docs/0.4/guides/self-hosting/interstitial-page/","0e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/kubernetes/",component:d("/docs/0.4/guides/self-hosting/kubernetes/","751"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/linux/",component:d("/docs/0.4/guides/self-hosting/linux/","3db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/linux/nginx/",component:d("/docs/0.4/guides/self-hosting/linux/nginx/","d5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/",component:d("/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/","c58"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/",component:d("/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/","5db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/oauth/configuring-oauth/",component:d("/docs/0.4/guides/self-hosting/oauth/configuring-oauth/","fc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/organizations/",component:d("/docs/0.4/guides/self-hosting/organizations/","587"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/personalized-frontend/",component:d("/docs/0.4/guides/self-hosting/personalized-frontend/","555"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/self-service-invite/",component:d("/docs/0.4/guides/self-hosting/self-service-invite/","7d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/vpn/",component:d("/docs/0.4/guides/vpn/","df1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/myzrok/custom-domains/",component:d("/docs/0.4/myzrok/custom-domains/","25a"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/",component:d("/docs/","5a5"),routes:[{path:"/docs/",component:d("/docs/","a12"),routes:[{path:"/docs/category/guides/",component:d("/docs/category/guides/","c07"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/metrics-and-limits/",component:d("/docs/category/metrics-and-limits/","9f2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/myzrok/",component:d("/docs/category/myzrok/","784"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/oauth/",component:d("/docs/category/oauth/","b50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/self-hosting/",component:d("/docs/category/self-hosting/","cad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/",component:d("/docs/concepts/","76a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/files/",component:d("/docs/concepts/files/","331"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/hosting/",component:d("/docs/concepts/hosting/","fea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/http/",component:d("/docs/concepts/http/","d68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/opensource/",component:d("/docs/concepts/opensource/","94c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-private/",component:d("/docs/concepts/sharing-private/","7b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-public/",component:d("/docs/concepts/sharing-public/","c3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-reserved/",component:d("/docs/concepts/sharing-reserved/","5d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/tunnels/",component:d("/docs/concepts/tunnels/","f73"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/getting-started/",component:d("/docs/getting-started/","fdf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/",component:d("/docs/guides/agent/","d0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/linux-service/",component:d("/docs/guides/agent/linux-service/","8a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/windows-service/",component:d("/docs/guides/agent/windows-service/","9a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/",component:d("/docs/guides/docker-share/","7d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_private_share_guide/",component:d("/docs/guides/docker-share/docker_private_share_guide/","927"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_public_share_guide/",component:d("/docs/guides/docker-share/docker_public_share_guide/","ccf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/drives/",component:d("/docs/guides/drives/","8a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/frontdoor/",component:d("/docs/guides/frontdoor/","e30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/",component:d("/docs/guides/install/","aa4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/linux/",component:d("/docs/guides/install/linux/","0c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/macos/",component:d("/docs/guides/install/macos/","532"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/windows/",component:d("/docs/guides/install/windows/","ad4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/permission-modes/",component:d("/docs/guides/permission-modes/","d45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/docker/",component:d("/docs/guides/self-hosting/docker/","5a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/instance-configuration/",component:d("/docs/guides/self-hosting/instance-configuration/","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/interstitial-page/",component:d("/docs/guides/self-hosting/interstitial-page/","90e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/kubernetes/",component:d("/docs/guides/self-hosting/kubernetes/","37d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/",component:d("/docs/guides/self-hosting/linux/","d78"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/nginx/",component:d("/docs/guides/self-hosting/linux/nginx/","b26"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-limits/","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/","0a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/oauth/configuring-oauth/",component:d("/docs/guides/self-hosting/oauth/configuring-oauth/","b5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/organizations/",component:d("/docs/guides/self-hosting/organizations/","369"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/personalized-frontend/",component:d("/docs/guides/self-hosting/personalized-frontend/","567"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/self-service-invite/",component:d("/docs/guides/self-hosting/self-service-invite/","532"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/vpn/",component:d("/docs/guides/vpn/","13f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/myzrok/custom-domains/",component:d("/docs/myzrok/custom-domains/","c1c"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(8193);const c=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),f=n(2831),p=n(4848);function m(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5260),g=n(4586),y=n(6025),b=n(6342),v=n(9024),w=n(2131),S=n(4090),k=n(2967),x=n(440),E=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function j(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,x.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function O(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:S.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(j,{}),(0,p.jsx)(_,{}),(0,p.jsx)(E.A,{tag:k.C,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const C=new Map;var A=n(6125),T=n(6988),P=n(205);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const L=D,M="__docusaurus-base-url-issue-banner-suggestion-container";function F(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${M}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${M}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function z(){const{siteConfig:{baseUrl:e}}=(0,g.A)();return(0,p.jsx)(p.Fragment,{children:!l.A.canUseDOM&&(0,p.jsx)(h.A,{children:(0,p.jsx)("script",{children:F(e)})})})}function B(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,p.jsx)(z,{}):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,g.A)(),a=(0,y.Ay)(e),{htmlLang:i,direction:s}=o[r];return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("html",{lang:i,dir:s}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:a})]})}var q=n(7489),$=n(2303);function H(){const e=(0,$.A)();return(0,p.jsx)(h.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}const V=(0,f.v)(u.A);function G(){const e=function(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,f.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(L,{location:e,children:V})}function W(){return(0,p.jsx)(q.A,{children:(0,p.jsx)(T.l,{children:(0,p.jsxs)(A.x,{children:[(0,p.jsxs)(m,{children:[(0,p.jsx)(U,{}),(0,p.jsx)(O,{}),(0,p.jsx)(B,{}),(0,p.jsx)(G,{})]}),(0,p.jsx)(H,{})]})})})}var K=n(4054);const Q=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Y=n(6921);const Z=new Set,J=new Set,X=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch:e=>{if(!(e=>!X()&&!J.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,f.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!X()&&!J.has(e))(e)&&(J.add(e),N(e))},te=Object.freeze(ee);function ne(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const re=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.vd,{children:(0,p.jsx)(ne,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(re)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};N(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"1.0","isLast":true,"path":"/docs","mainDocId":"getting-started","docs":[{"id":"concepts/files","path":"/docs/concepts/files","sidebar":"tutorialSidebar"},{"id":"concepts/hosting","path":"/docs/concepts/hosting","sidebar":"tutorialSidebar"},{"id":"concepts/http","path":"/docs/concepts/http","sidebar":"tutorialSidebar"},{"id":"concepts/index","path":"/docs/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/opensource","path":"/docs/concepts/opensource","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-private","path":"/docs/concepts/sharing-private","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-public","path":"/docs/concepts/sharing-public","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-reserved","path":"/docs/concepts/sharing-reserved","sidebar":"tutorialSidebar"},{"id":"concepts/tunnels","path":"/docs/concepts/tunnels","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/docs/getting-started","sidebar":"tutorialSidebar"},{"id":"guides/agent/index","path":"/docs/guides/agent/","sidebar":"tutorialSidebar"},{"id":"guides/agent/linux-service","path":"/docs/guides/agent/linux-service","sidebar":"tutorialSidebar"},{"id":"guides/agent/windows-service/index","path":"/docs/guides/agent/windows-service/","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_private_share_guide","path":"/docs/guides/docker-share/docker_private_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_public_share_guide","path":"/docs/guides/docker-share/docker_public_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/index","path":"/docs/guides/docker-share/","sidebar":"tutorialSidebar"},{"id":"guides/drives","path":"/docs/guides/drives","sidebar":"tutorialSidebar"},{"id":"guides/frontdoor","path":"/docs/guides/frontdoor","sidebar":"tutorialSidebar"},{"id":"guides/install/index","path":"/docs/guides/install/","sidebar":"tutorialSidebar"},{"id":"guides/install/linux","path":"/docs/guides/install/linux","sidebar":"tutorialSidebar"},{"id":"guides/install/macos","path":"/docs/guides/install/macos","sidebar":"tutorialSidebar"},{"id":"guides/install/windows","path":"/docs/guides/install/windows","sidebar":"tutorialSidebar"},{"id":"guides/permission-modes","path":"/docs/guides/permission-modes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/docker","path":"/docs/guides/self-hosting/docker","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/instance-configuration","path":"/docs/guides/self-hosting/instance-configuration","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/interstitial-page","path":"/docs/guides/self-hosting/interstitial-page","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/kubernetes","path":"/docs/guides/self-hosting/kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/index","path":"/docs/guides/self-hosting/linux/","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/nginx","path":"/docs/guides/self-hosting/linux/nginx","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/oauth/configuring-oauth","path":"/docs/guides/self-hosting/oauth/configuring-oauth","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/organizations","path":"/docs/guides/self-hosting/organizations","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/personalized-frontend","path":"/docs/guides/self-hosting/personalized-frontend","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/self-service-invite","path":"/docs/guides/self-hosting/self-service-invite","sidebar":"tutorialSidebar"},{"id":"guides/vpn/vpn","path":"/docs/guides/vpn/","sidebar":"tutorialSidebar"},{"id":"myzrok/custom-domains/index","path":"/docs/myzrok/custom-domains/","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/docs/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/self-hosting","path":"/docs/category/self-hosting","sidebar":"tutorialSidebar"},{"id":"/category/metrics-and-limits","path":"/docs/category/metrics-and-limits","sidebar":"tutorialSidebar"},{"id":"/category/oauth","path":"/docs/category/oauth","sidebar":"tutorialSidebar"},{"id":"/category/myzrok","path":"/docs/category/myzrok","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/getting-started","label":"Getting Started"}}}},{"name":"0.4","label":"0.4","isLast":false,"path":"/docs/0.4","mainDocId":"getting-started","docs":[{"id":"concepts/files","path":"/docs/0.4/concepts/files","sidebar":"tutorialSidebar"},{"id":"concepts/hosting","path":"/docs/0.4/concepts/hosting","sidebar":"tutorialSidebar"},{"id":"concepts/http","path":"/docs/0.4/concepts/http","sidebar":"tutorialSidebar"},{"id":"concepts/index","path":"/docs/0.4/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/opensource","path":"/docs/0.4/concepts/opensource","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-private","path":"/docs/0.4/concepts/sharing-private","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-public","path":"/docs/0.4/concepts/sharing-public","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-reserved","path":"/docs/0.4/concepts/sharing-reserved","sidebar":"tutorialSidebar"},{"id":"concepts/tunnels","path":"/docs/0.4/concepts/tunnels","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/docs/0.4/getting-started","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_private_share_guide","path":"/docs/0.4/guides/docker-share/docker_private_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_public_share_guide","path":"/docs/0.4/guides/docker-share/docker_public_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/index","path":"/docs/0.4/guides/docker-share/","sidebar":"tutorialSidebar"},{"id":"guides/drives","path":"/docs/0.4/guides/drives","sidebar":"tutorialSidebar"},{"id":"guides/frontdoor","path":"/docs/0.4/guides/frontdoor","sidebar":"tutorialSidebar"},{"id":"guides/install/index","path":"/docs/0.4/guides/install/","sidebar":"tutorialSidebar"},{"id":"guides/install/linux","path":"/docs/0.4/guides/install/linux","sidebar":"tutorialSidebar"},{"id":"guides/install/macos","path":"/docs/0.4/guides/install/macos","sidebar":"tutorialSidebar"},{"id":"guides/install/windows","path":"/docs/0.4/guides/install/windows","sidebar":"tutorialSidebar"},{"id":"guides/linux-user-share/index","path":"/docs/0.4/guides/linux-user-share/","sidebar":"tutorialSidebar"},{"id":"guides/permission-modes","path":"/docs/0.4/guides/permission-modes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/docker","path":"/docs/0.4/guides/self-hosting/docker","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/instance-configuration","path":"/docs/0.4/guides/self-hosting/instance-configuration","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/interstitial-page","path":"/docs/0.4/guides/self-hosting/interstitial-page","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/kubernetes","path":"/docs/0.4/guides/self-hosting/kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/index","path":"/docs/0.4/guides/self-hosting/linux/","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/nginx","path":"/docs/0.4/guides/self-hosting/linux/nginx","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","path":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","path":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/oauth/configuring-oauth","path":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/organizations","path":"/docs/0.4/guides/self-hosting/organizations","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/personalized-frontend","path":"/docs/0.4/guides/self-hosting/personalized-frontend","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/self-service-invite","path":"/docs/0.4/guides/self-hosting/self-service-invite","sidebar":"tutorialSidebar"},{"id":"guides/vpn/vpn","path":"/docs/0.4/guides/vpn/","sidebar":"tutorialSidebar"},{"id":"myzrok/custom-domains/index","path":"/docs/0.4/myzrok/custom-domains/","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/docs/0.4/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/self-hosting","path":"/docs/0.4/category/self-hosting","sidebar":"tutorialSidebar"},{"id":"/category/metrics-and-limits","path":"/docs/0.4/category/metrics-and-limits","sidebar":"tutorialSidebar"},{"id":"/category/oauth","path":"/docs/0.4/category/oauth","sidebar":"tutorialSidebar"},{"id":"/category/myzrok","path":"/docs/0.4/category/myzrok","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/0.4/getting-started","label":"Getting Started"}}}}],"breadcrumbs":true}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-MDFLZPK8","id":"default"}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.6.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.6.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.6.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.6.0"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.6.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.6.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.6.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.6.0"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.6.0"},"custom-webpack-plugin":{"type":"local"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(1957),l=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(p,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:S}=v,k=v.future.experimental_router,{withBaseUrl:x}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const j=f||p;const O=(0,s.A)(j),C=j?.replace("pathname://","");let A=void 0!==C?(T=C,y&&(e=>e.startsWith("/"))(T)?x(T):T):void 0;var T;"hash"===k&&A?.startsWith("./")&&(A=A?.slice(1)),A&&O&&(A=(0,a.Ks)(A,{trailingSlash:w,baseUrl:S}));const P=(0,r.useRef)(!1),I=n?o.k2:o.N_,R=l.A.canUseIntersectionObserver,N=(0,r.useRef)(),D=()=>{P.current||null==A||(window.docusaurus.preload(A),P.current=!0)};(0,r.useEffect)((()=>(!R&&O&&l.A.canUseDOM&&null!=A&&window.docusaurus.prefetch(A),()=>{R&&N.current&&N.current.disconnect()})),[N,A,R,O]);const L=A?.startsWith("#")??!1,M=!b.target||"_self"===b.target,F=!A||!O||!M||L&&"hash"!==k;g||!L&&F||E.collectLink(A),b.id&&E.collectAnchor(b.id);const z={};return F?(0,d.jsx)("a",{ref:_,href:A,...j&&!O&&{target:"_blank",rel:"noopener noreferrer"},...b,...z}):(0,d.jsx)(I,{...b,onMouseEnter:D,onTouchStart:D,innerRef:e=>{_.current=e,R&&e&&O&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),N.current.observe(e))},to:A,...n&&{isActive:h,activeClassName:m},...z})}const p=r.forwardRef(f)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>b});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(679),l=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,c.jsx)(p.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(h,{children:t})}function y(){const e=(0,r.useContext)(p);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},2565:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(4070),o=n(3886);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{$S:()=>m,B5:()=>_,Nr:()=>p,OF:()=>S,QB:()=>E,Vd:()=>k,Y:()=>v,cC:()=>f,d1:()=>j,fW:()=>x,w8:()=>y});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(9169),l=n(1682),c=n(3886),u=n(3025),d=n(609);function f(e){const t=(0,u.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function m(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),g=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||g(e.items,t))}function b(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function S(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function j(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>y,vT:()=>p,gk:()=>m,Gy:()=>d,HW:()=>b,ht:()=>f,r7:()=>g,jh:()=>h});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return s(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return c(t,n)}function b(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";var r=n(4876),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},1957:(e,t,n)=>{"use strict";n.d(t,{A:()=>jt});var r=n(6540),o=n(8215),a=n(7489),i=n(9024),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:b.skipToContent})}var w=n(6342),S=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",x.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function j(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const O={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:O.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:O.announcementBarPlaceholder}),(0,u.jsx)(j,{className:O.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:O.announcementBarClose})]})}var A=n(2069),T=n(3104);var P=n(9532),I=n(5600);const R=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,A.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,P.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(R.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function L(){const e=(0,r.useContext)(R);if(!e)throw new P.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=L();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const q={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(q.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",q.toggleButton,!i&&q.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite","aria-pressed":"dark"===r?"true":"false",children:[(0,u.jsx)(B,{className:(0,o.A)(q.toggleIcon,q.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.A)(q.toggleIcon,q.darkToggleIcon)})]})})}const H=r.memo($),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(3465);function K(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,A.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(8774),J=n(6025),X=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,J.Ay)(r),f=(0,J.Ay)(t),p=(0,J.Ay)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,X.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?p:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(f)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce="dropdownNavbarItemMobile_S0Fm";function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Fe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Fe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",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"})})}const ge="iconLanguage_nlXk";var ye=n(961),be=n(3219),ve=n(5260),we=n(4255),Se=n(1062),ke=n(2967),xe=n(2565);function Ee(){return[`language:${(0,le.A)().i18n.currentLocale}`,function(){const e=(0,xe.v)();return[ke.C,...e]}().map((e=>`docusaurus_tag:${e}`))]}const _e={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let je=null;function Oe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Ce(e){let{state:t,onClose:n}=e;const r=(0,we.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Ae(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.A)(),l=(0,Se.C)(),c=Ee(),d=a.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,p={...a.searchParameters,facetFilters:f},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[y,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),S=(0,r.useCallback)((()=>je?Promise.resolve():Promise.all([n.e(8158).then(n.bind(n,8158)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;je=t}))),[]),k=(0,r.useCallback)((()=>{if(!h.current){const e=document.createElement("div");h.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),x=(0,r.useCallback)((()=>{k(),S().then((()=>b(!0)))}),[S,k]),E=(0,r.useCallback)((()=>{b(!1),g.current?.focus()}),[]),_=(0,r.useCallback)((e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),w(e.key),x())}),[x]),j=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(o,t)?window.location.href=t:m.push(t)}}).current,O=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,C=(0,r.useMemo)((()=>e=>(0,u.jsx)(Ce,{...e,onClose:E})),[E]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return(0,be.E8)({isOpen:y,onOpen:x,onClose:E,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ve.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(be.Bc,{onTouchStart:S,onFocus:S,onMouseOver:S,onClick:x,ref:g,translations:_e.button}),y&&je&&h.current&&(0,ye.createPortal)((0,u.jsx)(je,{onClose:E,initialScrollY:window.scrollY,initialQuery:v,navigator:j,transformItems:O,hitComponent:Oe,transformSearchClient:A,...a.searchPagePath&&{resultsFooterComponent:C},...a,searchParameters:p,placeholder:_e.placeholder,translations:_e.modal}),h.current)]})}function Te(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(Ae,{...e.themeConfig.algolia})}const Pe={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ie(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Pe.navbarSearchContainer),children:t})}var Re=n(4070),Ne=n(6972);var De=n(3886);function Le(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Me={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),f=(0,me.o)(),{search:p,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ie,{className:n,children:(0,u.jsx)(Te,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Re.zK)(r),i=(0,Ne.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Re.zK)(r),i=(0,Ne.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Ne.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),f=(0,Re.zK)(n),p=(0,Re.jh)(n),{savePreferredVersionName:m}=(0,De.g1)(n),h=[...o,...p.map((function(e){const t=Le(e,f);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,Ne.Vd)(n)[0],y=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&h.length>1?void 0:Le(g,f).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function Fe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Me[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function ze(){const e=(0,A.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Fe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Be(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ue(){const e=0===(0,w.p)().navbar.items.length,t=L();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Be,{onClick:()=>t.hide()}),t.content]})}function qe(){const e=(0,A.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(ze,{}),secondaryMenu:(0,u.jsx)(Ue,{})}):null}const $e={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function He(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ve(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,A.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,T.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[$e.navbarHideable,!d&&$e.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(He,{onClick:i.toggle}),(0,u.jsx)(qe,{})]})}var Ge=n(440);const We={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ke(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Qe(e){let{error:t}=e;const n=(0,Ge.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:We.errorBoundaryError,children:n})}class Ye extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ze="right";function Je(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Xe(){const{toggle:e,shown:t}=(0,A.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Je,{})})}const et={colorModeToggle:"colorModeToggle_DEke"};function tt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ye,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Fe,{...e})},t)))})}function nt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function rt(){const e=(0,A.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ze)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(nt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Xe,{}),(0,u.jsx)(K,{}),(0,u.jsx)(tt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(tt,{items:r}),(0,u.jsx)(G,{className:et.colorModeToggle}),!o&&(0,u.jsx)(Ie,{children:(0,u.jsx)(Te,{})})]})})}function ot(){return(0,u.jsx)(Ve,{children:(0,u.jsx)(rt,{})})}function at(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,J.Ay)(n),l=(0,J.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,X.A)(r)&&(0,u.jsx)(te.A,{})]})}function it(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(at,{item:t})},t.href??t.to)}function st(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(it,{item:e},t)))})]})}function lt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(st,{column:e},t)))})}function ct(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ut(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(at,{item:t})}function dt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(ut,{item:e}),t.length!==n+1&&(0,u.jsx)(ct,{})]},n)))})})}function ft(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(lt,{columns:t}):(0,u.jsx)(dt,{links:t})}var pt=n(1122);const mt="footerLogoLink_BH7S";function ht(e){let{logo:t}=e;const{withBaseUrl:n}=(0,J.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(pt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function gt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:mt,target:t.target,children:(0,u.jsx)(ht,{logo:t})}):(0,u.jsx)(ht,{logo:t})}function yt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function bt(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function vt(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(bt,{style:o,links:n&&n.length>0&&(0,u.jsx)(ft,{links:n}),logo:r&&(0,u.jsx)(gt,{logo:r}),copyright:t&&(0,u.jsx)(yt,{copyright:t})})}const wt=r.memo(vt),St=(0,P.fM)([F.a,S.o,T.Tv,De.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(A.e,{children:(0,u.jsx)(N,{children:t})})})}]);function kt(e){let{children:t}=e;return(0,u.jsx)(St,{children:t})}var xt=n(1107);function Et(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(xt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Ke,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Qe,{error:t})})]})})})}const _t={mainWrapper:"mainWrapper_z2l0"};function jt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,u.jsxs)(kt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(C,{}),(0,u.jsx)(ot,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,_t.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Et,{...e}),children:t})}),!n&&(0,u.jsx)(wt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,o.Ay)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return f(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(6540),o=n(2303),a=n(679),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&f(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(679),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,m=e=>o.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function f(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function p(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>s,w:()=>l});var r=n(6540),o=n(4586),a=n(7485);const i="q";function s(){return(0,a.l)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(4586);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>l,l:()=>c});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=l(e)??"",n=function(e){const t=(0,o.W6)();return(0,r.useCallback)(((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})}),[e,t])}(e);return[t,n]}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{XI:()=>r,sb:()=>o})},9024:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>d,Jx:()=>m});var r=n(6540),o=n(5066),a=n(5260),i=n(3102);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),c=n(481),u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.s)(t),{withBaseUrl:d}=(0,l.hH)(),f=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.A,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,u.jsx)("meta",{property:"og:image",content:f}),f&&(0,u.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),s=(0,o.A)(i,t);return(0,u.jsxs)(f.Provider,{value:s,children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>u,a_:()=>m,gk:()=>h});var r=n(6540),o=n(8193),a=n(2303),i=n(205),s=n(9532),l=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const f=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(f()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=f();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function m(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function h(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(4586);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>s});var r=n(6540),o=n(1252),a=n(6025),i=n(8126);function s(){const{withBaseUrl:e}=(0,a.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},9231:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>A,yJ:()=>h,sC:()=>P,AO:()=>m,Fu:()=>g});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=s(t),o=s(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(1561);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function h(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function y(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var b=!("undefined"==typeof window||!window.document||!window.document.createElement);function v(e,t){t(window.confirm(e))}var w="popstate",S="hashchange";function k(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),b||(0,c.A)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,s=i.forceRefresh,l=void 0!==s&&s,d=i.getUserConfirmation,g=void 0===d?v:d,x=i.keyLength,E=void 0===x?6:x,_=e.basename?p(u(e.basename)):"";function j(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return _&&(a=f(a,_)),h(a,r,n)}function O(){return Math.random().toString(36).substr(2,E)}var C=y();function A(e){(0,r.A)(U,e),U.length=n.length,C.notifyListeners(U.location,U.action)}function T(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(j(e.state))}function P(){R(j(k()))}var I=!1;function R(e){if(I)I=!1,A();else{C.confirmTransitionTo(e,"POP",g,(function(t){t?A({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(I=!0,M(o))}(e)}))}}var N=j(k()),D=[N.key];function L(e){return _+m(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(w,T),a&&window.addEventListener(S,P)):0===F&&(window.removeEventListener(w,T),a&&window.removeEventListener(S,P))}var B=!1;var U={length:n.length,action:"POP",location:N,createHref:L,push:function(e,t){var r="PUSH",a=h(e,t,O(),U.location);C.confirmTransitionTo(a,r,g,(function(e){if(e){var t=L(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),l)window.location.href=t;else{var c=D.indexOf(U.location.key),u=D.slice(0,c+1);u.push(a.key),D=u,A({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,O(),U.location);C.confirmTransitionTo(a,r,g,(function(e){if(e){var t=L(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),l)window.location.replace(t);else{var c=D.indexOf(U.location.key);-1!==c&&(D[c]=a.key),A({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=C.appendListener(e);return z(1),function(){z(-1),t()}}};return U}var E="hashchange",_={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:u},slash:{encodePath:u,decodePath:u}};function j(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function O(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function C(e){window.location.replace(j(window.location.href)+"#"+e)}function A(e){void 0===e&&(e={}),b||(0,c.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?v:o,i=n.hashType,s=void 0===i?"slash":i,l=e.basename?p(u(e.basename)):"",d=_[s],g=d.encodePath,w=d.decodePath;function S(){var e=w(O());return l&&(e=f(e,l)),h(e)}var k=y();function x(e){(0,r.A)(B,e),B.length=t.length,k.notifyListeners(B.location,B.action)}var A=!1,T=null;function P(){var e,t,n=O(),r=g(n);if(n!==r)C(r);else{var o=S(),i=B.location;if(!A&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(T===m(o))return;T=null,function(e){if(A)A=!1,x();else{var t="POP";k.confirmTransitionTo(e,t,a,(function(n){n?x({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(m(t));-1===n&&(n=0);var r=D.lastIndexOf(m(e));-1===r&&(r=0);var o=n-r;o&&(A=!0,L(o))}(e)}))}}(o)}}var I=O(),R=g(I);I!==R&&C(R);var N=S(),D=[m(N)];function L(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(E,P):0===M&&window.removeEventListener(E,P)}var z=!1;var B={length:t.length,action:"POP",location:N,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=j(window.location.href)),n+"#"+g(l+m(e))},push:function(e,t){var n="PUSH",r=h(e,void 0,void 0,B.location);k.confirmTransitionTo(r,n,a,(function(e){if(e){var t=m(r),o=g(l+t);if(O()!==o){T=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(m(B.location)),i=D.slice(0,a+1);i.push(t),D=i,x({action:n,location:r})}else x()}}))},replace:function(e,t){var n="REPLACE",r=h(e,void 0,void 0,B.location);k.confirmTransitionTo(r,n,a,(function(e){if(e){var t=m(r),o=g(l+t);O()!==o&&(T=t,C(o));var a=D.indexOf(m(B.location));-1!==a&&(D[a]=t),x({action:n,location:r})}}))},go:L,goBack:function(){L(-1)},goForward:function(){L(1)},block:function(e){void 0===e&&(e=!1);var t=k.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=k.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function P(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=y();function d(e){(0,r.A)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function f(){return Math.random().toString(36).substr(2,c)}var p=T(s,0,a.length-1),g=a.map((function(e){return h(e,void 0,"string"==typeof e?f():e.key||f())})),b=m;function v(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:g.length,action:"POP",location:g[p],index:p,entries:g,createHref:b,push:function(e,t){var r="PUSH",o=h(e,t,f(),w.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=h(e,t,f(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=p(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g<i.length;++g){var y=i[g];if(!(a[y]||r&&r[y]||h&&h[y]||s&&s[y])){var b=f(n,y);try{c(t,y,b)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(s+=e.slice(i,p),i=p+d.length,f)s+=f[1];else{var m=e[i],h=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var S=null!=h&&null!=m&&m!==h,k="+"===v||"*"===v,x="?"===v||"*"===v,E=n[2]||u,_=y||b;r.push({name:g||a++,prefix:h||"",delimiter:E,optional:x,repeat:k,partial:S,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+l(E)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=s[u.name];if(null==f){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=l(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var f=l(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=l(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(p(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(a(e,n),t,n)}(e,t,n)}},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++o;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(l),m=u;o(m);){for(var h in f={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var y in d)if(!(y in u))for(var b in p(y))if(b in u){f[y]=!0;break}for(var v in m=f)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(f,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var f in l)d.push(s[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},m={};function h(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var y=/[\-:]([a-z])/g;function b(e){return e[1].toUpperCase()}function v(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(m,e)||!d.call(p,e)&&(f.test(e)?m[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,S=Symbol.for("react.element"),k=Symbol.for("react.portal"),x=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),j=Symbol.for("react.provider"),O=Symbol.for("react.context"),C=Symbol.for("react.forward_ref"),A=Symbol.for("react.suspense"),T=Symbol.for("react.suspense_list"),P=Symbol.for("react.memo"),I=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var R=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var N=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=N&&e[N]||e["@@iterator"])?e:null}var L,M=Object.assign;function F(e){if(void 0===L)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);L=t&&t[1]||""}return"\n"+L+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function U(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case k:return"Portal";case _:return"Profiler";case E:return"StrictMode";case A:return"Suspense";case T:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case O:return(e.displayName||"Context")+".Consumer";case j:return(e._context.displayName||"Context")+".Provider";case C:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case P:return null!==(t=e.displayName||null)?t:q(e.type)||"Memo";case I:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function $(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return q(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function V(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function G(e){e._valueTracker||(e._valueTracker=function(e){var t=V(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=V(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function J(e,t){Z(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function X(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function se(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ye=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function be(e,t){if(t){if(ye[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,xe=null,Ee=null;function _e(e){if(e=wo(e)){if("function"!=typeof ke)throw Error(a(280));var t=e.stateNode;t&&(t=ko(t),ke(e.stateNode,e.type,t))}}function je(e){xe?Ee?Ee.push(e):Ee=[e]:xe=e}function Oe(){if(xe){var e=xe,t=Ee;if(Ee=xe=null,_e(e),t)for(e=0;e<t.length;e++)_e(t[e])}}function Ce(e,t){return e(t)}function Ae(){}var Te=!1;function Pe(e,t,n){if(Te)return e(t,n);Te=!0;try{return Ce(e,t,n)}finally{Te=!1,(null!==xe||null!==Ee)&&(Ae(),Oe())}}function Ie(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Re=!1;if(u)try{var Ne={};Object.defineProperty(Ne,"passive",{get:function(){Re=!0}}),window.addEventListener("test",Ne,Ne),window.removeEventListener("test",Ne,Ne)}catch(ue){Re=!1}function De(e,t,n,r,o,a,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Le=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Le=!0,Me=e}};function Ue(e,t,n,r,o,a,i,s,l){Le=!1,Me=null,De.apply(Be,arguments)}function qe(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function $e(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(qe(e)!==e)throw Error(a(188))}function Ve(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=qe(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ge(e):null}function Ge(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ge(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Ke=o.unstable_cancelCallback,Qe=o.unstable_shouldYield,Ye=o.unstable_requestPaint,Ze=o.unstable_now,Je=o.unstable_getCurrentPriorityLevel,Xe=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&4194240&a))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return!(4194240&(ct<<=1))&&(ct=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function yt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function bt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var St,kt,xt,Et,_t,jt=!1,Ot=[],Ct=null,At=null,Tt=null,Pt=new Map,It=new Map,Rt=[],Nt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":Ct=null;break;case"dragenter":case"dragleave":At=null;break;case"mouseover":case"mouseout":Tt=null;break;case"pointerover":case"pointerout":Pt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":It.delete(t.pointerId)}}function Lt(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=wo(t))&&kt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=vo(e.target);if(null!==t){var n=qe(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=$e(n)))return e.blockedOn=t,void _t(e.priority,(function(){xt(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&kt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){jt=!1,null!==Ct&&Ft(Ct)&&(Ct=null),null!==At&&Ft(At)&&(At=null),null!==Tt&&Ft(Tt)&&(Tt=null),Pt.forEach(zt),It.forEach(zt)}function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,jt||(jt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function qt(e){function t(t){return Ut(t,e)}if(0<Ot.length){Ut(Ot[0],e);for(var n=1;n<Ot.length;n++){var r=Ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Ct&&Ut(Ct,e),null!==At&&Ut(At,e),null!==Tt&&Ut(Tt,e),Pt.forEach(t),It.forEach(t),n=0;n<Rt.length;n++)(r=Rt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Rt.length&&null===(n=Rt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Rt.shift()}var $t=w.ReactCurrentBatchConfig,Ht=!0;function Vt(e,t,n,r){var o=vt,a=$t.transition;$t.transition=null;try{vt=1,Wt(e,t,n,r)}finally{vt=o,$t.transition=a}}function Gt(e,t,n,r){var o=vt,a=$t.transition;$t.transition=null;try{vt=4,Wt(e,t,n,r)}finally{vt=o,$t.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Qt(e,t,n,r);if(null===o)Hr(e,t,r,Kt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return Ct=Lt(Ct,e,t,n,r,o),!0;case"dragenter":return At=Lt(At,e,t,n,r,o),!0;case"mouseover":return Tt=Lt(Tt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Pt.set(a,Lt(Pt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,It.set(a,Lt(It.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Nt.indexOf(e)){for(;null!==o;){var a=wo(o);if(null!==a&&St(a),null===(a=Qt(e,t,n,r))&&Hr(e,t,r,Kt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Kt=null;function Qt(e,t,n,r){if(Kt=null,null!==(e=vo(e=Se(r))))if(null===(t=qe(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=$e(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Kt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Je()){case Xe:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Jt=null,Xt=null;function en(){if(Xt)return Xt;var e,t,n=Jt,r=n.length,o="value"in Zt?Zt.value:Zt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Xt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,sn,ln,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),fn=on(dn),pn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:_n,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=on(pn),hn=on(M({},pn,{dataTransfer:0})),gn=on(M({},dn,{relatedTarget:0})),yn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),bn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=on(bn),wn=on(M({},cn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},xn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=xn[e])&&!!t[e]}function _n(){return En}var jn=M({},dn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?kn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:_n,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),On=on(jn),Cn=on(M({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),An=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:_n})),Tn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=M({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=on(Pn),Rn=[9,13,27,32],Nn=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var Ln=u&&"TextEvent"in window&&!Dn,Mn=u&&(!Nn||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Rn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var qn=!1;var $n={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!$n[e.type]:"textarea"===t}function Vn(e,t,n,r){je(r),0<(t=Gr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,Wn=null;function Kn(e){Fr(e,0)}function Qn(e){if(W(So(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Jn;if(u){var Xn="oninput"in document;if(!Xn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Xn="function"==typeof er.oninput}Jn=Xn}else Jn=!1;Zn=Jn&&(!document.documentMode||9<document.documentMode)}function tr(){Gn&&(Gn.detachEvent("onpropertychange",nr),Wn=Gn=null)}function nr(e){if("value"===e.propertyName&&Qn(Wn)){var t=[];Vn(t,Wn,e,Se(e)),Pe(Kn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Gn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Wn)}function ar(e,t){if("click"===e)return Qn(t)}function ir(e,t){if("input"===e||"change"===e)return Qn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!sr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,yr=null,br=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==gr||gr!==K(r)||("selectionStart"in(r=gr)&&pr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},br&&lr(br,r)||(br=r,0<(r=Gr(yr,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function Sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:Sr("Animation","AnimationEnd"),animationiteration:Sr("Animation","AnimationIteration"),animationstart:Sr("Animation","AnimationStart"),transitionend:Sr("Transition","TransitionEnd")},xr={},Er={};function _r(e){if(xr[e])return xr[e];if(!kr[e])return e;var t,n=kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return xr[e]=n[t];return e}u&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var jr=_r("animationend"),Or=_r("animationiteration"),Cr=_r("animationstart"),Ar=_r("transitionend"),Tr=new Map,Pr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ir(e,t){Tr.set(e,t),l(t,[e])}for(var Rr=0;Rr<Pr.length;Rr++){var Nr=Pr[Rr];Ir(Nr.toLowerCase(),"on"+(Nr[0].toUpperCase()+Nr.slice(1)))}Ir(jr,"onAnimationEnd"),Ir(Or,"onAnimationIteration"),Ir(Cr,"onAnimationStart"),Ir("dblclick","onDoubleClick"),Ir("focusin","onFocus"),Ir("focusout","onBlur"),Ir(Ar,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Lr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,s,l,c){if(Ue.apply(this,arguments),Le){if(!Le)throw Error(a(198));var u=Me;Le=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bubble";n.has(r)||($r(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),$r(n,e,r,t)}var Ur="_reactListening"+Math.random().toString(36).slice(2);function qr(e){if(!e[Ur]){e[Ur]=!0,i.forEach((function(t){"selectionchange"!==t&&(Lr.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Ur]||(t[Ur]=!0,Br("selectionchange",!1,t))}}function $r(e,t,n,r){switch(Yt(t)){case 1:var o=Vt;break;case 4:o=Gt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Re||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=vo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Pe((function(){var r=a,o=Se(n),i=[];e:{var s=Tr.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=On;break;case"focusin":c="focus",l=gn;break;case"focusout":c="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=An;break;case jr:case Or:case Cr:l=yn;break;case Ar:l=Tn;break;case"scroll":l=fn;break;case"wheel":l=In;break;case"copy":case"cut":case"paste":l=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Cn}var u=!!(4&t),d=!u&&"scroll"===e,f=u?null!==s?s+"Capture":null:s;u=[];for(var p,m=r;null!==m;){var h=(p=m).stateNode;if(5===p.tag&&null!==h&&(p=h,null!==f&&(null!=(h=Ie(m,f))&&u.push(Vr(m,h,p)))),d)break;m=m.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(!(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!vo(c)&&!c[ho])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?vo(c):null)&&(c!==(d=qe(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=mn,h="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Cn,h="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==l?s:So(l),p=null==c?s:So(c),(s=new u(h,m+"leave",l,n,o)).target=d,s.relatedTarget=p,h=null,vo(o)===r&&((u=new u(f,m+"enter",c,n,o)).target=p,u.relatedTarget=d,h=u),d=h,l&&c)e:{for(f=c,m=0,p=u=l;p;p=Wr(p))m++;for(p=0,h=f;h;h=Wr(h))p++;for(;0<m-p;)u=Wr(u),m--;for(;0<p-m;)f=Wr(f),p--;for(;m--;){if(u===f||null!==f&&u===f.alternate)break e;u=Wr(u),f=Wr(f)}u=null}else u=null;null!==l&&Kr(i,s,l,u,!1),null!==c&&null!==d&&Kr(i,d,c,u,!0)}if("select"===(l=(s=r?So(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var g=Yn;else if(Hn(s))if(Zn)g=ir;else{g=or;var y=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(g=ar);switch(g&&(g=g(e,r))?Vn(i,g,n,o):(y&&y(e,s,r),"focusout"===e&&(y=s._wrapperState)&&y.controlled&&"number"===s.type&&ee(s,"number",s.value)),y=r?So(r):window,e){case"focusin":(Hn(y)||"true"===y.contentEditable)&&(gr=y,yr=r,br=null);break;case"focusout":br=yr=gr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,o);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":wr(i,n,o)}var b;if(Nn)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else qn?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&(qn||"onCompositionStart"!==v?"onCompositionEnd"===v&&qn&&(b=en()):(Jt="value"in(Zt=o)?Zt.value:Zt.textContent,qn=!0)),0<(y=Gr(r,v)).length&&(v=new wn(v,e,null,n,o),i.push({event:v,listeners:y}),b?v.data=b:null!==(b=Un(n))&&(v.data=b))),(b=Ln?function(e,t){switch(e){case"compositionend":return Un(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(qn)return"compositionend"===e||!Nn&&Bn(e,t)?(e=en(),Xt=Jt=Zt=null,qn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Gr(r,"onBeforeInput")).length&&(o=new wn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=b))}Fr(i,t)}))}function Vr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Gr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Ie(e,n))&&r.unshift(Vr(e,a,o)),null!=(a=Ie(e,t))&&r.push(Vr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Kr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Ie(n,a))&&i.unshift(Vr(n,l,s)):o||null!=(l=Ie(n,a))&&i.push(Vr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Qr,"\n").replace(Yr,"")}function Jr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(a(425))}function Xr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void qt(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);qt(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po="__reactFiber$"+fo,mo="__reactProps$"+fo,ho="__reactContainer$"+fo,go="__reactEvents$"+fo,yo="__reactListeners$"+fo,bo="__reactHandles$"+fo;function vo(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[po])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[po]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function So(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function ko(e){return e[mo]||null}var xo=[],Eo=-1;function _o(e){return{current:e}}function jo(e){0>Eo||(e.current=xo[Eo],xo[Eo]=null,Eo--)}function Oo(e,t){Eo++,xo[Eo]=e.current,e.current=t}var Co={},Ao=_o(Co),To=_o(!1),Po=Co;function Io(e,t){var n=e.type.contextTypes;if(!n)return Co;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Ro(e){return null!=(e=e.childContextTypes)}function No(){jo(To),jo(Ao)}function Do(e,t,n){if(Ao.current!==Co)throw Error(a(168));Oo(Ao,t),Oo(To,n)}function Lo(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,$(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Co,Po=Ao.current,Oo(Ao,e),Oo(To,To.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Lo(e,t,Po),r.__reactInternalMemoizedMergedChildContext=e,jo(To),jo(Ao),Oo(Ao,e)):jo(To),Oo(To,n)}var zo=null,Bo=!1,Uo=!1;function qo(e){null===zo?zo=[e]:zo.push(e)}function $o(){if(!Uo&&null!==zo){Uo=!0;var e=0,t=vt;try{var n=zo;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Xe,$o),o}finally{vt=t,Uo=!1}}return null}var Ho=[],Vo=0,Go=null,Wo=0,Ko=[],Qo=0,Yo=null,Zo=1,Jo="";function Xo(e,t){Ho[Vo++]=Wo,Ho[Vo++]=Go,Go=e,Wo=t}function ea(e,t,n){Ko[Qo++]=Zo,Ko[Qo++]=Jo,Ko[Qo++]=Yo,Yo=e;var r=Zo;e=Jo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Zo=1<<32-it(t)+o|n<<o|r,Jo=a+e}else Zo=1<<a|n<<o|r,Jo=e}function ta(e){null!==e.return&&(Xo(e,1),ea(e,1,0))}function na(e){for(;e===Go;)Go=Ho[--Vo],Ho[Vo]=null,Wo=Ho[--Vo],Ho[Vo]=null;for(;e===Yo;)Yo=Ko[--Qo],Ko[Qo]=null,Jo=Ko[--Qo],Ko[Qo]=null,Zo=Ko[--Qo],Ko[Qo]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(e,t){var n=Pc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function la(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Yo?{id:Zo,overflow:Jo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Pc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return!(!(1&e.mode)||128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function fa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw pa(),Error(a(418));for(;t;)sa(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function pa(){for(var e=oa;e;)e=co(e.nextSibling)}function ma(){oa=ra=null,aa=!1}function ha(e){null===ia?ia=[e]:ia.push(e)}var ga=w.ReactCurrentBatchConfig;function ya(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function ba(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function va(e){return(0,e._init)(e._payload)}function wa(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Rc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Mc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===x?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===I&&va(a)===t.type)?((r=o(t,n.props)).ref=ya(e,t,n),r.return=e,r):((r=Nc(n.type,n.key,n.props,null,e.mode,r)).ref=ya(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Mc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case S:return(n=Nc(t.type,t.key,t.props,null,e.mode,n)).ref=ya(e,null,t),n.return=e,n;case k:return(t=Fc(t,e.mode,n)).return=e,t;case I:return f(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Dc(t,e.mode,n,null)).return=e,t;ba(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case S:return n.key===o?c(e,t,n,r):null;case k:return n.key===o?u(e,t,n,r):null;case I:return p(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);ba(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case k:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case I:return m(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);ba(t,r)}return null}function h(o,a,s,l){for(var c=null,u=null,d=a,h=a=0,g=null;null!==d&&h<s.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var y=p(o,d,s[h],l);if(null===y){null===d&&(d=g);break}e&&d&&null===y.alternate&&t(o,d),a=i(y,a,h),null===u?c=y:u.sibling=y,u=y,d=g}if(h===s.length)return n(o,d),aa&&Xo(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=f(o,s[h],l))&&(a=i(d,a,h),null===u?c=d:u.sibling=d,u=d);return aa&&Xo(o,h),c}for(d=r(o,d);h<s.length;h++)null!==(g=m(d,o,h,s[h],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),a=i(g,a,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),aa&&Xo(o,h),c}function g(o,s,l,c){var u=D(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,h=s,g=s=0,y=null,b=l.next();null!==h&&!b.done;g++,b=l.next()){h.index>g?(y=h,h=null):y=h.sibling;var v=p(o,h,b.value,c);if(null===v){null===h&&(h=y);break}e&&h&&null===v.alternate&&t(o,h),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v,h=y}if(b.done)return n(o,h),aa&&Xo(o,g),u;if(null===h){for(;!b.done;g++,b=l.next())null!==(b=f(o,b.value,c))&&(s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return aa&&Xo(o,g),u}for(h=r(o,h);!b.done;g++,b=l.next())null!==(b=m(h,o,g,b.value,c))&&(e&&null!==b.alternate&&h.delete(null===b.key?g:b.key),s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return e&&h.forEach((function(e){return t(o,e)})),aa&&Xo(o,g),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===x&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case S:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===x){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===I&&va(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=ya(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===x?((a=Dc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Nc(i.type,i.key,i.props,null,r.mode,l)).ref=ya(r,a,i),l.return=r,r=l)}return s(r);case k:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Fc(i,r.mode,l)).return=r,r=a}return s(r);case I:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return h(r,a,i,l);if(D(i))return g(r,a,i,l);ba(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Mc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Sa=wa(!0),ka=wa(!1),xa=_o(null),Ea=null,_a=null,ja=null;function Oa(){ja=_a=Ea=null}function Ca(e){var t=xa.current;jo(xa),e._currentValue=t}function Aa(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ta(e,t){Ea=e,ja=_a=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(vs=!0),e.firstContext=null)}function Pa(e){var t=e._currentValue;if(ja!==e)if(e={context:e,memoizedValue:t,next:null},null===_a){if(null===Ea)throw Error(a(308));_a=e,Ea.dependencies={lanes:0,firstContext:e}}else _a=_a.next=e;return t}var Ia=null;function Ra(e){null===Ia?Ia=[e]:Ia.push(e)}function Na(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Ra(t)):(n.next=o.next,o.next=n),t.interleaved=n,Da(e,r)}function Da(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var La=!1;function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function za(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ba(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Cl){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Da(e,n)}return null===(o=r.interleaved)?(t.next=t,Ra(r)):(t.next=o.next,o.next=t),r.interleaved=t,Da(e,n)}function Ua(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}function qa(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function $a(e,t,n,r){var o=e.updateQueue;La=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var f=s.lane,p=s.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,h=s;switch(f=t,p=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(p,d,f);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(f="function"==typeof(m=h.payload)?m.call(p,d,f):m))break e;d=M({},d,f);break e;case 2:La=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=p,l=d):u=u.next=p,i|=f;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(f=s).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Ll|=i,e.lanes=i,e.memoizedState=d}}function Ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Va={},Ga=_o(Va),Wa=_o(Va),Ka=_o(Va);function Qa(e){if(e===Va)throw Error(a(174));return e}function Ya(e,t){switch(Oo(Ka,t),Oo(Wa,e),Oo(Ga,Va),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}jo(Ga),Oo(Ga,t)}function Za(){jo(Ga),jo(Wa),jo(Ka)}function Ja(e){Qa(Ka.current);var t=Qa(Ga.current),n=le(t,e.type);t!==n&&(Oo(Wa,e),Oo(Ga,n))}function Xa(e){Wa.current===e&&(jo(Ga),jo(Wa))}var ei=_o(0);function ti(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var oi=w.ReactCurrentDispatcher,ai=w.ReactCurrentBatchConfig,ii=0,si=null,li=null,ci=null,ui=!1,di=!1,fi=0,pi=0;function mi(){throw Error(a(321))}function hi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function gi(e,t,n,r,o,i){if(ii=i,si=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,oi.current=null===e||null===e.memoizedState?Xi:es,e=n(r,o),di){i=0;do{if(di=!1,fi=0,25<=i)throw Error(a(301));i+=1,ci=li=null,t.updateQueue=null,oi.current=ts,e=n(r,o)}while(di)}if(oi.current=Ji,t=null!==li&&null!==li.next,ii=0,ci=li=si=null,ui=!1,t)throw Error(a(300));return e}function yi(){var e=0!==fi;return fi=0,e}function bi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?si.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===li){var e=si.alternate;e=null!==e?e.memoizedState:null}else e=li.next;var t=null===ci?si.memoizedState:ci.next;if(null!==t)ci=t,li=e;else{if(null===e)throw Error(a(310));e={memoizedState:(li=e).memoizedState,baseState:li.baseState,baseQueue:li.baseQueue,queue:li.queue,next:null},null===ci?si.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function Si(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=li,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((ii&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var f={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(l=c=f,s=r):c=c.next=f,si.lanes|=d,Ll|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(vs=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,si.lanes|=i,Ll|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(vs=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function xi(){}function Ei(e,t){var n=si,r=vi(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,vs=!0),r=r.queue,Li(Oi.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Pi(9,ji.bind(null,n,r,o,t),void 0,null),null===Al)throw Error(a(349));30&ii||_i(n,t,o)}return o}function _i(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function ji(e,t,n,r){t.value=n,t.getSnapshot=r,Ci(t)&&Ai(e)}function Oi(e,t,n){return n((function(){Ci(t)&&Ai(e)}))}function Ci(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function Ai(e){var t=Da(e,1);null!==t&&nc(t,e,1,-1)}function Ti(e){var t=bi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Ki.bind(null,si,e),[t.memoizedState,e]}function Pi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Ii(){return vi().memoizedState}function Ri(e,t,n,r){var o=bi();si.flags|=e,o.memoizedState=Pi(1|t,n,void 0,void 0===r?null:r)}function Ni(e,t,n,r){var o=vi();r=void 0===r?null:r;var a=void 0;if(null!==li){var i=li.memoizedState;if(a=i.destroy,null!==r&&hi(r,i.deps))return void(o.memoizedState=Pi(t,n,a,r))}si.flags|=e,o.memoizedState=Pi(1|t,n,a,r)}function Di(e,t){return Ri(8390656,8,e,t)}function Li(e,t){return Ni(2048,8,e,t)}function Mi(e,t){return Ni(4,2,e,t)}function Fi(e,t){return Ni(4,4,e,t)}function zi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Bi(e,t,n){return n=null!=n?n.concat([e]):null,Ni(4,4,zi.bind(null,t,e),n)}function Ui(){}function qi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function $i(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Hi(e,t,n){return 21&ii?(sr(n,t)||(n=ht(),si.lanes|=n,Ll|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,vs=!0),e.memoizedState=n)}function Vi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=ai.transition;ai.transition={};try{e(!1),t()}finally{vt=n,ai.transition=r}}function Gi(){return vi().memoizedState}function Wi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Qi(e))Yi(t,n);else if(null!==(n=Na(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Ki(e,t,n){var r=tc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Qi(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Ra(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Na(e,t,o,r))&&(nc(n,e,r,o=ec()),Zi(n,t,r))}}function Qi(e){var t=e.alternate;return e===si||null!==t&&t===si}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}var Ji={readContext:Pa,useCallback:mi,useContext:mi,useEffect:mi,useImperativeHandle:mi,useInsertionEffect:mi,useLayoutEffect:mi,useMemo:mi,useReducer:mi,useRef:mi,useState:mi,useDebugValue:mi,useDeferredValue:mi,useTransition:mi,useMutableSource:mi,useSyncExternalStore:mi,useId:mi,unstable_isNewReconciler:!1},Xi={readContext:Pa,useCallback:function(e,t){return bi().memoizedState=[e,void 0===t?null:t],e},useContext:Pa,useEffect:Di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ri(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ri(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ri(4,2,e,t)},useMemo:function(e,t){var n=bi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=bi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Wi.bind(null,si,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},bi().memoizedState=e},useState:Ti,useDebugValue:Ui,useDeferredValue:function(e){return bi().memoizedState=e},useTransition:function(){var e=Ti(!1),t=e[0];return e=Vi.bind(null,e[1]),bi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=si,o=bi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Al)throw Error(a(349));30&ii||_i(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Di(Oi.bind(null,r,i,e),[e]),r.flags|=2048,Pi(9,ji.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=bi(),t=Al.identifierPrefix;if(aa){var n=Jo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=fi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=pi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},es={readContext:Pa,useCallback:qi,useContext:Pa,useEffect:Li,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:$i,useReducer:Si,useRef:Ii,useState:function(){return Si(wi)},useDebugValue:Ui,useDeferredValue:function(e){return Hi(vi(),li.memoizedState,e)},useTransition:function(){return[Si(wi)[0],vi().memoizedState]},useMutableSource:xi,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1},ts={readContext:Pa,useCallback:qi,useContext:Pa,useEffect:Li,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:$i,useReducer:ki,useRef:Ii,useState:function(){return ki(wi)},useDebugValue:Ui,useDeferredValue:function(e){var t=vi();return null===li?t.memoizedState=e:Hi(t,li.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:xi,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1};function ns(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rs(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var os={isMounted:function(e){return!!(e=e._reactInternals)&&qe(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),Ua(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),Ua(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),o=za(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ba(e,o,r))&&(nc(t,e,r,n),Ua(t,e,r))}};function as(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function is(e,t,n){var r=!1,o=Co,a=t.contextType;return"object"==typeof a&&null!==a?a=Pa(a):(o=Ro(t)?Po:Ao.current,a=(r=null!=(r=t.contextTypes))?Io(e,o):Co),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=os,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function ss(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&os.enqueueReplaceState(t,t.state,null)}function ls(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs={},Ma(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Pa(a):(a=Ro(t)?Po:Ao.current,o.context=Io(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(rs(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&os.enqueueReplaceState(o,o.state,null),$a(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function cs(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function us(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ds(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function ps(e,t,n){(n=za(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hl||(Hl=!0,Vl=r),ds(0,t)},n}function ms(e,t,n){(n=za(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ds(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ds(0,t),"function"!=typeof r&&(null===Gl?Gl=new Set([this]):Gl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=_c.bind(null,e,t,n),t.then(e,e))}function gs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ys(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=za(-1,1)).tag=2,Ba(n,t,1))),n.lanes|=1),e)}var bs=w.ReactCurrentOwner,vs=!1;function ws(e,t,n,r){t.child=null===e?ka(t,null,n,r):Sa(t,e.child,n,r)}function Ss(e,t,n,r,o){n=n.render;var a=t.ref;return Ta(t,o),r=gi(e,t,n,r,a,o),n=yi(),null===e||vs?(aa&&n&&ta(t),t.flags|=1,ws(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function ks(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Ic(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Nc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,xs(e,t,a,r,o))}if(a=e.child,!(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Hs(e,t,o)}return t.flags|=1,(e=Rc(a,r)).ref=t.ref,e.return=t,t.child=e}function xs(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(vs=!1,t.pendingProps=r=a,!(e.lanes&o))return t.lanes=e.lanes,Hs(e,t,o);131072&e.flags&&(vs=!0)}}return js(e,t,n,r,o)}function Es(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Oo(Rl,Il),Il|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,Oo(Rl,Il),Il|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Oo(Rl,Il),Il|=n;else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,Oo(Rl,Il),Il|=r;return ws(e,t,o,n),t.child}function _s(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function js(e,t,n,r,o){var a=Ro(n)?Po:Ao.current;return a=Io(t,a),Ta(t,o),n=gi(e,t,n,r,a,o),r=yi(),null===e||vs?(aa&&r&&ta(t),t.flags|=1,ws(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function Os(e,t,n,r,o){if(Ro(n)){var a=!0;Mo(t)}else a=!1;if(Ta(t,o),null===t.stateNode)$s(e,t),is(t,n,r),ls(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Pa(c):c=Io(t,c=Ro(n)?Po:Ao.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&ss(t,i,r,c),La=!1;var f=t.memoizedState;i.state=f,$a(t,r,i,o),l=t.memoizedState,s!==r||f!==l||To.current||La?("function"==typeof u&&(rs(t,n,u,r),l=t.memoizedState),(s=La||as(t,n,s,r,f,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Fa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ns(t.type,s),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Pa(l):l=Io(t,l=Ro(n)?Po:Ao.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||f!==l)&&ss(t,i,r,l),La=!1,f=t.memoizedState,i.state=f,$a(t,r,i,o);var m=t.memoizedState;s!==d||f!==m||To.current||La?("function"==typeof p&&(rs(t,n,p,r),m=t.memoizedState),(c=La||as(t,n,c,r,f,m,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Cs(e,t,n,r,a,o)}function Cs(e,t,n,r,o,a){_s(e,t);var i=!!(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Hs(e,t,a);r=t.stateNode,bs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Sa(t,e.child,null,a),t.child=Sa(t,null,s,a)):ws(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function As(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),Ya(e,t.containerInfo)}function Ts(e,t,n,r,o){return ma(),ha(o),t.flags|=256,ws(e,t,n,r),t.child}var Ps,Is,Rs,Ns,Ds={dehydrated:null,treeContext:null,retryLane:0};function Ls(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ms(e,t,n){var r,o=t.pendingProps,i=ei.current,s=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),Oo(ei,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},1&o||null===s?s=Lc(l,o,0,null):(s.childLanes=0,s.pendingProps=l),e=Dc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ls(n),t.memoizedState=Ds,e):Fs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,zs(e,t,s,r=us(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Lc({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&Sa(t,e.child,null,s),t.child.memoizedState=Ls(s),t.memoizedState=Ds,i);if(!(1&t.mode))return zs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,zs(e,t,s,r=us(i=Error(a(419)),r,void 0))}if(l=!!(s&e.childLanes),vs||l){if(null!==(r=Al)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|s)?0:o)&&o!==i.retryLane&&(i.retryLane=o,Da(e,o),nc(r,e,o,-1))}return hc(),zs(e,t,s,r=us(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Oc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Ko[Qo++]=Zo,Ko[Qo++]=Jo,Ko[Qo++]=Yo,Zo=e.id,Jo=e.overflow,Yo=t),t=Fs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 1&l||t.child===i?(o=Rc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null),null!==r?s=Rc(r,s):(s=Dc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ls(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Ds,o}return e=(s=e.child).sibling,o=Rc(s,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Fs(e,t){return(t=Lc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zs(e,t,n,r){return null!==r&&ha(r),Sa(t,e.child,null,n),(e=Fs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Bs(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Aa(e.return,t,n)}function Us(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function qs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ws(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Bs(e,n,t);else if(19===e.tag)Bs(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(Oo(ei,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Us(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ti(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Us(t,!0,n,null,a);break;case"together":Us(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function $s(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ll|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Rc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Rc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Vs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Gs(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ws(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Gs(t),null;case 1:case 17:return Ro(t.type)&&No(),Gs(t),null;case 3:return r=t.stateNode,Za(),jo(To),jo(Ao),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ia&&(ic(ia),ia=null))),Is(e,t),Gs(t),null;case 5:Xa(t);var o=Qa(Ka.current);if(n=t.type,null!==e&&null!=t.stateNode)Rs(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Gs(t),null}if(e=Qa(Ga.current),fa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[po]=t,r[mo]=i,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var l in be(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Jr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Jr(r.textContent,c,e),o=["children",""+c]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&zr("scroll",r)}switch(n){case"input":G(r),X(r,i,!0);break;case"textarea":G(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Xr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[po]=t,e[mo]=r,Ps(e,t,!1,!1),t.stateNode=e;e:{switch(l=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Y(e,r),o=Q(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in be(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&fe(e,u):"number"==typeof u&&fe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,l))}switch(n){case"input":G(e),X(e,r,!1);break;case"textarea":G(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Xr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Gs(t),null;case 6:if(e&&null!=t.stateNode)Ns(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=Qa(Ka.current),Qa(Ga.current),fa(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Jr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Jr(r.nodeValue,n,!!(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Gs(t),null;case 13:if(jo(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&1&t.mode&&!(128&t.flags))pa(),ma(),t.flags|=98560,i=!1;else if(i=fa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[po]=t}else ma(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Gs(t),i=!1}else null!==ia&&(ic(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ei.current?0===Nl&&(Nl=3):hc())),null!==t.updateQueue&&(t.flags|=4),Gs(t),null);case 4:return Za(),Is(e,t),null===e&&qr(t.stateNode.containerInfo),Gs(t),null;case 10:return Ca(t.type._context),Gs(t),null;case 19:if(jo(ei),null===(i=t.memoizedState))return Gs(t),null;if(r=!!(128&t.flags),null===(l=i.rendering))if(r)Vs(i,!1);else{if(0!==Nl||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(l=ti(e))){for(t.flags|=128,Vs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Oo(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>ql&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Vs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Gs(t),null}else 2*Ze()-i.renderingStartTime>ql&&1073741824!==n&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,Oo(ei,r?1&n|2:1&n),t):(Gs(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Il)&&(Gs(t),6&t.subtreeFlags&&(t.flags|=8192)):Gs(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Ks(e,t){switch(na(t),t.tag){case 1:return Ro(t.type)&&No(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Za(),jo(To),jo(Ao),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Xa(t),null;case 13:if(jo(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ma()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return jo(ei),null;case 4:return Za(),null;case 10:return Ca(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Ps=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Is=function(){},Rs=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Qa(Ga.current);var a,i=null;switch(n){case"input":o=Q(e,o),r=Q(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Xr)}for(u in be(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ns=function(e,t,n,r){n!==r&&(t.flags|=4)};var Qs=!1,Ys=!1,Zs="function"==typeof WeakSet?WeakSet:Set,Js=null;function Xs(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function el(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var tl=!1;function nl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&el(t,n,a)}o=o.next}while(o!==r)}}function rl(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ol(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function al(e){var t=e.alternate;null!==t&&(e.alternate=null,al(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[po],delete t[mo],delete t[go],delete t[yo],delete t[bo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function il(e){return 5===e.tag||3===e.tag||4===e.tag}function sl(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||il(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ll(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Xr));else if(4!==r&&null!==(e=e.child))for(ll(e,t,n),e=e.sibling;null!==e;)ll(e,t,n),e=e.sibling}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}var ul=null,dl=!1;function fl(e,t,n){for(n=n.child;null!==n;)pl(e,t,n),n=n.sibling}function pl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ys||Xs(n,t);case 6:var r=ul,o=dl;ul=null,fl(e,t,n),dl=o,null!==(ul=r)&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ul.removeChild(n.stateNode));break;case 18:null!==ul&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),qt(e)):lo(ul,n.stateNode));break;case 4:r=ul,o=dl,ul=n.stateNode.containerInfo,dl=!0,fl(e,t,n),ul=r,dl=o;break;case 0:case 11:case 14:case 15:if(!Ys&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(2&a||4&a)&&el(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Ys&&(Xs(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Ec(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Ys=(r=Ys)||null!==n.memoizedState,fl(e,t,n),Ys=r):fl(e,t,n);break;default:fl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zs),t.forEach((function(t){var r=Cc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:ul=l.stateNode,dl=!1;break e;case 3:case 4:ul=l.stateNode.containerInfo,dl=!0;break e}l=l.return}if(null===ul)throw Error(a(160));pl(i,s,o),ul=null,dl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){Ec(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)gl(t,e),t=t.sibling}function gl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hl(t,e),yl(e),4&r){try{nl(3,e,e.return),rl(3,e)}catch(g){Ec(e,e.return,g)}try{nl(5,e,e.return)}catch(g){Ec(e,e.return,g)}}break;case 1:hl(t,e),yl(e),512&r&&null!==n&&Xs(n,n.return);break;case 5:if(hl(t,e),yl(e),512&r&&null!==n&&Xs(n,n.return),32&e.flags){var o=e.stateNode;try{fe(o,"")}catch(g){Ec(e,e.return,g)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Z(o,i),ve(l,s);var u=ve(l,i);for(s=0;s<c.length;s+=2){var d=c[s],f=c[s+1];"style"===d?ge(o,f):"dangerouslySetInnerHTML"===d?de(o,f):"children"===d?fe(o,f):v(o,d,f,u)}switch(l){case"input":J(o,i);break;case"textarea":ae(o,i);break;case"select":var p=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(o,!!i.multiple,m,!1):p!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[mo]=i}catch(g){Ec(e,e.return,g)}}break;case 6:if(hl(t,e),yl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(g){Ec(e,e.return,g)}}break;case 3:if(hl(t,e),yl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{qt(t.containerInfo)}catch(g){Ec(e,e.return,g)}break;case 4:default:hl(t,e),yl(e);break;case 13:hl(t,e),yl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||(Ul=Ze())),4&r&&ml(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ys=(u=Ys)||d,hl(t,e),Ys=u):hl(t,e),yl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&1&e.mode)for(Js=e,d=e.child;null!==d;){for(f=Js=d;null!==Js;){switch(m=(p=Js).child,p.tag){case 0:case 11:case 14:case 15:nl(4,p,p.return);break;case 1:Xs(p,p.return);var h=p.stateNode;if("function"==typeof h.componentWillUnmount){r=p,n=p.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){Ec(r,n,g)}}break;case 5:Xs(p,p.return);break;case 22:if(null!==p.memoizedState){Sl(f);continue}}null!==m?(m.return=p,Js=m):Sl(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{o=f.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(l=f.stateNode,s=null!=(c=f.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=he("display",s))}catch(g){Ec(e,e.return,g)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=u?"":f.memoizedProps}catch(g){Ec(e,e.return,g)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:hl(t,e),yl(e),4&r&&ml(e);case 21:}}function yl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(il(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(fe(o,""),r.flags&=-33),cl(e,sl(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;ll(e,sl(e),i);break;default:throw Error(a(161))}}catch(s){Ec(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function bl(e,t,n){Js=e,vl(e,t,n)}function vl(e,t,n){for(var r=!!(1&e.mode);null!==Js;){var o=Js,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Qs;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Ys;s=Qs;var c=Ys;if(Qs=i,(Ys=l)&&!c)for(Js=o;null!==Js;)l=(i=Js).child,22===i.tag&&null!==i.memoizedState?kl(o):null!==l?(l.return=i,Js=l):kl(o);for(;null!==a;)Js=a,vl(a,t,n),a=a.sibling;Js=o,Qs=s,Ys=c}wl(e)}else 8772&o.subtreeFlags&&null!==a?(a.return=o,Js=a):wl(e)}}function wl(e){for(;null!==Js;){var t=Js;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Ys||rl(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ys)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ns(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Ha(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ha(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&qt(f)}}}break;default:throw Error(a(163))}Ys||512&t.flags&&ol(t)}catch(p){Ec(t,t.return,p)}}if(t===e){Js=null;break}if(null!==(n=t.sibling)){n.return=t.return,Js=n;break}Js=t.return}}function Sl(e){for(;null!==Js;){var t=Js;if(t===e){Js=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Js=n;break}Js=t.return}}function kl(e){for(;null!==Js;){var t=Js;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rl(4,t)}catch(l){Ec(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){Ec(t,o,l)}}var a=t.return;try{ol(t)}catch(l){Ec(t,a,l)}break;case 5:var i=t.return;try{ol(t)}catch(l){Ec(t,i,l)}}}catch(l){Ec(t,t.return,l)}if(t===e){Js=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Js=s;break}Js=t.return}}var xl,El=Math.ceil,_l=w.ReactCurrentDispatcher,jl=w.ReactCurrentOwner,Ol=w.ReactCurrentBatchConfig,Cl=0,Al=null,Tl=null,Pl=0,Il=0,Rl=_o(0),Nl=0,Dl=null,Ll=0,Ml=0,Fl=0,zl=null,Bl=null,Ul=0,ql=1/0,$l=null,Hl=!1,Vl=null,Gl=null,Wl=!1,Kl=null,Ql=0,Yl=0,Zl=null,Jl=-1,Xl=0;function ec(){return 6&Cl?Ze():-1!==Jl?Jl:Jl=Ze()}function tc(e){return 1&e.mode?2&Cl&&0!==Pl?Pl&-Pl:null!==ga.transition?(0===Xl&&(Xl=ht()),Xl):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Yt(e.type):1}function nc(e,t,n,r){if(50<Yl)throw Yl=0,Zl=null,Error(a(185));yt(e,n,r),2&Cl&&e===Al||(e===Al&&(!(2&Cl)&&(Ml|=n),4===Nl&&sc(e,Pl)),rc(e,r),1===n&&0===Cl&&!(1&t.mode)&&(ql=Ze()+500,Bo&&$o()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),s=1<<i,l=o[i];-1===l?s&n&&!(s&r)||(o[i]=pt(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=ft(e,e===Al?Pl:0);if(0===r)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Bo=!0,qo(e)}(lc.bind(null,e)):qo(lc.bind(null,e)),io((function(){!(6&Cl)&&$o()})),n=null;else{switch(wt(r)){case 1:n=Xe;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Ac(n,oc.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function oc(e,t){if(Jl=-1,Xl=0,6&Cl)throw Error(a(327));var n=e.callbackNode;if(kc()&&e.callbackNode!==n)return null;var r=ft(e,e===Al?Pl:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=gc(e,r);else{t=r;var o=Cl;Cl|=2;var i=mc();for(Al===e&&Pl===t||($l=null,ql=Ze()+500,fc(e,t));;)try{bc();break}catch(l){pc(e,l)}Oa(),_l.current=i,Cl=o,null!==Tl?t=0:(Al=null,Pl=0,t=Nl)}if(0!==t){if(2===t&&(0!==(o=mt(e))&&(r=o,t=ac(e,o))),1===t)throw n=Dl,fc(e,0),sc(e,r),rc(e,Ze()),n;if(6===t)sc(e,r);else{if(o=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!sr(a(),o))return!1}catch(s){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)||(t=gc(e,r),2===t&&(i=mt(e),0!==i&&(r=i,t=ac(e,i))),1!==t)))throw n=Dl,fc(e,0),sc(e,r),rc(e,Ze()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:Sc(e,Bl,$l);break;case 3:if(sc(e,r),(130023424&r)===r&&10<(t=Ul+500-Ze())){if(0!==ft(e,0))break;if(((o=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(Sc.bind(null,e,Bl,$l),t);break}Sc(e,Bl,$l);break;case 4:if(sc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*El(r/1960))-r)){e.timeoutHandle=ro(Sc.bind(null,e,Bl,$l),r);break}Sc(e,Bl,$l);break;default:throw Error(a(329))}}}return rc(e,Ze()),e.callbackNode===n?oc.bind(null,e):null}function ac(e,t){var n=zl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=gc(e,t))&&(t=Bl,Bl=n,null!==t&&ic(t)),e}function ic(e){null===Bl?Bl=e:Bl.push.apply(Bl,e)}function sc(e,t){for(t&=~Fl,t&=~Ml,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function lc(e){if(6&Cl)throw Error(a(327));kc();var t=ft(e,0);if(!(1&t))return rc(e,Ze()),null;var n=gc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=ac(e,r))}if(1===n)throw n=Dl,fc(e,0),sc(e,t),rc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Sc(e,Bl,$l),rc(e,Ze()),null}function cc(e,t){var n=Cl;Cl|=1;try{return e(t)}finally{0===(Cl=n)&&(ql=Ze()+500,Bo&&$o())}}function uc(e){null!==Kl&&0===Kl.tag&&!(6&Cl)&&kc();var t=Cl;Cl|=1;var n=Ol.transition,r=vt;try{if(Ol.transition=null,vt=1,e)return e()}finally{vt=r,Ol.transition=n,!(6&(Cl=t))&&$o()}}function dc(){Il=Rl.current,jo(Rl)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Tl)for(n=Tl.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&No();break;case 3:Za(),jo(To),jo(Ao),ri();break;case 5:Xa(r);break;case 4:Za();break;case 13:case 19:jo(ei);break;case 10:Ca(r.type._context);break;case 22:case 23:dc()}n=n.return}if(Al=e,Tl=e=Rc(e.current,null),Pl=Il=t,Nl=0,Dl=null,Fl=Ml=Ll=0,Bl=zl=null,null!==Ia){for(t=0;t<Ia.length;t++)if(null!==(r=(n=Ia[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ia=null}return e}function pc(e,t){for(;;){var n=Tl;try{if(Oa(),oi.current=Ji,ui){for(var r=si.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ui=!1}if(ii=0,ci=li=si=null,di=!1,fi=0,jl.current=null,null===n||null===n.return){Nl=1,Dl=t,Tl=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Pl,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,f=d.tag;if(!(1&d.mode||0!==f&&11!==f&&15!==f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=gs(s);if(null!==m){m.flags&=-257,ys(m,s,l,0,t),1&m.mode&&hs(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(!(1&t)){hs(i,u,t),hc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var y=gs(s);if(null!==y){!(65536&y.flags)&&(y.flags|=256),ys(y,s,l,0,t),ha(cs(c,l));break e}}i=c=cs(c,l),4!==Nl&&(Nl=2),null===zl?zl=[i]:zl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,qa(i,ps(0,c,t));break e;case 1:l=c;var b=i.type,v=i.stateNode;if(!(128&i.flags||"function"!=typeof b.getDerivedStateFromError&&(null===v||"function"!=typeof v.componentDidCatch||null!==Gl&&Gl.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,qa(i,ms(i,l,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,Tl===n&&null!==n&&(Tl=n=n.return);continue}break}}function mc(){var e=_l.current;return _l.current=Ji,null===e?Ji:e}function hc(){0!==Nl&&3!==Nl&&2!==Nl||(Nl=4),null===Al||!(268435455&Ll)&&!(268435455&Ml)||sc(Al,Pl)}function gc(e,t){var n=Cl;Cl|=2;var r=mc();for(Al===e&&Pl===t||($l=null,fc(e,t));;)try{yc();break}catch(o){pc(e,o)}if(Oa(),Cl=n,_l.current=r,null!==Tl)throw Error(a(261));return Al=null,Pl=0,Nl}function yc(){for(;null!==Tl;)vc(Tl)}function bc(){for(;null!==Tl&&!Qe();)vc(Tl)}function vc(e){var t=xl(e.alternate,e,Il);e.memoizedProps=e.pendingProps,null===t?wc(e):Tl=t,jl.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ks(n,t)))return n.flags&=32767,void(Tl=n);if(null===e)return Nl=6,void(Tl=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Ws(n,t,Il)))return void(Tl=n);if(null!==(t=t.sibling))return void(Tl=t);Tl=t=e}while(null!==t);0===Nl&&(Nl=5)}function Sc(e,t,n){var r=vt,o=Ol.transition;try{Ol.transition=null,vt=1,function(e,t,n,r){do{kc()}while(null!==Kl);if(6&Cl)throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===Al&&(Tl=Al=null,Pl=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Wl||(Wl=!0,Ac(tt,(function(){return kc(),null}))),i=!!(15990&n.flags),!!(15990&n.subtreeFlags)||i){i=Ol.transition,Ol.transition=null;var s=vt;vt=1;var l=Cl;Cl|=4,jl.current=null,function(e,t){if(eo=Ht,pr(e=fr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(S){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,f=e,p=null;t:for(;;){for(var m;f!==n||0!==o&&3!==f.nodeType||(l=s+o),f!==i||0!==r&&3!==f.nodeType||(c=s+r),3===f.nodeType&&(s+=f.nodeValue.length),null!==(m=f.firstChild);)p=f,f=m;for(;;){if(f===e)break t;if(p===n&&++u===o&&(l=s),p===i&&++d===r&&(c=s),null!==(m=f.nextSibling))break;p=(f=p).parentNode}f=m}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Js=t;null!==Js;)if(e=(t=Js).child,1028&t.subtreeFlags&&null!==e)e.return=t,Js=e;else for(;null!==Js;){t=Js;try{var h=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,y=h.memoizedState,b=t.stateNode,v=b.getSnapshotBeforeUpdate(t.elementType===t.type?g:ns(t.type,g),y);b.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(a(163))}}catch(S){Ec(t,t.return,S)}if(null!==(e=t.sibling)){e.return=t.return,Js=e;break}Js=t.return}h=tl,tl=!1}(e,n),gl(n,e),mr(to),Ht=!!eo,to=eo=null,e.current=n,bl(n,e,o),Ye(),Cl=l,vt=s,Ol.transition=i}else e.current=n;if(Wl&&(Wl=!1,Kl=e,Ql=o),i=e.pendingLanes,0===i&&(Gl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,!(128&~e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Hl)throw Hl=!1,e=Vl,Vl=null,e;!!(1&Ql)&&0!==e.tag&&kc(),i=e.pendingLanes,1&i?e===Zl?Yl++:(Yl=0,Zl=e):Yl=0,$o()}(e,t,n,r)}finally{Ol.transition=o,vt=r}return null}function kc(){if(null!==Kl){var e=wt(Ql),t=Ol.transition,n=vt;try{if(Ol.transition=null,vt=16>e?16:e,null===Kl)var r=!1;else{if(e=Kl,Kl=null,Ql=0,6&Cl)throw Error(a(331));var o=Cl;for(Cl|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(16&Js.flags){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Js=u;null!==Js;){var d=Js;switch(d.tag){case 0:case 11:case 15:nl(8,d,i)}var f=d.child;if(null!==f)f.return=d,Js=f;else for(;null!==Js;){var p=(d=Js).sibling,m=d.return;if(al(d),d===u){Js=null;break}if(null!==p){p.return=m,Js=p;break}Js=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var y=g.sibling;g.sibling=null,g=y}while(null!==g)}}Js=i}}if(2064&i.subtreeFlags&&null!==s)s.return=i,Js=s;else e:for(;null!==Js;){if(2048&(i=Js).flags)switch(i.tag){case 0:case 11:case 15:nl(9,i,i.return)}var b=i.sibling;if(null!==b){b.return=i.return,Js=b;break e}Js=i.return}}var v=e.current;for(Js=v;null!==Js;){var w=(s=Js).child;if(2064&s.subtreeFlags&&null!==w)w.return=s,Js=w;else e:for(s=v;null!==Js;){if(2048&(l=Js).flags)try{switch(l.tag){case 0:case 11:case 15:rl(9,l)}}catch(k){Ec(l,l.return,k)}if(l===s){Js=null;break e}var S=l.sibling;if(null!==S){S.return=l.return,Js=S;break e}Js=l.return}}if(Cl=o,$o(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(k){}r=!0}return r}finally{vt=n,Ol.transition=t}}return!1}function xc(e,t,n){e=Ba(e,t=ps(0,t=cs(n,t),1),1),t=ec(),null!==e&&(yt(e,1,t),rc(e,t))}function Ec(e,t,n){if(3===e.tag)xc(e,e,n);else for(;null!==t;){if(3===t.tag){xc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Gl||!Gl.has(r))){t=Ba(t,e=ms(t,e=cs(n,e),1),1),e=ec(),null!==t&&(yt(t,1,e),rc(t,e));break}}t=t.return}}function _c(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,Al===e&&(Pl&n)===n&&(4===Nl||3===Nl&&(130023424&Pl)===Pl&&500>Ze()-Ul?fc(e,0):Fl|=n),rc(e,t)}function jc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Da(e,t))&&(yt(e,t,n),rc(e,n))}function Oc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),jc(e,n)}function Cc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),jc(e,n)}function Ac(e,t){return We(e,t)}function Tc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pc(e,t,n,r){return new Tc(e,t,n,r)}function Ic(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Rc(e,t){var n=e.alternate;return null===n?((n=Pc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Nc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Ic(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case x:return Dc(n.children,o,i,t);case E:s=8,o|=8;break;case _:return(e=Pc(12,n,t,2|o)).elementType=_,e.lanes=i,e;case A:return(e=Pc(13,n,t,o)).elementType=A,e.lanes=i,e;case T:return(e=Pc(19,n,t,o)).elementType=T,e.lanes=i,e;case R:return Lc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case j:s=10;break e;case O:s=9;break e;case C:s=11;break e;case P:s=14;break e;case I:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Pc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Pc(7,e,r,t)).lanes=n,e}function Lc(e,t,n,r){return(e=Pc(22,e,r,t)).elementType=R,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Pc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Pc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Bc(e,t,n,r,o,a,i,s,l){return e=new zc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Pc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ma(a),e}function Uc(e){if(!e)return Co;e:{if(qe(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Ro(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Ro(n))return Lo(e,n,t)}return t}function qc(e,t,n,r,o,a,i,s,l){return(e=Bc(n,r,!0,e,0,a,0,s,l)).context=Uc(null),n=e.current,(a=za(r=ec(),o=tc(n))).callback=null!=t?t:null,Ba(n,a,o),e.current.lanes=o,yt(e,o,r),rc(e,r),e}function $c(e,t,n,r){var o=t.current,a=ec(),i=tc(o);return n=Uc(n),null===t.context?t.context=n:t.pendingContext=n,(t=za(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ba(o,t,i))&&(nc(e,o,i,a),Ua(e,o,i)),i}function Hc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Vc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Gc(e,t){Vc(e,t),(e=e.alternate)&&Vc(e,t)}xl=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||To.current)vs=!0;else{if(!(e.lanes&n||128&t.flags))return vs=!1,function(e,t,n){switch(t.tag){case 3:As(t),ma();break;case 5:Ja(t);break;case 1:Ro(t.type)&&Mo(t);break;case 4:Ya(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;Oo(xa,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Oo(ei,1&ei.current),t.flags|=128,null):n&t.child.childLanes?Ms(e,t,n):(Oo(ei,1&ei.current),null!==(e=Hs(e,t,n))?e.sibling:null);Oo(ei,1&ei.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return qs(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),Oo(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,Es(e,t,n)}return Hs(e,t,n)}(e,t,n);vs=!!(131072&e.flags)}else vs=!1,aa&&1048576&t.flags&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$s(e,t),e=t.pendingProps;var o=Io(t,Ao.current);Ta(t,n),o=gi(null,t,r,e,o,n);var i=yi();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ro(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ma(t),o.updater=os,t.stateNode=o,o._reactInternals=t,ls(t,r,e,n),t=Cs(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),ws(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch($s(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Ic(e)?1:0;if(null!=e){if((e=e.$$typeof)===C)return 11;if(e===P)return 14}return 2}(r),e=ns(r,e),o){case 0:t=js(null,t,r,e,n);break e;case 1:t=Os(null,t,r,e,n);break e;case 11:t=Ss(null,t,r,e,n);break e;case 14:t=ks(null,t,r,ns(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,js(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 1:return r=t.type,o=t.pendingProps,Os(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 3:e:{if(As(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Fa(e,t),$a(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ts(e,t,r,n,o=cs(Error(a(423)),t));break e}if(r!==o){t=Ts(e,t,r,n,o=cs(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=ka(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ma(),r===o){t=Hs(e,t,n);break e}ws(e,t,r,n)}t=t.child}return t;case 5:return Ja(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),_s(e,t),ws(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Ms(e,t,n);case 4:return Ya(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Sa(t,null,r,n):ws(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ss(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 7:return ws(e,t,t.pendingProps,n),t.child;case 8:case 12:return ws(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,Oo(xa,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!To.current){t=Hs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=za(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),Aa(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),Aa(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}ws(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ta(t,n),r=r(o=Pa(o)),t.flags|=1,ws(e,t,r,n),t.child;case 14:return o=ns(r=t.type,t.pendingProps),ks(e,t,r,o=ns(r.type,o),n);case 15:return xs(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ns(r,o),$s(e,t),t.tag=1,Ro(r)?(e=!0,Mo(t)):e=!1,Ta(t,n),is(t,r,o),ls(t,r,o,n),Cs(null,t,r,!0,e,n);case 19:return qs(e,t,n);case 22:return Es(e,t,n)}throw Error(a(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Kc(e){this._internalRoot=e}function Qc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function Xc(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Hc(i);s.call(e)}}$c(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Hc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[ho]=i.current,qr(8===e.nodeType?e.parentNode:e),uc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Hc(l);s.call(e)}}var l=Bc(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=l,e[ho]=l.current,qr(8===e.nodeType?e.parentNode:e),uc((function(){$c(t,l,n,r)})),l}(n,t,e,o,r);return Hc(i)}Qc.prototype.render=Kc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));$c(e,t,null,null)},Qc.prototype.unmount=Kc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uc((function(){$c(null,e,null,null)})),t[ho]=null}},Qc.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Rt.length&&0!==t&&t<Rt[n].priority;n++);Rt.splice(n,0,e),0===n&&Mt(e)}},St=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(bt(t,1|n),rc(t,Ze()),!(6&Cl)&&(ql=Ze()+500,$o()))}break;case 13:uc((function(){var t=Da(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Gc(e,1)}},kt=function(e){if(13===e.tag){var t=Da(e,134217728);if(null!==t)nc(t,e,134217728,ec());Gc(e,134217728)}},xt=function(e){if(13===e.tag){var t=tc(e),n=Da(e,t);if(null!==n)nc(n,e,t,ec());Gc(e,t)}},Et=function(){return vt},_t=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},ke=function(e,t,n){switch(t){case"input":if(J(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=ko(r);if(!o)throw Error(a(90));W(r),J(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ce=cc,Ae=uc;var eu={usingClientEntryPoint:!1,Events:[wo,So,ko,je,Oe,cc]},tu={findFiberByHostInstance:vo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ve(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{ot=ru.inject(nu),at=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(a(299));var n=!1,r="",o=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Bc(e,1,!1,null,0,n,0,r,o),e[ho]=t.current,qr(8===e.nodeType?e.parentNode:e),new Kc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ve(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(a(200));return Xc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,s),e[ho]=t.current,qr(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Qc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(a(200));return Xc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(a(40));return!!e._reactRootContainer&&(uc((function(){Xc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return Xc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>X,vd:()=>V});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),s=n.n(i),l=n(311),c=n.n(l),u=n(2833),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},y={rel:["amphtml","canonical","alternate"]},b={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),S={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(S).reduce((function(e,t){return e[S[t]]=t,e}),{}),x=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=x(e,g.TITLE),n=x(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=x(e,"defaultTitle");return t||r||void 0},_=function(e){return x(e,"onChangeClientState")||function(){}},j=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},O=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},C=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var s=a[i],l=f({},r[s],o[s]);r[s]=l}return e}),[]).reverse()},A=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},T=function(e){return Array.isArray(e)?e.join(""):e},P=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},I=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[g.NOSCRIPT,g.SCRIPT,g.STYLE],N=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},L=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[S[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=S[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=L(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=T(t);return o?"<"+e+' data-rh="true" '+o+">"+N(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+N(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return L(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+N(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=P(e.metaTags,v),a=P(t,y),i=P(n,b);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,o.priority),M(g.LINK,a.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);p=m.priorityMethods,u=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,f,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:l,titleAttributes:c},r)}},B=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},q=r.createContext({}),$=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(q.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);V.canUseDOM=H,V.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=T(e)),W(g.TITLE,t)}(u,d);var f={baseTag:G(g.BASE,n),linkTags:G(g.LINK,o),metaTags:G(g.META,a),noscriptTags:G(g.NOSCRIPT,i),scriptTags:G(g.SCRIPT,l),styleTags:G(g.STYLE,c)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),s(e,p,m)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:O(["href"],e),bodyAttributes:j("bodyAttributes",e),defer:x(e,"defer"),encode:x(e,"encodeSpecialCharacters"),htmlAttributes:j("htmlAttributes",e),linkTags:C(g.LINK,["rel","href"],e),metaTags:C(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:C(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:C(g.SCRIPT,["src","innerHTML"],e),styleTags:C(g.STYLE,["cssText"],e),title:E(e),titleAttributes:j("titleAttributes",e),prioritizeSeoTags:A(e,"prioritizeSeoTags")});V.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){K(t,(function(){Q=null}))})):(K(t),Q=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:$.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],J=["children"],X=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(I(this.props,"helmetData"),I(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},o,((t={})[r.type]=i,t.titleAttributes=f({},a),t));case g.BODY:return f({},o,{bodyAttributes:f({},a)});case g.HTML:return f({},o,{htmlAttributes:f({},a)});default:return f({},o,((n={})[r.type]=f({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=h(r,Z),s=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,J),o=f({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(Y,f({},o,{context:a.value,helmetData:void 0})):r.createElement(q.Consumer,null,(function(e){return r.createElement(Y,f({},o,{context:e}))}))},t}(r.Component);X.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},X.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},X.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,y=n?Symbol.for("react.block"):60121,b=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function S(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case g:case h:case l:return e;default:return t}}case o:return t}}}function k(e){return S(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=f,t.Fragment=a,t.Lazy=g,t.Memo=h,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||S(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return S(e)===c},t.isContextProvider=function(e){return S(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return S(e)===f},t.isFragment=function(e){return S(e)===a},t.isLazy=function(e){return S(e)===g},t.isMemo=function(e){return S(e)===h},t.isPortal=function(e){return S(e)===o},t.isProfiler=function(e){return S(e)===s},t.isStrictMode=function(e){return S(e)===i},t.isSuspense=function(e){return S(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===f||e.$$typeof===b||e.$$typeof===v||e.$$typeof===w||e.$$typeof===y)},t.typeOf=S},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(6540),l=[],c=[];var u=s.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return l.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),f=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextType",u),f}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return s.createElement(u.Provider,{value:{report:this.props.report}},s.Children.only(this.props.children))},t}(s.Component);function y(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return y(e)}))}h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){y(l).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){y(c).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>s});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>y,k2:()=>w});var r=n(6347),o=n(2892),a=n(6540),i=n(9231),s=n(8168),l=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},m=function(e){return e},h=a.forwardRef;void 0===h&&(h=m);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.A)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=m!==h&&t||n,a.createElement("a",u)}));var y=h((function(e,t){var n=e.component,o=void 0===n?g:n,u=e.replace,d=e.to,y=e.innerRef,b=(0,l.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=p(f(d,e.location),e.location),l=r?n.createHref(r):"",g=(0,s.A)({},b,{href:l,navigate:function(){var t=f(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||y:g.innerRef=y,a.createElement(o,g)}))})),b=function(e){return e},v=a.forwardRef;void 0===v&&(v=b);var w=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,w=e.location,S=e.sensitive,k=e.strict,x=e.style,E=e.to,_=e.innerRef,j=(0,l.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=p(f(E,n),n),l=i.pathname,O=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),C=O?(0,r.B6)(n.pathname,{path:O,exact:h,sensitive:S,strict:k}):null,A=!!(g?g(C,n):C),T="function"==typeof m?m(A):m,P="function"==typeof x?x(A):x;A&&(T=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(T,u),P=(0,s.A)({},P,d));var I=(0,s.A)({"aria-current":A&&o||null,className:T,style:P,to:i},j);return b!==v?I.ref=t||_:I.innerRef=_,a.createElement(y,I)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>A,Ix:()=>v,W6:()=>F,XZ:()=>b,dO:()=>L,qh:()=>T,rd:()=>_,zy:()=>z});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(9231),l=n(1561),c=n(8168),u=n(5302),d=n.n(u),f=(n(4363),n(8587)),p=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},o.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},y=g("Router-History"),b=g("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(b.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(y.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}(0,r.A)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(o.Component);var S={},k=1e4,x=0;function E(e,t){return void 0===e&&(e="/"),void 0===t&&(t={}),"/"===e?e:function(e){if(S[e])return S[e];var t=d().compile(e);return x<k&&(S[e]=t,x++),t}(e)(t,{pretty:!0})}function _(e){var t=e.computedMatch,n=e.to,r=e.push,a=void 0!==r&&r;return o.createElement(b.Consumer,null,(function(e){e||(0,l.A)(!1);var r=e.history,i=e.staticContext,u=a?r.push:r.replace,d=(0,s.yJ)(t?"string"==typeof n?E(n,t.params):(0,c.A)({},n,{pathname:E(n.pathname,t.params)}):n);return i?(u(d),null):o.createElement(w,{onMount:function(){u(d)},onUpdate:function(e,t){var n=(0,s.yJ)(t.to);(0,s.Fu)(n,(0,c.A)({},d,{key:n.key}))||u(d)},to:n})}))}var j={},O=1e4,C=0;function A(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=j[n]||(j[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return C<O&&(r[e]=a,C++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],f=l.slice(1),p=e===u;return a&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var T=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(b.Consumer,null,(function(t){t||(0,l.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?A(n.pathname,e.props):t.match,a=(0,c.A)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(b.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function P(e){return"/"===e.charAt(0)?e:"/"+e}function I(e,t){if(!e)return t;var n=P(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function R(e){return"string"==typeof e?e:(0,s.AO)(e)}function N(e){return function(){(0,l.A)(!1)}}function D(){}o.Component;var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(b.Consumer,null,(function(t){t||(0,l.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?A(a.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var M=o.useContext;function F(){return M(y)}function z(){return M(b).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=y.prototype;var w=v.prototype=new b;w.constructor=v,h(w,y.prototype),w.isPureReactComponent=!0;var S=Array.isArray,k=Object.prototype.hasOwnProperty,x={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:x.current}}function j(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var O=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function A(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+C(l,0):a,S(i)?(o="",null!=e&&(o=e.replace(O,"$&/")+"/"),A(i,t,o,"",(function(e){return e}))):null!=i&&(j(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(O,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",S(e))for(var c=0;c<e.length;c++){var u=a+C(s=e[c],c);l+=A(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=A(s=s.value,t,o,u=a+C(s,c++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function T(e,t,n){if(null==e)return e;var r=[],o=0;return A(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function P(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var I={current:null},R={transition:null},N={ReactCurrentDispatcher:I,ReactCurrentBatchConfig:R,ReactCurrentOwner:x};function D(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:T,forEach:function(e,t,n){T(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return T(e,(function(){t++})),t},toArray:function(e){return T(e,(function(e){return e}))||[]},only:function(e){if(!j(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=i,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.act=D,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=h({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=x.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)k.call(t,c)&&!E.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=j,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=R.transition;R.transition={};try{e()}finally{R.transition=t}},t.unstable_act=D,t.useCallback=function(e,t){return I.current.useCallback(e,t)},t.useContext=function(e){return I.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return I.current.useDeferredValue(e)},t.useEffect=function(e,t){return I.current.useEffect(e,t)},t.useId=function(){return I.current.useId()},t.useImperativeHandle=function(e,t,n){return I.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return I.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return I.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return I.current.useMemo(e,t)},t.useReducer=function(e,t,n){return I.current.useReducer(e,t,n)},t.useRef=function(e){return I.current.useRef(e)},t.useState=function(e){return I.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return I.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return I.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,p=3,m=!1,h=!1,g=!1,y="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function S(e){if(g=!1,w(e),!h)if(null!==r(c))h=!0,R(k);else{var t=r(u);null!==t&&N(S,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,b(j),j=-1),m=!0;var a=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!A());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var s=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?f.callback=s:f===r(c)&&o(c),w(n)}else o(c);f=r(c)}if(null!==f)var l=!0;else{var d=r(u);null!==d&&N(S,d.startTime-n),l=!1}return l}finally{f=null,p=a,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var x,E=!1,_=null,j=-1,O=5,C=-1;function A(){return!(t.unstable_now()-C<O)}function T(){if(null!==_){var e=t.unstable_now();C=e;var n=!0;try{n=_(!0,e)}finally{n?x():(E=!1,_=null)}}else E=!1}if("function"==typeof v)x=function(){v(T)};else if("undefined"!=typeof MessageChannel){var P=new MessageChannel,I=P.port2;P.port1.onmessage=T,x=function(){I.postMessage(null)}}else x=function(){y(T,0)};function R(e){_=e,E||(E=!0,x())}function N(e,n){j=y((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,R(k))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):O=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(b(j),j=-1):g=!0,N(S,a-i))):(e.sortIndex=s,n(c,e),h||m||(h=!0,R(k))),e},t.unstable_shouldYield=A,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"zrok",staticDirectories:["static","../docs/images","../docker/compose","../etc/caddy"],tagline:"Globally distributed reverse proxy",url:"https://docs.zrok.io",baseUrl:"/",trailingSlash:!0,onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/space-ziggy.png",organizationName:"NetFoundry",projectName:"zrok",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/docs/guides/self-hosting/linux",from:["/docs/guides/self-hosting/self_hosting_guide"]},{to:"/docs/guides/self-hosting/linux/nginx",from:["/docs/guides/self-hosting/nginx_tls_guide/"]},{to:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",from:["/docs/guides/metrics-and-limits/configuring-limits"]},{to:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",from:["/docs/guides/metrics-and-limits/configuring-metrics"]}]}],null],presets:[["classic",{docs:{sidebarPath:"/home/runner/work/zrok/zrok/website/sidebars.js",editUrl:"https://github.com/openziti/zrok/blob/main/docs",path:"../docs",include:["**/*.md","**/*.mdx"],lastVersion:"current",versions:{current:{label:"1.0"}}},theme:{customCss:"/home/runner/work/zrok/zrok/website/src/css/custom.css"},pages:{path:"./src/pages"},googleTagManager:{containerId:"GTM-MDFLZPK8"},sitemap:{}}]],themeConfig:{navbar:{title:"zrok",logo:{alt:"Ziggy Goes to Space",src:"img/space-ziggy.png",href:"https://zrok.io",target:"_self"},items:[{type:"docsVersionDropdown",position:"left",dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://zrok.io/pricing/",position:"right",label:"pricing"},{href:"https://myzrok.io/",position:"right",label:"account"},{href:"https://github.com/orgs/openziti/projects/16",label:"roadmap",position:"right"},{href:"https://github.com/openziti/zrok",position:"right",className:"header-github-link",title:"GitHub"},{href:"https://openziti.discourse.group/",position:"right",className:"header-discourse-link",title:"Discourse"}],hideOnScroll:!1},footer:{style:"dark",links:[],copyright:"Copyright \xa9 2025 NetFoundry Inc. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"dark",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{sidebar:{autoCollapseCategories:!0,hideable:!1},versionPersistence:"localStorage"},algolia:{appId:"CO73R59OLO",apiKey:"489572e91d0a750d34c127c2071ef962",indexName:"zrok",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},8215:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},4876:(e,t,n)=>{"use strict";n.d(t,{My:()=>S,f4:()=>Y});var r,o,a=n(6540),i=n(8215),s=Object.create,l=Object.defineProperty,c=Object.defineProperties,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyDescriptors,f=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=Object.prototype.propertyIsEnumerable,y=(e,t,n)=>t in e?l(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,b=(e,t)=>{for(var n in t||(t={}))h.call(t,n)&&y(e,n,t[n]);if(p)for(var n of p(t))g.call(t,n)&&y(e,n,t[n]);return e},v=(e,t)=>c(e,d(t)),w=(e,t)=>{var n={};for(var r in e)h.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&p)for(var r of p(e))t.indexOf(r)<0&&g.call(e,r)&&(n[r]=e[r]);return n},S=((e,t,n)=>(n=null!=e?s(m(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of f(t))h.call(e,o)||o===n||l(e,o,{get:()=>t[o],enumerable:!(r=u(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:l(n,"default",{value:e,enumerable:!0}),e)))((r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new s;return l(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,s,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var h=p[m],g=h.inside,y=!!h.lookbehind,b=!!h.greedy,v=h.alias;if(b&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var S=h.pattern||h,k=s.next,x=u;k!==t.tail&&!(d&&x>=d.reach);x+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var _,j=1;if(b){if(!(_=a(S,x,e,y))||_.index>=e.length)break;var O=_.index,C=_.index+_[0].length,A=x;for(A+=k.value.length;O>=A;)A+=(k=k.next).value.length;if(x=A-=k.value.length,k.value instanceof o)continue;for(var T=k;T!==t.tail&&(A<C||"string"==typeof T.value);T=T.next)j++,A+=T.value.length;j--,E=e.slice(x,A),_.index-=x}else if(!(_=a(S,0,E,y)))continue;O=_.index;var P=_[0],I=E.slice(0,O),R=E.slice(O+P.length),N=x+E.length;d&&N>d.reach&&(d.reach=N);var D=k.prev;if(I&&(D=l(t,D,I),x+=I.length),c(t,D,j),k=l(t,D,new o(f,g?r.tokenize(P,g):P,v,P)),R&&l(t,k,R),j>1){var L={cause:f+","+m,reach:N};i(e,t,n,k.prev,x,L),d&&L.reach>d.reach&&(d.reach=L.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[f(r)[0]])((o={exports:{}}).exports,o),o.exports})());S.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},S.languages.markup.tag.inside["attr-value"].inside.entity=S.languages.markup.entity,S.languages.markup.doctype.inside["internal-subset"].inside=S.languages.markup,S.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(S.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:S.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:S.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},S.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(S.languages.markup.tag,"addAttribute",{value:function(e,t){S.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:S.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),S.languages.html=S.languages.markup,S.languages.mathml=S.languages.markup,S.languages.svg=S.languages.markup,S.languages.xml=S.languages.extend("markup",{}),S.languages.ssml=S.languages.xml,S.languages.atom=S.languages.xml,S.languages.rss=S.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(S),S.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},S.languages.javascript=S.languages.extend("clike",{"class-name":[S.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),S.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,S.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:S.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:S.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:S.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:S.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:S.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),S.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:S.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),S.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),S.languages.markup&&(S.languages.markup.tag.addInlined("script","javascript"),S.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),S.languages.js=S.languages.javascript,S.languages.actionscript=S.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),S.languages.actionscript["class-name"].alias="function",delete S.languages.actionscript.parameter,delete S.languages.actionscript["literal-property"],S.languages.markup&&S.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:S.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(S),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(S),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(S),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(S),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(S),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n)):s[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(S),S.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:S.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},S.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=f(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),0<o.length)){var s=f(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&0<=o.indexOf(c.content)&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function f(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&0==--o)return a}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),S.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,l,f,p,m,h,g,y=n[a];"string"==typeof y||"string"==typeof y.content?(i=d[c],-1!==(g=(h="string"==typeof y?y:y.content).indexOf(i))&&(++c,l=h.substring(0,g),m=u[i],f=void 0,(p={})["interpolation-punctuation"]=o,3===(p=e.tokenize(m,p)).length&&((f=[1,1]).push.apply(f,s(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,m),p=h.substring(g+i.length),m=[],l&&m.push(l),m.push(f),p&&(t(h=[p]),m.push.apply(m,h)),"string"==typeof y?(n.splice.apply(n,[a,1].concat(m)),a+=m.length-1):y.content=m)):(g=y.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,s,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(S),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(S),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(S),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(S),S.languages.n4js=S.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),S.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),S.languages.n4jsd=S.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(S),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(S),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(S),S.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},S.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=S.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(S),S.languages.c=S.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),S.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),S.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},S.languages.c.string],char:S.languages.c.char,comment:S.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:S.languages.c}}}}),S.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete S.languages.c.boolean,S.languages.objectivec=S.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete S.languages.objectivec["class-name"],S.languages.objc=S.languages.objectivec,S.languages.reason=S.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),S.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete S.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(S),S.languages.go=S.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),S.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete S.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(S),S.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},S.languages.python["string-interpolation"].inside.interpolation.inside.rest=S.languages.python,S.languages.py=S.languages.python,S.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},S.languages.webmanifest=S.languages.json;((e,t)=>{for(var n in t)l(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>k,duotoneDark:()=>x,duotoneLight:()=>E,github:()=>_,gruvboxMaterialDark:()=>q,gruvboxMaterialLight:()=>$,jettwaveDark:()=>F,jettwaveLight:()=>z,nightOwl:()=>j,nightOwlLight:()=>O,oceanicNext:()=>T,okaidia:()=>P,oneDark:()=>B,oneLight:()=>U,palenight:()=>I,shadesOfPurple:()=>R,synthwave84:()=>N,ultramin:()=>D,vsDark:()=>L,vsLight:()=>M});var k={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},x={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},E={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},_={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},j={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},O={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},C="#c5a5c5",A="#8dc891",T={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:C}},{types:["attr-value"],style:{color:A}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:A}},{types:["punctuation"],style:{color:A}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:C}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},P={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},I={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},R={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},N={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},D={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},L={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},M={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},F={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},z={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},B={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},U={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},q={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},$={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},H=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=b(b({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=v(b({},n),{backgroundColor:void 0}),r},V=/\r\n|\r|\n/,G=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},W=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},K=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=W(c,u.type),u.alias&&(c=W(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(V),f=d.length;s.push({types:c,content:d[0]});for(let t=1;t<f;t++)G(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return G(s),l},Q=({children:e,language:t,code:n,theme:r,prism:o})=>{const s=t.toLowerCase(),l=((e,t)=>{const[n,r]=(0,a.useState)(H(t,e)),o=(0,a.useRef)(),i=(0,a.useRef)();return(0,a.useEffect)((()=>{t===o.current&&e===i.current||(o.current=t,i.current=e,r(H(t,e)))}),[e,t]),n})(s,r),c=(e=>(0,a.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,s=w(n,["className","style","line"]);const l=v(b({},s),{className:(0,i.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=b(b({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,a.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,a.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,s=w(n,["token","className","style"]);const l=v(b({},s),{className:(0,i.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=b(b({},l.style||{}),a)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,a.useRef)(e);return(0,a.useMemo)((()=>{if(null==n)return K([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),K(e.tokens)}),[t,n,r])})({prism:o,language:s,code:n,grammar:o.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},Y=e=>(0,a.createElement)(Q,v(b({},e),{prism:e.prism||S,theme:e.theme||L,code:e.code,language:e.language}))},5066:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},1635:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>N,__assign:()=>a,__asyncDelegator:()=>_,__asyncGenerator:()=>E,__asyncValues:()=>j,__await:()=>x,__awaiter:()=>m,__classPrivateFieldGet:()=>P,__classPrivateFieldIn:()=>R,__classPrivateFieldSet:()=>I,__createBinding:()=>g,__decorate:()=>s,__disposeResources:()=>L,__esDecorate:()=>c,__exportStar:()=>y,__extends:()=>o,__generator:()=>h,__importDefault:()=>T,__importStar:()=>A,__makeTemplateObject:()=>O,__metadata:()=>p,__param:()=>l,__propKey:()=>d,__read:()=>v,__rest:()=>i,__runInitializers:()=>u,__setFunctionName:()=>f,__spread:()=>w,__spreadArray:()=>k,__spreadArrays:()=>S,__values:()=>b,default:()=>M});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function s(e,t,n,r){var o,a=arguments.length,i=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(t,n,i):o(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i}function l(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,o,a){function i(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var s,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var m={};for(var h in r)m[h]="access"===h?{}:r[h];for(var h in r.access)m.access[h]=r.access[h];m.addInitializer=function(e){if(f)throw new TypeError("Cannot add initializers after decoration has completed");a.push(i(e||null))};var g=(0,n[p])("accessor"===l?{get:d.get,set:d.set}:d[c],m);if("accessor"===l){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw new TypeError("Object expected");(s=i(g.get))&&(d.get=s),(s=i(g.set))&&(d.set=s),(s=i(g.init))&&o.unshift(s)}else(s=i(g))&&("field"===l?o.unshift(s):d[c]=s)}u&&Object.defineProperty(u,r.name,d),f=!0}function u(e,t,n){for(var r=arguments.length>2,o=0;o<t.length;o++)n=r?t[o].call(e,n):t[o].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function f(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{l(r.next(e))}catch(t){a(t)}}function s(e){try{l(r.throw(e))}catch(t){a(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}l((r=r.apply(e,t||[])).next())}))}function h(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(l){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(l){s=[6,l],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,l])}}}var g=Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function y(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||g(t,e,n)}function b(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(s){o={error:s}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i}function w(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function S(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var a=arguments[t],i=0,s=a.length;i<s;i++,o++)r[o]=a[i];return r}function k(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function x(e){return this instanceof x?(this.v=e,this):new x(e)}function E(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),a=[];return r={},i("next"),i("throw"),i("return"),r[Symbol.asyncIterator]=function(){return this},r;function i(e){o[e]&&(r[e]=function(t){return new Promise((function(n,r){a.push([e,t,n,r])>1||s(e,t)}))})}function s(e,t){try{(n=o[e](t)).value instanceof x?Promise.resolve(n.value.v).then(l,c):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function l(e){s("next",e)}function c(e){s("throw",e)}function u(e,t){e(t),a.shift(),a.length&&s(a[0][0],a[0][1])}}function _(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:x(e[r](t)),done:!1}:o?o(t):t}:o}}function j(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=b(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}}function O(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function A(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&g(t,e,n);return C(t,e),t}function T(e){return e&&e.__esModule?e:{default:e}}function P(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function I(e,t,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(e,n):o?o.value=n:t.set(e,n),n}function R(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function N(e,t,n){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var r;if(n){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose]}if("function"!=typeof r)throw new TypeError("Object not disposable.");e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var D="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=new Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function L(e){function t(t){e.error=e.hasError?new D(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}return function n(){for(;e.stack.length;){var r=e.stack.pop();try{var o=r.dispose&&r.dispose.call(r.value);if(r.async)return Promise.resolve(o).then(n,(function(e){return t(e),n()}))}catch(a){t(a)}}if(e.hasError)throw e.error}()}const M={__extends:o,__assign:a,__rest:i,__decorate:s,__param:l,__metadata:p,__awaiter:m,__generator:h,__createBinding:g,__exportStar:y,__values:b,__read:v,__spread:w,__spreadArrays:S,__spreadArray:k,__await:x,__asyncGenerator:E,__asyncDelegator:_,__asyncValues:j,__makeTemplateObject:O,__importStar:A,__importDefault:T,__classPrivateFieldGet:P,__classPrivateFieldSet:I,__classPrivateFieldIn:R,__addDisposableResource:N,__disposeResources:L}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search/-21e":{"__comp":"1a4e3797","__context":{"plugin":"c141421f"}},"/docs/-f20":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs/0.4/-81e":{"__comp":"a7bd4aaa","__props":"6ad1709d"},"/docs/0.4/-33b":{"__comp":"a94703ab"},"/docs/0.4/category/guides/-038":{"__comp":"14eb3368","__props":"e3e0bfdc"},"/docs/0.4/category/metrics-and-limits/-011":{"__comp":"14eb3368","__props":"28f20845"},"/docs/0.4/category/myzrok/-66c":{"__comp":"14eb3368","__props":"d087459a"},"/docs/0.4/category/oauth/-491":{"__comp":"14eb3368","__props":"80941509"},"/docs/0.4/category/self-hosting/-eab":{"__comp":"14eb3368","__props":"1f91e8db"},"/docs/0.4/concepts/-5db":{"__comp":"17896441","content":"7d0a541a"},"/docs/0.4/concepts/files/-c0e":{"__comp":"17896441","content":"6a6a5bbc"},"/docs/0.4/concepts/hosting/-ea5":{"__comp":"17896441","content":"bf372175"},"/docs/0.4/concepts/http/-d50":{"__comp":"17896441","content":"1dd31738"},"/docs/0.4/concepts/opensource/-050":{"__comp":"17896441","content":"61ea36d9"},"/docs/0.4/concepts/sharing-private/-ab6":{"__comp":"17896441","content":"ce04f2ae"},"/docs/0.4/concepts/sharing-public/-361":{"__comp":"17896441","content":"35a60099"},"/docs/0.4/concepts/sharing-reserved/-4c8":{"__comp":"17896441","content":"27b0284c"},"/docs/0.4/concepts/tunnels/-241":{"__comp":"17896441","content":"ecf841c3"},"/docs/0.4/getting-started/-acc":{"__comp":"17896441","content":"8a9ffb5d"},"/docs/0.4/guides/docker-share/-4d9":{"__comp":"17896441","content":"0c1cdb3d"},"/docs/0.4/guides/docker-share/docker_private_share_guide/-e49":{"__comp":"17896441","content":"25ef1bb8"},"/docs/0.4/guides/docker-share/docker_public_share_guide/-b4b":{"__comp":"17896441","content":"c88279fc"},"/docs/0.4/guides/drives/-186":{"__comp":"17896441","content":"8b4ddd1a"},"/docs/0.4/guides/frontdoor/-107":{"__comp":"17896441","content":"ebc0e2a0"},"/docs/0.4/guides/install/-4db":{"__comp":"17896441","content":"1ddd36f2"},"/docs/0.4/guides/install/linux/-1df":{"__comp":"17896441","content":"0efac3c3"},"/docs/0.4/guides/install/macos/-8c6":{"__comp":"17896441","content":"17f4c24e"},"/docs/0.4/guides/install/windows/-d0b":{"__comp":"17896441","content":"2cc2e835"},"/docs/0.4/guides/linux-user-share/-a76":{"__comp":"17896441","content":"f8f494be"},"/docs/0.4/guides/permission-modes/-895":{"__comp":"17896441","content":"4277b6a0"},"/docs/0.4/guides/self-hosting/docker/-e7e":{"__comp":"17896441","content":"685bed1a"},"/docs/0.4/guides/self-hosting/instance-configuration/-fe9":{"__comp":"17896441","content":"adf8dca1"},"/docs/0.4/guides/self-hosting/interstitial-page/-0e4":{"__comp":"17896441","content":"bc32cbb6"},"/docs/0.4/guides/self-hosting/kubernetes/-751":{"__comp":"17896441","content":"7dd0c8d0"},"/docs/0.4/guides/self-hosting/linux/-3db":{"__comp":"17896441","content":"392083ed"},"/docs/0.4/guides/self-hosting/linux/nginx/-d5a":{"__comp":"17896441","content":"d3a54718"},"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/-c58":{"__comp":"17896441","content":"8dbf8f84"},"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/-5db":{"__comp":"17896441","content":"901ef07d"},"/docs/0.4/guides/self-hosting/oauth/configuring-oauth/-fc6":{"__comp":"17896441","content":"bfe99541"},"/docs/0.4/guides/self-hosting/organizations/-587":{"__comp":"17896441","content":"b36bb0c9"},"/docs/0.4/guides/self-hosting/personalized-frontend/-555":{"__comp":"17896441","content":"81fb89b8"},"/docs/0.4/guides/self-hosting/self-service-invite/-7d9":{"__comp":"17896441","content":"033e8fc8"},"/docs/0.4/guides/vpn/-df1":{"__comp":"17896441","content":"48341697"},"/docs/0.4/myzrok/custom-domains/-25a":{"__comp":"17896441","content":"3fab0acb"},"/docs/-5a5":{"__comp":"a7bd4aaa","__props":"11b43341"},"/docs/-a12":{"__comp":"a94703ab"},"/docs/category/guides/-c07":{"__comp":"14eb3368","__props":"9af26a4e"},"/docs/category/metrics-and-limits/-9f2":{"__comp":"14eb3368","__props":"4cb7be2f"},"/docs/category/myzrok/-784":{"__comp":"14eb3368","__props":"f7af5a99"},"/docs/category/oauth/-b50":{"__comp":"14eb3368","__props":"e2c4d679"},"/docs/category/self-hosting/-cad":{"__comp":"14eb3368","__props":"2c440c24"},"/docs/concepts/-76a":{"__comp":"17896441","content":"bc747cac"},"/docs/concepts/files/-331":{"__comp":"17896441","content":"c015c796"},"/docs/concepts/hosting/-fea":{"__comp":"17896441","content":"50ef9c44"},"/docs/concepts/http/-d68":{"__comp":"17896441","content":"07d0b302"},"/docs/concepts/opensource/-94c":{"__comp":"17896441","content":"75b20590"},"/docs/concepts/sharing-private/-7b0":{"__comp":"17896441","content":"aad6478e"},"/docs/concepts/sharing-public/-c3b":{"__comp":"17896441","content":"54fa7005"},"/docs/concepts/sharing-reserved/-5d7":{"__comp":"17896441","content":"6272ba0e"},"/docs/concepts/tunnels/-f73":{"__comp":"17896441","content":"339d500a"},"/docs/getting-started/-fdf":{"__comp":"17896441","content":"f888b719"},"/docs/guides/agent/-d0d":{"__comp":"17896441","content":"71c8a211"},"/docs/guides/agent/linux-service/-8a7":{"__comp":"17896441","content":"2fede397"},"/docs/guides/agent/windows-service/-9a1":{"__comp":"17896441","content":"43e1c8e4"},"/docs/guides/docker-share/-7d3":{"__comp":"17896441","content":"2da89d45"},"/docs/guides/docker-share/docker_private_share_guide/-927":{"__comp":"17896441","content":"bbbe662c"},"/docs/guides/docker-share/docker_public_share_guide/-ccf":{"__comp":"17896441","content":"2e812224"},"/docs/guides/drives/-8a1":{"__comp":"17896441","content":"36b94792"},"/docs/guides/frontdoor/-e30":{"__comp":"17896441","content":"cda0d2e5"},"/docs/guides/install/-aa4":{"__comp":"17896441","content":"b6569025"},"/docs/guides/install/linux/-0c6":{"__comp":"17896441","content":"47881d5c"},"/docs/guides/install/macos/-532":{"__comp":"17896441","content":"1ba5bc99"},"/docs/guides/install/windows/-ad4":{"__comp":"17896441","content":"c304be44"},"/docs/guides/permission-modes/-d45":{"__comp":"17896441","content":"0c66edb9"},"/docs/guides/self-hosting/docker/-5a7":{"__comp":"17896441","content":"e1dfe4fe"},"/docs/guides/self-hosting/instance-configuration/-297":{"__comp":"17896441","content":"5cd0a723"},"/docs/guides/self-hosting/interstitial-page/-90e":{"__comp":"17896441","content":"9939c4f4"},"/docs/guides/self-hosting/kubernetes/-37d":{"__comp":"17896441","content":"20595907"},"/docs/guides/self-hosting/linux/-d78":{"__comp":"17896441","content":"d768dc0f"},"/docs/guides/self-hosting/linux/nginx/-b26":{"__comp":"17896441","content":"ef8afbfd"},"/docs/guides/self-hosting/metrics-and-limits/configuring-limits/-8b7":{"__comp":"17896441","content":"600b2345"},"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/-0a8":{"__comp":"17896441","content":"288b1075"},"/docs/guides/self-hosting/oauth/configuring-oauth/-b5f":{"__comp":"17896441","content":"6e881e32"},"/docs/guides/self-hosting/organizations/-369":{"__comp":"17896441","content":"7f5ec875"},"/docs/guides/self-hosting/personalized-frontend/-567":{"__comp":"17896441","content":"7452427d"},"/docs/guides/self-hosting/self-service-invite/-532":{"__comp":"17896441","content":"4f1777fd"},"/docs/guides/vpn/-13f":{"__comp":"17896441","content":"21880a4d"},"/docs/myzrok/custom-domains/-c1c":{"__comp":"17896441","content":"01cb08ea"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.73901735.js b/assets/js/main.73901735.js new file mode 100644 index 00000000..31e0d08d --- /dev/null +++ b/assets/js/main.73901735.js @@ -0,0 +1,2 @@ +/*! For license information please see main.73901735.js.LICENSE.txt */ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8792],{5600:(e,t,n)=>{"use strict";n.d(t,{Bc:()=>C,E8:()=>Zn,a1:()=>Yn});var r=n(6540);n(961);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){a(i,r,o,s,l,"next",e)}function l(e){a(i,r,o,s,l,"throw",e)}s(void 0)}))}}function s(e,t,n){return t=f(t),function(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,m()?Reflect.construct(t,n||[],f(e).constructor):t.apply(e,n))}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t,n){return Object.defineProperty(e,"prototype",{writable:!1}),e}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d.apply(null,arguments)}function f(e){return f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},f(e)}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}function m(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(m=function(){return!!e})()}function h(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?h(Object(n),!0).forEach((function(t){u(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):h(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function y(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function b(){b=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var a=t&&t.prototype instanceof y?t:y,i=Object.create(a.prototype),s=new P(r||[]);return o(i,"_invoke",{value:O(e,n,s)}),i}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var f="suspendedStart",p="suspendedYield",m="executing",h="completed",g={};function y(){}function v(){}function w(){}var S={};c(S,i,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(I([])));x&&x!==n&&r.call(x,i)&&(S=x);var E=w.prototype=y.prototype=Object.create(S);function _(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function j(e,t){function n(o,a,i,s){var l=d(e[o],e,a);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==typeof u&&r.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,i,s)}),(function(e){n("throw",e,i,s)})):t.resolve(u).then((function(e){c.value=e,i(c)}),(function(e){return n("throw",e,i,s)}))}s(l.arg)}var a;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return a=a?a.then(o,o):o()}})}function O(t,n,r){var o=f;return function(a,i){if(o===m)throw Error("Generator is already running");if(o===h){if("throw"===a)throw i;return{value:e,done:!0}}for(r.method=a,r.arg=i;;){var s=r.delegate;if(s){var l=C(s,r);if(l){if(l===g)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===f)throw o=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=m;var c=d(t,n,r);if("normal"===c.type){if(o=r.done?h:p,c.arg===g)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=h,r.method="throw",r.arg=c.arg)}}}function C(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,C(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var a=d(o,t.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,g;var i=a.arg;return i?i.done?(n[t.resultName]=i.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):i:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function A(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(A,this),this.reset(!0)}function I(t){if(t||""===t){var n=t[i];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return a.next=a}}throw new TypeError(typeof t+" is not iterable")}return v.prototype=w,o(E,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:v,configurable:!0}),v.displayName=c(w,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,w):(e.__proto__=w,c(e,l,"GeneratorFunction")),e.prototype=Object.create(E),e},t.awrap=function(e){return{__await:e}},_(j.prototype),c(j.prototype,s,(function(){return this})),t.AsyncIterator=j,t.async=function(e,n,r,o,a){void 0===a&&(a=Promise);var i=new j(u(e,n,r,o),a);return t.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},_(E),c(E,l,"Generator"),c(E,i,(function(){return this})),c(E,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=I,P.prototype={constructor:P,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return s.type="throw",s.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],s=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var l=r.call(i,"catchLoc"),c=r.call(i,"finallyLoc");if(l&&c){if(this.prev<i.catchLoc)return o(i.catchLoc,!0);if(this.prev<i.finallyLoc)return o(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return o(i.catchLoc,!0)}else{if(!c)throw Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return o(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var a=o;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method="next",this.next=a.finallyLoc,g):this.complete(i)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;T(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:I(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function v(e,t){return v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},v(e,t)}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}(e,t)||k(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||k(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function x(e){var t="function"==typeof Map?new Map:void 0;return x=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(m())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&v(o,n.prototype),o}(e,arguments,f(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),v(n,e)},x(e)}function E(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function _(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("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",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var j=["translations"],O="Ctrl",C=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=y(e,j),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=w((0,r.useState)(null),2),f=u[0],p=u[1];(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(O))}),[]);var m=w(f===O?[O,"Ctrl",r.createElement(E,null)]:["Meta","Command",f],3),h=m[0],g=m[1],b=m[2];return r.createElement("button",d({type:"button",className:"DocSearch DocSearch-Button","aria-label":"".concat(c," (").concat(g,"+K)")},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(_,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==f&&r.createElement(r.Fragment,null,r.createElement(A,{reactsToKey:h},b),r.createElement(A,{reactsToKey:"k"},"K"))))}));function A(e){var t=e.reactsToKey,n=e.children,o=w((0,r.useState)(!1),2),a=o[0],i=o[1];return(0,r.useEffect)((function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&i(!0)}function n(e){e.key!==t&&"Meta"!==e.key||i(!1)}}),[t]),r.createElement("kbd",{className:a?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}function T(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];n&&clearTimeout(n),n=setTimeout((function(){return e.apply(void 0,o)}),t)}}function P(e){return e.reduce((function(e,t){return e.concat(t)}),[])}var I=0;function R(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}function N(e){return e!==Object(e)}function D(e,t){if(e===t)return!0;if(N(e)||N(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n=0,r=Object.keys(e);n<r.length;n++){var o=r[n];if(!(o in t))return!1;if(!D(e[o],t[o]))return!1}return!0}var L=function(){},M=[{segment:"autocomplete-core",version:"1.17.9"}];function F(e){var t=e.item,n=e.items,r=void 0===n?[]:n;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var B=["items"],U=["items"];function q(e){return q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},q(e)}function $(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function G(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function W(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?G(Object(n),!0).forEach((function(t){K(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):G(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function K(e,t,n){return(t=function(e){var t=function(e){if("object"!==q(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==q(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===q(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Q(e){return e.map((function(e){var t=e.items,n=V(e,B);return W(W({},n),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||n.objectIDs})}))}function Y(e){var t,n,r,o=(t=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return z(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}((e.version||"").split(".").map(Number),2),n=t[0],r=t[1],n>=3||2===n&&r>=4||1===n&&r>=10);function a(t,n,r){if(o&&void 0!==r){var a=r[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[t].concat($(n),[{headers:i}]))}else e.apply(void 0,[t].concat($(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDsAfterSearch",Q(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDs",Q(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDsAfterSearch",Q(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDs",Q(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&t.reduce((function(e,t){var n=t.items,r=V(t,U);return[].concat($(e),$(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r<e.objectIDs.length;r+=t)n.push(W(W({},e),{},{objectIDs:e.objectIDs.slice(r,r+t)}));return n}(W(W({},r),{},{objectIDs:(null==n?void 0:n.map((function(e){return e.objectID})))||r.objectIDs})).map((function(e){return{items:n,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return a("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Z(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function J(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function ee(e){return function(e){if(Array.isArray(e))return te(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?te(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function ne(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ne(Object(n),!0).forEach((function(t){oe(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ne(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function oe(e,t,n){return(t=function(e){var t=function(e){if("object"!==X(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==X(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===X(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ae="2.15.0",ie="https://cdn.jsdelivr.net/npm/search-insights@".concat(ae,"/dist/search-insights.min.js"),se=T((function(e){var t=e.onItemsChange,n=e.items,r=e.insights,o=e.state;t({insights:r,insightsEvents:Z({items:n}).map((function(e){return re({eventName:"Items Viewed"},e)})),state:o})}),400);function le(e){var t=function(e){return re({onItemsChange:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.viewedObjectIDs.apply(t,ee(n.map((function(e){return re(re({},e),{},{algoliaSource:ce(e.algoliaSource,r.context)})}))))},onSelect:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.clickedObjectIDsAfterSearch.apply(t,ee(n.map((function(e){return re(re({},e),{},{algoliaSource:ce(e.algoliaSource,r.context)})}))))},onActive:L,__autocomplete_clickAnalytics:!0},e)}(e),n=t.insightsClient,r=t.insightsInitParams,o=t.onItemsChange,a=t.onSelect,i=t.onActive,s=t.__autocomplete_clickAnalytics,l=n;if(n||"undefined"!=typeof window&&function(e){var t=e.window,n=t.AlgoliaAnalyticsObject||"aa";"string"==typeof n&&(l=t[n]),l||(t.AlgoliaAnalyticsObject=n,t[n]||(t[n]=function(){t[n].queue||(t[n].queue=[]);for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];t[n].queue.push(r)}),t[n].version=ae,l=t[n],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var n=e.document.createElement("script");n.async=!0,n.src=ie,n.onerror=function(){console.error(t)},document.body.appendChild(n)}catch(e){console.error(t)}}(t))}({window:window}),!l)return{};r&&l("init",re({partial:!0},r));var c=Y(l),u={current:[]},d=T((function(e){var t=e.state;if(t.isOpen){var n=t.collections.reduce((function(e,t){return[].concat(ee(e),ee(t.items))}),[]).filter(J);D(u.current.map((function(e){return e.objectID})),n.map((function(e){return e.objectID})))||(u.current=n,n.length>0&&se({onItemsChange:o,items:n,insights:c,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function o(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:re(re({},s?{clickAnalytics:!0}:{}),e?{userToken:ue(e)}:{}),insights:c}})}l("addAlgoliaAgent","insights-plugin"),o(),l("onUserTokenChange",(function(e){o(e)})),l("getUserToken",null,(function(e,t){o(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,o=e.source;J(t)&&a({state:n,event:r,insights:c,item:t,insightsEvents:[re({eventName:"Item Selected"},F({item:t,items:o.getItems().filter(J)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;J(t)&&i({state:r,event:o,insights:c,item:t,insightsEvents:[re({eventName:"Item Active"},F({item:t,items:n.getItems().filter(J)}))]})}))},onStateChange:function(e){var t=e.state;d({state:t})},__autocomplete_pluginOptions:e}}function ce(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(ee(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],ee(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function ue(e){return"number"==typeof e?e.toString():e}function de(e,t){var n=t;return{then:function(t,r){return de(e.then(pe(t,n,e),pe(r,n,e)),n)},catch:function(t){return de(e.catch(pe(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),de(e.finally(pe(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function fe(e){return de(e,{isCanceled:!1,onCancelList:[]})}function pe(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function me(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function he(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ge(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?he(Object(n),!0).forEach((function(t){ye(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):he(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ye(e,t,n){return(t=function(e){var t=function(e){if("object"!==be(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==be(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===be(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function be(e){return be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},be(e)}function ve(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,n){var r=(e[n-1]||0)+t;return e.push(r),e}),[]).reduce((function(t,n){return n<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var n=t.items[function(e){for(var t=e.state,n=e.collection,r=!1,o=0,a=0;!1===r;){var i=t.collections[o];if(i===n){r=!0;break}a+=i.items.length,o++}return t.activeItemId-a}({state:e,collection:t})],r=t.source;return{item:n,itemInputValue:r.getItemInputValue({item:n,state:e}),itemUrl:r.getItemUrl({item:n,state:e}),source:r}}function we(e,t,n){return[e,null==n?void 0:n.sourceId,t].filter(Boolean).join("-").replace(/\s/g,"")}var Se=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function ke(e){return e.nativeEvent||e}function xe(e){return xe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},xe(e)}function Ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _e(e,t,n){return(t=function(e){var t=function(e){if("object"!==xe(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==xe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===xe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function je(e){return je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},je(e)}function Oe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ce(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Oe(Object(n),!0).forEach((function(t){Ae(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Oe(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Ae(e,t,n){return(t=function(e){var t=function(e){if("object"!==je(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==je(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===je(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Te(e){return Te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Te(e)}function Pe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ie(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ie(Object(n),!0).forEach((function(t){Ne(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ie(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Ne(e,t,n){return(t=function(e){var t=function(e){if("object"!==Te(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function De(e,t){var n,r="undefined"!=typeof window?window:{},o=e.plugins||[];return Re(Re({debug:!1,openOnFocus:!1,enterKeyHint:void 0,ignoreCompositionEvents:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:void 0,environment:r,shouldPanelOpen:function(e){return R(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(I++),plugins:o,initialState:Re({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return Pe(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Pe(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Pe(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:L,onResolve:L};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=ge(ge({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return P(e)})).then((function(e){return e.map((function(e){return Re(Re({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:Re({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Le(e){return Le="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Le(e)}function Me(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Fe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Me(Object(n),!0).forEach((function(t){ze(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Me(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ze(e,t,n){return(t=function(e){var t=function(e){if("object"!==Le(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Le(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Le(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Be(e){return Be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Be(e)}function Ue(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function qe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ue(Object(n),!0).forEach((function(t){$e(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ue(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function $e(e,t,n){return(t=function(e){var t=function(e){if("object"!==Be(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Be(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Be(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function He(e){return function(e){if(Array.isArray(e))return Ve(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Ve(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ve(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ge(e){return Boolean(e.execute)}function We(e){var t=e.reduce((function(e,t){if(!Ge(t))return e.push(t),e;var n=t.searchClient,r=t.execute,o=t.requesterId,a=t.requests,i=e.find((function(e){return Ge(t)&&Ge(e)&&e.searchClient===n&&Boolean(o)&&e.requesterId===o}));if(i){var s;(s=i.items).push.apply(s,He(a))}else{var l={execute:r,requesterId:o,items:a,searchClient:n};e.push(l)}return e}),[]).map((function(e){if(!Ge(e))return Promise.resolve(e);var t=e,n=t.execute,r=t.items;return n({searchClient:t.searchClient,requests:r})}));return Promise.all(t).then((function(e){return P(e)}))}function Ke(e){return Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ke(e)}var Qe=["event","nextState","props","query","refresh","store"];function Ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ze(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ye(Object(n),!0).forEach((function(t){Je(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ye(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Je(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ke(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ke(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ke(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Xe,et,tt,nt=null,rt=(Xe=-1,et=-1,tt=void 0,function(e){var t=++Xe;return Promise.resolve(e).then((function(e){return tt&&t<et?tt:(et=t,tt=e,e)}))});function ot(e){var t=e.event,n=e.nextState,r=void 0===n?{}:n,o=e.props,a=e.query,i=e.refresh,s=e.store,l=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Qe);nt&&o.environment.clearTimeout(nt);var c=l.setCollections,u=l.setIsOpen,d=l.setQuery,f=l.setActiveItemId,p=l.setStatus,m=l.setContext;if(d(a),f(o.defaultActiveItemId),!a&&!1===o.openOnFocus){var h,g=s.getState().collections.map((function(e){return Ze(Ze({},e),{},{items:[]})}));p("idle"),c(g),u(null!==(h=r.isOpen)&&void 0!==h?h:o.shouldPanelOpen({state:s.getState()}));var y=fe(rt(g).then((function(){return Promise.resolve()})));return s.pendingRequests.add(y)}p("loading"),nt=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var b=fe(rt(o.getSources(Ze({query:a,refresh:i,state:s.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(Ze({query:a,refresh:i,state:s.getState()},l))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(He(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return qe(qe({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?qe(qe({},n),{},{params:qe(qe({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,s.getState())}))}))).then(We).then((function(t){var n,r=t.some((function(e){return function(e){return!Array.isArray(e)&&Boolean(null==e?void 0:e._automaticInsights)}(e.items)}));return r&&m({algoliaInsightsPlugin:Ze(Ze({},(null===(n=s.getState().context)||void 0===n?void 0:n.algoliaInsightsPlugin)||{}),{},{__automaticInsights:r})}),function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),a=o.map((function(e){return e.items})),i=o[0].transformResponse,s=i?i({results:r=a,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):a;return t.onResolve({source:t,results:a,items:s,state:n.getState()}),s.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:s}}))}(t,e,s)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Fe(Fe({},e),{},ze({},t.source.sourceId,Fe(Fe({},t.source),{},{getItems:function(){return P(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return P(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:s.getState()})}))})))).then((function(e){var n;p("idle"),c(e);var d=o.shouldPanelOpen({state:s.getState()});u(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!a&&d||d);var f=ve(s.getState());if(null!==s.getState().activeItemId&&f){var m=f.item,h=f.itemInputValue,g=f.itemUrl,y=f.source;y.onActive(Ze({event:t,item:m,itemInputValue:h,itemUrl:g,refresh:i,source:y,state:s.getState()},l))}})).finally((function(){p("idle"),nt&&o.environment.clearTimeout(nt)}));return s.pendingRequests.add(b)}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}var it=["event","props","refresh","store"];function st(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?st(Object(n),!0).forEach((function(t){ct(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):st(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ct(e,t,n){return(t=function(e){var t=function(e){if("object"!==at(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ut(e){return ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ut(e)}var dt=["props","refresh","store"],ft=["inputElement","formElement","panelElement"],pt=["inputElement"],mt=["inputElement","maxLength"],ht=["source"],gt=["item","source"];function yt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function bt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?yt(Object(n),!0).forEach((function(t){vt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):yt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function vt(e,t,n){return(t=function(e){var t=function(e){if("object"!==ut(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==ut(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===ut(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wt(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function St(e){var t=e.props,n=e.refresh,r=e.store,o=wt(e,dt);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return(n=t)===(r=e.target)||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return bt({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},wt(e,ft))},getRootProps:function(e){return bt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return we(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":we(t.id,"label")},e)},getFormProps:function(e){return e.inputElement,bt({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(bt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(bt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},wt(e,pt))},getLabelProps:function(e){return bt({htmlFor:we(t.id,"input"),id:we(t.id,"label")},e)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&ot(bt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{};s.inputElement;var l=s.maxLength,c=void 0===l?512:l,u=wt(s,mt),d=ve(r.getState()),f=function(e){return Boolean(e&&e.match(Se))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),p=t.enterKeyHint||(null!=d&&d.itemUrl&&!f?"go":"search");return bt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?we(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return we(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":we(t.id,"label"),value:r.getState().completion||r.getState().query,id:we(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:p,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){var a=e.currentTarget.value;t.ignoreCompositionEvents&&ke(e).isComposing?o.setQuery(a):ot(bt({event:e,props:t,query:a.slice(0,c),refresh:n,store:r},o))},onCompositionEnd:function(e){ot(bt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){ke(e).isComposing||function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,it);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=ve(o.getState()),t=n.environment.document.getElementById(we(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},s=function(){var e=ve(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(lt({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?ot(lt({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ve(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,f=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});ot(lt({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){f.onSelect(lt({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a))}))}}}(bt({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:L,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return bt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=wt(n,ht);return bt({role:"listbox","aria-labelledby":we(t.id,"label"),id:we(t.id,"list",r)},o)},getItemProps:function(e){var a=e.item,i=e.source,s=wt(e,gt);return bt({id:we(t.id,"item-".concat(a.__autocomplete_id),i),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=ve(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(bt({event:e,item:i,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var s=i.getItemInputValue({item:a,state:r.getState()}),l=i.getItemUrl({item:a,state:r.getState()});(l?Promise.resolve():ot(bt({event:e,nextState:{isOpen:!1},props:t,query:s,refresh:n,store:r},o))).then((function(){i.onSelect(bt({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:i,state:r.getState()},o))}))}},s)}}}function kt(e){return kt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},kt(e)}function xt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Et(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?xt(Object(n),!0).forEach((function(t){_t(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):xt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function _t(e,t,n){return(t=function(e){var t=function(e){if("object"!==kt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==kt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===kt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function jt(e){var t,n,r,o,a=e.plugins,i=e.options,s=null===(t=((null===(n=i.__autocomplete_metadata)||void 0===n?void 0:n.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=s?_t({},s,Object.keys((null===(r=i.__autocomplete_metadata)||void 0===r?void 0:r.options)||{})):{};return{plugins:a.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:Et({"autocomplete-core":Object.keys(i)},l),ua:M.concat((null===(o=i.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function Ot(e){var t,n=e.state;return!1===n.isOpen||null===n.activeItemId?null:(null===(t=ve(n))||void 0===t?void 0:t.itemInputValue)||null}function Ct(e){return Ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ct(e)}function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Tt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?At(Object(n),!0).forEach((function(t){Pt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):At(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Pt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ct(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ct(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ct(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var It=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return Tt(Tt({},e),{},{activeItemId:t.payload});case"setQuery":return Tt(Tt({},e),{},{query:t.payload,completion:null});case"setCollections":return Tt(Tt({},e),{},{collections:t.payload});case"setIsOpen":return Tt(Tt({},e),{},{isOpen:t.payload});case"setStatus":return Tt(Tt({},e),{},{status:t.payload});case"setContext":return Tt(Tt({},e),{},{context:Tt(Tt({},e.context),t.payload)});case"ArrowDown":var n=Tt(Tt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:me(1,e.activeItemId,R(e),t.props.defaultActiveItemId)});return Tt(Tt({},n),{},{completion:Ot({state:n})});case"ArrowUp":var r=Tt(Tt({},e),{},{activeItemId:me(-1,e.activeItemId,R(e),t.props.defaultActiveItemId)});return Tt(Tt({},r),{},{completion:Ot({state:r})});case"Escape":return e.isOpen?Tt(Tt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):Tt(Tt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return Tt(Tt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return Tt(Tt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",completion:null,query:""});case"focus":return Tt(Tt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:Tt(Tt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return Tt(Tt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function Rt(e){return Rt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rt(e)}function Nt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Dt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Nt(Object(n),!0).forEach((function(t){Lt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Nt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Lt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Rt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Rt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Rt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Mt(e){var t=[],n=De(e,t),r=function(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ee(Object(n),!0).forEach((function(t){_e(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ee(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},o);o=e(o,{type:r,props:t,payload:a}),n({state:o,prevState:i})},pendingRequests:(r=[],{add:function(e){return r.push(e),e.finally((function(){r=r.filter((function(t){return t!==e}))}))},cancelAll:function(){r.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===r.length}})}}(It,n,(function(e){var t,r,a=e.prevState,c=e.state;if(n.onStateChange(Dt({prevState:a,state:c,refresh:i,navigator:n.navigator},o)),!l()&&null!==(t=c.context)&&void 0!==t&&null!==(r=t.algoliaInsightsPlugin)&&void 0!==r&&r.__automaticInsights&&!1!==n.insights){var u=le({__autocomplete_clickAnalytics:!1});n.plugins.push(u),s([u])}})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var n=0,r=e.map((function(e){return Ce(Ce({},e),{},{items:P(e.items).map((function(e){return Ce(Ce({},e),{},{__autocomplete_id:n++})}))})}));t.dispatch("setCollections",r)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:r}),a=St(Dt({props:n,refresh:i,store:r,navigator:n.navigator},o));function i(){return ot(Dt({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,navigator:n.navigator,query:r.getState().query,refresh:i,store:r},o))}function s(e){e.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Dt(Dt({},o),{},{navigator:n.navigator,refresh:i,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))}))}function l(){return n.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))}if(n.insights&&!l()){var c="boolean"==typeof n.insights?{}:n.insights;n.plugins.push(le(c))}return s(n.plugins),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var a=o.document.createElement("meta"),i=o.document.querySelector("head");a.name="algolia:metadata",setTimeout((function(){a.content=JSON.stringify(r),i.appendChild(a)}),0)}}({metadata:jt({plugins:n.plugins,options:e}),environment:n.environment}),Dt(Dt({refresh:i,navigator:n.navigator},a),o)}function Ft(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,o=void 0===n?"Search by":n;return r.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},r.createElement("span",{className:"DocSearch-Label"},o),r.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},r.createElement("defs",null,r.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),r.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),r.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),r.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),r.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),r.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function zt(e){return r.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},r.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Bt(e){var t=e.translations,n=void 0===t?{}:t,o=n.selectText,a=void 0===o?"to select":o,i=n.selectKeyAriaLabel,s=void 0===i?"Enter key":i,l=n.navigateText,c=void 0===l?"to navigate":l,u=n.navigateUpKeyAriaLabel,d=void 0===u?"Arrow up":u,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,h=void 0===m?"to close":m,g=n.closeKeyAriaLabel,y=void 0===g?"Escape key":g,b=n.searchByText,v=void 0===b?"Search by":b;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Logo"},r.createElement(Ft,{translations:{searchByText:v}})),r.createElement("ul",{className:"DocSearch-Commands"},r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:s},r.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),r.createElement("span",{className:"DocSearch-Label"},a)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:p},r.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:d},r.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),r.createElement("span",{className:"DocSearch-Label"},c)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:y},r.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),r.createElement("span",{className:"DocSearch-Label"},h))))}function Ut(e){var t=e.hit,n=e.children;return r.createElement("a",{href:t.url},n)}function qt(){return r.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},r.createElement("g",{fill:"none",fillRule:"evenodd"},r.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),r.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},r.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function $t(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),r.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Ht(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Vt(){return r.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),r.createElement("path",{d:"M8 17l-6-6 6-6"})))}var Gt=function(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Wt(e){switch(e.type){case"lvl1":return r.createElement(Gt,null);case"content":return r.createElement(Qt,null);default:return r.createElement(Kt,null)}}function Kt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Qt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Yt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Zt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function Jt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function Xt(e){var t=e.translations,n=void 0===t?{}:t,o=n.titleText,a=void 0===o?"Unable to fetch results":o,i=n.helpText,s=void 0===i?"You might want to check your network connection.":i;return r.createElement("div",{className:"DocSearch-ErrorScreen"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Zt,null)),r.createElement("p",{className:"DocSearch-Title"},a),r.createElement("p",{className:"DocSearch-Help"},s))}var en=["translations"];function tn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,en),a=n.noResultsText,i=void 0===a?"No results for":a,s=n.suggestedQueryText,l=void 0===s?"Try searching for":s,c=n.reportMissingResultsText,u=void 0===c?"Believe this query should return results?":c,d=n.reportMissingResultsLinkText,f=void 0===d?"Let us know.":d,p=o.state.context.searchSuggestions;return r.createElement("div",{className:"DocSearch-NoResults"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Jt,null)),r.createElement("p",{className:"DocSearch-Title"},i,' "',r.createElement("strong",null,o.state.query),'"'),p&&p.length>0&&r.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},r.createElement("p",{className:"DocSearch-Help"},l,":"),r.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(S(e),[r.createElement("li",{key:t},r.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){o.setQuery(t.toLowerCase()+" "),o.refresh(),o.inputRef.current.focus()}},t))])}),[]))),o.getMissingResultsUrl&&r.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),r.createElement("a",{href:o.getMissingResultsUrl({query:o.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var nn=["hit","attribute","tagName"];function rn(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function on(e){var t=e.hit,n=e.attribute,o=e.tagName,a=void 0===o?"span":o,i=y(e,nn);return(0,r.createElement)(a,g(g({},i),{},{dangerouslySetInnerHTML:{__html:rn(t,"_snippetResult.".concat(n,".value"))||rn(t,n)}}))}function an(e){return e.collection&&0!==e.collection.items.length?r.createElement("section",{className:"DocSearch-Hits"},r.createElement("div",{className:"DocSearch-Hit-source"},e.title),r.createElement("ul",e.getListProps(),e.collection.items.map((function(t,n){return r.createElement(sn,d({key:[e.title,t.objectID].join(":"),item:t,index:n},e))})))):null}function sn(e){var t=e.item,n=e.index,o=e.renderIcon,a=e.renderAction,i=e.getItemProps,s=e.onItemClick,l=e.collection,c=e.hitComponent,u=w(r.useState(!1),2),f=u[0],p=u[1],m=w(r.useState(!1),2),h=m[0],g=m[1],y=r.useRef(null),b=c;return r.createElement("li",d({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",f&&"DocSearch-Hit--deleting",h&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){y.current&&y.current()}},i({item:t,source:l.source,onClick:function(e){s(t,e)}})),r.createElement(b,{hit:t},r.createElement("div",{className:"DocSearch-Hit-Container"},o({item:t,index:n}),t.hierarchy[t.type]&&"lvl1"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),a({item:t,runDeleteTransition:function(e){p(!0),y.current=e},runFavoriteTransition:function(e){g(!0),y.current=e}}))))}function ln(e,t,n){return e.reduce((function(e,r){var o=t(r);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(n||5)&&e[o].push(r),e}),{})}function cn(e){return e}function un(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function dn(){}var fn=/(<mark>|<\/mark>)/g,pn=RegExp(fn.source);function mn(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0;return o?o.value&&pn.test(o.value)?o.value.replace(fn,""):o.value:e.hierarchy.lvl0}function hn(e){return r.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var n=mn(t.items[0]);return r.createElement(an,d({},e,{key:t.source.sourceId,title:n,collection:t,renderIcon:function(e){var n,o=e.item,a=e.index;return r.createElement(r.Fragment,null,o.__docsearch_parent&&r.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},o.__docsearch_parent!==(null===(n=t.items[a+1])||void 0===n?void 0:n.__docsearch_parent)?r.createElement("path",{d:"M8 6v21M20 27H8.3"}):r.createElement("path",{d:"M8 6v42M20 27H8.3"}))),r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Wt,{type:o.type})))},renderAction:function(){return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement(Vt,null))}}))})),e.resultsFooterComponent&&r.createElement("section",{className:"DocSearch-HitsFooter"},r.createElement(e.resultsFooterComponent,{state:e.state})))}var gn=["translations"];function yn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,gn),a=n.recentSearchesTitle,i=void 0===a?"Recent":a,s=n.noRecentSearchesText,l=void 0===s?"No recent searches":s,c=n.saveRecentSearchButtonTitle,u=void 0===c?"Save this search":c,f=n.removeRecentSearchButtonTitle,p=void 0===f?"Remove this search from history":f,m=n.favoriteSearchesTitle,h=void 0===m?"Favorite":m,g=n.removeFavoriteSearchButtonTitle,b=void 0===g?"Remove this search from favorites":g;return"idle"===o.state.status&&!1===o.hasCollections?o.disableUserPersonalization?null:r.createElement("div",{className:"DocSearch-StartScreen"},r.createElement("p",{className:"DocSearch-Help"},l)):!1===o.hasCollections?null:r.createElement("div",{className:"DocSearch-Dropdown-Container"},r.createElement(an,d({},o,{title:i,collection:o.state.collections[0],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement($t,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,a=e.runDeleteTransition;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.add(t),o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Yt,null))),r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:p,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),a((function(){o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Ht,null))))}})),r.createElement(an,d({},o,{title:h,collection:o.state.collections[1],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Yt,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:b,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.remove(t),o.refresh()}))}},r.createElement(Ht,null)))}})))}var bn=["translations"],vn=r.memo((function(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,bn);if("error"===o.state.status)return r.createElement(Xt,{translations:null==n?void 0:n.errorScreen});var a=o.state.collections.some((function(e){return e.items.length>0}));return o.state.query?!1===a?r.createElement(tn,d({},o,{translations:null==n?void 0:n.noResultsScreen})):r.createElement(hn,o):r.createElement(yn,d({},o,{hasCollections:a,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),wn=["translations"];function Sn(e){var t=e.translations,n=void 0===t?{}:t,o=y(e,wn),a=n.resetButtonTitle,i=void 0===a?"Clear the query":a,s=n.resetButtonAriaLabel,l=void 0===s?"Clear the query":s,c=n.cancelButtonText,u=void 0===c?"Cancel":c,f=n.cancelButtonAriaLabel,p=void 0===f?"Cancel":f,m=n.searchInputLabel,h=void 0===m?"Search":m,g=o.getFormProps({inputElement:o.inputRef.current}).onReset;return r.useEffect((function(){o.autoFocus&&o.inputRef.current&&o.inputRef.current.focus()}),[o.autoFocus,o.inputRef]),r.useEffect((function(){o.isFromSelection&&o.inputRef.current&&o.inputRef.current.select()}),[o.isFromSelection,o.inputRef]),r.createElement(r.Fragment,null,r.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:g},r.createElement("label",d({className:"DocSearch-MagnifierLabel"},o.getLabelProps()),r.createElement(_,null),r.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},h)),r.createElement("div",{className:"DocSearch-LoadingIndicator"},r.createElement(qt,null)),r.createElement("input",d({className:"DocSearch-Input",ref:o.inputRef},o.getInputProps({inputElement:o.inputRef.current,autoFocus:o.autoFocus,maxLength:64}))),r.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":l,hidden:!o.state.query},r.createElement(Ht,null))),r.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":p,onClick:o.onClose},u))}var kn=["_highlightResult","_snippetResult"];function xn(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),a=o.getItem().slice(0,r);return{add:function(e){var t=e;t._highlightResult,t._snippetResult;var n=y(t,kn),i=a.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&a.splice(i,1),a.unshift(n),a=a.slice(0,r),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function En(e){var t,n="algolia-client-js-".concat(e.key);function r(){return void 0===t&&(t=e.localStorage||window.localStorage),t}function o(){return JSON.parse(r().getItem(n)||"{}")}function a(e){r().setItem(n,JSON.stringify(e))}return{get:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var n,r,i;return n=e.timeToLive?1e3*e.timeToLive:null,r=o(),a(i=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==w(e,2)[1].timestamp})))),n&&a(Object.fromEntries(Object.entries(i).filter((function(e){var t=w(e,2)[1],r=(new Date).getTime();return!(t.timestamp+n<r)})))),o()[JSON.stringify(t)]})).then((function(e){return Promise.all([e?e.value:n(),void 0!==e])})).then((function(e){var t=w(e,2),n=t[0],o=t[1];return Promise.all([n,o||r.miss(n)])})).then((function(e){return w(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var a=o();return a[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(a)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function _n(e){var t=S(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return w(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return _n({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return _n({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return _n({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return _n({caches:t}).clear()}))}}}function jn(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var i=r();return i.then((function(e){return o.miss(e)})).then((function(){return i}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function On(e){var t=e.algoliaAgents,n=e.client,r=e.version,o=function(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}(r).add({segment:n,version:r});return t.forEach((function(e){return o.add(e)})),o}var Cn=12e4;function An(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"up",n=Date.now();return g(g({},e),{},{status:t,lastUpdate:n,isUp:function(){return"up"===t||Date.now()-n>Cn},isTimedOut:function(){return"timed out"===t&&Date.now()-n<=Cn}})}var Tn=function(){function e(t,n){var r;return l(this,e),u(r=s(this,e,[t]),"name","AlgoliaError"),n&&(r.name=n),r}return p(e,x(Error)),c(e)}(),Pn=function(){function e(t,n,r){var o;return l(this,e),u(o=s(this,e,[t,r]),"stackTrace",void 0),o.stackTrace=n,o}return p(e,Tn),c(e)}(),In=function(){function e(t){return l(this,e),s(this,e,["Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",t,"RetryError"])}return p(e,Pn),c(e)}(),Rn=function(){function e(t,n,r){var o,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"ApiError";return l(this,e),u(o=s(this,e,[t,r,a]),"status",void 0),o.status=n,o}return p(e,Pn),c(e)}(),Nn=function(){function e(t,n){var r;return l(this,e),u(r=s(this,e,[t,"DeserializationError"]),"response",void 0),r.response=n,r}return p(e,Tn),c(e)}(),Dn=function(){function e(t,n,r,o){var a;return l(this,e),u(a=s(this,e,[t,n,o,"DetailedApiError"]),"error",void 0),a.error=r,a}return p(e,Rn),c(e)}();function Ln(e,t,n){var r,o=(r=n,Object.keys(r).filter((function(e){return void 0!==r[e]})).sort().map((function(e){return"".concat(e,"=").concat(encodeURIComponent("[object Array]"===Object.prototype.toString.call(r[e])?r[e].join(","):r[e]).replace(/\+/g,"%20"))})).join("&")),a="".concat(e.protocol,"://").concat(e.url).concat(e.port?":".concat(e.port):"","/").concat("/"===t.charAt(0)?t.substring(1):t);return o.length&&(a+="?".concat(o)),a}function Mn(e,t){if("GET"!==e.method&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:g(g({},e.data),t.data);return JSON.stringify(n)}}function Fn(e,t,n){var r=g(g(g({Accept:"application/json"},e),t),n),o={};return Object.keys(r).forEach((function(e){var t=r[e];o[e.toLowerCase()]=t})),o}function zn(e){try{return JSON.parse(e.content)}catch(t){throw new Nn(t.message,e)}}function Bn(e,t){var n=e.content,r=e.status;try{var o=JSON.parse(n);return"error"in o?new Dn(o.message,r,o.error,t):new Rn(o.message,r,t)}catch(e){}return new Rn(n,r,t)}function Un(e){return e.map((function(e){return qn(e)}))}function qn(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return g(g({},e),{},{request:g(g({},e.request),{},{headers:g(g({},e.request.headers),t)})})}var $n=["appId","apiKey","authMode","algoliaAgents"],Hn=["params"],Vn="5.19.0";function Gn(e){return[{url:"".concat(e,"-dsn.algolia.net"),accept:"read",protocol:"https"},{url:"".concat(e,".algolia.net"),accept:"write",protocol:"https"}].concat(function(e){for(var t=e,n=e.length-1;n>0;n--){var r=Math.floor(Math.random()*(n+1)),o=e[n];t[n]=e[r],t[r]=o}return t}([{url:"".concat(e,"-1.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-2.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-3.algolianet.com"),accept:"readWrite",protocol:"https"}]))}var Wn="3.9.0";function Kn(e,t,n){return r.useMemo((function(){var r=function(e,t){if(!e||"string"!=typeof e)throw new Error("`appId` is missing.");if(!t||"string"!=typeof t)throw new Error("`apiKey` is missing.");return function(e){var t=e.appId,n=e.apiKey,r=e.authMode,o=e.algoliaAgents,a=y(e,$n),s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"WithinHeaders",r={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers:function(){return"WithinHeaders"===n?r:{}},queryParameters:function(){return"WithinQueryParameters"===n?r:{}}}}(t,n,r),l=function(e){var t=e.hosts,n=e.hostsCache,r=e.baseHeaders,o=e.logger,a=e.baseQueryParameters,s=e.algoliaAgent,l=e.timeouts,c=e.requester,u=e.requestsCache,d=e.responsesCache;function f(e){return p.apply(this,arguments)}function p(){return(p=i(b().mark((function e(t){var r,o,a,i,s;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all(t.map((function(e){return n.get(e,(function(){return Promise.resolve(An(e))}))})));case 2:return r=e.sent,o=r.filter((function(e){return e.isUp()})),a=r.filter((function(e){return e.isTimedOut()})),i=[].concat(S(o),S(a)),s=i.length>0?i:t,e.abrupt("return",{hosts:s,getTimeout:function(e,t){return(0===a.length&&0===e?1:a.length+3+e)*t}});case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function m(e,t){return h.apply(this,arguments)}function h(){return h=i(b().mark((function e(u,d){var p,m,h,y,v,w,k,x,E,_,j,O,C,A=arguments;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=!(A.length>2&&void 0!==A[2])||A[2],m=[],h=Mn(u,d),y=Fn(r,u.headers,d.headers),v="GET"===u.method?g(g({},u.data),d.data):{},w=g(g(g({},a),u.queryParameters),v),s.value&&(w["x-algolia-agent"]=s.value),d&&d.queryParameters)for(k=0,x=Object.keys(d.queryParameters);k<x.length;k++)E=x[k],d.queryParameters[E]&&"[object Object]"!==Object.prototype.toString.call(d.queryParameters[E])?w[E]=d.queryParameters[E].toString():w[E]=d.queryParameters[E];return _=0,j=function(){var e=i(b().mark((function e(t,r){var a,i,s,f,v,S;return b().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(a=t.pop())){e.next=3;break}throw new In(Un(m));case 3:return i=g(g({},l),d.timeouts),s={data:h,headers:y,method:u.method,url:Ln(a,u.path,w),connectTimeout:r(_,i.connect),responseTimeout:r(_,p?i.read:i.write)},f=function(e){var n={request:s,response:e,host:a,triesLeft:t.length};return m.push(n),n},e.next=8,c.send(s);case 8:if(k=(b=v=e.sent).isTimedOut,x=b.status,!(k||function(e){return!e.isTimedOut&&!~~e.status}({isTimedOut:k,status:x})||2!=~~(x/100)&&4!=~~(x/100))){e.next=16;break}return S=f(v),v.isTimedOut&&_++,o.info("Retryable failure",qn(S)),e.next=15,n.set(a,An(a,v.isTimedOut?"timed out":"down"));case 15:return e.abrupt("return",j(t,r));case 16:if(2!=~~(v.status/100)){e.next=18;break}return e.abrupt("return",zn(v));case 18:throw f(v),Bn(v,m);case 20:case"end":return e.stop()}var b,k,x}),e)})));return function(t,n){return e.apply(this,arguments)}}(),O=t.filter((function(e){return"readWrite"===e.accept||(p?"read"===e.accept:"write"===e.accept)})),e.next=13,f(O);case 13:return C=e.sent,e.abrupt("return",j(S(C.hosts).reverse(),C.getTimeout));case 15:case"end":return e.stop()}}),e)}))),h.apply(this,arguments)}return{hostsCache:n,requester:c,timeouts:l,logger:o,algoliaAgent:s,baseHeaders:r,baseQueryParameters:a,hosts:t,request:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.useReadTransporter||"GET"===e.method;if(!n)return m(e,t,n);var o=function(){return m(e,t)};if(!0!==(t.cacheable||e.cacheable))return o();var i={request:e,requestOptions:t,transporter:{queryParameters:a,headers:r}};return d.get(i,(function(){return u.get(i,(function(){return u.set(i,o()).then((function(e){return Promise.all([u.delete(i),e])}),(function(e){return Promise.all([u.delete(i),Promise.reject(e)])})).then((function(e){var t=w(e,2);return t[0],t[1]}))}))}),{miss:function(e){return d.set(i,e)}})},requestsCache:u,responsesCache:d}}(g(g({hosts:Gn(t)},a),{},{algoliaAgent:On({algoliaAgents:o,client:"Lite",version:Vn}),baseHeaders:g(g({"content-type":"text/plain"},s.headers()),a.baseHeaders),baseQueryParameters:g(g({},s.queryParameters()),a.baseQueryParameters)}));return{transporter:l,appId:t,apiKey:n,clearCache:function(){return Promise.all([l.requestsCache.clear(),l.responsesCache.clear()]).then((function(){}))},get _ua(){return l.algoliaAgent.value},addAlgoliaAgent:function(e,t){l.algoliaAgent.add({segment:e,version:t})},setClientApiKey:function(e){var t=e.apiKey;r&&"WithinHeaders"!==r?l.baseQueryParameters["x-algolia-api-key"]=t:l.baseHeaders["x-algolia-api-key"]=t},searchForHits:function(e,t){return this.search(e,t)},searchForFacets:function(e,t){return this.search(e,t)},customPost:function(e,t){var n=e.path,r=e.parameters,o=e.body;if(!n)throw new Error("Parameter `path` is required when calling `customPost`.");var a={method:"POST",path:"/{path}".replace("{path}",n),queryParameters:r||{},headers:{},data:o||{}};return l.request(a,t)},getRecommendations:function(e,t){if(e&&Array.isArray(e)&&(e={requests:e}),!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");var n={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return l.request(n,t)},search:function(e,t){if(e&&Array.isArray(e)){var n={requests:e.map((function(e){var t=e.params,n=y(e,Hn);return"facet"===n.type?g(g(g({},n),t),{},{type:"facet"}):g(g(g({},n),t),{},{facet:void 0,maxFacetHits:void 0,facetQuery:void 0})}))};e=n}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");var r={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return l.request(r,t)}}}(g({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:function(e,t){return Promise.resolve()},info:function(e,t){return Promise.resolve()},error:function(e,t){return Promise.resolve()}},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),e)},a=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(a),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(a),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(a),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:jn(),requestsCache:jn({serializable:!1}),hostsCache:_n({caches:[En({key:"".concat(Vn,"-").concat(e)}),jn()]})},void 0))}(e,t);return r.addAlgoliaAgent("docsearch",Wn),!1===/docsearch.js \(.*\)/.test(r.transporter.algoliaAgent.value)&&r.addAlgoliaAgent("docsearch-react",Wn),n(r)}),[e,t,n])}var Qn=["footer","searchBox"];function Yn(e){var t=e.appId,n=e.apiKey,o=e.indexName,a=e.placeholder,i=void 0===a?"Search docs":a,s=e.searchParameters,l=e.maxResultsPerGroup,c=e.onClose,u=void 0===c?dn:c,f=e.transformItems,p=void 0===f?cn:f,m=e.hitComponent,h=void 0===m?Ut:m,b=e.resultsFooterComponent,v=void 0===b?function(){return null}:b,S=e.navigator,k=e.initialScrollY,x=void 0===k?0:k,E=e.transformSearchClient,_=void 0===E?cn:E,j=e.disableUserPersonalization,O=void 0!==j&&j,C=e.initialQuery,A=void 0===C?"":C,T=e.translations,P=void 0===T?{}:T,I=e.getMissingResultsUrl,R=e.insights,N=void 0!==R&&R,D=P.footer,L=P.searchBox,M=y(P,Qn),F=w(r.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),z=F[0],B=F[1],U=r.useRef(null),q=r.useRef(null),$=r.useRef(null),H=r.useRef(null),V=r.useRef(null),G=r.useRef(10),W=r.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,K=r.useRef(A||W).current,Q=Kn(t,n,_),Y=r.useRef(xn({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(o),limit:10})).current,Z=r.useRef(xn({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(o),limit:0===Y.getAll().length?7:4})).current,J=r.useCallback((function(e){if(!O){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===Y.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&Z.add(t)}}),[Y,Z,O]),X=r.useCallback((function(e){if(z.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};z.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[z.context.algoliaInsightsPlugin]),ee=r.useMemo((function(){return Mt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:K,context:{searchSuggestions:[]}},insights:N,navigator:S,onStateChange:function(e){B(e.state)},getSources:function(e){var r=e.query,a=e.state,i=e.setContext,c=e.setStatus;if(!r)return O?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Y.getAll()}}];var d=Boolean(N);return Q.search({requests:[g({query:r,indexName:o,attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(G.current),"hierarchy.lvl2:".concat(G.current),"hierarchy.lvl3:".concat(G.current),"hierarchy.lvl4:".concat(G.current),"hierarchy.lvl5:".concat(G.current),"hierarchy.lvl6:".concat(G.current),"content:".concat(G.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:d},s)]}).catch((function(e){throw"RetryError"===e.name&&c("error"),e})).then((function(e){var r=e.results[0],s=r.hits,c=r.nbHits,f=ln(s,(function(e){return mn(e)}),l);a.context.searchSuggestions.length<Object.keys(f).length&&i({searchSuggestions:Object.keys(f)}),i({nbHits:c});var m={};return d&&(m={__autocomplete_indexName:o,__autocomplete_queryID:r.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:n}}),Object.values(f).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,n=e.event;J(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(ln(e,(function(e){return e.hierarchy.lvl1}),l)).map(p).map((function(e){return e.map((function(t){var n=null,r=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&r&&(n=r),g(g({},t),{},{__docsearch_parent:n},m)}))})).flat()}}}))}))}})}),[o,s,l,Q,u,Z,Y,J,K,i,S,p,O,N,t,n]),te=ee.getEnvironmentProps,ne=ee.getRootProps,re=ee.refresh;return function(e){var t=e.getEnvironmentProps,n=e.panelElement,o=e.formElement,a=e.inputElement;r.useEffect((function(){if(n&&o&&a){var e=t({panelElement:n,formElement:o,inputElement:a}),r=e.onTouchStart,i=e.onTouchMove;return window.addEventListener("touchstart",r),window.addEventListener("touchmove",i),function(){window.removeEventListener("touchstart",r),window.removeEventListener("touchmove",i)}}}),[t,n,o,a])}({getEnvironmentProps:te,panelElement:H.current,formElement:$.current,inputElement:V.current}),function(e){var t=e.container;r.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),n=e[0],r=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus()))}}),[t])}({container:U.current}),r.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,x)}}),[]),r.useLayoutEffect((function(){var e=window.innerWidth-document.body.clientWidth;return document.body.style.marginRight="".concat(e,"px"),function(){document.body.style.marginRight="0px"}}),[]),r.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(G.current=5)}),[]),r.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[z.query]),r.useEffect((function(){K.length>0&&(re(),V.current&&V.current.focus())}),[K,re]),r.useEffect((function(){function e(){if(q.current){var e=.01*window.innerHeight;q.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),r.createElement("div",d({ref:U},ne({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===z.status&&"DocSearch-Container--Stalled","error"===z.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),r.createElement("div",{className:"DocSearch-Modal",ref:q},r.createElement("header",{className:"DocSearch-SearchBar",ref:$},r.createElement(Sn,d({},ee,{state:z,autoFocus:0===K.length,inputRef:V,isFromSelection:Boolean(K)&&K===W,translations:L,onClose:u}))),r.createElement("div",{className:"DocSearch-Dropdown",ref:H},r.createElement(vn,d({},ee,{indexName:o,state:z,hitComponent:h,resultsFooterComponent:v,disableUserPersonalization:O,recentSearches:Z,favoriteSearches:Y,inputRef:V,translations:M,getMissingResultsUrl:I,onItemClick:function(e,t){X(e),J(e),un(t)||u()}}))),r.createElement("footer",{className:"DocSearch-Footer"},r.createElement(Bt,{translations:D}))))}function Zn(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;if("Escape"===e.code&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)return e.preventDefault(),void(t?o():document.body.classList.contains("DocSearch--active")||n());i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}},8912:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"01cb08ea":[()=>n.e(3747).then(n.bind(n,7644)),"@site/../docs/myzrok/custom-domains/index.mdx",7644],"033e8fc8":[()=>n.e(6475).then(n.bind(n,3575)),"@site/versioned_docs/version-0.4/guides/self-hosting/self-service-invite.mdx",3575],"07d0b302":[()=>n.e(7499).then(n.bind(n,6667)),"@site/../docs/concepts/http.md",6667],"0c1cdb3d":[()=>Promise.all([n.e(1869),n.e(6595)]).then(n.bind(n,8581)),"@site/versioned_docs/version-0.4/guides/docker-share/index.mdx",8581],"0c66edb9":[()=>n.e(7216).then(n.bind(n,6844)),"@site/../docs/guides/permission-modes.md",6844],"0efac3c3":[()=>Promise.all([n.e(1869),n.e(2913),n.e(382),n.e(8173)]).then(n.bind(n,9563)),"@site/versioned_docs/version-0.4/guides/install/linux.mdx",9563],"11b43341":[()=>n.e(2256).then(n.t.bind(n,5293,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-7fc.json",5293],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,7981)),"@theme/DocCategoryGeneratedIndexPage",7981],17896441:[()=>Promise.all([n.e(1869),n.e(2913),n.e(4017),n.e(8401)]).then(n.bind(n,1973)),"@theme/DocItem",1973],"17f4c24e":[()=>Promise.all([n.e(1869),n.e(8875)]).then(n.bind(n,7650)),"@site/versioned_docs/version-0.4/guides/install/macos.mdx",7650],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,278)),"@theme/SearchPage",278],"1ba5bc99":[()=>Promise.all([n.e(1869),n.e(2759)]).then(n.bind(n,795)),"@site/../docs/guides/install/macos.mdx",795],"1dd31738":[()=>n.e(6878).then(n.bind(n,1614)),"@site/versioned_docs/version-0.4/concepts/http.md",1614],"1ddd36f2":[()=>Promise.all([n.e(1869),n.e(1595)]).then(n.bind(n,9854)),"@site/versioned_docs/version-0.4/guides/install/index.mdx",9854],"1f91e8db":[()=>n.e(6381).then(n.t.bind(n,1922,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-self-hosting-a07.json",1922],20595907:[()=>n.e(8582).then(n.bind(n,1785)),"@site/../docs/guides/self-hosting/kubernetes.mdx",1785],"21880a4d":[()=>n.e(749).then(n.bind(n,1214)),"@site/../docs/guides/vpn/vpn.md",1214],"25ef1bb8":[()=>n.e(8746).then(n.bind(n,8396)),"@site/versioned_docs/version-0.4/guides/docker-share/docker_private_share_guide.md",8396],"27b0284c":[()=>n.e(4277).then(n.bind(n,3043)),"@site/versioned_docs/version-0.4/concepts/sharing-reserved.md",3043],"288b1075":[()=>n.e(3588).then(n.bind(n,8732)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md",8732],"28f20845":[()=>n.e(8240).then(n.t.bind(n,6933,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-metrics-and-limits-d40.json",6933],"2c440c24":[()=>n.e(3979).then(n.t.bind(n,1209,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-self-hosting-4be.json",1209],"2cc2e835":[()=>Promise.all([n.e(1869),n.e(6946)]).then(n.bind(n,6526)),"@site/versioned_docs/version-0.4/guides/install/windows.mdx",6526],"2da89d45":[()=>Promise.all([n.e(1869),n.e(6332)]).then(n.bind(n,968)),"@site/../docs/guides/docker-share/index.mdx",968],"2e812224":[()=>n.e(8471).then(n.bind(n,8723)),"@site/../docs/guides/docker-share/docker_public_share_guide.md",8723],"2fede397":[()=>n.e(7120).then(n.bind(n,5470)),"@site/../docs/guides/agent/linux-service.mdx",5470],"339d500a":[()=>n.e(7752).then(n.bind(n,9e3)),"@site/../docs/concepts/tunnels.md",9e3],"35a60099":[()=>n.e(9148).then(n.bind(n,2397)),"@site/versioned_docs/version-0.4/concepts/sharing-public.mdx",2397],"36b94792":[()=>n.e(3921).then(n.bind(n,4123)),"@site/../docs/guides/drives.mdx",4123],"392083ed":[()=>n.e(4717).then(n.bind(n,2698)),"@site/versioned_docs/version-0.4/guides/self-hosting/linux/index.mdx",2698],"3fab0acb":[()=>n.e(351).then(n.bind(n,5359)),"@site/versioned_docs/version-0.4/myzrok/custom-domains/index.mdx",5359],"4277b6a0":[()=>n.e(8436).then(n.bind(n,6676)),"@site/versioned_docs/version-0.4/guides/permission-modes.md",6676],"43e1c8e4":[()=>n.e(8528).then(n.bind(n,1469)),"@site/../docs/guides/agent/windows-service/index.mdx",1469],"47881d5c":[()=>Promise.all([n.e(1869),n.e(2913),n.e(382),n.e(4927)]).then(n.bind(n,4774)),"@site/../docs/guides/install/linux.mdx",4774],48341697:[()=>n.e(9471).then(n.bind(n,7501)),"@site/versioned_docs/version-0.4/guides/vpn/vpn.md",7501],"4cb7be2f":[()=>n.e(3574).then(n.t.bind(n,9264,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-metrics-and-limits-6f7.json",9264],"4f1777fd":[()=>n.e(277).then(n.bind(n,1833)),"@site/../docs/guides/self-hosting/self-service-invite.mdx",1833],"50ef9c44":[()=>n.e(429).then(n.bind(n,5853)),"@site/../docs/concepts/hosting.md",5853],"54fa7005":[()=>n.e(8675).then(n.bind(n,7941)),"@site/../docs/concepts/sharing-public.mdx",7941],"5cd0a723":[()=>n.e(4074).then(n.bind(n,6413)),"@site/../docs/guides/self-hosting/instance-configuration.mdx",6413],"5e95c892":[()=>n.e(9647).then(n.bind(n,8122)),"@theme/DocsRoot",8122],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"600b2345":[()=>n.e(9355).then(n.bind(n,9056)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md",9056],"61ea36d9":[()=>n.e(9576).then(n.bind(n,1101)),"@site/versioned_docs/version-0.4/concepts/opensource.md",1101],"6272ba0e":[()=>n.e(7242).then(n.bind(n,7859)),"@site/../docs/concepts/sharing-reserved.md",7859],"685bed1a":[()=>n.e(5689).then(n.bind(n,9900)),"@site/versioned_docs/version-0.4/guides/self-hosting/docker.mdx",9900],"6a6a5bbc":[()=>n.e(2867).then(n.bind(n,8899)),"@site/versioned_docs/version-0.4/concepts/files.md",8899],"6ad1709d":[()=>n.e(6063).then(n.t.bind(n,9345,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-b8d.json",9345],"6e881e32":[()=>n.e(3373).then(n.bind(n,3707)),"@site/../docs/guides/self-hosting/oauth/configuring-oauth.md",3707],"71c8a211":[()=>n.e(1421).then(n.bind(n,7417)),"@site/../docs/guides/agent/index.mdx",7417],"7452427d":[()=>n.e(9476).then(n.bind(n,2285)),"@site/../docs/guides/self-hosting/personalized-frontend.md",2285],"75b20590":[()=>n.e(9025).then(n.bind(n,6988)),"@site/../docs/concepts/opensource.md",6988],"7d0a541a":[()=>n.e(4466).then(n.bind(n,6698)),"@site/versioned_docs/version-0.4/concepts/index.md",6698],"7dd0c8d0":[()=>n.e(471).then(n.bind(n,845)),"@site/versioned_docs/version-0.4/guides/self-hosting/kubernetes.mdx",845],"7f5ec875":[()=>n.e(1939).then(n.bind(n,1911)),"@site/../docs/guides/self-hosting/organizations.md",1911],80941509:[()=>n.e(1831).then(n.t.bind(n,3799,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-oauth-b74.json",3799],"81fb89b8":[()=>n.e(8301).then(n.bind(n,4605)),"@site/versioned_docs/version-0.4/guides/self-hosting/personalized-frontend.md",4605],"8a9ffb5d":[()=>Promise.all([n.e(1869),n.e(1864)]).then(n.bind(n,4954)),"@site/versioned_docs/version-0.4/getting-started.mdx",4954],"8b4ddd1a":[()=>n.e(5955).then(n.bind(n,3671)),"@site/versioned_docs/version-0.4/guides/drives.mdx",3671],"8dbf8f84":[()=>n.e(5117).then(n.bind(n,4836)),"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-limits.md",4836],"901ef07d":[()=>n.e(9033).then(n.bind(n,9273)),"@site/versioned_docs/version-0.4/guides/self-hosting/metrics-and-limits/configuring-metrics.md",9273],"9939c4f4":[()=>n.e(598).then(n.bind(n,4052)),"@site/../docs/guides/self-hosting/interstitial-page.md",4052],"9af26a4e":[()=>n.e(9631).then(n.t.bind(n,773,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-guides-95a.json",773],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,5047)),"@theme/DocVersionRoot",5047],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1841)),"@theme/DocRoot",1841],aad6478e:[()=>n.e(1769).then(n.bind(n,7602)),"@site/../docs/concepts/sharing-private.mdx",7602],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],adf8dca1:[()=>n.e(8051).then(n.bind(n,7773)),"@site/versioned_docs/version-0.4/guides/self-hosting/instance-configuration.mdx",7773],b36bb0c9:[()=>n.e(4504).then(n.bind(n,5318)),"@site/versioned_docs/version-0.4/guides/self-hosting/organizations.md",5318],b6569025:[()=>Promise.all([n.e(1869),n.e(714)]).then(n.bind(n,6984)),"@site/../docs/guides/install/index.mdx",6984],bbbe662c:[()=>n.e(1057).then(n.bind(n,511)),"@site/../docs/guides/docker-share/docker_private_share_guide.md",511],bc32cbb6:[()=>n.e(826).then(n.bind(n,1651)),"@site/versioned_docs/version-0.4/guides/self-hosting/interstitial-page.md",1651],bc747cac:[()=>n.e(4909).then(n.bind(n,2731)),"@site/../docs/concepts/index.md",2731],bf372175:[()=>n.e(6974).then(n.bind(n,9620)),"@site/versioned_docs/version-0.4/concepts/hosting.md",9620],bfe99541:[()=>n.e(3434).then(n.bind(n,364)),"@site/versioned_docs/version-0.4/guides/self-hosting/oauth/configuring-oauth.md",364],c015c796:[()=>n.e(887).then(n.bind(n,8167)),"@site/../docs/concepts/files.md",8167],c141421f:[()=>n.e(957).then(n.t.bind(n,936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",936],c304be44:[()=>Promise.all([n.e(1869),n.e(3786)]).then(n.bind(n,6028)),"@site/../docs/guides/install/windows.mdx",6028],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,9179)),"@site/src/pages/index.js",9179],c88279fc:[()=>n.e(3165).then(n.bind(n,466)),"@site/versioned_docs/version-0.4/guides/docker-share/docker_public_share_guide.md",466],cda0d2e5:[()=>Promise.all([n.e(1869),n.e(2913),n.e(382),n.e(4831),n.e(2757)]).then(n.bind(n,2832)),"@site/../docs/guides/frontdoor.mdx",2832],ce04f2ae:[()=>n.e(6289).then(n.bind(n,518)),"@site/versioned_docs/version-0.4/concepts/sharing-private.mdx",518],d087459a:[()=>n.e(627).then(n.t.bind(n,892,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-myzrok-95a.json",892],d3a54718:[()=>n.e(1346).then(n.bind(n,9565)),"@site/versioned_docs/version-0.4/guides/self-hosting/linux/nginx.mdx",9565],d768dc0f:[()=>n.e(4247).then(n.bind(n,1115)),"@site/../docs/guides/self-hosting/linux/index.mdx",1115],e1dfe4fe:[()=>n.e(3423).then(n.bind(n,5011)),"@site/../docs/guides/self-hosting/docker.mdx",5011],e2c4d679:[()=>n.e(9253).then(n.t.bind(n,9166,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-oauth-81c.json",9166],e3e0bfdc:[()=>n.e(9851).then(n.t.bind(n,1349,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-4-category-guides-4f1.json",1349],ebc0e2a0:[()=>Promise.all([n.e(1869),n.e(2913),n.e(382),n.e(4831),n.e(37)]).then(n.bind(n,8903)),"@site/versioned_docs/version-0.4/guides/frontdoor.mdx",8903],ecf841c3:[()=>n.e(9002).then(n.bind(n,1311)),"@site/versioned_docs/version-0.4/concepts/tunnels.md",1311],ef8afbfd:[()=>n.e(9905).then(n.bind(n,669)),"@site/../docs/guides/self-hosting/linux/nginx.mdx",669],f7af5a99:[()=>n.e(7599).then(n.t.bind(n,2144,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-myzrok-735.json",2144],f888b719:[()=>Promise.all([n.e(1869),n.e(4470)]).then(n.bind(n,7768)),"@site/../docs/getting-started.mdx",7768],f8f494be:[()=>n.e(5695).then(n.bind(n,3078)),"@site/versioned_docs/version-0.4/guides/linux-user-share/index.mdx",3078]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(3722),u=n(5313);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(3042).then(n.bind(n,3042)),modules:["@theme/NotFound"],webpack:()=>[3042],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const f=[{path:"/search/",component:d("/search/","21e"),exact:!0},{path:"/docs/",component:d("/docs/","f20"),routes:[{path:"/docs/0.4/",component:d("/docs/0.4/","81e"),routes:[{path:"/docs/0.4/",component:d("/docs/0.4/","33b"),routes:[{path:"/docs/0.4/category/guides/",component:d("/docs/0.4/category/guides/","038"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/metrics-and-limits/",component:d("/docs/0.4/category/metrics-and-limits/","011"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/myzrok/",component:d("/docs/0.4/category/myzrok/","66c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/oauth/",component:d("/docs/0.4/category/oauth/","491"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/category/self-hosting/",component:d("/docs/0.4/category/self-hosting/","eab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/",component:d("/docs/0.4/concepts/","5db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/files/",component:d("/docs/0.4/concepts/files/","c0e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/hosting/",component:d("/docs/0.4/concepts/hosting/","ea5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/http/",component:d("/docs/0.4/concepts/http/","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/opensource/",component:d("/docs/0.4/concepts/opensource/","050"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-private/",component:d("/docs/0.4/concepts/sharing-private/","ab6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-public/",component:d("/docs/0.4/concepts/sharing-public/","361"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/sharing-reserved/",component:d("/docs/0.4/concepts/sharing-reserved/","4c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/concepts/tunnels/",component:d("/docs/0.4/concepts/tunnels/","241"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/getting-started/",component:d("/docs/0.4/getting-started/","acc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/",component:d("/docs/0.4/guides/docker-share/","4d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/docker_private_share_guide/",component:d("/docs/0.4/guides/docker-share/docker_private_share_guide/","e49"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/docker-share/docker_public_share_guide/",component:d("/docs/0.4/guides/docker-share/docker_public_share_guide/","b4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/drives/",component:d("/docs/0.4/guides/drives/","186"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/frontdoor/",component:d("/docs/0.4/guides/frontdoor/","107"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/",component:d("/docs/0.4/guides/install/","4db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/linux/",component:d("/docs/0.4/guides/install/linux/","1df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/macos/",component:d("/docs/0.4/guides/install/macos/","8c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/install/windows/",component:d("/docs/0.4/guides/install/windows/","d0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/linux-user-share/",component:d("/docs/0.4/guides/linux-user-share/","a76"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/permission-modes/",component:d("/docs/0.4/guides/permission-modes/","895"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/docker/",component:d("/docs/0.4/guides/self-hosting/docker/","e7e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/instance-configuration/",component:d("/docs/0.4/guides/self-hosting/instance-configuration/","fe9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/interstitial-page/",component:d("/docs/0.4/guides/self-hosting/interstitial-page/","0e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/kubernetes/",component:d("/docs/0.4/guides/self-hosting/kubernetes/","751"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/linux/",component:d("/docs/0.4/guides/self-hosting/linux/","3db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/linux/nginx/",component:d("/docs/0.4/guides/self-hosting/linux/nginx/","d5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/",component:d("/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/","c58"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/",component:d("/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/","5db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/oauth/configuring-oauth/",component:d("/docs/0.4/guides/self-hosting/oauth/configuring-oauth/","fc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/organizations/",component:d("/docs/0.4/guides/self-hosting/organizations/","587"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/personalized-frontend/",component:d("/docs/0.4/guides/self-hosting/personalized-frontend/","555"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/self-hosting/self-service-invite/",component:d("/docs/0.4/guides/self-hosting/self-service-invite/","7d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/guides/vpn/",component:d("/docs/0.4/guides/vpn/","df1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4/myzrok/custom-domains/",component:d("/docs/0.4/myzrok/custom-domains/","25a"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/",component:d("/docs/","5a5"),routes:[{path:"/docs/",component:d("/docs/","a12"),routes:[{path:"/docs/category/guides/",component:d("/docs/category/guides/","c07"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/metrics-and-limits/",component:d("/docs/category/metrics-and-limits/","9f2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/myzrok/",component:d("/docs/category/myzrok/","784"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/oauth/",component:d("/docs/category/oauth/","b50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/self-hosting/",component:d("/docs/category/self-hosting/","cad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/",component:d("/docs/concepts/","76a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/files/",component:d("/docs/concepts/files/","331"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/hosting/",component:d("/docs/concepts/hosting/","fea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/http/",component:d("/docs/concepts/http/","d68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/opensource/",component:d("/docs/concepts/opensource/","94c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-private/",component:d("/docs/concepts/sharing-private/","7b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-public/",component:d("/docs/concepts/sharing-public/","c3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-reserved/",component:d("/docs/concepts/sharing-reserved/","5d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/tunnels/",component:d("/docs/concepts/tunnels/","f73"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/getting-started/",component:d("/docs/getting-started/","fdf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/",component:d("/docs/guides/agent/","d0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/linux-service/",component:d("/docs/guides/agent/linux-service/","8a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/agent/windows-service/",component:d("/docs/guides/agent/windows-service/","9a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/",component:d("/docs/guides/docker-share/","7d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_private_share_guide/",component:d("/docs/guides/docker-share/docker_private_share_guide/","927"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_public_share_guide/",component:d("/docs/guides/docker-share/docker_public_share_guide/","ccf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/drives/",component:d("/docs/guides/drives/","8a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/frontdoor/",component:d("/docs/guides/frontdoor/","e30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/",component:d("/docs/guides/install/","aa4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/linux/",component:d("/docs/guides/install/linux/","0c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/macos/",component:d("/docs/guides/install/macos/","532"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/windows/",component:d("/docs/guides/install/windows/","ad4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/permission-modes/",component:d("/docs/guides/permission-modes/","d45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/docker/",component:d("/docs/guides/self-hosting/docker/","5a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/instance-configuration/",component:d("/docs/guides/self-hosting/instance-configuration/","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/interstitial-page/",component:d("/docs/guides/self-hosting/interstitial-page/","90e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/kubernetes/",component:d("/docs/guides/self-hosting/kubernetes/","37d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/",component:d("/docs/guides/self-hosting/linux/","d78"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/nginx/",component:d("/docs/guides/self-hosting/linux/nginx/","b26"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-limits/","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/","0a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/oauth/configuring-oauth/",component:d("/docs/guides/self-hosting/oauth/configuring-oauth/","b5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/organizations/",component:d("/docs/guides/self-hosting/organizations/","369"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/personalized-frontend/",component:d("/docs/guides/self-hosting/personalized-frontend/","567"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/self-service-invite/",component:d("/docs/guides/self-hosting/self-service-invite/","532"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/vpn/",component:d("/docs/guides/vpn/","13f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/myzrok/custom-domains/",component:d("/docs/myzrok/custom-domains/","c1c"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},4974:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},1823:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(1934);const c=[n(7378),n(7264),n(8867),n(2094)];var u=n(8912),d=n(6347),f=n(2831),p=n(4848);function m(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(7143),g=n(797),y=n(9030),b=n(3115),v=n(9144),w=n(7976),S=n(7788),k=n(9396),x=n(99),E=n(7220);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function j(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,x.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function O(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:S.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(j,{}),(0,p.jsx)(_,{}),(0,p.jsx)(E.A,{tag:k.C,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const C=new Map;var A=n(4974),T=n(6193),P=n(372);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const L=D,M="__docusaurus-base-url-issue-banner-suggestion-container";function F(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${M}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${M}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function z(){const{siteConfig:{baseUrl:e}}=(0,g.A)();return(0,p.jsx)(p.Fragment,{children:!l.A.canUseDOM&&(0,p.jsx)(h.A,{children:(0,p.jsx)("script",{children:F(e)})})})}function B(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,p.jsx)(z,{}):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,g.A)(),a=(0,y.Ay)(e),{htmlLang:i,direction:s}=o[r];return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("html",{lang:i,dir:s}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:a})]})}var q=n(4023),$=n(9136);function H(){const e=(0,$.A)();return(0,p.jsx)(h.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}const V=(0,f.v)(u.A);function G(){const e=function(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,f.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(L,{location:e,children:V})}function W(){return(0,p.jsx)(q.A,{children:(0,p.jsx)(T.l,{children:(0,p.jsxs)(A.x,{children:[(0,p.jsxs)(m,{children:[(0,p.jsx)(U,{}),(0,p.jsx)(O,{}),(0,p.jsx)(B,{}),(0,p.jsx)(G,{})]}),(0,p.jsx)(H,{})]})})})}var K=n(4054);const Q=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Y=n(3722);const Z=new Set,J=new Set,X=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch:e=>{if(!(e=>!X()&&!J.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,f.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!X()&&!J.has(e))(e)&&(J.add(e),N(e))},te=Object.freeze(ee);function ne(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const re=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.vd,{children:(0,p.jsx)(ne,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(re)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};N(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6193:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"1.0","isLast":true,"path":"/docs","mainDocId":"getting-started","docs":[{"id":"concepts/files","path":"/docs/concepts/files","sidebar":"tutorialSidebar"},{"id":"concepts/hosting","path":"/docs/concepts/hosting","sidebar":"tutorialSidebar"},{"id":"concepts/http","path":"/docs/concepts/http","sidebar":"tutorialSidebar"},{"id":"concepts/index","path":"/docs/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/opensource","path":"/docs/concepts/opensource","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-private","path":"/docs/concepts/sharing-private","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-public","path":"/docs/concepts/sharing-public","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-reserved","path":"/docs/concepts/sharing-reserved","sidebar":"tutorialSidebar"},{"id":"concepts/tunnels","path":"/docs/concepts/tunnels","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/docs/getting-started","sidebar":"tutorialSidebar"},{"id":"guides/agent/index","path":"/docs/guides/agent/","sidebar":"tutorialSidebar"},{"id":"guides/agent/linux-service","path":"/docs/guides/agent/linux-service","sidebar":"tutorialSidebar"},{"id":"guides/agent/windows-service/index","path":"/docs/guides/agent/windows-service/","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_private_share_guide","path":"/docs/guides/docker-share/docker_private_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_public_share_guide","path":"/docs/guides/docker-share/docker_public_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/index","path":"/docs/guides/docker-share/","sidebar":"tutorialSidebar"},{"id":"guides/drives","path":"/docs/guides/drives","sidebar":"tutorialSidebar"},{"id":"guides/frontdoor","path":"/docs/guides/frontdoor","sidebar":"tutorialSidebar"},{"id":"guides/install/index","path":"/docs/guides/install/","sidebar":"tutorialSidebar"},{"id":"guides/install/linux","path":"/docs/guides/install/linux","sidebar":"tutorialSidebar"},{"id":"guides/install/macos","path":"/docs/guides/install/macos","sidebar":"tutorialSidebar"},{"id":"guides/install/windows","path":"/docs/guides/install/windows","sidebar":"tutorialSidebar"},{"id":"guides/permission-modes","path":"/docs/guides/permission-modes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/docker","path":"/docs/guides/self-hosting/docker","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/instance-configuration","path":"/docs/guides/self-hosting/instance-configuration","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/interstitial-page","path":"/docs/guides/self-hosting/interstitial-page","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/kubernetes","path":"/docs/guides/self-hosting/kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/index","path":"/docs/guides/self-hosting/linux/","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/nginx","path":"/docs/guides/self-hosting/linux/nginx","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/oauth/configuring-oauth","path":"/docs/guides/self-hosting/oauth/configuring-oauth","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/organizations","path":"/docs/guides/self-hosting/organizations","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/personalized-frontend","path":"/docs/guides/self-hosting/personalized-frontend","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/self-service-invite","path":"/docs/guides/self-hosting/self-service-invite","sidebar":"tutorialSidebar"},{"id":"guides/vpn/vpn","path":"/docs/guides/vpn/","sidebar":"tutorialSidebar"},{"id":"myzrok/custom-domains/index","path":"/docs/myzrok/custom-domains/","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/docs/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/self-hosting","path":"/docs/category/self-hosting","sidebar":"tutorialSidebar"},{"id":"/category/metrics-and-limits","path":"/docs/category/metrics-and-limits","sidebar":"tutorialSidebar"},{"id":"/category/oauth","path":"/docs/category/oauth","sidebar":"tutorialSidebar"},{"id":"/category/myzrok","path":"/docs/category/myzrok","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/getting-started","label":"Getting Started"}}}},{"name":"0.4","label":"0.4","isLast":false,"path":"/docs/0.4","mainDocId":"getting-started","docs":[{"id":"concepts/files","path":"/docs/0.4/concepts/files","sidebar":"tutorialSidebar"},{"id":"concepts/hosting","path":"/docs/0.4/concepts/hosting","sidebar":"tutorialSidebar"},{"id":"concepts/http","path":"/docs/0.4/concepts/http","sidebar":"tutorialSidebar"},{"id":"concepts/index","path":"/docs/0.4/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/opensource","path":"/docs/0.4/concepts/opensource","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-private","path":"/docs/0.4/concepts/sharing-private","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-public","path":"/docs/0.4/concepts/sharing-public","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-reserved","path":"/docs/0.4/concepts/sharing-reserved","sidebar":"tutorialSidebar"},{"id":"concepts/tunnels","path":"/docs/0.4/concepts/tunnels","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/docs/0.4/getting-started","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_private_share_guide","path":"/docs/0.4/guides/docker-share/docker_private_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_public_share_guide","path":"/docs/0.4/guides/docker-share/docker_public_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/index","path":"/docs/0.4/guides/docker-share/","sidebar":"tutorialSidebar"},{"id":"guides/drives","path":"/docs/0.4/guides/drives","sidebar":"tutorialSidebar"},{"id":"guides/frontdoor","path":"/docs/0.4/guides/frontdoor","sidebar":"tutorialSidebar"},{"id":"guides/install/index","path":"/docs/0.4/guides/install/","sidebar":"tutorialSidebar"},{"id":"guides/install/linux","path":"/docs/0.4/guides/install/linux","sidebar":"tutorialSidebar"},{"id":"guides/install/macos","path":"/docs/0.4/guides/install/macos","sidebar":"tutorialSidebar"},{"id":"guides/install/windows","path":"/docs/0.4/guides/install/windows","sidebar":"tutorialSidebar"},{"id":"guides/linux-user-share/index","path":"/docs/0.4/guides/linux-user-share/","sidebar":"tutorialSidebar"},{"id":"guides/permission-modes","path":"/docs/0.4/guides/permission-modes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/docker","path":"/docs/0.4/guides/self-hosting/docker","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/instance-configuration","path":"/docs/0.4/guides/self-hosting/instance-configuration","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/interstitial-page","path":"/docs/0.4/guides/self-hosting/interstitial-page","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/kubernetes","path":"/docs/0.4/guides/self-hosting/kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/index","path":"/docs/0.4/guides/self-hosting/linux/","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/nginx","path":"/docs/0.4/guides/self-hosting/linux/nginx","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","path":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","path":"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/oauth/configuring-oauth","path":"/docs/0.4/guides/self-hosting/oauth/configuring-oauth","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/organizations","path":"/docs/0.4/guides/self-hosting/organizations","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/personalized-frontend","path":"/docs/0.4/guides/self-hosting/personalized-frontend","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/self-service-invite","path":"/docs/0.4/guides/self-hosting/self-service-invite","sidebar":"tutorialSidebar"},{"id":"guides/vpn/vpn","path":"/docs/0.4/guides/vpn/","sidebar":"tutorialSidebar"},{"id":"myzrok/custom-domains/index","path":"/docs/0.4/myzrok/custom-domains/","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/docs/0.4/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/self-hosting","path":"/docs/0.4/category/self-hosting","sidebar":"tutorialSidebar"},{"id":"/category/metrics-and-limits","path":"/docs/0.4/category/metrics-and-limits","sidebar":"tutorialSidebar"},{"id":"/category/oauth","path":"/docs/0.4/category/oauth","sidebar":"tutorialSidebar"},{"id":"/category/myzrok","path":"/docs/0.4/category/myzrok","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/0.4/getting-started","label":"Getting Started"}}}}],"breadcrumbs":true}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-MDFLZPK8","id":"default"}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.7.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.7.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.7.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.7.0"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.7.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.7.0"},"docusaurus-plugin-svgr":{"type":"package","name":"@docusaurus/plugin-svgr","version":"3.7.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.7.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.7.0"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.7.0"},"custom-webpack-plugin":{"type":"local"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4023:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),o=n(1934),a=n(7143),i=n(99),s=n(7912),l=n(5313),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(p,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},1934:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},7143:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},6289:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),o=n(4625),a=n(99),i=n(797),s=n(2887),l=n(1934),c=n(5246),u=n(9030),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:S}=v,k=v.future.experimental_router,{withBaseUrl:x}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const j=f||p;const O=(0,s.A)(j),C=j?.replace("pathname://","");let A=void 0!==C?(T=C,y&&(e=>e.startsWith("/"))(T)?x(T):T):void 0;var T;"hash"===k&&A?.startsWith("./")&&(A=A?.slice(1)),A&&O&&(A=(0,a.Ks)(A,{trailingSlash:w,baseUrl:S}));const P=(0,r.useRef)(!1),I=n?o.k2:o.N_,R=l.A.canUseIntersectionObserver,N=(0,r.useRef)(),D=()=>{P.current||null==A||(window.docusaurus.preload(A),P.current=!0)};(0,r.useEffect)((()=>(!R&&O&&l.A.canUseDOM&&null!=A&&window.docusaurus.prefetch(A),()=>{R&&N.current&&N.current.disconnect()})),[N,A,R,O]);const L=A?.startsWith("#")??!1,M=!b.target||"_self"===b.target,F=!A||!O||!M||L&&"hash"!==k;g||!L&&F||E.collectLink(A),b.id&&E.collectAnchor(b.id);const z={};return F?(0,d.jsx)("a",{ref:_,href:A,...j&&!O&&{target:"_blank",rel:"noopener noreferrer"},...b,...z}):(0,d.jsx)(I,{...b,onMouseEnter:D,onTouchStart:D,innerRef:e=>{_.current=e,R&&e&&O&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),N.current.observe(e))},to:A,...n&&{isActive:h,activeClassName:m},...z})}const p=r.forwardRef(f)},539:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},4332:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},2887:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},9030:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(797),a=n(2887);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},5246:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},797:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6193);function a(){return(0,r.useContext)(o.o)}},9136:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(4974);function a(){return(0,r.useContext)(o.o)}},372:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(1934).A.canUseDOM?r.useLayoutEffect:r.useEffect},3722:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},5313:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},6351:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>b});var r=n(6540),o=n(6942),a=n(4332),i=n(3115),s=n(8749),l=n(6849),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,c.jsx)(p.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(h,{children:t})}function y(){const e=(0,r.useContext)(p);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},3716:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(6942),o=n(6351);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},2306:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(6849),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},3751:(e,t,n)=>{"use strict";n.d(t,{$S:()=>m,B5:()=>_,Nr:()=>p,OF:()=>S,QB:()=>E,Vd:()=>k,Y:()=>v,cC:()=>f,d1:()=>j,fW:()=>x,w8:()=>y});var r=n(6540),o=n(6347),a=n(2831),i=n(6942),s=n(214),l=n(1861),c=n(6351),u=n(1858),d=n(2306);function f(e){const t=(0,u.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function m(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),g=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||g(e.items,t))}function b(e,t){switch(e.type){case"category":return y(e,t)||void 0!==e.href&&!e.linkUnlisted||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function S(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function j(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},1858:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(6849),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},6942:(e,t,n)=>{"use strict";n.d(t,{zK:()=>y,vT:()=>p,gk:()=>m,Gy:()=>d,HW:()=>b,ht:()=>f,r7:()=>g,jh:()=>h});var r=n(6347),o=n(797),a=n(4332);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return s(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return c(t,n)}function b(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8867:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},7264:(e,t,n)=>{"use strict";var r=n(4876),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},9303:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(539),a=n(3115),i=n(6289),s=n(5246);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},7912:(e,t,n)=>{"use strict";n.d(t,{A:()=>Ot});var r=n(6540),o=n(8215),a=n(4023),i=n(9144),s=n(6347),l=n(539),c=n(7685),u=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(204),y=n(7788);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:b.skipToContent})}var w=n(3115),S=n(3380);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",x.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function j(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const O={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:O.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:O.announcementBarPlaceholder}),(0,u.jsx)(j,{className:O.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:O.announcementBarClose})]})}var A=n(5528),T=n(5627);var P=n(6849),I=n(3065);const R=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,A.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,P.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(R.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function L(){const e=(0,r.useContext)(R);if(!e)throw new P.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=L();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(8532),z=n(9136);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const q={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(q.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",q.toggleButton,!i&&q.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite","aria-pressed":"dark"===r?"true":"false",children:[(0,u.jsx)(B,{className:(0,o.A)(q.toggleIcon,q.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.A)(q.toggleIcon,q.darkToggleIcon)})]})})}const H=r.memo($),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(2862);function K(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,A.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(6289),J=n(9030),X=n(2887),ee=n(6767),te=n(5891);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,J.Ay)(r),f=(0,J.Ay)(t),p=(0,J.Ay)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,X.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?p:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(f)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(3535),se=n(214),le=n(797);const ce="dropdownNavbarItemMobile_S0Fm";function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(ze,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(ze,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var me=n(7976);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",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"})})}const ge="iconLanguage_nlXk";var ye=n(961),be=n(5600),ve=n(7143),we=n(3592),Se=n(8455),ke=n(9396),xe=n(3716);function Ee(){return[`language:${(0,le.A)().i18n.currentLocale}`,function(){const e=(0,xe.v)();return[ke.C,...e]}().map((e=>`docusaurus_tag:${e}`))]}const _e={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let je=null;function Oe(){return je?Promise.resolve():Promise.all([n.e(8158).then(n.bind(n,8158)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(1809)]).then(n.bind(n,4190))]).then((e=>{let[{DocSearchModal:t}]=e;je=t}))}function Ce(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Ae(e){let{state:t,onClose:n}=e;const r=(0,we.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Te(e){let{externalUrlRegex:t,...n}=e;const o=function(e){let{externalUrlRegex:t}=e;const n=(0,s.W6)(),[o]=(0,r.useState)((()=>({navigate(e){(0,ee.G)(t,e.itemUrl)?window.location.href=e.itemUrl:n.push(e.itemUrl)}})));return o}({externalUrlRegex:t}),a=function(e){let{contextualSearch:t,...n}=e;const r=Ee(),o=n.searchParameters?.facetFilters??[],a=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(r,o):o;return{...n.searchParameters,facetFilters:a}}({...n}),i=function(e){const t=(0,Se.C)(),[n]=(0,r.useState)((()=>n=>e.transformItems?e.transformItems(n):n.map((e=>({...e,url:t(e.url)})))));return n}(n),l=function(){const{siteMetadata:{docusaurusVersion:e}}=(0,le.A)();return(0,r.useCallback)((t=>(t.addAlgoliaAgent("docusaurus",e),t)),[e])}(),c=(0,r.useRef)(null),d=(0,r.useRef)(null),[f,p]=(0,r.useState)(!1),[m,h]=(0,r.useState)(void 0),g=(0,r.useCallback)((()=>{if(!c.current){const e=document.createElement("div");c.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),y=(0,r.useCallback)((()=>{g(),Oe().then((()=>p(!0)))}),[g]),b=(0,r.useCallback)((()=>{p(!1),d.current?.focus(),h(void 0)}),[]),v=(0,r.useCallback)((e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),h(e.key),y())}),[y]),w=function(e){let{closeModal:t}=e;return(0,r.useMemo)((()=>e=>{let{state:n}=e;return(0,u.jsx)(Ae,{state:n,onClose:t})}),[t])}({closeModal:b});return(0,be.E8)({isOpen:f,onOpen:y,onClose:b,onInput:v,searchButtonRef:d}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ve.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${n.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(be.Bc,{onTouchStart:Oe,onFocus:Oe,onMouseOver:Oe,onClick:y,ref:d,translations:n.translations?.button??_e.button}),f&&je&&c.current&&(0,ye.createPortal)((0,u.jsx)(je,{onClose:b,initialScrollY:window.scrollY,initialQuery:m,navigator:o,transformItems:i,hitComponent:Ce,transformSearchClient:l,...n.searchPagePath&&{resultsFooterComponent:w},placeholder:_e.placeholder,...n,translations:n.translations?.modal??_e.modal,searchParameters:a}),c.current)]})}function Pe(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(Te,{...e.themeConfig.algolia})}const Ie={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Re(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Ie.navbarSearchContainer),children:t})}var Ne=n(6942),De=n(3751);var Le=n(6351);function Me(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Fe={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),f=(0,me.o)(),{search:p,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Re,{className:n,children:(0,u.jsx)(Pe,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,De.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,De.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,De.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),f=(0,Ne.zK)(n),p=(0,Ne.jh)(n),{savePreferredVersionName:m}=(0,Le.g1)(n),h=[...o,...p.map((function(e){const t=Me(e,f);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,De.Vd)(n)[0],y=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&h.length>1?void 0:Me(g,f).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function ze(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Fe[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Be(){const e=(0,A.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(ze,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ue(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function qe(){const e=0===(0,w.p)().navbar.items.length,t=L();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ue,{onClick:()=>t.hide()}),t.content]})}function $e(){const e=(0,A.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Be,{}),secondaryMenu:(0,u.jsx)(qe,{})}):null}const He={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ve(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ge(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,A.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,T.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[He.navbarHideable,!d&&He.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ve,{onClick:i.toggle}),(0,u.jsx)($e,{})]})}var We=n(99);const Ke={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Qe(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ye(e){let{error:t}=e;const n=(0,We.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Ke.errorBoundaryError,children:n})}class Ze extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Je="right";function Xe(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function et(){const{toggle:e,shown:t}=(0,A.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Xe,{})})}const tt={colorModeToggle:"colorModeToggle_DEke"};function nt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ze,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(ze,{...e})},t)))})}function rt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ot(){const e=(0,A.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Je)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(rt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(et,{}),(0,u.jsx)(K,{}),(0,u.jsx)(nt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(nt,{items:r}),(0,u.jsx)(G,{className:tt.colorModeToggle}),!o&&(0,u.jsx)(Re,{children:(0,u.jsx)(Pe,{})})]})})}function at(){return(0,u.jsx)(Ge,{children:(0,u.jsx)(ot,{})})}function it(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:i,className:s,...l}=t,c=(0,J.Ay)(n),d=(0,J.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:(0,o.A)("footer__link-item",s),...r?{href:i?d:r}:{to:c},...l,children:[a,r&&!(0,X.A)(r)&&(0,u.jsx)(te.A,{})]})}function st(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:(0,o.A)("footer__item",t.className),dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(it,{item:t})},t.href??t.to)}function lt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:(0,o.A)("col footer__col",t.className),children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(st,{item:e},t)))})]})}function ct(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(lt,{column:e},t)))})}function ut(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function dt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:(0,o.A)("footer__link-item",t.className),dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(it,{item:t})}function ft(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(dt,{item:e}),t.length!==n+1&&(0,u.jsx)(ut,{})]},n)))})})}function pt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(ct,{columns:t}):(0,u.jsx)(ft,{links:t})}var mt=n(9324);const ht="footerLogoLink_BH7S";function gt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,J.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(mt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function yt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:ht,target:t.target,children:(0,u.jsx)(gt,{logo:t})}):(0,u.jsx)(gt,{logo:t})}function bt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function vt(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function wt(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(vt,{style:o,links:n&&n.length>0&&(0,u.jsx)(pt,{links:n}),logo:r&&(0,u.jsx)(yt,{logo:r}),copyright:t&&(0,u.jsx)(bt,{copyright:t})})}const St=r.memo(wt),kt=(0,P.fM)([F.a,S.o,T.Tv,Le.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(A.e,{children:(0,u.jsx)(N,{children:t})})})}]);function xt(e){let{children:t}=e;return(0,u.jsx)(kt,{children:t})}var Et=n(9303);function _t(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Et.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Qe,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ye,{error:t})})]})})})}const jt={mainWrapper:"mainWrapper_z2l0"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,u.jsxs)(xt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(C,{}),(0,u.jsx)(at,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,jt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(_t,{...e}),children:t})}),!n&&(0,u.jsx)(St,{})]})}},2862:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(6289),o=n(9030),a=n(797),i=n(3115),s=n(9324),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,o.Ay)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},7220:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(7143),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},9324:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(9136),i=n(8532);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},3535:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(6540),o=n(9136),a=n(372),i=n(4924),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return f(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){let{collapsed:t,isBrowser:n}=e;if(!n)return t?u:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:i,onCollapseTransitionEnd:l,className:c,disableSSRStyle:u}=e;const d=(0,o.A)(),h=(0,r.useRef)(null);return p({collapsibleRef:h,collapsed:n,animation:i}),(0,s.jsx)(t,{ref:h,style:u?void 0:m({collapsed:n,isBrowser:d}),onTransitionEnd:e=>{"height"===e.propertyName&&(f(h.current,n),l?.(n))},className:c,children:a})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},3380:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(6540),o=n(9136),a=n(8749),i=n(6849),s=n(3115),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&f(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},8532:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(6540),o=n(1934),a=n(6849),i=n(8749),s=n(3115),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,m=e=>o.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5528:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(6540),o=n(3065),a=n(6682),i=n(604),s=n(3115),l=n(6849),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function f(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function p(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},3065:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(6849),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},7788:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},3592:(e,t,n)=>{"use strict";n.d(t,{b:()=>s,w:()=>l});var r=n(6540),o=n(797),a=n(604);const i="q";function s(){return(0,a.l)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},6682:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(1934);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},204:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},4924:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},4159:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(797);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},604:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>l,l:()=>c});var r=n(6540),o=n(6347),a=n(6849);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=l(e)??"",n=function(e){const t=(0,o.W6)();return(0,r.useCallback)(((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})}),[e,t])}(e);return[t,n]}},1861:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{XI:()=>r,sb:()=>o})},9144:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>d,Jx:()=>m});var r=n(6540),o=n(5066),a=n(7143),i=n(5313);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(9030),c=n(4159),u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.s)(t),{withBaseUrl:d}=(0,l.hH)(),f=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.A,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,u.jsx)("meta",{property:"og:image",content:f}),f&&(0,u.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),s=(0,o.A)(i,t);return(0,u.jsxs)(f.Provider,{value:s,children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(p,{className:(0,o.A)(r,a),children:t})}},6849:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(372),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},6767:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},214:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8912),a=n(797);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},5627:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>u,a_:()=>m,gk:()=>h});var r=n(6540),o=n(1934),a=n(9136),i=n(372),s=n(6849),l=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const f=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(f()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=f();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function m(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function h(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},9396:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},8749:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>n.get()),(()=>null)),n]}},7976:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(797),o=n(6347),a=n(99);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},7685:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(6849);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},3115:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(797);function o(){return(0,r.A)().siteConfig.themeConfig}},1835:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(797);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},8455:(e,t,n)=>{"use strict";n.d(t,{C:()=>s});var r=n(6540),o=n(6767),a=n(9030),i=n(1835);function s(){const{withBaseUrl:e}=(0,a.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2562:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(7149);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},2528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},99:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var o=n(2562);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(7149);var i=n(2528);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},7149:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},9231:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>A,yJ:()=>h,sC:()=>P,AO:()=>m,Fu:()=>g});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=s(t),o=s(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(1561);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function h(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function y(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var b=!("undefined"==typeof window||!window.document||!window.document.createElement);function v(e,t){t(window.confirm(e))}var w="popstate",S="hashchange";function k(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),b||(0,c.A)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,s=i.forceRefresh,l=void 0!==s&&s,d=i.getUserConfirmation,g=void 0===d?v:d,x=i.keyLength,E=void 0===x?6:x,_=e.basename?p(u(e.basename)):"";function j(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return _&&(a=f(a,_)),h(a,r,n)}function O(){return Math.random().toString(36).substr(2,E)}var C=y();function A(e){(0,r.A)(U,e),U.length=n.length,C.notifyListeners(U.location,U.action)}function T(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(j(e.state))}function P(){R(j(k()))}var I=!1;function R(e){if(I)I=!1,A();else{C.confirmTransitionTo(e,"POP",g,(function(t){t?A({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(I=!0,M(o))}(e)}))}}var N=j(k()),D=[N.key];function L(e){return _+m(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(w,T),a&&window.addEventListener(S,P)):0===F&&(window.removeEventListener(w,T),a&&window.removeEventListener(S,P))}var B=!1;var U={length:n.length,action:"POP",location:N,createHref:L,push:function(e,t){var r="PUSH",a=h(e,t,O(),U.location);C.confirmTransitionTo(a,r,g,(function(e){if(e){var t=L(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),l)window.location.href=t;else{var c=D.indexOf(U.location.key),u=D.slice(0,c+1);u.push(a.key),D=u,A({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,O(),U.location);C.confirmTransitionTo(a,r,g,(function(e){if(e){var t=L(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),l)window.location.replace(t);else{var c=D.indexOf(U.location.key);-1!==c&&(D[c]=a.key),A({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=C.appendListener(e);return z(1),function(){z(-1),t()}}};return U}var E="hashchange",_={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:u},slash:{encodePath:u,decodePath:u}};function j(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function O(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function C(e){window.location.replace(j(window.location.href)+"#"+e)}function A(e){void 0===e&&(e={}),b||(0,c.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?v:o,i=n.hashType,s=void 0===i?"slash":i,l=e.basename?p(u(e.basename)):"",d=_[s],g=d.encodePath,w=d.decodePath;function S(){var e=w(O());return l&&(e=f(e,l)),h(e)}var k=y();function x(e){(0,r.A)(B,e),B.length=t.length,k.notifyListeners(B.location,B.action)}var A=!1,T=null;function P(){var e,t,n=O(),r=g(n);if(n!==r)C(r);else{var o=S(),i=B.location;if(!A&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(T===m(o))return;T=null,function(e){if(A)A=!1,x();else{var t="POP";k.confirmTransitionTo(e,t,a,(function(n){n?x({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(m(t));-1===n&&(n=0);var r=D.lastIndexOf(m(e));-1===r&&(r=0);var o=n-r;o&&(A=!0,L(o))}(e)}))}}(o)}}var I=O(),R=g(I);I!==R&&C(R);var N=S(),D=[m(N)];function L(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(E,P):0===M&&window.removeEventListener(E,P)}var z=!1;var B={length:t.length,action:"POP",location:N,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=j(window.location.href)),n+"#"+g(l+m(e))},push:function(e,t){var n="PUSH",r=h(e,void 0,void 0,B.location);k.confirmTransitionTo(r,n,a,(function(e){if(e){var t=m(r),o=g(l+t);if(O()!==o){T=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(m(B.location)),i=D.slice(0,a+1);i.push(t),D=i,x({action:n,location:r})}else x()}}))},replace:function(e,t){var n="REPLACE",r=h(e,void 0,void 0,B.location);k.confirmTransitionTo(r,n,a,(function(e){if(e){var t=m(r),o=g(l+t);O()!==o&&(T=t,C(o));var a=D.indexOf(m(B.location));-1!==a&&(D[a]=t),x({action:n,location:r})}}))},go:L,goBack:function(){L(-1)},goForward:function(){L(1)},block:function(e){void 0===e&&(e=!1);var t=k.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=k.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function P(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=y();function d(e){(0,r.A)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function f(){return Math.random().toString(36).substr(2,c)}var p=T(s,0,a.length-1),g=a.map((function(e){return h(e,void 0,"string"==typeof e?f():e.key||f())})),b=m;function v(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:g.length,action:"POP",location:g[p],index:p,entries:g,createHref:b,push:function(e,t){var r="PUSH",o=h(e,t,f(),w.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=h(e,t,f(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=p(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g<i.length;++g){var y=i[g];if(!(a[y]||r&&r[y]||h&&h[y]||s&&s[y])){var b=f(n,y);try{c(t,y,b)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},7378:(e,t,n)=>{"use strict";n.r(t)},2094:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(s+=e.slice(i,p),i=p+d.length,f)s+=f[1];else{var m=e[i],h=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var S=null!=h&&null!=m&&m!==h,k="+"===v||"*"===v,x="?"===v||"*"===v,E=n[2]||u,_=y||b;r.push({name:g||a++,prefix:h||"",delimiter:E,optional:x,repeat:k,partial:S,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+l(E)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=s[u.name];if(null==f){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=l(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var f=l(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=l(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(p(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(a(e,n),t,n)}(e,t,n)}},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++o;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(l),m=u;o(m);){for(var h in f={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var y in d)if(!(y in u))for(var b in p(y))if(b in u){f[y]=!0;break}for(var v in m=f)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(f,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var f in l)d.push(s[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},m={};function h(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var y=/[\-:]([a-z])/g;function b(e){return e[1].toUpperCase()}function v(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(m,e)||!d.call(p,e)&&(f.test(e)?m[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,b);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,S=Symbol.for("react.element"),k=Symbol.for("react.portal"),x=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),j=Symbol.for("react.provider"),O=Symbol.for("react.context"),C=Symbol.for("react.forward_ref"),A=Symbol.for("react.suspense"),T=Symbol.for("react.suspense_list"),P=Symbol.for("react.memo"),I=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var R=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var N=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=N&&e[N]||e["@@iterator"])?e:null}var L,M=Object.assign;function F(e){if(void 0===L)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);L=t&&t[1]||""}return"\n"+L+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function U(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case k:return"Portal";case _:return"Profiler";case E:return"StrictMode";case A:return"Suspense";case T:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case O:return(e.displayName||"Context")+".Consumer";case j:return(e._context.displayName||"Context")+".Provider";case C:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case P:return null!==(t=e.displayName||null)?t:q(e.type)||"Memo";case I:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function $(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return q(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function V(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function G(e){e._valueTracker||(e._valueTracker=function(e){var t=V(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=V(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function J(e,t){Z(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function X(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function se(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ye=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function be(e,t){if(t){if(ye[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,xe=null,Ee=null;function _e(e){if(e=wo(e)){if("function"!=typeof ke)throw Error(a(280));var t=e.stateNode;t&&(t=ko(t),ke(e.stateNode,e.type,t))}}function je(e){xe?Ee?Ee.push(e):Ee=[e]:xe=e}function Oe(){if(xe){var e=xe,t=Ee;if(Ee=xe=null,_e(e),t)for(e=0;e<t.length;e++)_e(t[e])}}function Ce(e,t){return e(t)}function Ae(){}var Te=!1;function Pe(e,t,n){if(Te)return e(t,n);Te=!0;try{return Ce(e,t,n)}finally{Te=!1,(null!==xe||null!==Ee)&&(Ae(),Oe())}}function Ie(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Re=!1;if(u)try{var Ne={};Object.defineProperty(Ne,"passive",{get:function(){Re=!0}}),window.addEventListener("test",Ne,Ne),window.removeEventListener("test",Ne,Ne)}catch(ue){Re=!1}function De(e,t,n,r,o,a,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Le=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Le=!0,Me=e}};function Ue(e,t,n,r,o,a,i,s,l){Le=!1,Me=null,De.apply(Be,arguments)}function qe(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function $e(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(qe(e)!==e)throw Error(a(188))}function Ve(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=qe(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ge(e):null}function Ge(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ge(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Ke=o.unstable_cancelCallback,Qe=o.unstable_shouldYield,Ye=o.unstable_requestPaint,Ze=o.unstable_now,Je=o.unstable_getCurrentPriorityLevel,Xe=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&4194240&a))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return!(4194240&(ct<<=1))&&(ct=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function yt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function bt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var St,kt,xt,Et,_t,jt=!1,Ot=[],Ct=null,At=null,Tt=null,Pt=new Map,It=new Map,Rt=[],Nt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":Ct=null;break;case"dragenter":case"dragleave":At=null;break;case"mouseover":case"mouseout":Tt=null;break;case"pointerover":case"pointerout":Pt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":It.delete(t.pointerId)}}function Lt(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=wo(t))&&kt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=vo(e.target);if(null!==t){var n=qe(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=$e(n)))return e.blockedOn=t,void _t(e.priority,(function(){xt(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&kt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){jt=!1,null!==Ct&&Ft(Ct)&&(Ct=null),null!==At&&Ft(At)&&(At=null),null!==Tt&&Ft(Tt)&&(Tt=null),Pt.forEach(zt),It.forEach(zt)}function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,jt||(jt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function qt(e){function t(t){return Ut(t,e)}if(0<Ot.length){Ut(Ot[0],e);for(var n=1;n<Ot.length;n++){var r=Ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Ct&&Ut(Ct,e),null!==At&&Ut(At,e),null!==Tt&&Ut(Tt,e),Pt.forEach(t),It.forEach(t),n=0;n<Rt.length;n++)(r=Rt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Rt.length&&null===(n=Rt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Rt.shift()}var $t=w.ReactCurrentBatchConfig,Ht=!0;function Vt(e,t,n,r){var o=vt,a=$t.transition;$t.transition=null;try{vt=1,Wt(e,t,n,r)}finally{vt=o,$t.transition=a}}function Gt(e,t,n,r){var o=vt,a=$t.transition;$t.transition=null;try{vt=4,Wt(e,t,n,r)}finally{vt=o,$t.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Qt(e,t,n,r);if(null===o)Hr(e,t,r,Kt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return Ct=Lt(Ct,e,t,n,r,o),!0;case"dragenter":return At=Lt(At,e,t,n,r,o),!0;case"mouseover":return Tt=Lt(Tt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Pt.set(a,Lt(Pt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,It.set(a,Lt(It.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Nt.indexOf(e)){for(;null!==o;){var a=wo(o);if(null!==a&&St(a),null===(a=Qt(e,t,n,r))&&Hr(e,t,r,Kt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Kt=null;function Qt(e,t,n,r){if(Kt=null,null!==(e=vo(e=Se(r))))if(null===(t=qe(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=$e(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Kt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Je()){case Xe:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Jt=null,Xt=null;function en(){if(Xt)return Xt;var e,t,n=Jt,r=n.length,o="value"in Zt?Zt.value:Zt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Xt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,sn,ln,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),fn=on(dn),pn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:_n,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=on(pn),hn=on(M({},pn,{dataTransfer:0})),gn=on(M({},dn,{relatedTarget:0})),yn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),bn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=on(bn),wn=on(M({},cn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},xn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=xn[e])&&!!t[e]}function _n(){return En}var jn=M({},dn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?kn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:_n,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),On=on(jn),Cn=on(M({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),An=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:_n})),Tn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=M({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=on(Pn),Rn=[9,13,27,32],Nn=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var Ln=u&&"TextEvent"in window&&!Dn,Mn=u&&(!Nn||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Rn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var qn=!1;var $n={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!$n[e.type]:"textarea"===t}function Vn(e,t,n,r){je(r),0<(t=Gr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,Wn=null;function Kn(e){Fr(e,0)}function Qn(e){if(W(So(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Jn;if(u){var Xn="oninput"in document;if(!Xn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Xn="function"==typeof er.oninput}Jn=Xn}else Jn=!1;Zn=Jn&&(!document.documentMode||9<document.documentMode)}function tr(){Gn&&(Gn.detachEvent("onpropertychange",nr),Wn=Gn=null)}function nr(e){if("value"===e.propertyName&&Qn(Wn)){var t=[];Vn(t,Wn,e,Se(e)),Pe(Kn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Gn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Wn)}function ar(e,t){if("click"===e)return Qn(t)}function ir(e,t){if("input"===e||"change"===e)return Qn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!sr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,yr=null,br=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==gr||gr!==K(r)||("selectionStart"in(r=gr)&&pr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},br&&lr(br,r)||(br=r,0<(r=Gr(yr,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function Sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:Sr("Animation","AnimationEnd"),animationiteration:Sr("Animation","AnimationIteration"),animationstart:Sr("Animation","AnimationStart"),transitionend:Sr("Transition","TransitionEnd")},xr={},Er={};function _r(e){if(xr[e])return xr[e];if(!kr[e])return e;var t,n=kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return xr[e]=n[t];return e}u&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var jr=_r("animationend"),Or=_r("animationiteration"),Cr=_r("animationstart"),Ar=_r("transitionend"),Tr=new Map,Pr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ir(e,t){Tr.set(e,t),l(t,[e])}for(var Rr=0;Rr<Pr.length;Rr++){var Nr=Pr[Rr];Ir(Nr.toLowerCase(),"on"+(Nr[0].toUpperCase()+Nr.slice(1)))}Ir(jr,"onAnimationEnd"),Ir(Or,"onAnimationIteration"),Ir(Cr,"onAnimationStart"),Ir("dblclick","onDoubleClick"),Ir("focusin","onFocus"),Ir("focusout","onBlur"),Ir(Ar,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Lr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,s,l,c){if(Ue.apply(this,arguments),Le){if(!Le)throw Error(a(198));var u=Me;Le=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bubble";n.has(r)||($r(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),$r(n,e,r,t)}var Ur="_reactListening"+Math.random().toString(36).slice(2);function qr(e){if(!e[Ur]){e[Ur]=!0,i.forEach((function(t){"selectionchange"!==t&&(Lr.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Ur]||(t[Ur]=!0,Br("selectionchange",!1,t))}}function $r(e,t,n,r){switch(Yt(t)){case 1:var o=Vt;break;case 4:o=Gt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Re||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=vo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Pe((function(){var r=a,o=Se(n),i=[];e:{var s=Tr.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=On;break;case"focusin":c="focus",l=gn;break;case"focusout":c="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=An;break;case jr:case Or:case Cr:l=yn;break;case Ar:l=Tn;break;case"scroll":l=fn;break;case"wheel":l=In;break;case"copy":case"cut":case"paste":l=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Cn}var u=!!(4&t),d=!u&&"scroll"===e,f=u?null!==s?s+"Capture":null:s;u=[];for(var p,m=r;null!==m;){var h=(p=m).stateNode;if(5===p.tag&&null!==h&&(p=h,null!==f&&(null!=(h=Ie(m,f))&&u.push(Vr(m,h,p)))),d)break;m=m.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(!(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!vo(c)&&!c[ho])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?vo(c):null)&&(c!==(d=qe(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=mn,h="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Cn,h="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==l?s:So(l),p=null==c?s:So(c),(s=new u(h,m+"leave",l,n,o)).target=d,s.relatedTarget=p,h=null,vo(o)===r&&((u=new u(f,m+"enter",c,n,o)).target=p,u.relatedTarget=d,h=u),d=h,l&&c)e:{for(f=c,m=0,p=u=l;p;p=Wr(p))m++;for(p=0,h=f;h;h=Wr(h))p++;for(;0<m-p;)u=Wr(u),m--;for(;0<p-m;)f=Wr(f),p--;for(;m--;){if(u===f||null!==f&&u===f.alternate)break e;u=Wr(u),f=Wr(f)}u=null}else u=null;null!==l&&Kr(i,s,l,u,!1),null!==c&&null!==d&&Kr(i,d,c,u,!0)}if("select"===(l=(s=r?So(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var g=Yn;else if(Hn(s))if(Zn)g=ir;else{g=or;var y=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(g=ar);switch(g&&(g=g(e,r))?Vn(i,g,n,o):(y&&y(e,s,r),"focusout"===e&&(y=s._wrapperState)&&y.controlled&&"number"===s.type&&ee(s,"number",s.value)),y=r?So(r):window,e){case"focusin":(Hn(y)||"true"===y.contentEditable)&&(gr=y,yr=r,br=null);break;case"focusout":br=yr=gr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,o);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":wr(i,n,o)}var b;if(Nn)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else qn?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&(qn||"onCompositionStart"!==v?"onCompositionEnd"===v&&qn&&(b=en()):(Jt="value"in(Zt=o)?Zt.value:Zt.textContent,qn=!0)),0<(y=Gr(r,v)).length&&(v=new wn(v,e,null,n,o),i.push({event:v,listeners:y}),b?v.data=b:null!==(b=Un(n))&&(v.data=b))),(b=Ln?function(e,t){switch(e){case"compositionend":return Un(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(qn)return"compositionend"===e||!Nn&&Bn(e,t)?(e=en(),Xt=Jt=Zt=null,qn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Gr(r,"onBeforeInput")).length&&(o=new wn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=b))}Fr(i,t)}))}function Vr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Gr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Ie(e,n))&&r.unshift(Vr(e,a,o)),null!=(a=Ie(e,t))&&r.push(Vr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Kr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Ie(n,a))&&i.unshift(Vr(n,l,s)):o||null!=(l=Ie(n,a))&&i.push(Vr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Qr,"\n").replace(Yr,"")}function Jr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(a(425))}function Xr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void qt(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);qt(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po="__reactFiber$"+fo,mo="__reactProps$"+fo,ho="__reactContainer$"+fo,go="__reactEvents$"+fo,yo="__reactListeners$"+fo,bo="__reactHandles$"+fo;function vo(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[po])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[po]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function So(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function ko(e){return e[mo]||null}var xo=[],Eo=-1;function _o(e){return{current:e}}function jo(e){0>Eo||(e.current=xo[Eo],xo[Eo]=null,Eo--)}function Oo(e,t){Eo++,xo[Eo]=e.current,e.current=t}var Co={},Ao=_o(Co),To=_o(!1),Po=Co;function Io(e,t){var n=e.type.contextTypes;if(!n)return Co;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Ro(e){return null!=(e=e.childContextTypes)}function No(){jo(To),jo(Ao)}function Do(e,t,n){if(Ao.current!==Co)throw Error(a(168));Oo(Ao,t),Oo(To,n)}function Lo(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,$(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Co,Po=Ao.current,Oo(Ao,e),Oo(To,To.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Lo(e,t,Po),r.__reactInternalMemoizedMergedChildContext=e,jo(To),jo(Ao),Oo(Ao,e)):jo(To),Oo(To,n)}var zo=null,Bo=!1,Uo=!1;function qo(e){null===zo?zo=[e]:zo.push(e)}function $o(){if(!Uo&&null!==zo){Uo=!0;var e=0,t=vt;try{var n=zo;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Xe,$o),o}finally{vt=t,Uo=!1}}return null}var Ho=[],Vo=0,Go=null,Wo=0,Ko=[],Qo=0,Yo=null,Zo=1,Jo="";function Xo(e,t){Ho[Vo++]=Wo,Ho[Vo++]=Go,Go=e,Wo=t}function ea(e,t,n){Ko[Qo++]=Zo,Ko[Qo++]=Jo,Ko[Qo++]=Yo,Yo=e;var r=Zo;e=Jo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Zo=1<<32-it(t)+o|n<<o|r,Jo=a+e}else Zo=1<<a|n<<o|r,Jo=e}function ta(e){null!==e.return&&(Xo(e,1),ea(e,1,0))}function na(e){for(;e===Go;)Go=Ho[--Vo],Ho[Vo]=null,Wo=Ho[--Vo],Ho[Vo]=null;for(;e===Yo;)Yo=Ko[--Qo],Ko[Qo]=null,Jo=Ko[--Qo],Ko[Qo]=null,Zo=Ko[--Qo],Ko[Qo]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(e,t){var n=Pc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function la(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Yo?{id:Zo,overflow:Jo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Pc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return!(!(1&e.mode)||128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function fa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw pa(),Error(a(418));for(;t;)sa(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function pa(){for(var e=oa;e;)e=co(e.nextSibling)}function ma(){oa=ra=null,aa=!1}function ha(e){null===ia?ia=[e]:ia.push(e)}var ga=w.ReactCurrentBatchConfig;function ya(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function ba(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function va(e){return(0,e._init)(e._payload)}function wa(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Rc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Mc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===x?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===I&&va(a)===t.type)?((r=o(t,n.props)).ref=ya(e,t,n),r.return=e,r):((r=Nc(n.type,n.key,n.props,null,e.mode,r)).ref=ya(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Mc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case S:return(n=Nc(t.type,t.key,t.props,null,e.mode,n)).ref=ya(e,null,t),n.return=e,n;case k:return(t=Fc(t,e.mode,n)).return=e,t;case I:return f(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Dc(t,e.mode,n,null)).return=e,t;ba(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case S:return n.key===o?c(e,t,n,r):null;case k:return n.key===o?u(e,t,n,r):null;case I:return p(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);ba(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case k:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case I:return m(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);ba(t,r)}return null}function h(o,a,s,l){for(var c=null,u=null,d=a,h=a=0,g=null;null!==d&&h<s.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var y=p(o,d,s[h],l);if(null===y){null===d&&(d=g);break}e&&d&&null===y.alternate&&t(o,d),a=i(y,a,h),null===u?c=y:u.sibling=y,u=y,d=g}if(h===s.length)return n(o,d),aa&&Xo(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=f(o,s[h],l))&&(a=i(d,a,h),null===u?c=d:u.sibling=d,u=d);return aa&&Xo(o,h),c}for(d=r(o,d);h<s.length;h++)null!==(g=m(d,o,h,s[h],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),a=i(g,a,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),aa&&Xo(o,h),c}function g(o,s,l,c){var u=D(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,h=s,g=s=0,y=null,b=l.next();null!==h&&!b.done;g++,b=l.next()){h.index>g?(y=h,h=null):y=h.sibling;var v=p(o,h,b.value,c);if(null===v){null===h&&(h=y);break}e&&h&&null===v.alternate&&t(o,h),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v,h=y}if(b.done)return n(o,h),aa&&Xo(o,g),u;if(null===h){for(;!b.done;g++,b=l.next())null!==(b=f(o,b.value,c))&&(s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return aa&&Xo(o,g),u}for(h=r(o,h);!b.done;g++,b=l.next())null!==(b=m(h,o,g,b.value,c))&&(e&&null!==b.alternate&&h.delete(null===b.key?g:b.key),s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return e&&h.forEach((function(e){return t(o,e)})),aa&&Xo(o,g),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===x&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case S:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===x){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===I&&va(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=ya(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===x?((a=Dc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Nc(i.type,i.key,i.props,null,r.mode,l)).ref=ya(r,a,i),l.return=r,r=l)}return s(r);case k:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Fc(i,r.mode,l)).return=r,r=a}return s(r);case I:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return h(r,a,i,l);if(D(i))return g(r,a,i,l);ba(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Mc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Sa=wa(!0),ka=wa(!1),xa=_o(null),Ea=null,_a=null,ja=null;function Oa(){ja=_a=Ea=null}function Ca(e){var t=xa.current;jo(xa),e._currentValue=t}function Aa(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ta(e,t){Ea=e,ja=_a=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(vs=!0),e.firstContext=null)}function Pa(e){var t=e._currentValue;if(ja!==e)if(e={context:e,memoizedValue:t,next:null},null===_a){if(null===Ea)throw Error(a(308));_a=e,Ea.dependencies={lanes:0,firstContext:e}}else _a=_a.next=e;return t}var Ia=null;function Ra(e){null===Ia?Ia=[e]:Ia.push(e)}function Na(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Ra(t)):(n.next=o.next,o.next=n),t.interleaved=n,Da(e,r)}function Da(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var La=!1;function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function za(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ba(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Cl){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Da(e,n)}return null===(o=r.interleaved)?(t.next=t,Ra(r)):(t.next=o.next,o.next=t),r.interleaved=t,Da(e,n)}function Ua(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}function qa(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function $a(e,t,n,r){var o=e.updateQueue;La=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var f=s.lane,p=s.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,h=s;switch(f=t,p=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(p,d,f);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(f="function"==typeof(m=h.payload)?m.call(p,d,f):m))break e;d=M({},d,f);break e;case 2:La=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=p,l=d):u=u.next=p,i|=f;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(f=s).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Ll|=i,e.lanes=i,e.memoizedState=d}}function Ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Va={},Ga=_o(Va),Wa=_o(Va),Ka=_o(Va);function Qa(e){if(e===Va)throw Error(a(174));return e}function Ya(e,t){switch(Oo(Ka,t),Oo(Wa,e),Oo(Ga,Va),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}jo(Ga),Oo(Ga,t)}function Za(){jo(Ga),jo(Wa),jo(Ka)}function Ja(e){Qa(Ka.current);var t=Qa(Ga.current),n=le(t,e.type);t!==n&&(Oo(Wa,e),Oo(Ga,n))}function Xa(e){Wa.current===e&&(jo(Ga),jo(Wa))}var ei=_o(0);function ti(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var oi=w.ReactCurrentDispatcher,ai=w.ReactCurrentBatchConfig,ii=0,si=null,li=null,ci=null,ui=!1,di=!1,fi=0,pi=0;function mi(){throw Error(a(321))}function hi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function gi(e,t,n,r,o,i){if(ii=i,si=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,oi.current=null===e||null===e.memoizedState?Xi:es,e=n(r,o),di){i=0;do{if(di=!1,fi=0,25<=i)throw Error(a(301));i+=1,ci=li=null,t.updateQueue=null,oi.current=ts,e=n(r,o)}while(di)}if(oi.current=Ji,t=null!==li&&null!==li.next,ii=0,ci=li=si=null,ui=!1,t)throw Error(a(300));return e}function yi(){var e=0!==fi;return fi=0,e}function bi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?si.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===li){var e=si.alternate;e=null!==e?e.memoizedState:null}else e=li.next;var t=null===ci?si.memoizedState:ci.next;if(null!==t)ci=t,li=e;else{if(null===e)throw Error(a(310));e={memoizedState:(li=e).memoizedState,baseState:li.baseState,baseQueue:li.baseQueue,queue:li.queue,next:null},null===ci?si.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function Si(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=li,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((ii&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var f={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(l=c=f,s=r):c=c.next=f,si.lanes|=d,Ll|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(vs=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,si.lanes|=i,Ll|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(vs=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function xi(){}function Ei(e,t){var n=si,r=vi(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,vs=!0),r=r.queue,Li(Oi.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Pi(9,ji.bind(null,n,r,o,t),void 0,null),null===Al)throw Error(a(349));30&ii||_i(n,t,o)}return o}function _i(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function ji(e,t,n,r){t.value=n,t.getSnapshot=r,Ci(t)&&Ai(e)}function Oi(e,t,n){return n((function(){Ci(t)&&Ai(e)}))}function Ci(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function Ai(e){var t=Da(e,1);null!==t&&nc(t,e,1,-1)}function Ti(e){var t=bi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Ki.bind(null,si,e),[t.memoizedState,e]}function Pi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Ii(){return vi().memoizedState}function Ri(e,t,n,r){var o=bi();si.flags|=e,o.memoizedState=Pi(1|t,n,void 0,void 0===r?null:r)}function Ni(e,t,n,r){var o=vi();r=void 0===r?null:r;var a=void 0;if(null!==li){var i=li.memoizedState;if(a=i.destroy,null!==r&&hi(r,i.deps))return void(o.memoizedState=Pi(t,n,a,r))}si.flags|=e,o.memoizedState=Pi(1|t,n,a,r)}function Di(e,t){return Ri(8390656,8,e,t)}function Li(e,t){return Ni(2048,8,e,t)}function Mi(e,t){return Ni(4,2,e,t)}function Fi(e,t){return Ni(4,4,e,t)}function zi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Bi(e,t,n){return n=null!=n?n.concat([e]):null,Ni(4,4,zi.bind(null,t,e),n)}function Ui(){}function qi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function $i(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Hi(e,t,n){return 21&ii?(sr(n,t)||(n=ht(),si.lanes|=n,Ll|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,vs=!0),e.memoizedState=n)}function Vi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=ai.transition;ai.transition={};try{e(!1),t()}finally{vt=n,ai.transition=r}}function Gi(){return vi().memoizedState}function Wi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Qi(e))Yi(t,n);else if(null!==(n=Na(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Ki(e,t,n){var r=tc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Qi(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Ra(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Na(e,t,o,r))&&(nc(n,e,r,o=ec()),Zi(n,t,r))}}function Qi(e){var t=e.alternate;return e===si||null!==t&&t===si}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}var Ji={readContext:Pa,useCallback:mi,useContext:mi,useEffect:mi,useImperativeHandle:mi,useInsertionEffect:mi,useLayoutEffect:mi,useMemo:mi,useReducer:mi,useRef:mi,useState:mi,useDebugValue:mi,useDeferredValue:mi,useTransition:mi,useMutableSource:mi,useSyncExternalStore:mi,useId:mi,unstable_isNewReconciler:!1},Xi={readContext:Pa,useCallback:function(e,t){return bi().memoizedState=[e,void 0===t?null:t],e},useContext:Pa,useEffect:Di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ri(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ri(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ri(4,2,e,t)},useMemo:function(e,t){var n=bi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=bi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Wi.bind(null,si,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},bi().memoizedState=e},useState:Ti,useDebugValue:Ui,useDeferredValue:function(e){return bi().memoizedState=e},useTransition:function(){var e=Ti(!1),t=e[0];return e=Vi.bind(null,e[1]),bi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=si,o=bi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Al)throw Error(a(349));30&ii||_i(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Di(Oi.bind(null,r,i,e),[e]),r.flags|=2048,Pi(9,ji.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=bi(),t=Al.identifierPrefix;if(aa){var n=Jo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=fi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=pi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},es={readContext:Pa,useCallback:qi,useContext:Pa,useEffect:Li,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:$i,useReducer:Si,useRef:Ii,useState:function(){return Si(wi)},useDebugValue:Ui,useDeferredValue:function(e){return Hi(vi(),li.memoizedState,e)},useTransition:function(){return[Si(wi)[0],vi().memoizedState]},useMutableSource:xi,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1},ts={readContext:Pa,useCallback:qi,useContext:Pa,useEffect:Li,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:$i,useReducer:ki,useRef:Ii,useState:function(){return ki(wi)},useDebugValue:Ui,useDeferredValue:function(e){var t=vi();return null===li?t.memoizedState=e:Hi(t,li.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:xi,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1};function ns(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rs(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var os={isMounted:function(e){return!!(e=e._reactInternals)&&qe(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),Ua(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),Ua(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),o=za(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ba(e,o,r))&&(nc(t,e,r,n),Ua(t,e,r))}};function as(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function is(e,t,n){var r=!1,o=Co,a=t.contextType;return"object"==typeof a&&null!==a?a=Pa(a):(o=Ro(t)?Po:Ao.current,a=(r=null!=(r=t.contextTypes))?Io(e,o):Co),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=os,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function ss(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&os.enqueueReplaceState(t,t.state,null)}function ls(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs={},Ma(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Pa(a):(a=Ro(t)?Po:Ao.current,o.context=Io(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(rs(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&os.enqueueReplaceState(o,o.state,null),$a(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function cs(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function us(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ds(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function ps(e,t,n){(n=za(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hl||(Hl=!0,Vl=r),ds(0,t)},n}function ms(e,t,n){(n=za(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ds(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ds(0,t),"function"!=typeof r&&(null===Gl?Gl=new Set([this]):Gl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=_c.bind(null,e,t,n),t.then(e,e))}function gs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ys(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=za(-1,1)).tag=2,Ba(n,t,1))),n.lanes|=1),e)}var bs=w.ReactCurrentOwner,vs=!1;function ws(e,t,n,r){t.child=null===e?ka(t,null,n,r):Sa(t,e.child,n,r)}function Ss(e,t,n,r,o){n=n.render;var a=t.ref;return Ta(t,o),r=gi(e,t,n,r,a,o),n=yi(),null===e||vs?(aa&&n&&ta(t),t.flags|=1,ws(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function ks(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Ic(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Nc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,xs(e,t,a,r,o))}if(a=e.child,!(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Hs(e,t,o)}return t.flags|=1,(e=Rc(a,r)).ref=t.ref,e.return=t,t.child=e}function xs(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(vs=!1,t.pendingProps=r=a,!(e.lanes&o))return t.lanes=e.lanes,Hs(e,t,o);131072&e.flags&&(vs=!0)}}return js(e,t,n,r,o)}function Es(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Oo(Rl,Il),Il|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,Oo(Rl,Il),Il|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Oo(Rl,Il),Il|=n;else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,Oo(Rl,Il),Il|=r;return ws(e,t,o,n),t.child}function _s(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function js(e,t,n,r,o){var a=Ro(n)?Po:Ao.current;return a=Io(t,a),Ta(t,o),n=gi(e,t,n,r,a,o),r=yi(),null===e||vs?(aa&&r&&ta(t),t.flags|=1,ws(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function Os(e,t,n,r,o){if(Ro(n)){var a=!0;Mo(t)}else a=!1;if(Ta(t,o),null===t.stateNode)$s(e,t),is(t,n,r),ls(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Pa(c):c=Io(t,c=Ro(n)?Po:Ao.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&ss(t,i,r,c),La=!1;var f=t.memoizedState;i.state=f,$a(t,r,i,o),l=t.memoizedState,s!==r||f!==l||To.current||La?("function"==typeof u&&(rs(t,n,u,r),l=t.memoizedState),(s=La||as(t,n,s,r,f,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Fa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ns(t.type,s),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Pa(l):l=Io(t,l=Ro(n)?Po:Ao.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||f!==l)&&ss(t,i,r,l),La=!1,f=t.memoizedState,i.state=f,$a(t,r,i,o);var m=t.memoizedState;s!==d||f!==m||To.current||La?("function"==typeof p&&(rs(t,n,p,r),m=t.memoizedState),(c=La||as(t,n,c,r,f,m,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Cs(e,t,n,r,a,o)}function Cs(e,t,n,r,o,a){_s(e,t);var i=!!(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Hs(e,t,a);r=t.stateNode,bs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Sa(t,e.child,null,a),t.child=Sa(t,null,s,a)):ws(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function As(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),Ya(e,t.containerInfo)}function Ts(e,t,n,r,o){return ma(),ha(o),t.flags|=256,ws(e,t,n,r),t.child}var Ps,Is,Rs,Ns,Ds={dehydrated:null,treeContext:null,retryLane:0};function Ls(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ms(e,t,n){var r,o=t.pendingProps,i=ei.current,s=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),Oo(ei,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},1&o||null===s?s=Lc(l,o,0,null):(s.childLanes=0,s.pendingProps=l),e=Dc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ls(n),t.memoizedState=Ds,e):Fs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,zs(e,t,s,r=us(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Lc({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&Sa(t,e.child,null,s),t.child.memoizedState=Ls(s),t.memoizedState=Ds,i);if(!(1&t.mode))return zs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,zs(e,t,s,r=us(i=Error(a(419)),r,void 0))}if(l=!!(s&e.childLanes),vs||l){if(null!==(r=Al)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|s)?0:o)&&o!==i.retryLane&&(i.retryLane=o,Da(e,o),nc(r,e,o,-1))}return hc(),zs(e,t,s,r=us(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Oc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Ko[Qo++]=Zo,Ko[Qo++]=Jo,Ko[Qo++]=Yo,Zo=e.id,Jo=e.overflow,Yo=t),t=Fs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 1&l||t.child===i?(o=Rc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null),null!==r?s=Rc(r,s):(s=Dc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ls(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Ds,o}return e=(s=e.child).sibling,o=Rc(s,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Fs(e,t){return(t=Lc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zs(e,t,n,r){return null!==r&&ha(r),Sa(t,e.child,null,n),(e=Fs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Bs(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Aa(e.return,t,n)}function Us(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function qs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ws(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Bs(e,n,t);else if(19===e.tag)Bs(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(Oo(ei,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Us(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ti(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Us(t,!0,n,null,a);break;case"together":Us(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function $s(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ll|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Rc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Rc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Vs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Gs(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ws(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Gs(t),null;case 1:case 17:return Ro(t.type)&&No(),Gs(t),null;case 3:return r=t.stateNode,Za(),jo(To),jo(Ao),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ia&&(ic(ia),ia=null))),Is(e,t),Gs(t),null;case 5:Xa(t);var o=Qa(Ka.current);if(n=t.type,null!==e&&null!=t.stateNode)Rs(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Gs(t),null}if(e=Qa(Ga.current),fa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[po]=t,r[mo]=i,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var l in be(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Jr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Jr(r.textContent,c,e),o=["children",""+c]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&zr("scroll",r)}switch(n){case"input":G(r),X(r,i,!0);break;case"textarea":G(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Xr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[po]=t,e[mo]=r,Ps(e,t,!1,!1),t.stateNode=e;e:{switch(l=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Y(e,r),o=Q(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in be(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&fe(e,u):"number"==typeof u&&fe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,l))}switch(n){case"input":G(e),X(e,r,!1);break;case"textarea":G(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Xr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Gs(t),null;case 6:if(e&&null!=t.stateNode)Ns(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=Qa(Ka.current),Qa(Ga.current),fa(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Jr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Jr(r.nodeValue,n,!!(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Gs(t),null;case 13:if(jo(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&1&t.mode&&!(128&t.flags))pa(),ma(),t.flags|=98560,i=!1;else if(i=fa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[po]=t}else ma(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Gs(t),i=!1}else null!==ia&&(ic(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ei.current?0===Nl&&(Nl=3):hc())),null!==t.updateQueue&&(t.flags|=4),Gs(t),null);case 4:return Za(),Is(e,t),null===e&&qr(t.stateNode.containerInfo),Gs(t),null;case 10:return Ca(t.type._context),Gs(t),null;case 19:if(jo(ei),null===(i=t.memoizedState))return Gs(t),null;if(r=!!(128&t.flags),null===(l=i.rendering))if(r)Vs(i,!1);else{if(0!==Nl||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(l=ti(e))){for(t.flags|=128,Vs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Oo(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>ql&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Vs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Gs(t),null}else 2*Ze()-i.renderingStartTime>ql&&1073741824!==n&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,Oo(ei,r?1&n|2:1&n),t):(Gs(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Il)&&(Gs(t),6&t.subtreeFlags&&(t.flags|=8192)):Gs(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Ks(e,t){switch(na(t),t.tag){case 1:return Ro(t.type)&&No(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Za(),jo(To),jo(Ao),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Xa(t),null;case 13:if(jo(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ma()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return jo(ei),null;case 4:return Za(),null;case 10:return Ca(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Ps=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Is=function(){},Rs=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Qa(Ga.current);var a,i=null;switch(n){case"input":o=Q(e,o),r=Q(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Xr)}for(u in be(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ns=function(e,t,n,r){n!==r&&(t.flags|=4)};var Qs=!1,Ys=!1,Zs="function"==typeof WeakSet?WeakSet:Set,Js=null;function Xs(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function el(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var tl=!1;function nl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&el(t,n,a)}o=o.next}while(o!==r)}}function rl(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ol(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function al(e){var t=e.alternate;null!==t&&(e.alternate=null,al(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[po],delete t[mo],delete t[go],delete t[yo],delete t[bo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function il(e){return 5===e.tag||3===e.tag||4===e.tag}function sl(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||il(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ll(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Xr));else if(4!==r&&null!==(e=e.child))for(ll(e,t,n),e=e.sibling;null!==e;)ll(e,t,n),e=e.sibling}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}var ul=null,dl=!1;function fl(e,t,n){for(n=n.child;null!==n;)pl(e,t,n),n=n.sibling}function pl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ys||Xs(n,t);case 6:var r=ul,o=dl;ul=null,fl(e,t,n),dl=o,null!==(ul=r)&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ul.removeChild(n.stateNode));break;case 18:null!==ul&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),qt(e)):lo(ul,n.stateNode));break;case 4:r=ul,o=dl,ul=n.stateNode.containerInfo,dl=!0,fl(e,t,n),ul=r,dl=o;break;case 0:case 11:case 14:case 15:if(!Ys&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(2&a||4&a)&&el(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Ys&&(Xs(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Ec(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Ys=(r=Ys)||null!==n.memoizedState,fl(e,t,n),Ys=r):fl(e,t,n);break;default:fl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zs),t.forEach((function(t){var r=Cc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:ul=l.stateNode,dl=!1;break e;case 3:case 4:ul=l.stateNode.containerInfo,dl=!0;break e}l=l.return}if(null===ul)throw Error(a(160));pl(i,s,o),ul=null,dl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){Ec(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)gl(t,e),t=t.sibling}function gl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hl(t,e),yl(e),4&r){try{nl(3,e,e.return),rl(3,e)}catch(g){Ec(e,e.return,g)}try{nl(5,e,e.return)}catch(g){Ec(e,e.return,g)}}break;case 1:hl(t,e),yl(e),512&r&&null!==n&&Xs(n,n.return);break;case 5:if(hl(t,e),yl(e),512&r&&null!==n&&Xs(n,n.return),32&e.flags){var o=e.stateNode;try{fe(o,"")}catch(g){Ec(e,e.return,g)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Z(o,i),ve(l,s);var u=ve(l,i);for(s=0;s<c.length;s+=2){var d=c[s],f=c[s+1];"style"===d?ge(o,f):"dangerouslySetInnerHTML"===d?de(o,f):"children"===d?fe(o,f):v(o,d,f,u)}switch(l){case"input":J(o,i);break;case"textarea":ae(o,i);break;case"select":var p=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(o,!!i.multiple,m,!1):p!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[mo]=i}catch(g){Ec(e,e.return,g)}}break;case 6:if(hl(t,e),yl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(g){Ec(e,e.return,g)}}break;case 3:if(hl(t,e),yl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{qt(t.containerInfo)}catch(g){Ec(e,e.return,g)}break;case 4:default:hl(t,e),yl(e);break;case 13:hl(t,e),yl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||(Ul=Ze())),4&r&&ml(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ys=(u=Ys)||d,hl(t,e),Ys=u):hl(t,e),yl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&1&e.mode)for(Js=e,d=e.child;null!==d;){for(f=Js=d;null!==Js;){switch(m=(p=Js).child,p.tag){case 0:case 11:case 14:case 15:nl(4,p,p.return);break;case 1:Xs(p,p.return);var h=p.stateNode;if("function"==typeof h.componentWillUnmount){r=p,n=p.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){Ec(r,n,g)}}break;case 5:Xs(p,p.return);break;case 22:if(null!==p.memoizedState){Sl(f);continue}}null!==m?(m.return=p,Js=m):Sl(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{o=f.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(l=f.stateNode,s=null!=(c=f.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=he("display",s))}catch(g){Ec(e,e.return,g)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=u?"":f.memoizedProps}catch(g){Ec(e,e.return,g)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:hl(t,e),yl(e),4&r&&ml(e);case 21:}}function yl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(il(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(fe(o,""),r.flags&=-33),cl(e,sl(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;ll(e,sl(e),i);break;default:throw Error(a(161))}}catch(s){Ec(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function bl(e,t,n){Js=e,vl(e,t,n)}function vl(e,t,n){for(var r=!!(1&e.mode);null!==Js;){var o=Js,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Qs;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Ys;s=Qs;var c=Ys;if(Qs=i,(Ys=l)&&!c)for(Js=o;null!==Js;)l=(i=Js).child,22===i.tag&&null!==i.memoizedState?kl(o):null!==l?(l.return=i,Js=l):kl(o);for(;null!==a;)Js=a,vl(a,t,n),a=a.sibling;Js=o,Qs=s,Ys=c}wl(e)}else 8772&o.subtreeFlags&&null!==a?(a.return=o,Js=a):wl(e)}}function wl(e){for(;null!==Js;){var t=Js;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Ys||rl(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ys)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ns(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Ha(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ha(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&qt(f)}}}break;default:throw Error(a(163))}Ys||512&t.flags&&ol(t)}catch(p){Ec(t,t.return,p)}}if(t===e){Js=null;break}if(null!==(n=t.sibling)){n.return=t.return,Js=n;break}Js=t.return}}function Sl(e){for(;null!==Js;){var t=Js;if(t===e){Js=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Js=n;break}Js=t.return}}function kl(e){for(;null!==Js;){var t=Js;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rl(4,t)}catch(l){Ec(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){Ec(t,o,l)}}var a=t.return;try{ol(t)}catch(l){Ec(t,a,l)}break;case 5:var i=t.return;try{ol(t)}catch(l){Ec(t,i,l)}}}catch(l){Ec(t,t.return,l)}if(t===e){Js=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Js=s;break}Js=t.return}}var xl,El=Math.ceil,_l=w.ReactCurrentDispatcher,jl=w.ReactCurrentOwner,Ol=w.ReactCurrentBatchConfig,Cl=0,Al=null,Tl=null,Pl=0,Il=0,Rl=_o(0),Nl=0,Dl=null,Ll=0,Ml=0,Fl=0,zl=null,Bl=null,Ul=0,ql=1/0,$l=null,Hl=!1,Vl=null,Gl=null,Wl=!1,Kl=null,Ql=0,Yl=0,Zl=null,Jl=-1,Xl=0;function ec(){return 6&Cl?Ze():-1!==Jl?Jl:Jl=Ze()}function tc(e){return 1&e.mode?2&Cl&&0!==Pl?Pl&-Pl:null!==ga.transition?(0===Xl&&(Xl=ht()),Xl):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Yt(e.type):1}function nc(e,t,n,r){if(50<Yl)throw Yl=0,Zl=null,Error(a(185));yt(e,n,r),2&Cl&&e===Al||(e===Al&&(!(2&Cl)&&(Ml|=n),4===Nl&&sc(e,Pl)),rc(e,r),1===n&&0===Cl&&!(1&t.mode)&&(ql=Ze()+500,Bo&&$o()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),s=1<<i,l=o[i];-1===l?s&n&&!(s&r)||(o[i]=pt(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=ft(e,e===Al?Pl:0);if(0===r)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Bo=!0,qo(e)}(lc.bind(null,e)):qo(lc.bind(null,e)),io((function(){!(6&Cl)&&$o()})),n=null;else{switch(wt(r)){case 1:n=Xe;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Ac(n,oc.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function oc(e,t){if(Jl=-1,Xl=0,6&Cl)throw Error(a(327));var n=e.callbackNode;if(kc()&&e.callbackNode!==n)return null;var r=ft(e,e===Al?Pl:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=gc(e,r);else{t=r;var o=Cl;Cl|=2;var i=mc();for(Al===e&&Pl===t||($l=null,ql=Ze()+500,fc(e,t));;)try{bc();break}catch(l){pc(e,l)}Oa(),_l.current=i,Cl=o,null!==Tl?t=0:(Al=null,Pl=0,t=Nl)}if(0!==t){if(2===t&&(0!==(o=mt(e))&&(r=o,t=ac(e,o))),1===t)throw n=Dl,fc(e,0),sc(e,r),rc(e,Ze()),n;if(6===t)sc(e,r);else{if(o=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!sr(a(),o))return!1}catch(s){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)||(t=gc(e,r),2===t&&(i=mt(e),0!==i&&(r=i,t=ac(e,i))),1!==t)))throw n=Dl,fc(e,0),sc(e,r),rc(e,Ze()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:Sc(e,Bl,$l);break;case 3:if(sc(e,r),(130023424&r)===r&&10<(t=Ul+500-Ze())){if(0!==ft(e,0))break;if(((o=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(Sc.bind(null,e,Bl,$l),t);break}Sc(e,Bl,$l);break;case 4:if(sc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*El(r/1960))-r)){e.timeoutHandle=ro(Sc.bind(null,e,Bl,$l),r);break}Sc(e,Bl,$l);break;default:throw Error(a(329))}}}return rc(e,Ze()),e.callbackNode===n?oc.bind(null,e):null}function ac(e,t){var n=zl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=gc(e,t))&&(t=Bl,Bl=n,null!==t&&ic(t)),e}function ic(e){null===Bl?Bl=e:Bl.push.apply(Bl,e)}function sc(e,t){for(t&=~Fl,t&=~Ml,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function lc(e){if(6&Cl)throw Error(a(327));kc();var t=ft(e,0);if(!(1&t))return rc(e,Ze()),null;var n=gc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=ac(e,r))}if(1===n)throw n=Dl,fc(e,0),sc(e,t),rc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Sc(e,Bl,$l),rc(e,Ze()),null}function cc(e,t){var n=Cl;Cl|=1;try{return e(t)}finally{0===(Cl=n)&&(ql=Ze()+500,Bo&&$o())}}function uc(e){null!==Kl&&0===Kl.tag&&!(6&Cl)&&kc();var t=Cl;Cl|=1;var n=Ol.transition,r=vt;try{if(Ol.transition=null,vt=1,e)return e()}finally{vt=r,Ol.transition=n,!(6&(Cl=t))&&$o()}}function dc(){Il=Rl.current,jo(Rl)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Tl)for(n=Tl.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&No();break;case 3:Za(),jo(To),jo(Ao),ri();break;case 5:Xa(r);break;case 4:Za();break;case 13:case 19:jo(ei);break;case 10:Ca(r.type._context);break;case 22:case 23:dc()}n=n.return}if(Al=e,Tl=e=Rc(e.current,null),Pl=Il=t,Nl=0,Dl=null,Fl=Ml=Ll=0,Bl=zl=null,null!==Ia){for(t=0;t<Ia.length;t++)if(null!==(r=(n=Ia[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ia=null}return e}function pc(e,t){for(;;){var n=Tl;try{if(Oa(),oi.current=Ji,ui){for(var r=si.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ui=!1}if(ii=0,ci=li=si=null,di=!1,fi=0,jl.current=null,null===n||null===n.return){Nl=1,Dl=t,Tl=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Pl,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,f=d.tag;if(!(1&d.mode||0!==f&&11!==f&&15!==f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=gs(s);if(null!==m){m.flags&=-257,ys(m,s,l,0,t),1&m.mode&&hs(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(!(1&t)){hs(i,u,t),hc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var y=gs(s);if(null!==y){!(65536&y.flags)&&(y.flags|=256),ys(y,s,l,0,t),ha(cs(c,l));break e}}i=c=cs(c,l),4!==Nl&&(Nl=2),null===zl?zl=[i]:zl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,qa(i,ps(0,c,t));break e;case 1:l=c;var b=i.type,v=i.stateNode;if(!(128&i.flags||"function"!=typeof b.getDerivedStateFromError&&(null===v||"function"!=typeof v.componentDidCatch||null!==Gl&&Gl.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,qa(i,ms(i,l,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,Tl===n&&null!==n&&(Tl=n=n.return);continue}break}}function mc(){var e=_l.current;return _l.current=Ji,null===e?Ji:e}function hc(){0!==Nl&&3!==Nl&&2!==Nl||(Nl=4),null===Al||!(268435455&Ll)&&!(268435455&Ml)||sc(Al,Pl)}function gc(e,t){var n=Cl;Cl|=2;var r=mc();for(Al===e&&Pl===t||($l=null,fc(e,t));;)try{yc();break}catch(o){pc(e,o)}if(Oa(),Cl=n,_l.current=r,null!==Tl)throw Error(a(261));return Al=null,Pl=0,Nl}function yc(){for(;null!==Tl;)vc(Tl)}function bc(){for(;null!==Tl&&!Qe();)vc(Tl)}function vc(e){var t=xl(e.alternate,e,Il);e.memoizedProps=e.pendingProps,null===t?wc(e):Tl=t,jl.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ks(n,t)))return n.flags&=32767,void(Tl=n);if(null===e)return Nl=6,void(Tl=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Ws(n,t,Il)))return void(Tl=n);if(null!==(t=t.sibling))return void(Tl=t);Tl=t=e}while(null!==t);0===Nl&&(Nl=5)}function Sc(e,t,n){var r=vt,o=Ol.transition;try{Ol.transition=null,vt=1,function(e,t,n,r){do{kc()}while(null!==Kl);if(6&Cl)throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===Al&&(Tl=Al=null,Pl=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Wl||(Wl=!0,Ac(tt,(function(){return kc(),null}))),i=!!(15990&n.flags),!!(15990&n.subtreeFlags)||i){i=Ol.transition,Ol.transition=null;var s=vt;vt=1;var l=Cl;Cl|=4,jl.current=null,function(e,t){if(eo=Ht,pr(e=fr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(S){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,f=e,p=null;t:for(;;){for(var m;f!==n||0!==o&&3!==f.nodeType||(l=s+o),f!==i||0!==r&&3!==f.nodeType||(c=s+r),3===f.nodeType&&(s+=f.nodeValue.length),null!==(m=f.firstChild);)p=f,f=m;for(;;){if(f===e)break t;if(p===n&&++u===o&&(l=s),p===i&&++d===r&&(c=s),null!==(m=f.nextSibling))break;p=(f=p).parentNode}f=m}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Js=t;null!==Js;)if(e=(t=Js).child,1028&t.subtreeFlags&&null!==e)e.return=t,Js=e;else for(;null!==Js;){t=Js;try{var h=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,y=h.memoizedState,b=t.stateNode,v=b.getSnapshotBeforeUpdate(t.elementType===t.type?g:ns(t.type,g),y);b.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(a(163))}}catch(S){Ec(t,t.return,S)}if(null!==(e=t.sibling)){e.return=t.return,Js=e;break}Js=t.return}h=tl,tl=!1}(e,n),gl(n,e),mr(to),Ht=!!eo,to=eo=null,e.current=n,bl(n,e,o),Ye(),Cl=l,vt=s,Ol.transition=i}else e.current=n;if(Wl&&(Wl=!1,Kl=e,Ql=o),i=e.pendingLanes,0===i&&(Gl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,!(128&~e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Hl)throw Hl=!1,e=Vl,Vl=null,e;!!(1&Ql)&&0!==e.tag&&kc(),i=e.pendingLanes,1&i?e===Zl?Yl++:(Yl=0,Zl=e):Yl=0,$o()}(e,t,n,r)}finally{Ol.transition=o,vt=r}return null}function kc(){if(null!==Kl){var e=wt(Ql),t=Ol.transition,n=vt;try{if(Ol.transition=null,vt=16>e?16:e,null===Kl)var r=!1;else{if(e=Kl,Kl=null,Ql=0,6&Cl)throw Error(a(331));var o=Cl;for(Cl|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(16&Js.flags){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Js=u;null!==Js;){var d=Js;switch(d.tag){case 0:case 11:case 15:nl(8,d,i)}var f=d.child;if(null!==f)f.return=d,Js=f;else for(;null!==Js;){var p=(d=Js).sibling,m=d.return;if(al(d),d===u){Js=null;break}if(null!==p){p.return=m,Js=p;break}Js=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var y=g.sibling;g.sibling=null,g=y}while(null!==g)}}Js=i}}if(2064&i.subtreeFlags&&null!==s)s.return=i,Js=s;else e:for(;null!==Js;){if(2048&(i=Js).flags)switch(i.tag){case 0:case 11:case 15:nl(9,i,i.return)}var b=i.sibling;if(null!==b){b.return=i.return,Js=b;break e}Js=i.return}}var v=e.current;for(Js=v;null!==Js;){var w=(s=Js).child;if(2064&s.subtreeFlags&&null!==w)w.return=s,Js=w;else e:for(s=v;null!==Js;){if(2048&(l=Js).flags)try{switch(l.tag){case 0:case 11:case 15:rl(9,l)}}catch(k){Ec(l,l.return,k)}if(l===s){Js=null;break e}var S=l.sibling;if(null!==S){S.return=l.return,Js=S;break e}Js=l.return}}if(Cl=o,$o(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(k){}r=!0}return r}finally{vt=n,Ol.transition=t}}return!1}function xc(e,t,n){e=Ba(e,t=ps(0,t=cs(n,t),1),1),t=ec(),null!==e&&(yt(e,1,t),rc(e,t))}function Ec(e,t,n){if(3===e.tag)xc(e,e,n);else for(;null!==t;){if(3===t.tag){xc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Gl||!Gl.has(r))){t=Ba(t,e=ms(t,e=cs(n,e),1),1),e=ec(),null!==t&&(yt(t,1,e),rc(t,e));break}}t=t.return}}function _c(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,Al===e&&(Pl&n)===n&&(4===Nl||3===Nl&&(130023424&Pl)===Pl&&500>Ze()-Ul?fc(e,0):Fl|=n),rc(e,t)}function jc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Da(e,t))&&(yt(e,t,n),rc(e,n))}function Oc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),jc(e,n)}function Cc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),jc(e,n)}function Ac(e,t){return We(e,t)}function Tc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pc(e,t,n,r){return new Tc(e,t,n,r)}function Ic(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Rc(e,t){var n=e.alternate;return null===n?((n=Pc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Nc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Ic(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case x:return Dc(n.children,o,i,t);case E:s=8,o|=8;break;case _:return(e=Pc(12,n,t,2|o)).elementType=_,e.lanes=i,e;case A:return(e=Pc(13,n,t,o)).elementType=A,e.lanes=i,e;case T:return(e=Pc(19,n,t,o)).elementType=T,e.lanes=i,e;case R:return Lc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case j:s=10;break e;case O:s=9;break e;case C:s=11;break e;case P:s=14;break e;case I:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Pc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Pc(7,e,r,t)).lanes=n,e}function Lc(e,t,n,r){return(e=Pc(22,e,r,t)).elementType=R,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Pc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Pc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Bc(e,t,n,r,o,a,i,s,l){return e=new zc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Pc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ma(a),e}function Uc(e){if(!e)return Co;e:{if(qe(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Ro(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Ro(n))return Lo(e,n,t)}return t}function qc(e,t,n,r,o,a,i,s,l){return(e=Bc(n,r,!0,e,0,a,0,s,l)).context=Uc(null),n=e.current,(a=za(r=ec(),o=tc(n))).callback=null!=t?t:null,Ba(n,a,o),e.current.lanes=o,yt(e,o,r),rc(e,r),e}function $c(e,t,n,r){var o=t.current,a=ec(),i=tc(o);return n=Uc(n),null===t.context?t.context=n:t.pendingContext=n,(t=za(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ba(o,t,i))&&(nc(e,o,i,a),Ua(e,o,i)),i}function Hc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Vc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Gc(e,t){Vc(e,t),(e=e.alternate)&&Vc(e,t)}xl=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||To.current)vs=!0;else{if(!(e.lanes&n||128&t.flags))return vs=!1,function(e,t,n){switch(t.tag){case 3:As(t),ma();break;case 5:Ja(t);break;case 1:Ro(t.type)&&Mo(t);break;case 4:Ya(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;Oo(xa,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Oo(ei,1&ei.current),t.flags|=128,null):n&t.child.childLanes?Ms(e,t,n):(Oo(ei,1&ei.current),null!==(e=Hs(e,t,n))?e.sibling:null);Oo(ei,1&ei.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return qs(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),Oo(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,Es(e,t,n)}return Hs(e,t,n)}(e,t,n);vs=!!(131072&e.flags)}else vs=!1,aa&&1048576&t.flags&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$s(e,t),e=t.pendingProps;var o=Io(t,Ao.current);Ta(t,n),o=gi(null,t,r,e,o,n);var i=yi();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ro(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ma(t),o.updater=os,t.stateNode=o,o._reactInternals=t,ls(t,r,e,n),t=Cs(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),ws(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch($s(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Ic(e)?1:0;if(null!=e){if((e=e.$$typeof)===C)return 11;if(e===P)return 14}return 2}(r),e=ns(r,e),o){case 0:t=js(null,t,r,e,n);break e;case 1:t=Os(null,t,r,e,n);break e;case 11:t=Ss(null,t,r,e,n);break e;case 14:t=ks(null,t,r,ns(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,js(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 1:return r=t.type,o=t.pendingProps,Os(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 3:e:{if(As(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Fa(e,t),$a(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ts(e,t,r,n,o=cs(Error(a(423)),t));break e}if(r!==o){t=Ts(e,t,r,n,o=cs(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=ka(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ma(),r===o){t=Hs(e,t,n);break e}ws(e,t,r,n)}t=t.child}return t;case 5:return Ja(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),_s(e,t),ws(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Ms(e,t,n);case 4:return Ya(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Sa(t,null,r,n):ws(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ss(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 7:return ws(e,t,t.pendingProps,n),t.child;case 8:case 12:return ws(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,Oo(xa,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!To.current){t=Hs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=za(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),Aa(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),Aa(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}ws(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ta(t,n),r=r(o=Pa(o)),t.flags|=1,ws(e,t,r,n),t.child;case 14:return o=ns(r=t.type,t.pendingProps),ks(e,t,r,o=ns(r.type,o),n);case 15:return xs(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ns(r,o),$s(e,t),t.tag=1,Ro(r)?(e=!0,Mo(t)):e=!1,Ta(t,n),is(t,r,o),ls(t,r,o,n),Cs(null,t,r,!0,e,n);case 19:return qs(e,t,n);case 22:return Es(e,t,n)}throw Error(a(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Kc(e){this._internalRoot=e}function Qc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function Xc(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Hc(i);s.call(e)}}$c(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Hc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[ho]=i.current,qr(8===e.nodeType?e.parentNode:e),uc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Hc(l);s.call(e)}}var l=Bc(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=l,e[ho]=l.current,qr(8===e.nodeType?e.parentNode:e),uc((function(){$c(t,l,n,r)})),l}(n,t,e,o,r);return Hc(i)}Qc.prototype.render=Kc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));$c(e,t,null,null)},Qc.prototype.unmount=Kc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uc((function(){$c(null,e,null,null)})),t[ho]=null}},Qc.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Rt.length&&0!==t&&t<Rt[n].priority;n++);Rt.splice(n,0,e),0===n&&Mt(e)}},St=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(bt(t,1|n),rc(t,Ze()),!(6&Cl)&&(ql=Ze()+500,$o()))}break;case 13:uc((function(){var t=Da(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Gc(e,1)}},kt=function(e){if(13===e.tag){var t=Da(e,134217728);if(null!==t)nc(t,e,134217728,ec());Gc(e,134217728)}},xt=function(e){if(13===e.tag){var t=tc(e),n=Da(e,t);if(null!==n)nc(n,e,t,ec());Gc(e,t)}},Et=function(){return vt},_t=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},ke=function(e,t,n){switch(t){case"input":if(J(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=ko(r);if(!o)throw Error(a(90));W(r),J(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ce=cc,Ae=uc;var eu={usingClientEntryPoint:!1,Events:[wo,So,ko,je,Oe,cc]},tu={findFiberByHostInstance:vo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ve(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{ot=ru.inject(nu),at=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(a(299));var n=!1,r="",o=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Bc(e,1,!1,null,0,n,0,r,o),e[ho]=t.current,qr(8===e.nodeType?e.parentNode:e),new Kc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ve(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(a(200));return Xc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,s),e[ho]=t.current,qr(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Qc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(a(200));return Xc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(a(40));return!!e._reactRootContainer&&(uc((function(){Xc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return Xc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>X,vd:()=>V});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),s=n.n(i),l=n(311),c=n.n(l),u=n(2833),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},y={rel:["amphtml","canonical","alternate"]},b={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),S={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(S).reduce((function(e,t){return e[S[t]]=t,e}),{}),x=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=x(e,g.TITLE),n=x(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=x(e,"defaultTitle");return t||r||void 0},_=function(e){return x(e,"onChangeClientState")||function(){}},j=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},O=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},C=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var s=a[i],l=f({},r[s],o[s]);r[s]=l}return e}),[]).reverse()},A=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},T=function(e){return Array.isArray(e)?e.join(""):e},P=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},I=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[g.NOSCRIPT,g.SCRIPT,g.STYLE],N=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},L=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[S[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=S[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=L(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=T(t);return o?"<"+e+' data-rh="true" '+o+">"+N(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+N(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return L(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+N(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=P(e.metaTags,v),a=P(t,y),i=P(n,b);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,o.priority),M(g.LINK,a.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);p=m.priorityMethods,u=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,f,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:l,titleAttributes:c},r)}},B=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},q=r.createContext({}),$=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(q.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);V.canUseDOM=H,V.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=T(e)),W(g.TITLE,t)}(u,d);var f={baseTag:G(g.BASE,n),linkTags:G(g.LINK,o),metaTags:G(g.META,a),noscriptTags:G(g.NOSCRIPT,i),scriptTags:G(g.SCRIPT,l),styleTags:G(g.STYLE,c)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),s(e,p,m)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:O(["href"],e),bodyAttributes:j("bodyAttributes",e),defer:x(e,"defer"),encode:x(e,"encodeSpecialCharacters"),htmlAttributes:j("htmlAttributes",e),linkTags:C(g.LINK,["rel","href"],e),metaTags:C(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:C(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:C(g.SCRIPT,["src","innerHTML"],e),styleTags:C(g.STYLE,["cssText"],e),title:E(e),titleAttributes:j("titleAttributes",e),prioritizeSeoTags:A(e,"prioritizeSeoTags")});V.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){K(t,(function(){Q=null}))})):(K(t),Q=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:$.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],J=["children"],X=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(I(this.props,"helmetData"),I(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},o,((t={})[r.type]=i,t.titleAttributes=f({},a),t));case g.BODY:return f({},o,{bodyAttributes:f({},a)});case g.HTML:return f({},o,{htmlAttributes:f({},a)});default:return f({},o,((n={})[r.type]=f({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=h(r,Z),s=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,J),o=f({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(Y,f({},o,{context:a.value,helmetData:void 0})):r.createElement(q.Consumer,null,(function(e){return r.createElement(Y,f({},o,{context:e}))}))},t}(r.Component);X.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},X.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},X.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,y=n?Symbol.for("react.block"):60121,b=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function S(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case g:case h:case l:return e;default:return t}}case o:return t}}}function k(e){return S(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=f,t.Fragment=a,t.Lazy=g,t.Memo=h,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||S(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return S(e)===c},t.isContextProvider=function(e){return S(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return S(e)===f},t.isFragment=function(e){return S(e)===a},t.isLazy=function(e){return S(e)===g},t.isMemo=function(e){return S(e)===h},t.isPortal=function(e){return S(e)===o},t.isProfiler=function(e){return S(e)===s},t.isStrictMode=function(e){return S(e)===i},t.isSuspense=function(e){return S(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===f||e.$$typeof===b||e.$$typeof===v||e.$$typeof===w||e.$$typeof===y)},t.typeOf=S},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(6540),l=[],c=[];var u=s.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return l.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),f=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextType",u),f}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return s.createElement(u.Provider,{value:{report:this.props.report}},s.Children.only(this.props.children))},t}(s.Component);function y(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return y(e)}))}h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){y(l).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){y(c).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>s});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>y,k2:()=>w});var r=n(6347),o=n(2892),a=n(6540),i=n(9231),s=n(8168),l=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},m=function(e){return e},h=a.forwardRef;void 0===h&&(h=m);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.A)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=m!==h&&t||n,a.createElement("a",u)}));var y=h((function(e,t){var n=e.component,o=void 0===n?g:n,u=e.replace,d=e.to,y=e.innerRef,b=(0,l.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=p(f(d,e.location),e.location),l=r?n.createHref(r):"",g=(0,s.A)({},b,{href:l,navigate:function(){var t=f(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||y:g.innerRef=y,a.createElement(o,g)}))})),b=function(e){return e},v=a.forwardRef;void 0===v&&(v=b);var w=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,w=e.location,S=e.sensitive,k=e.strict,x=e.style,E=e.to,_=e.innerRef,j=(0,l.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=p(f(E,n),n),l=i.pathname,O=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),C=O?(0,r.B6)(n.pathname,{path:O,exact:h,sensitive:S,strict:k}):null,A=!!(g?g(C,n):C),T="function"==typeof m?m(A):m,P="function"==typeof x?x(A):x;A&&(T=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(T,u),P=(0,s.A)({},P,d));var I=(0,s.A)({"aria-current":A&&o||null,className:T,style:P,to:i},j);return b!==v?I.ref=t||_:I.innerRef=_,a.createElement(y,I)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>A,Ix:()=>v,W6:()=>F,XZ:()=>b,dO:()=>L,qh:()=>T,rd:()=>_,zy:()=>z});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(9231),l=n(1561),c=n(8168),u=n(5302),d=n.n(u),f=(n(4363),n(8587)),p=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},o.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},y=g("Router-History"),b=g("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(b.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(y.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}(0,r.A)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(o.Component);var S={},k=1e4,x=0;function E(e,t){return void 0===e&&(e="/"),void 0===t&&(t={}),"/"===e?e:function(e){if(S[e])return S[e];var t=d().compile(e);return x<k&&(S[e]=t,x++),t}(e)(t,{pretty:!0})}function _(e){var t=e.computedMatch,n=e.to,r=e.push,a=void 0!==r&&r;return o.createElement(b.Consumer,null,(function(e){e||(0,l.A)(!1);var r=e.history,i=e.staticContext,u=a?r.push:r.replace,d=(0,s.yJ)(t?"string"==typeof n?E(n,t.params):(0,c.A)({},n,{pathname:E(n.pathname,t.params)}):n);return i?(u(d),null):o.createElement(w,{onMount:function(){u(d)},onUpdate:function(e,t){var n=(0,s.yJ)(t.to);(0,s.Fu)(n,(0,c.A)({},d,{key:n.key}))||u(d)},to:n})}))}var j={},O=1e4,C=0;function A(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=j[n]||(j[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return C<O&&(r[e]=a,C++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],f=l.slice(1),p=e===u;return a&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var T=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(b.Consumer,null,(function(t){t||(0,l.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?A(n.pathname,e.props):t.match,a=(0,c.A)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(b.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function P(e){return"/"===e.charAt(0)?e:"/"+e}function I(e,t){if(!e)return t;var n=P(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function R(e){return"string"==typeof e?e:(0,s.AO)(e)}function N(e){return function(){(0,l.A)(!1)}}function D(){}o.Component;var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(b.Consumer,null,(function(t){t||(0,l.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?A(a.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var M=o.useContext;function F(){return M(y)}function z(){return M(b).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=y.prototype;var w=v.prototype=new b;w.constructor=v,h(w,y.prototype),w.isPureReactComponent=!0;var S=Array.isArray,k=Object.prototype.hasOwnProperty,x={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:x.current}}function j(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var O=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function A(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+C(l,0):a,S(i)?(o="",null!=e&&(o=e.replace(O,"$&/")+"/"),A(i,t,o,"",(function(e){return e}))):null!=i&&(j(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(O,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",S(e))for(var c=0;c<e.length;c++){var u=a+C(s=e[c],c);l+=A(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=A(s=s.value,t,o,u=a+C(s,c++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function T(e,t,n){if(null==e)return e;var r=[],o=0;return A(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function P(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var I={current:null},R={transition:null},N={ReactCurrentDispatcher:I,ReactCurrentBatchConfig:R,ReactCurrentOwner:x};function D(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:T,forEach:function(e,t,n){T(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return T(e,(function(){t++})),t},toArray:function(e){return T(e,(function(e){return e}))||[]},only:function(e){if(!j(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=i,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.act=D,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=h({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=x.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)k.call(t,c)&&!E.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=j,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=R.transition;R.transition={};try{e()}finally{R.transition=t}},t.unstable_act=D,t.useCallback=function(e,t){return I.current.useCallback(e,t)},t.useContext=function(e){return I.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return I.current.useDeferredValue(e)},t.useEffect=function(e,t){return I.current.useEffect(e,t)},t.useId=function(){return I.current.useId()},t.useImperativeHandle=function(e,t,n){return I.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return I.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return I.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return I.current.useMemo(e,t)},t.useReducer=function(e,t,n){return I.current.useReducer(e,t,n)},t.useRef=function(e){return I.current.useRef(e)},t.useState=function(e){return I.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return I.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return I.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,p=3,m=!1,h=!1,g=!1,y="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function S(e){if(g=!1,w(e),!h)if(null!==r(c))h=!0,R(k);else{var t=r(u);null!==t&&N(S,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,b(j),j=-1),m=!0;var a=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!A());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var s=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?f.callback=s:f===r(c)&&o(c),w(n)}else o(c);f=r(c)}if(null!==f)var l=!0;else{var d=r(u);null!==d&&N(S,d.startTime-n),l=!1}return l}finally{f=null,p=a,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var x,E=!1,_=null,j=-1,O=5,C=-1;function A(){return!(t.unstable_now()-C<O)}function T(){if(null!==_){var e=t.unstable_now();C=e;var n=!0;try{n=_(!0,e)}finally{n?x():(E=!1,_=null)}}else E=!1}if("function"==typeof v)x=function(){v(T)};else if("undefined"!=typeof MessageChannel){var P=new MessageChannel,I=P.port2;P.port1.onmessage=T,x=function(){I.postMessage(null)}}else x=function(){y(T,0)};function R(e){_=e,E||(E=!0,x())}function N(e,n){j=y((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,R(k))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):O=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(b(j),j=-1):g=!0,N(S,a-i))):(e.sortIndex=s,n(c,e),h||m||(h=!0,R(k))),e},t.unstable_shouldYield=A,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"zrok",staticDirectories:["static","../docs/images","../docker/compose","../etc/caddy"],tagline:"Globally distributed reverse proxy",url:"https://docs.zrok.io",baseUrl:"/",trailingSlash:!0,onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/space-ziggy.png",organizationName:"NetFoundry",projectName:"zrok",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/docs/guides/self-hosting/linux",from:["/docs/guides/self-hosting/self_hosting_guide"]},{to:"/docs/guides/self-hosting/linux/nginx",from:["/docs/guides/self-hosting/nginx_tls_guide/"]},{to:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",from:["/docs/guides/metrics-and-limits/configuring-limits"]},{to:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",from:["/docs/guides/metrics-and-limits/configuring-metrics"]}]}],null],presets:[["classic",{docs:{sidebarPath:"/home/runner/work/zrok/zrok/website/sidebars.js",editUrl:"https://github.com/openziti/zrok/blob/main/docs",path:"../docs",include:["**/*.md","**/*.mdx"],lastVersion:"current",versions:{current:{label:"1.0"}}},theme:{customCss:"/home/runner/work/zrok/zrok/website/src/css/custom.css"},pages:{path:"./src/pages"},googleTagManager:{containerId:"GTM-MDFLZPK8"},sitemap:{}}]],themeConfig:{navbar:{title:"zrok",logo:{alt:"Ziggy Goes to Space",src:"img/space-ziggy.png",href:"https://zrok.io",target:"_self"},items:[{type:"docsVersionDropdown",position:"left",dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://zrok.io/pricing/",position:"right",label:"pricing"},{href:"https://myzrok.io/",position:"right",label:"account"},{href:"https://github.com/orgs/openziti/projects/16",label:"roadmap",position:"right"},{href:"https://github.com/openziti/zrok",position:"right",className:"header-github-link",title:"GitHub"},{href:"https://openziti.discourse.group/",position:"right",className:"header-discourse-link",title:"Discourse"}],hideOnScroll:!1},footer:{style:"dark",links:[],copyright:"Copyright \xa9 2025 NetFoundry Inc. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"dark",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{sidebar:{autoCollapseCategories:!0,hideable:!1},versionPersistence:"localStorage"},algolia:{appId:"CO73R59OLO",apiKey:"489572e91d0a750d34c127c2071ef962",indexName:"zrok",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},8215:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},4876:(e,t,n)=>{"use strict";n.d(t,{My:()=>S,f4:()=>Y});var r,o,a=n(6540),i=n(8215),s=Object.create,l=Object.defineProperty,c=Object.defineProperties,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyDescriptors,f=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=Object.prototype.propertyIsEnumerable,y=(e,t,n)=>t in e?l(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,b=(e,t)=>{for(var n in t||(t={}))h.call(t,n)&&y(e,n,t[n]);if(p)for(var n of p(t))g.call(t,n)&&y(e,n,t[n]);return e},v=(e,t)=>c(e,d(t)),w=(e,t)=>{var n={};for(var r in e)h.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&p)for(var r of p(e))t.indexOf(r)<0&&g.call(e,r)&&(n[r]=e[r]);return n},S=((e,t,n)=>(n=null!=e?s(m(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of f(t))h.call(e,o)||o===n||l(e,o,{get:()=>t[o],enumerable:!(r=u(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:l(n,"default",{value:e,enumerable:!0}),e)))((r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new s;return l(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,s,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var h=p[m],g=h.inside,y=!!h.lookbehind,b=!!h.greedy,v=h.alias;if(b&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var S=h.pattern||h,k=s.next,x=u;k!==t.tail&&!(d&&x>=d.reach);x+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var _,j=1;if(b){if(!(_=a(S,x,e,y))||_.index>=e.length)break;var O=_.index,C=_.index+_[0].length,A=x;for(A+=k.value.length;O>=A;)A+=(k=k.next).value.length;if(x=A-=k.value.length,k.value instanceof o)continue;for(var T=k;T!==t.tail&&(A<C||"string"==typeof T.value);T=T.next)j++,A+=T.value.length;j--,E=e.slice(x,A),_.index-=x}else if(!(_=a(S,0,E,y)))continue;O=_.index;var P=_[0],I=E.slice(0,O),R=E.slice(O+P.length),N=x+E.length;d&&N>d.reach&&(d.reach=N);var D=k.prev;if(I&&(D=l(t,D,I),x+=I.length),c(t,D,j),k=l(t,D,new o(f,g?r.tokenize(P,g):P,v,P)),R&&l(t,k,R),j>1){var L={cause:f+","+m,reach:N};i(e,t,n,k.prev,x,L),d&&L.reach>d.reach&&(d.reach=L.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[f(r)[0]])((o={exports:{}}).exports,o),o.exports})());S.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},S.languages.markup.tag.inside["attr-value"].inside.entity=S.languages.markup.entity,S.languages.markup.doctype.inside["internal-subset"].inside=S.languages.markup,S.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(S.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:S.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:S.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},S.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(S.languages.markup.tag,"addAttribute",{value:function(e,t){S.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:S.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),S.languages.html=S.languages.markup,S.languages.mathml=S.languages.markup,S.languages.svg=S.languages.markup,S.languages.xml=S.languages.extend("markup",{}),S.languages.ssml=S.languages.xml,S.languages.atom=S.languages.xml,S.languages.rss=S.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(S),S.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},S.languages.javascript=S.languages.extend("clike",{"class-name":[S.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),S.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,S.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:S.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:S.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:S.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:S.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:S.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),S.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:S.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),S.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),S.languages.markup&&(S.languages.markup.tag.addInlined("script","javascript"),S.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),S.languages.js=S.languages.javascript,S.languages.actionscript=S.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),S.languages.actionscript["class-name"].alias="function",delete S.languages.actionscript.parameter,delete S.languages.actionscript["literal-property"],S.languages.markup&&S.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:S.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(S),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(S),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(S),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(S),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(S),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n)):s[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(S),S.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:S.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},S.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=f(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),0<o.length)){var s=f(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&0<=o.indexOf(c.content)&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function f(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&0==--o)return a}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),S.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,l,f,p,m,h,g,y=n[a];"string"==typeof y||"string"==typeof y.content?(i=d[c],-1!==(g=(h="string"==typeof y?y:y.content).indexOf(i))&&(++c,l=h.substring(0,g),m=u[i],f=void 0,(p={})["interpolation-punctuation"]=o,3===(p=e.tokenize(m,p)).length&&((f=[1,1]).push.apply(f,s(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,m),p=h.substring(g+i.length),m=[],l&&m.push(l),m.push(f),p&&(t(h=[p]),m.push.apply(m,h)),"string"==typeof y?(n.splice.apply(n,[a,1].concat(m)),a+=m.length-1):y.content=m)):(g=y.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,s,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(S),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(S),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(S),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(S),S.languages.n4js=S.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),S.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),S.languages.n4jsd=S.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(S),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(S),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(S),S.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},S.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=S.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(S),S.languages.c=S.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),S.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),S.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},S.languages.c.string],char:S.languages.c.char,comment:S.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:S.languages.c}}}}),S.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete S.languages.c.boolean,S.languages.objectivec=S.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete S.languages.objectivec["class-name"],S.languages.objc=S.languages.objectivec,S.languages.reason=S.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),S.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete S.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(S),S.languages.go=S.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),S.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete S.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(S),S.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},S.languages.python["string-interpolation"].inside.interpolation.inside.rest=S.languages.python,S.languages.py=S.languages.python,S.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},S.languages.webmanifest=S.languages.json;((e,t)=>{for(var n in t)l(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>k,duotoneDark:()=>x,duotoneLight:()=>E,github:()=>_,gruvboxMaterialDark:()=>q,gruvboxMaterialLight:()=>$,jettwaveDark:()=>F,jettwaveLight:()=>z,nightOwl:()=>j,nightOwlLight:()=>O,oceanicNext:()=>T,okaidia:()=>P,oneDark:()=>B,oneLight:()=>U,palenight:()=>I,shadesOfPurple:()=>R,synthwave84:()=>N,ultramin:()=>D,vsDark:()=>L,vsLight:()=>M});var k={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},x={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},E={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},_={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},j={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},O={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},C="#c5a5c5",A="#8dc891",T={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:C}},{types:["attr-value"],style:{color:A}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:A}},{types:["punctuation"],style:{color:A}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:C}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},P={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},I={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},R={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},N={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},D={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},L={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},M={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},F={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},z={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},B={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},U={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},q={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},$={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},H=/\r\n|\r|\n/,V=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},G=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},W=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=G(c,u.type),u.alias&&(c=G(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(H),f=d.length;s.push({types:c,content:d[0]});for(let t=1;t<f;t++)V(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return V(s),l},K=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=b(b({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=v(b({},n),{backgroundColor:void 0}),r},Q=({children:e,language:t,code:n,theme:r,prism:o})=>{const s=t.toLowerCase(),l=K(r,s),c=(e=>(0,a.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,s=w(n,["className","style","line"]);const l=v(b({},s),{className:(0,i.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=b(b({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,a.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,a.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,s=w(n,["token","className","style"]);const l=v(b({},s),{className:(0,i.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=b(b({},l.style||{}),a)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:r})=>(0,a.useMemo)((()=>{if(null==n)return W([t]);const o={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",o),W(o.tokens)}),[t,n,r,e]))({prism:o,language:s,code:n,grammar:o.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},Y=e=>(0,a.createElement)(Q,v(b({},e),{prism:e.prism||S,theme:e.theme||L,code:e.code,language:e.language}))},5066:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},1635:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>N,__assign:()=>a,__asyncDelegator:()=>_,__asyncGenerator:()=>E,__asyncValues:()=>j,__await:()=>x,__awaiter:()=>m,__classPrivateFieldGet:()=>P,__classPrivateFieldIn:()=>R,__classPrivateFieldSet:()=>I,__createBinding:()=>g,__decorate:()=>s,__disposeResources:()=>L,__esDecorate:()=>c,__exportStar:()=>y,__extends:()=>o,__generator:()=>h,__importDefault:()=>T,__importStar:()=>A,__makeTemplateObject:()=>O,__metadata:()=>p,__param:()=>l,__propKey:()=>d,__read:()=>v,__rest:()=>i,__runInitializers:()=>u,__setFunctionName:()=>f,__spread:()=>w,__spreadArray:()=>k,__spreadArrays:()=>S,__values:()=>b,default:()=>M});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function s(e,t,n,r){var o,a=arguments.length,i=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(t,n,i):o(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i}function l(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,o,a){function i(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var s,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var m={};for(var h in r)m[h]="access"===h?{}:r[h];for(var h in r.access)m.access[h]=r.access[h];m.addInitializer=function(e){if(f)throw new TypeError("Cannot add initializers after decoration has completed");a.push(i(e||null))};var g=(0,n[p])("accessor"===l?{get:d.get,set:d.set}:d[c],m);if("accessor"===l){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw new TypeError("Object expected");(s=i(g.get))&&(d.get=s),(s=i(g.set))&&(d.set=s),(s=i(g.init))&&o.unshift(s)}else(s=i(g))&&("field"===l?o.unshift(s):d[c]=s)}u&&Object.defineProperty(u,r.name,d),f=!0}function u(e,t,n){for(var r=arguments.length>2,o=0;o<t.length;o++)n=r?t[o].call(e,n):t[o].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function f(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{l(r.next(e))}catch(t){a(t)}}function s(e){try{l(r.throw(e))}catch(t){a(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}l((r=r.apply(e,t||[])).next())}))}function h(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(l){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(l){s=[6,l],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,l])}}}var g=Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function y(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||g(t,e,n)}function b(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(s){o={error:s}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i}function w(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function S(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var a=arguments[t],i=0,s=a.length;i<s;i++,o++)r[o]=a[i];return r}function k(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function x(e){return this instanceof x?(this.v=e,this):new x(e)}function E(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),a=[];return r={},i("next"),i("throw"),i("return"),r[Symbol.asyncIterator]=function(){return this},r;function i(e){o[e]&&(r[e]=function(t){return new Promise((function(n,r){a.push([e,t,n,r])>1||s(e,t)}))})}function s(e,t){try{(n=o[e](t)).value instanceof x?Promise.resolve(n.value.v).then(l,c):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function l(e){s("next",e)}function c(e){s("throw",e)}function u(e,t){e(t),a.shift(),a.length&&s(a[0][0],a[0][1])}}function _(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:x(e[r](t)),done:!1}:o?o(t):t}:o}}function j(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=b(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}}function O(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function A(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&g(t,e,n);return C(t,e),t}function T(e){return e&&e.__esModule?e:{default:e}}function P(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function I(e,t,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(e,n):o?o.value=n:t.set(e,n),n}function R(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function N(e,t,n){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var r;if(n){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose]}if("function"!=typeof r)throw new TypeError("Object not disposable.");e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var D="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=new Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function L(e){function t(t){e.error=e.hasError?new D(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}return function n(){for(;e.stack.length;){var r=e.stack.pop();try{var o=r.dispose&&r.dispose.call(r.value);if(r.async)return Promise.resolve(o).then(n,(function(e){return t(e),n()}))}catch(a){t(a)}}if(e.hasError)throw e.error}()}const M={__extends:o,__assign:a,__rest:i,__decorate:s,__param:l,__metadata:p,__awaiter:m,__generator:h,__createBinding:g,__exportStar:y,__values:b,__read:v,__spread:w,__spreadArrays:S,__spreadArray:k,__await:x,__asyncGenerator:E,__asyncDelegator:_,__asyncValues:j,__makeTemplateObject:O,__importStar:A,__importDefault:T,__classPrivateFieldGet:P,__classPrivateFieldSet:I,__classPrivateFieldIn:R,__addDisposableResource:N,__disposeResources:L}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search/-21e":{"__comp":"1a4e3797","__context":{"plugin":"c141421f"}},"/docs/-f20":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs/0.4/-81e":{"__comp":"a7bd4aaa","__props":"6ad1709d"},"/docs/0.4/-33b":{"__comp":"a94703ab"},"/docs/0.4/category/guides/-038":{"__comp":"14eb3368","__props":"e3e0bfdc"},"/docs/0.4/category/metrics-and-limits/-011":{"__comp":"14eb3368","__props":"28f20845"},"/docs/0.4/category/myzrok/-66c":{"__comp":"14eb3368","__props":"d087459a"},"/docs/0.4/category/oauth/-491":{"__comp":"14eb3368","__props":"80941509"},"/docs/0.4/category/self-hosting/-eab":{"__comp":"14eb3368","__props":"1f91e8db"},"/docs/0.4/concepts/-5db":{"__comp":"17896441","content":"7d0a541a"},"/docs/0.4/concepts/files/-c0e":{"__comp":"17896441","content":"6a6a5bbc"},"/docs/0.4/concepts/hosting/-ea5":{"__comp":"17896441","content":"bf372175"},"/docs/0.4/concepts/http/-d50":{"__comp":"17896441","content":"1dd31738"},"/docs/0.4/concepts/opensource/-050":{"__comp":"17896441","content":"61ea36d9"},"/docs/0.4/concepts/sharing-private/-ab6":{"__comp":"17896441","content":"ce04f2ae"},"/docs/0.4/concepts/sharing-public/-361":{"__comp":"17896441","content":"35a60099"},"/docs/0.4/concepts/sharing-reserved/-4c8":{"__comp":"17896441","content":"27b0284c"},"/docs/0.4/concepts/tunnels/-241":{"__comp":"17896441","content":"ecf841c3"},"/docs/0.4/getting-started/-acc":{"__comp":"17896441","content":"8a9ffb5d"},"/docs/0.4/guides/docker-share/-4d9":{"__comp":"17896441","content":"0c1cdb3d"},"/docs/0.4/guides/docker-share/docker_private_share_guide/-e49":{"__comp":"17896441","content":"25ef1bb8"},"/docs/0.4/guides/docker-share/docker_public_share_guide/-b4b":{"__comp":"17896441","content":"c88279fc"},"/docs/0.4/guides/drives/-186":{"__comp":"17896441","content":"8b4ddd1a"},"/docs/0.4/guides/frontdoor/-107":{"__comp":"17896441","content":"ebc0e2a0"},"/docs/0.4/guides/install/-4db":{"__comp":"17896441","content":"1ddd36f2"},"/docs/0.4/guides/install/linux/-1df":{"__comp":"17896441","content":"0efac3c3"},"/docs/0.4/guides/install/macos/-8c6":{"__comp":"17896441","content":"17f4c24e"},"/docs/0.4/guides/install/windows/-d0b":{"__comp":"17896441","content":"2cc2e835"},"/docs/0.4/guides/linux-user-share/-a76":{"__comp":"17896441","content":"f8f494be"},"/docs/0.4/guides/permission-modes/-895":{"__comp":"17896441","content":"4277b6a0"},"/docs/0.4/guides/self-hosting/docker/-e7e":{"__comp":"17896441","content":"685bed1a"},"/docs/0.4/guides/self-hosting/instance-configuration/-fe9":{"__comp":"17896441","content":"adf8dca1"},"/docs/0.4/guides/self-hosting/interstitial-page/-0e4":{"__comp":"17896441","content":"bc32cbb6"},"/docs/0.4/guides/self-hosting/kubernetes/-751":{"__comp":"17896441","content":"7dd0c8d0"},"/docs/0.4/guides/self-hosting/linux/-3db":{"__comp":"17896441","content":"392083ed"},"/docs/0.4/guides/self-hosting/linux/nginx/-d5a":{"__comp":"17896441","content":"d3a54718"},"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/-c58":{"__comp":"17896441","content":"8dbf8f84"},"/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/-5db":{"__comp":"17896441","content":"901ef07d"},"/docs/0.4/guides/self-hosting/oauth/configuring-oauth/-fc6":{"__comp":"17896441","content":"bfe99541"},"/docs/0.4/guides/self-hosting/organizations/-587":{"__comp":"17896441","content":"b36bb0c9"},"/docs/0.4/guides/self-hosting/personalized-frontend/-555":{"__comp":"17896441","content":"81fb89b8"},"/docs/0.4/guides/self-hosting/self-service-invite/-7d9":{"__comp":"17896441","content":"033e8fc8"},"/docs/0.4/guides/vpn/-df1":{"__comp":"17896441","content":"48341697"},"/docs/0.4/myzrok/custom-domains/-25a":{"__comp":"17896441","content":"3fab0acb"},"/docs/-5a5":{"__comp":"a7bd4aaa","__props":"11b43341"},"/docs/-a12":{"__comp":"a94703ab"},"/docs/category/guides/-c07":{"__comp":"14eb3368","__props":"9af26a4e"},"/docs/category/metrics-and-limits/-9f2":{"__comp":"14eb3368","__props":"4cb7be2f"},"/docs/category/myzrok/-784":{"__comp":"14eb3368","__props":"f7af5a99"},"/docs/category/oauth/-b50":{"__comp":"14eb3368","__props":"e2c4d679"},"/docs/category/self-hosting/-cad":{"__comp":"14eb3368","__props":"2c440c24"},"/docs/concepts/-76a":{"__comp":"17896441","content":"bc747cac"},"/docs/concepts/files/-331":{"__comp":"17896441","content":"c015c796"},"/docs/concepts/hosting/-fea":{"__comp":"17896441","content":"50ef9c44"},"/docs/concepts/http/-d68":{"__comp":"17896441","content":"07d0b302"},"/docs/concepts/opensource/-94c":{"__comp":"17896441","content":"75b20590"},"/docs/concepts/sharing-private/-7b0":{"__comp":"17896441","content":"aad6478e"},"/docs/concepts/sharing-public/-c3b":{"__comp":"17896441","content":"54fa7005"},"/docs/concepts/sharing-reserved/-5d7":{"__comp":"17896441","content":"6272ba0e"},"/docs/concepts/tunnels/-f73":{"__comp":"17896441","content":"339d500a"},"/docs/getting-started/-fdf":{"__comp":"17896441","content":"f888b719"},"/docs/guides/agent/-d0d":{"__comp":"17896441","content":"71c8a211"},"/docs/guides/agent/linux-service/-8a7":{"__comp":"17896441","content":"2fede397"},"/docs/guides/agent/windows-service/-9a1":{"__comp":"17896441","content":"43e1c8e4"},"/docs/guides/docker-share/-7d3":{"__comp":"17896441","content":"2da89d45"},"/docs/guides/docker-share/docker_private_share_guide/-927":{"__comp":"17896441","content":"bbbe662c"},"/docs/guides/docker-share/docker_public_share_guide/-ccf":{"__comp":"17896441","content":"2e812224"},"/docs/guides/drives/-8a1":{"__comp":"17896441","content":"36b94792"},"/docs/guides/frontdoor/-e30":{"__comp":"17896441","content":"cda0d2e5"},"/docs/guides/install/-aa4":{"__comp":"17896441","content":"b6569025"},"/docs/guides/install/linux/-0c6":{"__comp":"17896441","content":"47881d5c"},"/docs/guides/install/macos/-532":{"__comp":"17896441","content":"1ba5bc99"},"/docs/guides/install/windows/-ad4":{"__comp":"17896441","content":"c304be44"},"/docs/guides/permission-modes/-d45":{"__comp":"17896441","content":"0c66edb9"},"/docs/guides/self-hosting/docker/-5a7":{"__comp":"17896441","content":"e1dfe4fe"},"/docs/guides/self-hosting/instance-configuration/-297":{"__comp":"17896441","content":"5cd0a723"},"/docs/guides/self-hosting/interstitial-page/-90e":{"__comp":"17896441","content":"9939c4f4"},"/docs/guides/self-hosting/kubernetes/-37d":{"__comp":"17896441","content":"20595907"},"/docs/guides/self-hosting/linux/-d78":{"__comp":"17896441","content":"d768dc0f"},"/docs/guides/self-hosting/linux/nginx/-b26":{"__comp":"17896441","content":"ef8afbfd"},"/docs/guides/self-hosting/metrics-and-limits/configuring-limits/-8b7":{"__comp":"17896441","content":"600b2345"},"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/-0a8":{"__comp":"17896441","content":"288b1075"},"/docs/guides/self-hosting/oauth/configuring-oauth/-b5f":{"__comp":"17896441","content":"6e881e32"},"/docs/guides/self-hosting/organizations/-369":{"__comp":"17896441","content":"7f5ec875"},"/docs/guides/self-hosting/personalized-frontend/-567":{"__comp":"17896441","content":"7452427d"},"/docs/guides/self-hosting/self-service-invite/-532":{"__comp":"17896441","content":"4f1777fd"},"/docs/guides/vpn/-13f":{"__comp":"17896441","content":"21880a4d"},"/docs/myzrok/custom-domains/-c1c":{"__comp":"17896441","content":"01cb08ea"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=1823,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.35a8599c.js.LICENSE.txt b/assets/js/main.73901735.js.LICENSE.txt similarity index 100% rename from assets/js/main.35a8599c.js.LICENSE.txt rename to assets/js/main.73901735.js.LICENSE.txt diff --git a/assets/js/runtime~main.0fc14dac.js b/assets/js/runtime~main.0fc14dac.js deleted file mode 100644 index b9d38f1e..00000000 --- a/assets/js/runtime~main.0fc14dac.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,r.amdO={},e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],d=e[i][1],f=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&f||b>=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f<b&&(b=f));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({37:"ebc0e2a0",277:"4f1777fd",351:"3fab0acb",429:"50ef9c44",471:"7dd0c8d0",598:"9939c4f4",627:"d087459a",714:"b6569025",749:"21880a4d",826:"bc32cbb6",887:"c015c796",957:"c141421f",1057:"bbbe662c",1235:"a7456010",1346:"d3a54718",1421:"71c8a211",1595:"1ddd36f2",1769:"aad6478e",1831:"80941509",1864:"8a9ffb5d",1939:"7f5ec875",2138:"1a4e3797",2256:"11b43341",2634:"c4f5d8e4",2757:"cda0d2e5",2759:"1ba5bc99",2867:"6a6a5bbc",3165:"c88279fc",3373:"6e881e32",3423:"e1dfe4fe",3434:"bfe99541",3574:"4cb7be2f",3588:"288b1075",3747:"01cb08ea",3786:"c304be44",3921:"36b94792",3979:"2c440c24",4074:"5cd0a723",4247:"d768dc0f",4277:"27b0284c",4466:"7d0a541a",4470:"f888b719",4504:"b36bb0c9",4717:"392083ed",4909:"bc747cac",4927:"47881d5c",5117:"8dbf8f84",5689:"685bed1a",5695:"f8f494be",5742:"aba21aa0",5955:"8b4ddd1a",6063:"6ad1709d",6289:"ce04f2ae",6332:"2da89d45",6381:"1f91e8db",6475:"033e8fc8",6595:"0c1cdb3d",6878:"1dd31738",6946:"2cc2e835",6969:"14eb3368",6974:"bf372175",7098:"a7bd4aaa",7120:"2fede397",7216:"0c66edb9",7242:"6272ba0e",7499:"07d0b302",7599:"f7af5a99",7752:"339d500a",8051:"adf8dca1",8173:"0efac3c3",8240:"28f20845",8301:"81fb89b8",8401:"17896441",8436:"4277b6a0",8471:"2e812224",8528:"43e1c8e4",8582:"20595907",8675:"54fa7005",8746:"25ef1bb8",8875:"17f4c24e",9002:"ecf841c3",9025:"75b20590",9033:"901ef07d",9048:"a94703ab",9148:"35a60099",9253:"e2c4d679",9355:"600b2345",9471:"48341697",9476:"7452427d",9576:"61ea36d9",9631:"9af26a4e",9647:"5e95c892",9851:"e3e0bfdc",9905:"ef8afbfd"}[e]||e)+"."+{37:"5671cf6f",277:"7a01d5ed",351:"d2be5705",382:"a8e40f63",416:"36a683d5",429:"7c0dd56b",471:"b0b509b1",598:"0a8ed6f3",627:"5b953d23",714:"6245889e",749:"2545a6d9",826:"ac399eaf",887:"32854b4b",957:"94fe8bc5",962:"3828f828",1057:"b37b0a59",1235:"7b4b0a20",1346:"adbe71c6",1421:"0259d6a9",1595:"031ba1fd",1769:"8dd329a2",1831:"76c5af9c",1864:"77502c26",1939:"bb718edf",2138:"b404fedf",2237:"1d1b868c",2256:"fe1bdd39",2634:"ff3bb442",2757:"a558c3ba",2759:"1ceac7e5",2867:"7ff8dd0a",3165:"70a81d0d",3373:"58f05075",3423:"557c1d76",3434:"bd20f5d0",3574:"a83087ce",3588:"7fdf1033",3747:"58ce9e89",3786:"338d89b1",3921:"799856c4",3979:"8ad59b19",4074:"ff1769bd",4247:"7eb1170c",4277:"24ca90bb",4466:"bebc18c0",4470:"25860f0f",4504:"32b884d9",4717:"30911eae",4909:"7ee6980c",4927:"beaba6e5",5117:"b796122d",5394:"216a6dc4",5689:"a03f3930",5695:"f6c4378a",5742:"9ac6642b",5955:"c9cbe2e9",6063:"68cc20aa",6289:"4cc27842",6332:"c53388d7",6381:"2ff8779a",6475:"550a98dd",6595:"93ac86f2",6878:"b424452b",6946:"42c85917",6969:"a2fb3a9b",6974:"6ce3604a",7098:"6c642da0",7120:"d7c9e9b3",7216:"a1604a49",7242:"e147ca1e",7499:"de243ccc",7599:"8573f403",7752:"749f941d",8051:"b0b219c1",8158:"900dc11d",8173:"3f261e03",8240:"b3a7ec46",8301:"8e503f5a",8401:"1409512a",8436:"4bd27697",8471:"6dc7f702",8528:"444957a7",8582:"3e569479",8585:"e93703b4",8675:"cf645e57",8746:"5af8d370",8875:"17d254d5",8913:"83bce4ad",9002:"7d4c9847",9025:"c44edc33",9033:"08f99ecd",9048:"43814358",9148:"7bc9aad5",9253:"dd14fdd8",9355:"18130102",9471:"f4018882",9476:"951c0809",9576:"f59265a3",9631:"b4a6cf60",9647:"6794ea18",9851:"c7a4408d",9905:"dbcbe2ba"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="website:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==f+c){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",f+c),t.src=e),d[e]=[a];var l=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",20595907:"8582",48341697:"9471",80941509:"1831",ebc0e2a0:"37","4f1777fd":"277","3fab0acb":"351","50ef9c44":"429","7dd0c8d0":"471","9939c4f4":"598",d087459a:"627",b6569025:"714","21880a4d":"749",bc32cbb6:"826",c015c796:"887",c141421f:"957",bbbe662c:"1057",a7456010:"1235",d3a54718:"1346","71c8a211":"1421","1ddd36f2":"1595",aad6478e:"1769","8a9ffb5d":"1864","7f5ec875":"1939","1a4e3797":"2138","11b43341":"2256",c4f5d8e4:"2634",cda0d2e5:"2757","1ba5bc99":"2759","6a6a5bbc":"2867",c88279fc:"3165","6e881e32":"3373",e1dfe4fe:"3423",bfe99541:"3434","4cb7be2f":"3574","288b1075":"3588","01cb08ea":"3747",c304be44:"3786","36b94792":"3921","2c440c24":"3979","5cd0a723":"4074",d768dc0f:"4247","27b0284c":"4277","7d0a541a":"4466",f888b719:"4470",b36bb0c9:"4504","392083ed":"4717",bc747cac:"4909","47881d5c":"4927","8dbf8f84":"5117","685bed1a":"5689",f8f494be:"5695",aba21aa0:"5742","8b4ddd1a":"5955","6ad1709d":"6063",ce04f2ae:"6289","2da89d45":"6332","1f91e8db":"6381","033e8fc8":"6475","0c1cdb3d":"6595","1dd31738":"6878","2cc2e835":"6946","14eb3368":"6969",bf372175:"6974",a7bd4aaa:"7098","2fede397":"7120","0c66edb9":"7216","6272ba0e":"7242","07d0b302":"7499",f7af5a99:"7599","339d500a":"7752",adf8dca1:"8051","0efac3c3":"8173","28f20845":"8240","81fb89b8":"8301","4277b6a0":"8436","2e812224":"8471","43e1c8e4":"8528","54fa7005":"8675","25ef1bb8":"8746","17f4c24e":"8875",ecf841c3:"9002","75b20590":"9025","901ef07d":"9033",a94703ab:"9048","35a60099":"9148",e2c4d679:"9253","600b2345":"9355","7452427d":"9476","61ea36d9":"9576","9af26a4e":"9631","5e95c892":"9647",e3e0bfdc:"9851",ef8afbfd:"9905"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n<b.length;n++)f=b[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},c=self.webpackChunkwebsite=self.webpackChunkwebsite||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.27dd39d7.js b/assets/js/runtime~main.27dd39d7.js new file mode 100644 index 00000000..28463f47 --- /dev/null +++ b/assets/js/runtime~main.27dd39d7.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,d,c,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,r.amdO={},e=[],r.O=(a,d,c,f)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){d=e[i][0],c=e[i][1],f=e[i][2];for(var t=!0,o=0;o<d.length;o++)(!1&f||b>=f)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,f<b&&(b=f));if(t){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[d,c,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({37:"ebc0e2a0",277:"4f1777fd",351:"3fab0acb",429:"50ef9c44",471:"7dd0c8d0",598:"9939c4f4",627:"d087459a",714:"b6569025",749:"21880a4d",826:"bc32cbb6",887:"c015c796",957:"c141421f",1057:"bbbe662c",1235:"a7456010",1346:"d3a54718",1421:"71c8a211",1595:"1ddd36f2",1769:"aad6478e",1831:"80941509",1864:"8a9ffb5d",1939:"7f5ec875",2138:"1a4e3797",2256:"11b43341",2634:"c4f5d8e4",2757:"cda0d2e5",2759:"1ba5bc99",2867:"6a6a5bbc",3165:"c88279fc",3373:"6e881e32",3423:"e1dfe4fe",3434:"bfe99541",3574:"4cb7be2f",3588:"288b1075",3747:"01cb08ea",3786:"c304be44",3921:"36b94792",3979:"2c440c24",4074:"5cd0a723",4247:"d768dc0f",4277:"27b0284c",4466:"7d0a541a",4470:"f888b719",4504:"b36bb0c9",4717:"392083ed",4909:"bc747cac",4927:"47881d5c",5117:"8dbf8f84",5689:"685bed1a",5695:"f8f494be",5742:"aba21aa0",5955:"8b4ddd1a",6063:"6ad1709d",6289:"ce04f2ae",6332:"2da89d45",6381:"1f91e8db",6475:"033e8fc8",6595:"0c1cdb3d",6878:"1dd31738",6946:"2cc2e835",6969:"14eb3368",6974:"bf372175",7098:"a7bd4aaa",7120:"2fede397",7216:"0c66edb9",7242:"6272ba0e",7499:"07d0b302",7599:"f7af5a99",7752:"339d500a",8051:"adf8dca1",8173:"0efac3c3",8240:"28f20845",8301:"81fb89b8",8401:"17896441",8436:"4277b6a0",8471:"2e812224",8528:"43e1c8e4",8582:"20595907",8675:"54fa7005",8746:"25ef1bb8",8875:"17f4c24e",9002:"ecf841c3",9025:"75b20590",9033:"901ef07d",9048:"a94703ab",9148:"35a60099",9253:"e2c4d679",9355:"600b2345",9471:"48341697",9476:"7452427d",9576:"61ea36d9",9631:"9af26a4e",9647:"5e95c892",9851:"e3e0bfdc",9905:"ef8afbfd"}[e]||e)+"."+{37:"2fd8a7d5",277:"8662c934",351:"42090723",382:"a8e40f63",429:"12fc4d19",471:"bff7c1df",598:"269715f4",627:"5b953d23",714:"fe4b9c1c",749:"3fc237ab",826:"9999155a",887:"72c3baed",957:"94fe8bc5",1057:"9639f5d7",1235:"7b4b0a20",1346:"cf229226",1421:"bc7ae09e",1595:"9d005e77",1769:"3d3869e2",1809:"e9544cab",1831:"76c5af9c",1864:"d8752724",1939:"930ba73d",2138:"41a00028",2256:"79f8cce9",2634:"e72ebafa",2757:"2230e891",2759:"29713972",2867:"492570ea",2913:"952f279a",3042:"616631a6",3165:"e4590d8c",3373:"d1a95584",3423:"6a8817d7",3434:"ebbc647d",3574:"a83087ce",3588:"d8c0cc34",3747:"e2a119f7",3786:"9bdbc4e1",3921:"4fa1b781",3979:"8ad59b19",4017:"7e97479c",4074:"a9c6bc01",4247:"3a416f3d",4277:"f6ce6473",4466:"60c67a50",4470:"5c9a422f",4504:"40225a52",4717:"44e8edfb",4831:"cc421862",4909:"47cf4617",4927:"207612b2",5117:"3f2e467f",5689:"805a7a11",5695:"6cdbf166",5742:"9ac6642b",5955:"f19e7085",6063:"68cc20aa",6289:"7967717a",6332:"50a9d468",6381:"2ff8779a",6475:"d38e5d82",6595:"2f3a3b78",6878:"f2361110",6946:"3f7ac032",6969:"77817439",6974:"b4ab81db",7098:"cea47d6c",7120:"cf7aaa58",7216:"ea664c8d",7242:"6f3f0f49",7499:"d3837b27",7599:"8573f403",7752:"f2d81bcd",8051:"2569ff33",8158:"18bfb97f",8173:"e00c8d4e",8240:"b3a7ec46",8301:"5431648f",8401:"575d0faf",8436:"0e01d84b",8471:"1a40eb4c",8528:"968e1006",8582:"d363fbd2",8675:"b2d85980",8746:"829f2dbc",8875:"e3487d90",8913:"83bce4ad",9002:"55fddec0",9025:"6e350206",9033:"b8ef613e",9048:"fa816e76",9148:"e9f86877",9253:"dd14fdd8",9355:"9c2e688e",9471:"ee186ebb",9476:"213d2c47",9576:"d29dac57",9631:"b4a6cf60",9647:"6fe04f8c",9851:"c7a4408d",9905:"adaf6ea9"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},f="website:",r.l=(e,a,d,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==f+d){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",f+d),t.src=e),c[e]=[a];var l=(a,d)=>{t.onerror=t.onload=null,clearTimeout(s);var f=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(d))),a)return a(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",20595907:"8582",48341697:"9471",80941509:"1831",ebc0e2a0:"37","4f1777fd":"277","3fab0acb":"351","50ef9c44":"429","7dd0c8d0":"471","9939c4f4":"598",d087459a:"627",b6569025:"714","21880a4d":"749",bc32cbb6:"826",c015c796:"887",c141421f:"957",bbbe662c:"1057",a7456010:"1235",d3a54718:"1346","71c8a211":"1421","1ddd36f2":"1595",aad6478e:"1769","8a9ffb5d":"1864","7f5ec875":"1939","1a4e3797":"2138","11b43341":"2256",c4f5d8e4:"2634",cda0d2e5:"2757","1ba5bc99":"2759","6a6a5bbc":"2867",c88279fc:"3165","6e881e32":"3373",e1dfe4fe:"3423",bfe99541:"3434","4cb7be2f":"3574","288b1075":"3588","01cb08ea":"3747",c304be44:"3786","36b94792":"3921","2c440c24":"3979","5cd0a723":"4074",d768dc0f:"4247","27b0284c":"4277","7d0a541a":"4466",f888b719:"4470",b36bb0c9:"4504","392083ed":"4717",bc747cac:"4909","47881d5c":"4927","8dbf8f84":"5117","685bed1a":"5689",f8f494be:"5695",aba21aa0:"5742","8b4ddd1a":"5955","6ad1709d":"6063",ce04f2ae:"6289","2da89d45":"6332","1f91e8db":"6381","033e8fc8":"6475","0c1cdb3d":"6595","1dd31738":"6878","2cc2e835":"6946","14eb3368":"6969",bf372175:"6974",a7bd4aaa:"7098","2fede397":"7120","0c66edb9":"7216","6272ba0e":"7242","07d0b302":"7499",f7af5a99:"7599","339d500a":"7752",adf8dca1:"8051","0efac3c3":"8173","28f20845":"8240","81fb89b8":"8301","4277b6a0":"8436","2e812224":"8471","43e1c8e4":"8528","54fa7005":"8675","25ef1bb8":"8746","17f4c24e":"8875",ecf841c3:"9002","75b20590":"9025","901ef07d":"9033",a94703ab:"9048","35a60099":"9148",e2c4d679:"9253","600b2345":"9355","7452427d":"9476","61ea36d9":"9576","9af26a4e":"9631","5e95c892":"9647",e3e0bfdc:"9851",ef8afbfd:"9905"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)d.push(c[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((d,f)=>c=e[a]=[d,f]));d.push(c[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var f=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var c,f,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(d);n<b.length;n++)f=b[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},d=self.webpackChunkwebsite=self.webpackChunkwebsite||[];d.forEach(a.bind(null,0)),d.push=a.bind(null,d.push.bind(d))})()})(); \ No newline at end of file diff --git a/docs/0.4/category/guides/index.html b/docs/0.4/category/guides/index.html index 0bfd1f2d..7db25ea2 100644 --- a/docs/0.4/category/guides/index.html +++ b/docs/0.4/category/guides/index.html @@ -2,19 +2,21 @@ <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-0.4 docs-doc-page" data-has-hydrated="false"> <head> <meta charset="UTF-8"> -<meta name="generator" content="Docusaurus v3.6.0"> +<meta name="generator" content="Docusaurus v3.7.0"> <title data-rh="true">Guides | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/0.4/category/metrics-and-limits/index.html b/docs/0.4/category/metrics-and-limits/index.html index 2c620194..6c96908f 100644 --- a/docs/0.4/category/metrics-and-limits/index.html +++ b/docs/0.4/category/metrics-and-limits/index.html @@ -2,19 +2,21 @@ - + Metrics and Limits | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/0.4/category/myzrok/index.html b/docs/0.4/category/myzrok/index.html index bb050f24..3038605a 100644 --- a/docs/0.4/category/myzrok/index.html +++ b/docs/0.4/category/myzrok/index.html @@ -2,19 +2,21 @@ - + myzrok | zrok - - - + + + + -
Version: 0.4

myzrok

+ +
Version: 0.4

myzrok

\ No newline at end of file diff --git a/docs/0.4/category/oauth/index.html b/docs/0.4/category/oauth/index.html index c2397100..59df1da3 100644 --- a/docs/0.4/category/oauth/index.html +++ b/docs/0.4/category/oauth/index.html @@ -2,19 +2,21 @@ - + OAuth | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/0.4/category/self-hosting/index.html b/docs/0.4/category/self-hosting/index.html index 778562b3..fc2b41fa 100644 --- a/docs/0.4/category/self-hosting/index.html +++ b/docs/0.4/category/self-hosting/index.html @@ -2,19 +2,21 @@ - + Self Hosting | zrok - - - + + + + -
Version: 0.4

Self Hosting

📄️ Organizations

zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

+ +
Version: 0.4

Self Hosting

📄️ Organizations

zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

\ No newline at end of file diff --git a/docs/0.4/concepts/files/index.html b/docs/0.4/concepts/files/index.html index 4f4bab75..803e6f2b 100644 --- a/docs/0.4/concepts/files/index.html +++ b/docs/0.4/concepts/files/index.html @@ -2,20 +2,22 @@ - + Sharing Websites and Files | zrok - - - + + + + -
Version: 0.4

Sharing Websites and Files

With zrok it is possible to share files quickly and easily as well. To share files using zrok use + +

Version: 0.4

Sharing Websites and Files

With zrok it is possible to share files quickly and easily as well. To share files using zrok use the --backend-mode web, for example: zrok share private . --backend-mode web.

Running with this mode will make it trivially easy to share files from the directory which the command was run from.

diff --git a/docs/0.4/concepts/hosting/index.html b/docs/0.4/concepts/hosting/index.html index 4cea9f72..1f8fa7cb 100644 --- a/docs/0.4/concepts/hosting/index.html +++ b/docs/0.4/concepts/hosting/index.html @@ -2,20 +2,22 @@ - + Hosting | zrok - - - + + + + -
Version: 0.4

Hosting

+ +
Version: 0.4

Hosting

Self-Hosted

zrok is not limited to a managed offering. You can host your own instance of zrok as well. zrok is also freely available as open source software hosted by GitHub under a very permissive Apache v2 license.

diff --git a/docs/0.4/concepts/http/index.html b/docs/0.4/concepts/http/index.html index 55f1d82e..0faa7892 100644 --- a/docs/0.4/concepts/http/index.html +++ b/docs/0.4/concepts/http/index.html @@ -2,20 +2,22 @@ - + Sharing HTTP Servers | zrok - - - + + + + -
Version: 0.4

Sharing HTTP Servers

+ +
Version: 0.4

Sharing HTTP Servers

zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.

The --backend-mode proxy is the default backend mode, so if you do not specify a --backend-mode you will get the proxy mode by default.

If you have a web server running on localhost that you want to expose to other users using zrok, you can execute a command like the following:

diff --git a/docs/0.4/concepts/index.html b/docs/0.4/concepts/index.html index 2a8169e9..2db361f1 100644 --- a/docs/0.4/concepts/index.html +++ b/docs/0.4/concepts/index.html @@ -2,20 +2,22 @@ - + Concepts | zrok - - - + + + + -
Version: 0.4

Concepts

+ +
Version: 0.4

Concepts

zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we'll tour through all of the most important features.

Sharing with zrok can be either public or private. Naturally, regular web-based resources can be shared but zrok also includes support for sharing raw TCP and UDP network connections, and also includes a website and file sharing feature.

diff --git a/docs/0.4/concepts/opensource/index.html b/docs/0.4/concepts/opensource/index.html index 9981cceb..59bb5146 100644 --- a/docs/0.4/concepts/opensource/index.html +++ b/docs/0.4/concepts/opensource/index.html @@ -2,20 +2,22 @@ - + Open Source | zrok - - - + + + + -
Version: 0.4

Open Source

+ +
Version: 0.4

Open Source

It's important to the zrok project that it remain free and open source software. The code is available on GitHub for the world to use, inspect, and build upon!

Check out the repository over on GitHub at https://github.com/openziti/zrok. If you find zrok to be useful, and diff --git a/docs/0.4/concepts/sharing-private/index.html b/docs/0.4/concepts/sharing-private/index.html index d982cad1..31958ca7 100644 --- a/docs/0.4/concepts/sharing-private/index.html +++ b/docs/0.4/concepts/sharing-private/index.html @@ -2,20 +2,22 @@ - + Private Shares | zrok - - - + + + + -

Version: 0.4

Private Shares

+ +
Version: 0.4

Private Shares

zrok was built to share and access digital resources. A private share allows a resource to be accessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another zrok user who has the details of your unique share. You are in control of who can access your private shares by sharing the share token.

Peer-to-peer private resource sharing is one of the things that makes zrok unique.

diff --git a/docs/0.4/concepts/sharing-public/index.html b/docs/0.4/concepts/sharing-public/index.html index 4781a181..3d74a9e6 100644 --- a/docs/0.4/concepts/sharing-public/index.html +++ b/docs/0.4/concepts/sharing-public/index.html @@ -2,20 +2,22 @@ - + Public Shares | zrok - - - + + + + -
Version: 0.4

Public Shares

+ +
Version: 0.4

Public Shares

zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.

Peer to Public

zrok_public_share

diff --git a/docs/0.4/concepts/sharing-reserved/index.html b/docs/0.4/concepts/sharing-reserved/index.html index 0d56b93a..d9a72b8b 100644 --- a/docs/0.4/concepts/sharing-reserved/index.html +++ b/docs/0.4/concepts/sharing-reserved/index.html @@ -2,20 +2,22 @@ - + Reserved Shares | zrok - - - + + + + -
Version: 0.4

Reserved Shares

+ +
Version: 0.4

Reserved Shares

By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.

You can use a reserved share to persist your share token across multiple runs of the zrok share bridge. When you use a reserved share, the share token will not be deleted between multiple runs of zrok share.

To use a reserved share, you will first run the zrok reserve command to create the reserved share (see zrok reserve --help for details). Once you've created your reserved share, you will use the zrok share reserved command (see --help for details) to run the bridge for the shared resource.

diff --git a/docs/0.4/concepts/tunnels/index.html b/docs/0.4/concepts/tunnels/index.html index 3e7bac40..ef42c78d 100644 --- a/docs/0.4/concepts/tunnels/index.html +++ b/docs/0.4/concepts/tunnels/index.html @@ -2,20 +2,22 @@ - + Sharing TCP and UDP Servers | zrok - - - + + + + -
Version: 0.4

Sharing TCP and UDP Servers

+ +
Version: 0.4

Sharing TCP and UDP Servers

zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.

As of version v0.4, zrok supports sharing TCP and UDP network resources using private sharing.

To share a raw network resource using zrok, you'll want to use the zrok share private command from your enable-d environment, like this:

diff --git a/docs/0.4/getting-started/index.html b/docs/0.4/getting-started/index.html index 4aea9bb3..4d34b3c6 100644 --- a/docs/0.4/getting-started/index.html +++ b/docs/0.4/getting-started/index.html @@ -2,20 +2,22 @@ - + Getting Started | zrok - - - + + + + -
Version: 0.4

Getting Started

Your Secure Internet Sharing Perimeter

+ +
Version: 0.4

Getting Started

Your Secure Internet Sharing Perimeter

zrok (/ziːɹɒk/ ZEE-rock) is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files. There's a hardened zrok-as-a-service offering available at myzrok.io with a generous free tier.

Your First Share

diff --git a/docs/0.4/guides/docker-share/docker_private_share_guide/index.html b/docs/0.4/guides/docker-share/docker_private_share_guide/index.html index a0bb21b2..39732431 100644 --- a/docs/0.4/guides/docker-share/docker_private_share_guide/index.html +++ b/docs/0.4/guides/docker-share/docker_private_share_guide/index.html @@ -2,20 +2,22 @@ - + Docker Private Share | zrok - - - + + + + -
Version: 0.4

Docker Private Share

Goal

+ +
Version: 0.4

Docker Private Share

Goal

Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token.

Overview

With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel.

diff --git a/docs/0.4/guides/docker-share/docker_public_share_guide/index.html b/docs/0.4/guides/docker-share/docker_public_share_guide/index.html index c93a67ba..73a68336 100644 --- a/docs/0.4/guides/docker-share/docker_public_share_guide/index.html +++ b/docs/0.4/guides/docker-share/docker_public_share_guide/index.html @@ -2,20 +2,22 @@ - + Docker Compose Public Share | zrok - - - + + + + -
Version: 0.4

Docker Compose Public Share

Goal

+ +
Version: 0.4

Docker Compose Public Share

Goal

Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL.

Overview

With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service.

diff --git a/docs/0.4/guides/docker-share/index.html b/docs/0.4/guides/docker-share/index.html index 148b550a..40bbf29d 100644 --- a/docs/0.4/guides/docker-share/index.html +++ b/docs/0.4/guides/docker-share/index.html @@ -2,20 +2,22 @@ - + Getting Started with Docker | zrok - - - + + + + -
Version: 0.4

Getting Started with Docker

Overview

+ +
Version: 0.4

Getting Started with Docker

Overview

To follow the guides in this section you will need Docker.

You have the option to enable a zrok account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (compose.yml) to enable a separate zrok environment for each project.

This page provides docker and docker compose examples of mounting the host's zrok environment on the container. You'll need to first enable zrok on the Docker host to use this approach.

diff --git a/docs/0.4/guides/drives/index.html b/docs/0.4/guides/drives/index.html index efacef98..4f47b449 100644 --- a/docs/0.4/guides/drives/index.html +++ b/docs/0.4/guides/drives/index.html @@ -2,20 +2,22 @@ - + Drives | zrok - - - + + + + -
Version: 0.4

Drives

+ +
Version: 0.4

Drives

The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.

Sharing a Drive

Virtual drives are shared through the zrok CLI using the --backend-mode drive flag through the zrok share command, using either the public or private sharing modes. We'll use the private sharing mode for this example:

diff --git a/docs/0.4/guides/frontdoor/index.html b/docs/0.4/guides/frontdoor/index.html index 9c7b3ce7..162354fd 100644 --- a/docs/0.4/guides/frontdoor/index.html +++ b/docs/0.4/guides/frontdoor/index.html @@ -2,20 +2,22 @@ - + zrok frontdoor | zrok - - - + + + + -
Version: 0.4

zrok frontdoor

zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends.

+ +
Version: 0.4

zrok frontdoor

zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends.

Overview

zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a zrok.io frontend, you're using zrok frontdoor. zrok.io is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use zrok frontdoor.

diff --git a/docs/0.4/guides/install/index.html b/docs/0.4/guides/install/index.html index daf8d773..823239a1 100644 --- a/docs/0.4/guides/install/index.html +++ b/docs/0.4/guides/install/index.html @@ -2,19 +2,21 @@ - + Install | zrok - - - + + + + -
+ +
\ No newline at end of file diff --git a/docs/0.4/guides/install/linux/index.html b/docs/0.4/guides/install/linux/index.html index 56c22f8a..67d929d6 100644 --- a/docs/0.4/guides/install/linux/index.html +++ b/docs/0.4/guides/install/linux/index.html @@ -2,20 +2,22 @@ - + Install zrok in Linux | zrok - - - + + + + -
Version: 0.4

Install zrok in Linux

Install zrok from the Repository

+ +
Version: 0.4

Install zrok in Linux

Install zrok from the Repository

This will configure the system to receive DEB or RPM package updates.

curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok
info

Check out zrok frontdoor for running zrok as an always-on service.

diff --git a/docs/0.4/guides/install/macos/index.html b/docs/0.4/guides/install/macos/index.html index bf251074..d16235c0 100644 --- a/docs/0.4/guides/install/macos/index.html +++ b/docs/0.4/guides/install/macos/index.html @@ -2,20 +2,22 @@ - + Install zrok in macOS | zrok - - - + + + + -
Version: 0.4

Install zrok in macOS

Homebrew

+ +
Version: 0.4

Install zrok in macOS

Homebrew

brew install zrok

Darwin Binary

macOS logo

macOS

diff --git a/docs/0.4/guides/install/windows/index.html b/docs/0.4/guides/install/windows/index.html index 983520b0..11ae6730 100644 --- a/docs/0.4/guides/install/windows/index.html +++ b/docs/0.4/guides/install/windows/index.html @@ -2,20 +2,22 @@ - + Install zrok in Windows | zrok - - - + + + + -
Version: 0.4

Install zrok in Windows

Windows Binary

+ +
Version: 0.4

Install zrok in Windows

Windows Binary

Windows logo

Windows

  1. diff --git a/docs/0.4/guides/linux-user-share/index.html b/docs/0.4/guides/linux-user-share/index.html index 59cb5e2b..5bc741a8 100644 --- a/docs/0.4/guides/linux-user-share/index.html +++ b/docs/0.4/guides/linux-user-share/index.html @@ -2,20 +2,22 @@ - + Linux User Share | zrok - - - + + + + -
    Version: 0.4

    Linux User Share

    Overview

    + +
    Version: 0.4

    Linux User Share

    Overview

    You can run any number of zrok share services as systemd --user units with your Linux user's zrok environment in ~/.zrok. This is like zrok frontdoor except that frontdoor is a system service managed by root separately from your user's login. Linux user shares, Linux system services, and Docker shares all use the same configuration environment variables.

    Install the Linux Package

    The package provides the zrok executable and service unit template.

    diff --git a/docs/0.4/guides/permission-modes/index.html b/docs/0.4/guides/permission-modes/index.html index 30745bc3..0fd367a7 100644 --- a/docs/0.4/guides/permission-modes/index.html +++ b/docs/0.4/guides/permission-modes/index.html @@ -2,20 +2,22 @@ - + Permission Modes | zrok - - - + + + + -
    Version: 0.4

    Permission Modes

    + +
    Version: 0.4

    Permission Modes

    Shares created in zrok v0.4.26 and newer now include a choice of permission mode.

    Shares created with zrok v0.4.25 and older were created using what is now called the open permission mode. Whether public or private, these shares can be accessed by any user of the zrok service instance, as long as they know the share token of the share. Effectively shares with the open permission mode are accessible by any user of the zrok service instance.

    zrok now supports a closed permission mode, which allows for more fine-grained control over which zrok users are allowed to privately access your shares using zrok access private.

    diff --git a/docs/0.4/guides/self-hosting/docker/index.html b/docs/0.4/guides/self-hosting/docker/index.html index ba20f376..80f83cd2 100644 --- a/docs/0.4/guides/self-hosting/docker/index.html +++ b/docs/0.4/guides/self-hosting/docker/index.html @@ -2,20 +2,22 @@ - + Self-hosting guide for Docker | zrok - - - + + + + -
    Version: 0.4

    Self-hosting guide for Docker

    Docker Instance

    + +
    Version: 0.4

    Self-hosting guide for Docker

    Docker Instance

    This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:

      diff --git a/docs/0.4/guides/self-hosting/instance-configuration/index.html b/docs/0.4/guides/self-hosting/instance-configuration/index.html index 6c9a1707..d3135736 100644 --- a/docs/0.4/guides/self-hosting/instance-configuration/index.html +++ b/docs/0.4/guides/self-hosting/instance-configuration/index.html @@ -2,20 +2,22 @@ - + Use Another zrok Instance | zrok - - - + + + + -
      Version: 0.4

      Use Another zrok Instance

      note

      This guide is relevant if you are self-hosting or using a friend's zrok instance instead of using zrok-as-a-service from zrok.io.

      + +
      Version: 0.4

      Use Another zrok Instance

      note

      This guide is relevant if you are self-hosting or using a friend's zrok instance instead of using zrok-as-a-service from zrok.io.

      The zrok command on your computer uses a zrok instance over the network.

      The default instance API endpoint for the zrok command is api.zrok.io. Set the API endpoint to another instance's API endpoint:

      zrok config set apiEndpoint https://zrok.example.com
      diff --git a/docs/0.4/guides/self-hosting/interstitial-page/index.html b/docs/0.4/guides/self-hosting/interstitial-page/index.html index 5aee6965..b0180058 100644 --- a/docs/0.4/guides/self-hosting/interstitial-page/index.html +++ b/docs/0.4/guides/self-hosting/interstitial-page/index.html @@ -2,20 +2,22 @@ - + Interstitial Pages | zrok - - - + + + + -
      Version: 0.4

      Interstitial Pages

      On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.

      + +
      Version: 0.4

      Interstitial Pages

      On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.

      Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use).

      The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges.

      By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them.

      diff --git a/docs/0.4/guides/self-hosting/kubernetes/index.html b/docs/0.4/guides/self-hosting/kubernetes/index.html index 0cca29fa..e92fe5f5 100644 --- a/docs/0.4/guides/self-hosting/kubernetes/index.html +++ b/docs/0.4/guides/self-hosting/kubernetes/index.html @@ -2,20 +2,22 @@ - + Self-host a zrok Instance in Kubernetes | zrok - - - + + + + -
      Version: 0.4

      Self-host a zrok Instance in Kubernetes

      The Helm chart for zrok is available from the main OpenZiti charts repo.

      + +
      \ No newline at end of file diff --git a/docs/0.4/guides/self-hosting/linux/index.html b/docs/0.4/guides/self-hosting/linux/index.html index b54f9438..cc4a39f6 100644 --- a/docs/0.4/guides/self-hosting/linux/index.html +++ b/docs/0.4/guides/self-hosting/linux/index.html @@ -2,20 +2,22 @@ - + Self-Hosting Guide for Linux | zrok - - - + + + + -
      Version: 0.4

      Self-Hosting Guide for Linux

      Walkthrough Video

      + +
      Version: 0.4

      Self-Hosting Guide for Linux

      Walkthrough Video

      Before you Begin

      This will get you up and running with a self-hosted instance of zrok. I'll assume you have the following:

      diff --git a/docs/0.4/guides/self-hosting/linux/nginx/index.html b/docs/0.4/guides/self-hosting/linux/nginx/index.html index 79cbdc69..90141f60 100644 --- a/docs/0.4/guides/self-hosting/linux/nginx/index.html +++ b/docs/0.4/guides/self-hosting/linux/nginx/index.html @@ -2,20 +2,22 @@ - + NGINX Reverse Proxy for zrok | zrok - - - + + + + -
      Version: 0.4

      NGINX Reverse Proxy for zrok

      + +
      Version: 0.4

      NGINX Reverse Proxy for zrok

      Walkthrough Video

      Before You Begin

      diff --git a/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/index.html b/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/index.html index c2866778..a01feebd 100644 --- a/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/index.html +++ b/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-limits/index.html @@ -2,20 +2,22 @@ - + Configuring Limits | zrok - - - + + + + -
      Version: 0.4

      Configuring Limits

      + +
      Version: 0.4

      Configuring Limits

      note

      This guide is current as of zrok version v0.4.31.

      warning

      If you have not yet configured metrics, please visit the metrics guide first before working through the limits configuration.

      Understanding the zrok Limits Agent

      diff --git a/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html b/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html index 496b04ca..f900e11e 100644 --- a/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html +++ b/docs/0.4/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html @@ -2,20 +2,22 @@ - + Configuring Metrics | zrok - - - + + + + -
      Version: 0.4

      Configuring Metrics

      + +
      Version: 0.4

      Configuring Metrics

      A fully configured, production-scale zrok service instance looks like this:

      zrok Metrics Architecture

      zrok metrics builds on top of the fabric.usage event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The zrok controller has several ways to consume fabric.usage events. Smaller installations could be configured in these ways:

      diff --git a/docs/0.4/guides/self-hosting/oauth/configuring-oauth/index.html b/docs/0.4/guides/self-hosting/oauth/configuring-oauth/index.html index e32dd696..cfe4824b 100644 --- a/docs/0.4/guides/self-hosting/oauth/configuring-oauth/index.html +++ b/docs/0.4/guides/self-hosting/oauth/configuring-oauth/index.html @@ -2,20 +2,22 @@ - + OAuth Public Frontend Configuration | zrok - - - + + + + -
      Version: 0.4

      OAuth Public Frontend Configuration

      + +
      Version: 0.4

      OAuth Public Frontend Configuration

      As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.

      This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share.

      This is a first step towards a more comprehensive portfolio of user authentication strategies in future zrok releases.

      diff --git a/docs/0.4/guides/self-hosting/organizations/index.html b/docs/0.4/guides/self-hosting/organizations/index.html index f2e5b7f7..c03da6c1 100644 --- a/docs/0.4/guides/self-hosting/organizations/index.html +++ b/docs/0.4/guides/self-hosting/organizations/index.html @@ -2,20 +2,22 @@ - + Organizations | zrok - - - + + + + -
      Version: 0.4

      Organizations

      + +
      Version: 0.4

      Organizations

      zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

      Future zrok releases will include additional organization features, including --closed permission sharing functions.

      Configuring an Organization

      diff --git a/docs/0.4/guides/self-hosting/personalized-frontend/index.html b/docs/0.4/guides/self-hosting/personalized-frontend/index.html index 30f86cc2..1294fe54 100644 --- a/docs/0.4/guides/self-hosting/personalized-frontend/index.html +++ b/docs/0.4/guides/self-hosting/personalized-frontend/index.html @@ -2,20 +2,22 @@ - + Personalized Frontend | zrok - - - + + + + -
      Version: 0.4

      Personalized Frontend

      This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.

      + +
      Version: 0.4

      Personalized Frontend

      This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.

      In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice.

      This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources.

      This guide isn't a detailed how to with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment.

      diff --git a/docs/0.4/guides/self-hosting/self-service-invite/index.html b/docs/0.4/guides/self-hosting/self-service-invite/index.html index 471500dc..57630b7c 100644 --- a/docs/0.4/guides/self-hosting/self-service-invite/index.html +++ b/docs/0.4/guides/self-hosting/self-service-invite/index.html @@ -2,20 +2,22 @@ - + Invitations | zrok - - - + + + + -
      Version: 0.4

      Invitations

      This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.

      + +
      Version: 0.4

      Invitations

      This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.

      Overview

      • You can create user accounts directly with the zrok admin create account CLI or API instead of inviting them.
      • diff --git a/docs/0.4/guides/vpn/index.html b/docs/0.4/guides/vpn/index.html index 76c174c3..51196528 100644 --- a/docs/0.4/guides/vpn/index.html +++ b/docs/0.4/guides/vpn/index.html @@ -2,20 +2,22 @@ - + zrok VPN Guide | zrok - - - + + + + -
        Version: 0.4

        zrok VPN Guide

        + +
        Version: 0.4

        zrok VPN Guide

        zrok VPN backend allows for simple host-to-host VPN setup.

        Operating System Requirements

        zrok VPN requires elevated privileges to manage network devices.

        diff --git a/docs/0.4/myzrok/custom-domains/index.html b/docs/0.4/myzrok/custom-domains/index.html index 74a1e9db..444b3a04 100644 --- a/docs/0.4/myzrok/custom-domains/index.html +++ b/docs/0.4/myzrok/custom-domains/index.html @@ -2,20 +2,22 @@ - + Custom Domains | zrok - - - + + + + -
        Version: 0.4

        Custom Domains

        Overview

        + +
        Version: 0.4

        Custom Domains

        Overview

        myzrok.io is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares. For example, let's say you own the domain foo.example.io, you can leverage zrok custom domains to create ephemeral shares such as: https://vw8jbg4ijz5g.foo.example.io diff --git a/docs/category/guides/index.html b/docs/category/guides/index.html index bde4d859..ced79c4e 100644 --- a/docs/category/guides/index.html +++ b/docs/category/guides/index.html @@ -2,19 +2,21 @@ - + Guides | zrok - - - + + + + -

        + + \ No newline at end of file diff --git a/docs/category/metrics-and-limits/index.html b/docs/category/metrics-and-limits/index.html index daf09cb9..79a52242 100644 --- a/docs/category/metrics-and-limits/index.html +++ b/docs/category/metrics-and-limits/index.html @@ -2,19 +2,21 @@ - + Metrics and Limits | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/category/myzrok/index.html b/docs/category/myzrok/index.html index b9284cfe..7e7b8aa5 100644 --- a/docs/category/myzrok/index.html +++ b/docs/category/myzrok/index.html @@ -2,19 +2,21 @@ - + myzrok | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/category/oauth/index.html b/docs/category/oauth/index.html index 24b2f241..45d0877a 100644 --- a/docs/category/oauth/index.html +++ b/docs/category/oauth/index.html @@ -2,19 +2,21 @@ - + OAuth | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/category/self-hosting/index.html b/docs/category/self-hosting/index.html index 3c3e1a26..ed6b4e99 100644 --- a/docs/category/self-hosting/index.html +++ b/docs/category/self-hosting/index.html @@ -2,19 +2,21 @@ - + Self Hosting | zrok - - - + + + + -
        Version: 1.0

        Self Hosting

        📄️ Organizations

        zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

        + +
        Version: 1.0

        Self Hosting

        📄️ Organizations

        zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

        \ No newline at end of file diff --git a/docs/concepts/files/index.html b/docs/concepts/files/index.html index 1b3193a1..f2a8dd15 100644 --- a/docs/concepts/files/index.html +++ b/docs/concepts/files/index.html @@ -2,20 +2,22 @@ - + Sharing Websites and Files | zrok - - - + + + + -
        Version: 1.0

        Sharing Websites and Files

        With zrok it is possible to share files quickly and easily as well. To share files using zrok use + +

        Version: 1.0

        Sharing Websites and Files

        With zrok it is possible to share files quickly and easily as well. To share files using zrok use the --backend-mode web, for example: zrok share private . --backend-mode web.

        Running with this mode will make it trivially easy to share files from the directory which the command was run from.

        diff --git a/docs/concepts/hosting/index.html b/docs/concepts/hosting/index.html index 7f16bc28..f9dd4e80 100644 --- a/docs/concepts/hosting/index.html +++ b/docs/concepts/hosting/index.html @@ -2,20 +2,22 @@ - + Hosting | zrok - - - + + + + -
        Version: 1.0

        Hosting

        + +
        Version: 1.0

        Hosting

        Self-Hosted

        zrok is not limited to a managed offering. You can host your own instance of zrok as well. zrok is also freely available as open source software hosted by GitHub under a very permissive Apache v2 license.

        diff --git a/docs/concepts/http/index.html b/docs/concepts/http/index.html index 4f7f4f32..92b248e9 100644 --- a/docs/concepts/http/index.html +++ b/docs/concepts/http/index.html @@ -2,20 +2,22 @@ - + Sharing HTTP Servers | zrok - - - + + + + -
        Version: 1.0

        Sharing HTTP Servers

        + +
        Version: 1.0

        Sharing HTTP Servers

        zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.

        The --backend-mode proxy is the default backend mode, so if you do not specify a --backend-mode you will get the proxy mode by default.

        If you have a web server running on localhost that you want to expose to other users using zrok, you can execute a command like the following:

        diff --git a/docs/concepts/index.html b/docs/concepts/index.html index 319f8f4d..b0ff6021 100644 --- a/docs/concepts/index.html +++ b/docs/concepts/index.html @@ -2,20 +2,22 @@ - + Concepts | zrok - - - + + + + -
        Version: 1.0

        Concepts

        + +
        Version: 1.0

        Concepts

        zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we'll tour through all of the most important features.

        Sharing with zrok can be either public or private. Naturally, regular web-based resources can be shared but zrok also includes support for sharing raw TCP and UDP network connections, and also includes a website and file sharing feature.

        diff --git a/docs/concepts/opensource/index.html b/docs/concepts/opensource/index.html index 12564fbf..ffa88af0 100644 --- a/docs/concepts/opensource/index.html +++ b/docs/concepts/opensource/index.html @@ -2,20 +2,22 @@ - + Open Source | zrok - - - + + + + -
        Version: 1.0

        Open Source

        + +
        Version: 1.0

        Open Source

        It's important to the zrok project that it remain free and open source software. The code is available on GitHub for the world to use, inspect, and build upon!

        Check out the repository over on GitHub at https://github.com/openziti/zrok. If you find zrok to be useful, and diff --git a/docs/concepts/sharing-private/index.html b/docs/concepts/sharing-private/index.html index 7644b530..8c3832f5 100644 --- a/docs/concepts/sharing-private/index.html +++ b/docs/concepts/sharing-private/index.html @@ -2,20 +2,22 @@ - + Private Shares | zrok - - - + + + + -

        Version: 1.0

        Private Shares

        + +
        Version: 1.0

        Private Shares

        zrok was built to share and access digital resources. A private share allows a resource to be accessed on another user's system as if it were local to them. Privately shared resources can only be accessed by another zrok user who has the details of your unique share. You are in control of who can access your private shares by sharing the share token.

        Peer-to-peer private resource sharing is one of the things that makes zrok unique.

        diff --git a/docs/concepts/sharing-public/index.html b/docs/concepts/sharing-public/index.html index dd8c9d2e..b168a6d7 100644 --- a/docs/concepts/sharing-public/index.html +++ b/docs/concepts/sharing-public/index.html @@ -2,20 +2,22 @@ - + Public Shares | zrok - - - + + + + -
        Version: 1.0

        Public Shares

        + +
        Version: 1.0

        Public Shares

        zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.

        Peer to Public

        zrok_public_share

        diff --git a/docs/concepts/sharing-reserved/index.html b/docs/concepts/sharing-reserved/index.html index d10de5f6..8c4add48 100644 --- a/docs/concepts/sharing-reserved/index.html +++ b/docs/concepts/sharing-reserved/index.html @@ -2,20 +2,22 @@ - + Reserved Shares | zrok - - - + + + + -
        Version: 1.0

        Reserved Shares

        + +
        Version: 1.0

        Reserved Shares

        By default, a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.

        You can use a reserved share to persist your share token across multiple runs of the zrok share bridge. When you use a reserved share, the share token will not be deleted between multiple runs of zrok share.

        To use a reserved share, you will first run the zrok reserve command to create the reserved share (see zrok reserve --help for details). Once you've created your reserved share, you will use the zrok share reserved command (see --help for details) to run the bridge for the shared resource.

        diff --git a/docs/concepts/tunnels/index.html b/docs/concepts/tunnels/index.html index 822a5cfe..90d1f494 100644 --- a/docs/concepts/tunnels/index.html +++ b/docs/concepts/tunnels/index.html @@ -2,26 +2,28 @@ - + Sharing TCP and UDP Servers | zrok - - - + + + + -
        Version: 1.0

        Sharing TCP and UDP Servers

        + +
        Version: 1.0

        Sharing TCP and UDP Servers

        zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.

        As of version v0.4, zrok supports sharing TCP and UDP network resources using private sharing.

        To share a raw network resource using zrok, you'll want to use the zrok share private command from your enable-d environment, like this:

        $ zrok share private --backend-mode tcpTunnel 192.168.9.1:22

        This will result in a share client starting, which looks like this:

        -
        ╭───────────────────────────────────────────────────────────╮╭────────────────────╮
        │ access your share with: zrok access private 5adagwfl888k ││[PRIVATE][TCPTUNNEL]│
        ╰───────────────────────────────────────────────────────────╯╰────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │ │
        │ │
        │ │
        │ │
        ╰─────────────────────────────────────────────────────────────────────────────────╯
        +
        ╭───────────────────────────────────────────────────────────╮╭────────────────────╮
        │ access your share with: zrok access private 5adagwfl888k ││[PRIVATE][TCPTUNNEL]│
        ╰───────────────────────────────────────────────────────────╯╰────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │ │
        │ │
        │ │
        │ │
        ╰─────────────────────────────────────────────────────────────────────────────────╯

        Then on the system where you want to access your shared resource (an SSH endpoint in this case), you'll need an enable-d zrok environment. Run the following command (shown in the banner at the top of the zrok share client above):

        $ zrok access private 5adagwfl888k

        This will start an access client on this system:

        @@ -29,7 +31,7 @@

        The access client shows the endpoint at the top where the service can be accessed. In this case, you'll want to connect your SSH client to 127.0.0.1:9191. We'll just use nc (netcat) to access the shared TCP port:

        $ nc 127.0.0.1 9191
        SSH-2.0-OpenSSH_9.2 FreeBSD-openssh-portable-9.2.p1,1

        And both the share client and the access client show the traffic:

        -
        ╭──────────────────────────────────────────────────────────╮╭─────────────────────╮
        │ access your share with: zrok access private 5adagwfl888k ││[PRIVATE] [TCPTUNNEL]│
        ╰──────────────────────────────────────────────────────────╯╰─────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router │
        │connId=2147483648, logical=ziti- │
        │sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 │
        │ │
        │ │
        ╰─────────────────────────────────────────────────────────────────────────────────╯
        +
        ╭──────────────────────────────────────────────────────────╮╭─────────────────────╮
        │ access your share with: zrok access private 5adagwfl888k ││[PRIVATE] [TCPTUNNEL]│
        ╰──────────────────────────────────────────────────────────╯╰─────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │Friday, 23-Jun-23 15:33:10 EDT ziti-edge-router │
        │connId=2147483648, logical=ziti- │
        │sdk[router=tls:ziti-lx:3022] -> ACCEPT 192.168.9.1:22 │
        │ │
        │ │
        ╰─────────────────────────────────────────────────────────────────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │ tcp://127.0.0.1:9191 -> 5adagwfl888k │
        ╰─────────────────────────────────────────────────────────────────────────────────╯
        ╭─────────────────────────────────────────────────────────────────────────────────╮
        │Friday, 23-Jun-23 15:33:10 EDT 127.0.0.1:42312 -> ACCEPT 5adagwfl888k │
        │ │
        │ │
        │ │
        ╰─────────────────────────────────────────────────────────────────────────────────╯

        Exit the access client to remove the local access to the shared TCP port. Exit the share client to disable further accesses to the shared resource.

        For UDP network resources just use the zrok share private --backend-mode udpTunnel instead of tcpTunnel.

        diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index 579895bb..8fac37c5 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -2,20 +2,22 @@ - + Getting Started | zrok - - - + + + + -
        Version: 1.0

        Getting Started

        note

        If you've upgraded to v1.0.0 from a previous version and you receive an error message like this:

        [ERROR]: unable to create share (error getting zrok client: client version error accessing api endpoint 'https://api.zrok.io': [POST /clientVersionCheck] clientVersionCheck (status 404): {}: [POST /clientVersionCheck] clientVersionCheck (status 404): {})

        Use the command zrok rebase apiEndpoint https://api-v1.zrok.io/ to update your environment to the latest zrok endpoint.

        + +
        Version: 1.0

        Getting Started

        note

        If you've upgraded to v1.0.0 from a previous version and you receive an error message like this:

        [ERROR]: unable to create share (error getting zrok client: client version error accessing api endpoint 'https://api.zrok.io': [POST /clientVersionCheck] clientVersionCheck (status 404): {}: [POST /clientVersionCheck] clientVersionCheck (status 404): {})

        Use the command zrok rebase apiEndpoint https://api-v1.zrok.io/ to update your environment to the latest zrok endpoint.

        Your Secure Internet Sharing Perimeter

        zrok (/ziːɹɒk/ ZEE-rock) is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files. There's a hardened zrok-as-a-service offering available at myzrok.io with a generous free tier.

        diff --git a/docs/guides/agent/index.html b/docs/guides/agent/index.html index be6ebc6f..a76bd7b2 100644 --- a/docs/guides/agent/index.html +++ b/docs/guides/agent/index.html @@ -2,20 +2,22 @@ - + Agent | zrok - - - + + + + -
        Version: 1.0

        Agent

        The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.

        + +
        Version: 1.0

        Agent

        The zrok Agent centralizes management of your zrok shares and accesses. It provides both web-based and command-line interfaces, and changes how the zrok share and zrok access commands behave.

        Tutorial

        Run the Agent in the foreground.

        zrok agent
        diff --git a/docs/guides/agent/linux-service/index.html b/docs/guides/agent/linux-service/index.html index 07784d9b..2c0f0966 100644 --- a/docs/guides/agent/linux-service/index.html +++ b/docs/guides/agent/linux-service/index.html @@ -2,20 +2,22 @@ - + Linux Agent Service | zrok - - - + + + + -
        Version: 1.0

        Linux Agent Service

        Overview

        + +
        Version: 1.0

        Linux Agent Service

        Overview

        Run the zrok agent as a systemd --user service under your Linux user account.

        Install the Package

        The package provides the zrok executable and the zrok-agent.service unit.

        diff --git a/docs/guides/agent/windows-service/index.html b/docs/guides/agent/windows-service/index.html index 5c3f5b70..ce250cd8 100644 --- a/docs/guides/agent/windows-service/index.html +++ b/docs/guides/agent/windows-service/index.html @@ -2,20 +2,22 @@ - + Configuring a Windows Service | zrok - - - + + + + -
        Version: 1.0

        Configuring a Windows Service

        In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.

        + +
        Version: 1.0

        Configuring a Windows Service

        In Windows environments, it can be useful to run the zrok Agent as a service, allowing it to automatically restart with your system.

        Support for running the zrok Agent as a Windows service is handled through a third party utility, nssm, which is available here:

        https://nssm.cc/download

        Give the nssm documentation a quick review, here:

        diff --git a/docs/guides/docker-share/docker_private_share_guide/index.html b/docs/guides/docker-share/docker_private_share_guide/index.html index bb000a33..6aa69756 100644 --- a/docs/guides/docker-share/docker_private_share_guide/index.html +++ b/docs/guides/docker-share/docker_private_share_guide/index.html @@ -2,20 +2,22 @@ - + Docker Private Share | zrok - - - + + + + -
        Version: 1.0

        Docker Private Share

        Goal

        + +
        Version: 1.0

        Docker Private Share

        Goal

        Privately share a Docker Compose service with a separate zrok environment and a permanent zrok share token.

        Overview

        With zrok, you can privately share a service that's running in Docker. You need a zrok private share running somewhere that it can reach the service you're sharing, and a zrok private access running somewhere else where you want to use the private share. Together, the private share and private access form a private point-to-point tunnel.

        diff --git a/docs/guides/docker-share/docker_public_share_guide/index.html b/docs/guides/docker-share/docker_public_share_guide/index.html index eb1d3e8d..b0dee87e 100644 --- a/docs/guides/docker-share/docker_public_share_guide/index.html +++ b/docs/guides/docker-share/docker_public_share_guide/index.html @@ -2,20 +2,22 @@ - + Docker Compose Public Share | zrok - - - + + + + -
        Version: 1.0

        Docker Compose Public Share

        Goal

        + +
        Version: 1.0

        Docker Compose Public Share

        Goal

        Publicly share a Docker Compose service with a separate zrok environment and a permanent zrok share URL.

        Overview

        With zrok, you can publicly share a service that's running in Docker. You need a zrok public share running somewhere that it can reach the service you're sharing. As long as that public share is running and your service is available, anyone with the address can use your service.

        diff --git a/docs/guides/docker-share/index.html b/docs/guides/docker-share/index.html index 9cb830f6..a53bd8b4 100644 --- a/docs/guides/docker-share/index.html +++ b/docs/guides/docker-share/index.html @@ -2,20 +2,22 @@ - + Getting Started with Docker | zrok - - - + + + + -
        Version: 1.0

        Getting Started with Docker

        Overview

        + +
        Version: 1.0

        Getting Started with Docker

        Overview

        To follow the guides in this section you will need Docker.

        You have the option to enable a zrok account on the Docker host and mount it on the container or you can use the provided Docker Compose project files (compose.yml) to enable a separate zrok environment for each project.

        This page provides docker and docker compose examples of mounting the host's zrok environment on the container. You'll need to first enable zrok on the Docker host to use this approach.

        diff --git a/docs/guides/drives/index.html b/docs/guides/drives/index.html index f9337a90..07568f88 100644 --- a/docs/guides/drives/index.html +++ b/docs/guides/drives/index.html @@ -2,20 +2,22 @@ - + Drives | zrok - - - + + + + -
        Version: 1.0

        Drives

        + +
        Version: 1.0

        Drives

        The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.

        Sharing a Drive

        Virtual drives are shared through the zrok CLI using the --backend-mode drive flag through the zrok share command, using either the public or private sharing modes. We'll use the private sharing mode for this example:

        @@ -38,7 +40,7 @@

        Public shares work very similarly to private shares, they just use a different URL scheme:

        $ zrok share public --headless --backend-mode drive /tmp/junk
        [ 0.708] INFO sdk-golang/ziti.(*listenerManager).createSessionWithBackoff: {session token=[05e0f48b-242b-4fd9-8edb-259488535c47]} new service session
        [ 0.878] INFO main.(*sharePublicCommand).run: access your zrok share at the following endpoints:
        https://6kiww4bn7iok.share.zrok.io

        The same commands, with a different URL scheme work with the zrok drives CLI:

        -
        $ zrok copy util/ https://6kiww4bn7iok.share.zrok.io
        [ 0.268] INFO zrok/drives/sync.OneWay: => /email.go
        [ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go
        [ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go
        [ 0.655] INFO zrok/drives/sync.OneWay: => /size.go
        [ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go
        copy complete!
        michael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok
        $ zrok ls https://6kiww4bn7iok.share.zrok.io
        ┌──────┬───────────────┬───────┬───────────────────────────────┐
        │ TYPE │ NAME │ SIZE │ MODIFIED │
        ├──────┼───────────────┼───────┼───────────────────────────────┤
        │ │ email.go │ 329 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ headers.go │ 456 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ proxy.go │ 609 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ size.go │ 361 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ uniqueName.go │ 423 B │ 2024-01-02 11:57:14 -0500 EST │
        └──────┴───────────────┴───────┴───────────────────────────────┘
        +
        $ zrok copy util/ https://6kiww4bn7iok.share.zrok.io
        [ 0.268] INFO zrok/drives/sync.OneWay: => /email.go
        [ 0.406] INFO zrok/drives/sync.OneWay: => /headers.go
        [ 0.530] INFO zrok/drives/sync.OneWay: => /proxy.go
        [ 0.655] INFO zrok/drives/sync.OneWay: => /size.go
        [ 0.714] INFO zrok/drives/sync.OneWay: => /uniqueName.go
        copy complete!
        michael@fourtyfour Fri Jan 19 12:42:52 ~/Repos/nf/zrok
        $ zrok ls https://6kiww4bn7iok.share.zrok.io
        ┌──────┬───────────────┬───────┬───────────────────────────────┐
        │ TYPE │ NAME │ SIZE │ MODIFIED │
        ├──────┼───────────────┼───────┼───────────────────────────────┤
        │ │ email.go │ 329 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ headers.go │ 456 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ proxy.go │ 609 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ size.go │ 361 B │ 2023-07-21 13:17:56 -0400 EDT │
        │ │ uniqueName.go │ 423 B │ 2024-01-02 11:57:14 -0500 EST │
        └──────┴───────────────┴───────┴───────────────────────────────┘

        For basic authentication provided by public shares, the zrok drives CLI offers the --basic-auth flag, which accepts a <username>:<password> parameter to specify the authentication for the public virtual drive (if it's required).

        Alternatively, the authentication can be set using the ZROK_DRIVES_BASIC_AUTH environment variable:

        $ export ZROK_DRIVES_BASIC_AUTH=username:password
        diff --git a/docs/guides/frontdoor/index.html b/docs/guides/frontdoor/index.html index 0281d66c..4be2fd27 100644 --- a/docs/guides/frontdoor/index.html +++ b/docs/guides/frontdoor/index.html @@ -2,20 +2,22 @@ - + zrok frontdoor | zrok - - - + + + + -
        Version: 1.0

        zrok frontdoor

        zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends.

        + +
        Version: 1.0

        zrok frontdoor

        zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io's hardened, managed frontends.

        Overview

        zrok frontends are the parts of zrok that proxy incoming public web traffic to zrok backend shares via OpenZiti. When you use zrok with a zrok.io frontend, you're using zrok frontdoor. zrok.io is zrok-as-a-service by NetFoundry, the team behind OpenZiti. You need a free account to use zrok frontdoor.

        diff --git a/docs/guides/install/index.html b/docs/guides/install/index.html index b1d0544b..d7eb5e5f 100644 --- a/docs/guides/install/index.html +++ b/docs/guides/install/index.html @@ -2,19 +2,21 @@ - + Install | zrok - - - + + + + - + + \ No newline at end of file diff --git a/docs/guides/install/linux/index.html b/docs/guides/install/linux/index.html index 8a0e05cf..4ecd5d4f 100644 --- a/docs/guides/install/linux/index.html +++ b/docs/guides/install/linux/index.html @@ -2,20 +2,22 @@ - + Install zrok in Linux | zrok - - - + + + + -
        Version: 1.0

        Install zrok in Linux

        Install zrok from the Repository

        + +
        Version: 1.0

        Install zrok in Linux

        Install zrok from the Repository

        This will configure the system to receive DEB or RPM package updates.

        curl -sSf https://get.openziti.io/install.bash | sudo bash -s zrok
        info

        Check out zrok frontdoor for running zrok as an always-on service.

        diff --git a/docs/guides/install/macos/index.html b/docs/guides/install/macos/index.html index aadafd5e..f11d2f33 100644 --- a/docs/guides/install/macos/index.html +++ b/docs/guides/install/macos/index.html @@ -2,20 +2,22 @@ - + Install zrok in macOS | zrok - - - + + + + -
        Version: 1.0

        Install zrok in macOS

        Homebrew

        + +
        Version: 1.0

        Install zrok in macOS

        Homebrew

        brew install zrok

        Darwin Binary

        macOS logo

        macOS

        diff --git a/docs/guides/install/windows/index.html b/docs/guides/install/windows/index.html index 3f9dda3d..406f733c 100644 --- a/docs/guides/install/windows/index.html +++ b/docs/guides/install/windows/index.html @@ -2,20 +2,22 @@ - + Install zrok in Windows | zrok - - - + + + + -
        Version: 1.0

        Install zrok in Windows

        Windows Binary

        + +
        Version: 1.0

        Install zrok in Windows

        Windows Binary

        Windows logo

        Windows

        1. diff --git a/docs/guides/permission-modes/index.html b/docs/guides/permission-modes/index.html index 3053ab2e..257a1955 100644 --- a/docs/guides/permission-modes/index.html +++ b/docs/guides/permission-modes/index.html @@ -2,20 +2,22 @@ - + Permission Modes | zrok - - - + + + + -
          Version: 1.0

          Permission Modes

          + +
          Version: 1.0

          Permission Modes

          Shares created in zrok v0.4.26 and newer now include a choice of permission mode.

          Shares created with zrok v0.4.25 and older were created using what is now called the open permission mode. Whether public or private, these shares can be accessed by any user of the zrok service instance, as long as they know the share token of the share. Effectively shares with the open permission mode are accessible by any user of the zrok service instance.

          zrok now supports a closed permission mode, which allows for more fine-grained control over which zrok users are allowed to privately access your shares using zrok access private.

          diff --git a/docs/guides/self-hosting/docker/index.html b/docs/guides/self-hosting/docker/index.html index b6218e7b..7769a495 100644 --- a/docs/guides/self-hosting/docker/index.html +++ b/docs/guides/self-hosting/docker/index.html @@ -2,20 +2,22 @@ - + Self-hosting guide for Docker | zrok - - - + + + + -
          Version: 1.0

          Self-hosting guide for Docker

          Docker Instance

          + +
          Version: 1.0

          Self-hosting guide for Docker

          Docker Instance

          This Docker Compose project creates a zrok instance supported by a OpenZiti controller and router. It supports flexible deployment configurations:

            diff --git a/docs/guides/self-hosting/instance-configuration/index.html b/docs/guides/self-hosting/instance-configuration/index.html index 9b03a84c..1a4f8a28 100644 --- a/docs/guides/self-hosting/instance-configuration/index.html +++ b/docs/guides/self-hosting/instance-configuration/index.html @@ -2,20 +2,22 @@ - + Use Another zrok Instance | zrok - - - + + + + -
            Version: 1.0

            Use Another zrok Instance

            note

            This guide is relevant if you are self-hosting or using a friend's zrok instance instead of using zrok-as-a-service from zrok.io.

            + +
            Version: 1.0

            Use Another zrok Instance

            note

            This guide is relevant if you are self-hosting or using a friend's zrok instance instead of using zrok-as-a-service from zrok.io.

            The zrok command on your computer uses a zrok instance over the network.

            The default instance API endpoint for the zrok command is api-v1.zrok.io. Set the API endpoint to another instance's API endpoint:

            zrok config set apiEndpoint https://zrok.example.com
            diff --git a/docs/guides/self-hosting/interstitial-page/index.html b/docs/guides/self-hosting/interstitial-page/index.html index 65dabeb2..795ae99e 100644 --- a/docs/guides/self-hosting/interstitial-page/index.html +++ b/docs/guides/self-hosting/interstitial-page/index.html @@ -2,20 +2,22 @@ - + Interstitial Pages | zrok - - - + + + + -
            Version: 1.0

            Interstitial Pages

            On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.

            + +
            Version: 1.0

            Interstitial Pages

            On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.

            Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use).

            The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges.

            By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them.

            diff --git a/docs/guides/self-hosting/kubernetes/index.html b/docs/guides/self-hosting/kubernetes/index.html index 8d510e2b..5cd00e79 100644 --- a/docs/guides/self-hosting/kubernetes/index.html +++ b/docs/guides/self-hosting/kubernetes/index.html @@ -2,20 +2,22 @@ - + Self-host a zrok Instance in Kubernetes | zrok - - - + + + + -
            Version: 1.0

            Self-host a zrok Instance in Kubernetes

            The Helm chart for zrok is available from the main OpenZiti charts repo.

            + + \ No newline at end of file diff --git a/docs/guides/self-hosting/linux/index.html b/docs/guides/self-hosting/linux/index.html index ab7193ca..13540b07 100644 --- a/docs/guides/self-hosting/linux/index.html +++ b/docs/guides/self-hosting/linux/index.html @@ -2,20 +2,22 @@ - + Self-Hosting Guide for Linux | zrok - - - + + + + -
            Version: 1.0

            Self-Hosting Guide for Linux

            Walkthrough Video

            + +
            Version: 1.0

            Self-Hosting Guide for Linux

            Walkthrough Video

            Before you Begin

            This will get you up and running with a self-hosted instance of zrok. I'll assume you have the following:

            diff --git a/docs/guides/self-hosting/linux/nginx/index.html b/docs/guides/self-hosting/linux/nginx/index.html index a6309d40..9405629b 100644 --- a/docs/guides/self-hosting/linux/nginx/index.html +++ b/docs/guides/self-hosting/linux/nginx/index.html @@ -2,20 +2,22 @@ - + NGINX Reverse Proxy for zrok | zrok - - - + + + + -
            Version: 1.0

            NGINX Reverse Proxy for zrok

            + +
            Version: 1.0

            NGINX Reverse Proxy for zrok

            Walkthrough Video

            Before You Begin

            diff --git a/docs/guides/self-hosting/metrics-and-limits/configuring-limits/index.html b/docs/guides/self-hosting/metrics-and-limits/configuring-limits/index.html index ee3726f3..1162887c 100644 --- a/docs/guides/self-hosting/metrics-and-limits/configuring-limits/index.html +++ b/docs/guides/self-hosting/metrics-and-limits/configuring-limits/index.html @@ -2,20 +2,22 @@ - + Configuring Limits | zrok - - - + + + + -
            Version: 1.0

            Configuring Limits

            + +
            Version: 1.0

            Configuring Limits

            note

            This guide is current as of zrok version v0.4.31.

            warning

            If you have not yet configured metrics, please visit the metrics guide first before working through the limits configuration.

            Understanding the zrok Limits Agent

            diff --git a/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html b/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html index d4d7e74e..84af8989 100644 --- a/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html +++ b/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/index.html @@ -2,20 +2,22 @@ - + Configuring Metrics | zrok - - - + + + + -
            Version: 1.0

            Configuring Metrics

            + +
            Version: 1.0

            Configuring Metrics

            A fully configured, production-scale zrok service instance looks like this:

            zrok Metrics Architecture

            zrok metrics builds on top of the fabric.usage event type from OpenZiti. The OpenZiti controller has a number of way to emit events. The zrok controller has several ways to consume fabric.usage events. Smaller installations could be configured in these ways:

            diff --git a/docs/guides/self-hosting/oauth/configuring-oauth/index.html b/docs/guides/self-hosting/oauth/configuring-oauth/index.html index 94bd07d0..b956403b 100644 --- a/docs/guides/self-hosting/oauth/configuring-oauth/index.html +++ b/docs/guides/self-hosting/oauth/configuring-oauth/index.html @@ -2,20 +2,22 @@ - + OAuth Public Frontend Configuration | zrok - - - + + + + -
            Version: 1.0

            OAuth Public Frontend Configuration

            + +
            Version: 1.0

            OAuth Public Frontend Configuration

            As of v0.4.7, zrok includes OAuth integration for both Google and GitHub for zrok access public public frontends.

            This integration allows you to create public shares and request that the public frontend authenticate your users against either the Google or GitHub OAuth endpoints (using the user's Google or GitHub accounts). Additionally, you can restrict the email address domain associated with the count to a list of domains that you provide when you create the share.

            This is a first step towards a more comprehensive portfolio of user authentication strategies in future zrok releases.

            diff --git a/docs/guides/self-hosting/organizations/index.html b/docs/guides/self-hosting/organizations/index.html index 2d9b88cf..c3aa404c 100644 --- a/docs/guides/self-hosting/organizations/index.html +++ b/docs/guides/self-hosting/organizations/index.html @@ -2,20 +2,22 @@ - + Organizations | zrok - - - + + + + -
            Version: 1.0

            Organizations

            + +
            Version: 1.0

            Organizations

            zrok (starting with v0.4.45) includes support for "organizations". Organizations are groups of related accounts that are typically centrally managed in some capacity. A zrok account can be a member of multiple organizations. Organization membership can also include an "admin" permission. As of v0.4.45 organization admins are able to retrieve an "overview" (zrok overview) from any other account in the organization, allowing the admin to see the details of the environments, shares, and accesses created within that account.

            Future zrok releases will include additional organization features, including --closed permission sharing functions.

            Configuring an Organization

            diff --git a/docs/guides/self-hosting/personalized-frontend/index.html b/docs/guides/self-hosting/personalized-frontend/index.html index bb67d175..5ddfb47a 100644 --- a/docs/guides/self-hosting/personalized-frontend/index.html +++ b/docs/guides/self-hosting/personalized-frontend/index.html @@ -2,20 +2,22 @@ - + Personalized Frontend | zrok - - - + + + + -
            Version: 1.0

            Personalized Frontend

            This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.

            + +
            Version: 1.0

            Personalized Frontend

            This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.

            In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice.

            This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources.

            This guide isn't a detailed how to with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment.

            diff --git a/docs/guides/self-hosting/self-service-invite/index.html b/docs/guides/self-hosting/self-service-invite/index.html index ba779551..2c8ed6b5 100644 --- a/docs/guides/self-hosting/self-service-invite/index.html +++ b/docs/guides/self-hosting/self-service-invite/index.html @@ -2,20 +2,22 @@ - + Invitations | zrok - - - + + + + -
            Version: 1.0

            Invitations

            This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.

            + +
            Version: 1.0

            Invitations

            This is how to set up self-service invitations for your users to get an account on your self-hosted zrok instance.

            Overview

            • You can create user accounts directly with the zrok admin create account CLI or API instead of inviting them.
            • diff --git a/docs/guides/vpn/index.html b/docs/guides/vpn/index.html index 251134f7..5052cec5 100644 --- a/docs/guides/vpn/index.html +++ b/docs/guides/vpn/index.html @@ -2,20 +2,22 @@ - + zrok VPN Guide | zrok - - - + + + + -
              Version: 1.0

              zrok VPN Guide

              + +
              Version: 1.0

              zrok VPN Guide

              zrok VPN backend allows for simple host-to-host VPN setup.

              Operating System Requirements

              zrok VPN requires elevated privileges to manage network devices.

              diff --git a/docs/myzrok/custom-domains/index.html b/docs/myzrok/custom-domains/index.html index b969df3a..ea689581 100644 --- a/docs/myzrok/custom-domains/index.html +++ b/docs/myzrok/custom-domains/index.html @@ -2,20 +2,22 @@ - + Custom Domains | zrok - - - + + + + -
              Version: 1.0

              Custom Domains

              Overview

              + +
              Version: 1.0

              Custom Domains

              Overview

              myzrok.io is a hosted zrok-as-a-service offering that provides a way for you bring a custom DNS name for zrok shares. For example, let's say you own the domain foo.example.io, you can leverage zrok custom domains to create ephemeral shares such as: https://vw8jbg4ijz5g.foo.example.io diff --git a/index.html b/index.html index ac91c148..ddfcb415 100644 --- a/index.html +++ b/index.html @@ -2,19 +2,21 @@ - + zrok - - - + + + + +

              \ No newline at end of file diff --git a/search/index.html b/search/index.html index 28f71bdf..64dc7d5d 100644 --- a/search/index.html +++ b/search/index.html @@ -2,19 +2,21 @@ - + Search the documentation | zrok - - - + + + + -

              Search the documentation

              + +

              Search the documentation

              \ No newline at end of file