From 10a7fb8d8708f19a0b8ff0ea6d8ef7761d2743c7 Mon Sep 17 00:00:00 2001 From: trixoniisama <93526043+trixoniisama@users.noreply.github.com> Date: Mon, 20 May 2024 01:23:22 +0200 Subject: [PATCH] Deploy website - based on bedcf1b7a534e664d1cfd676de617210ee470c11 --- .DS_Store | Bin 6148 -> 0 bytes 404.html | 6 +- ...tyles.d8c3d5e8.css => styles.a929805e.css} | 2 +- ...meme-db92f83a118086187f0de0dea1362caf.webp | Bin 0 -> 246962 bytes ...0e3af.41380c38.js => 0630e3af.7a61a9e7.js} | 2 +- ...8bfdb.896da601.js => 09a8bfdb.2bff3c81.js} | 2 +- assets/js/1599.5625342b.js | 2 + ...CENSE.txt => 1599.5625342b.js.LICENSE.txt} | 4 +- assets/js/1fabe0bd.488a4260.js | 1 + ...769d8.11611dbf.js => 20d769d8.53a493ba.js} | 2 +- assets/js/25003e4f.10b014df.js | 1 + assets/js/25003e4f.ea63b8ee.js | 1 - assets/js/37c719d6.7afdaca8.js | 1 + ...56ce8.dc9ab492.js => 41756ce8.12f3327b.js} | 2 +- assets/js/48b7ca01.9b8dfff0.js | 1 + assets/js/48b7ca01.fc8927d9.js | 1 - ...3e6dc.5c1e50b8.js => 53a3e6dc.4219249c.js} | 2 +- ...0ba71.0d3ec2f2.js => 5c30ba71.a40f75cf.js} | 2 +- ...9b2b5.70fda637.js => 6549b2b5.d50e32c1.js} | 2 +- assets/js/70de1c07.23bc15bd.js | 1 - assets/js/70de1c07.bce2655b.js | 1 + assets/js/772.fa094b13.js | 2 - assets/js/7c110bd0.5e112286.js | 1 + assets/js/7c110bd0.62d4bb39.js | 1 - ...6a12e.ad92cdfd.js => 7f76a12e.32790757.js} | 2 +- assets/js/814f3328.0981bb33.js | 1 + assets/js/814f3328.d20d1a0f.js | 1 - assets/js/8f6f5e4c.93d7d4c9.js | 1 + assets/js/915a111c.35484085.js | 1 - assets/js/915a111c.8e3ad7f3.js | 1 + assets/js/94782d2d.6eef689a.js | 1 + ...a717f.b3ed906d.js => ac6a717f.e9d17e1f.js} | 2 +- assets/js/b261517a.e1c706d6.js | 1 + assets/js/b4030b4d.4b66c6e6.js | 1 + assets/js/b4030b4d.55b3e3ac.js | 1 - ...f02bf.e7886f70.js => b8af02bf.34f376f2.js} | 2 +- assets/js/d96727fd.2dea97a9.js | 1 + ...437f7.a1a369c7.js => e1a437f7.a2870dea.js} | 2 +- assets/js/edaea366.e58187a3.js | 1 + assets/js/fda0af90.cb7232d3.js | 1 + assets/js/main.5078de37.js | 2 + ...CENSE.txt => main.5078de37.js.LICENSE.txt} | 0 assets/js/main.a10a2874.js | 2 - assets/js/runtime~main.de8f3bf6.js | 1 - assets/js/runtime~main.fd922b09.js | 1 + blog.html | 10 +- blog/archive.html | 8 +- blog/atom.xml | 409 ++++++++++++++++-- blog/av1-encoding-for-dummies.html | 8 +- blog/embedding-the-un-embeddable.html | 8 +- blog/rss.xml | 405 +++++++++++++++-- blog/site-optimization.html | 8 +- blog/svt-av1-deep-dive.html | 102 ++--- blog/svt-av1-second-deep-dive.html | 323 ++++++++++++++ blog/tags.html | 8 +- blog/tags/benchmarks.html | 10 +- blog/tags/compression.html | 10 +- blog/tags/discord.html | 8 +- blog/tags/image.html | 8 +- blog/tags/video.html | 10 +- blog/tags/web.html | 8 +- docs/FAQ.html | 8 +- docs/audio/AAC.html | 8 +- docs/audio/Dolby.html | 8 +- docs/audio/FLAC.html | 8 +- docs/audio/MP3.html | 8 +- docs/audio/Opus.html | 8 +- docs/audio/Speex.html | 8 +- docs/audio/Vorbis.html | 8 +- docs/audio/WavPack.html | 8 +- docs/colorimetry/format.html | 127 ++++++ docs/colorimetry/intro.html | 36 ++ docs/colorimetry/matrix.html | 97 +++++ docs/colorimetry/primaries.html | 110 +++++ docs/colorimetry/range.html | 37 ++ docs/colorimetry/transfer.html | 113 +++++ docs/contribution-guide.html | 8 +- docs/data/7z.html | 8 +- docs/data/brotli.html | 8 +- docs/data/bzip2.html | 8 +- docs/data/gzip.html | 8 +- docs/data/tar.html | 8 +- docs/data/xz.html | 8 +- docs/data/zip.html | 8 +- docs/data/zpaq.html | 8 +- docs/data/zstd.html | 8 +- docs/encoders/AVM.html | 8 +- docs/encoders/Aurora1.html | 8 +- docs/encoders/HM.html | 8 +- docs/encoders/JM.html | 8 +- docs/encoders/Kvazaar.html | 8 +- docs/encoders/SVT-AV1.html | 8 +- docs/encoders/SVT-HEVC.html | 8 +- docs/encoders/SVT-VP9.html | 8 +- docs/encoders/VTM.html | 8 +- docs/encoders/VVenC.html | 8 +- docs/encoders/aomenc.html | 8 +- docs/encoders/rav1e.html | 8 +- docs/encoders/uvg266.html | 8 +- docs/encoders/vpxenc.html | 8 +- docs/encoders/x264.html | 8 +- docs/encoders/x265.html | 8 +- docs/encoders/x266.html | 8 +- docs/encoders_hw/amf.html | 8 +- docs/encoders_hw/mediacodec.html | 8 +- docs/encoders_hw/nvenc.html | 8 +- docs/encoders_hw/qsv.html | 8 +- docs/encoders_hw/videotoolbox.html | 8 +- docs/filtering/deband.html | 8 +- docs/filtering/dehalo.html | 10 +- docs/filtering/deinterlace.html | 8 +- docs/filtering/denoise.html | 8 +- docs/filtering/detelecine.html | 8 +- docs/filtering/intro.html | 8 +- docs/filtering/vapoursynth.html | 8 +- docs/images/AVIF.html | 8 +- docs/images/GIF.html | 8 +- docs/images/HEIC.html | 8 +- docs/images/JPEG.html | 8 +- docs/images/JPEG2000.html | 8 +- docs/images/JXL.html | 8 +- docs/images/PNG.html | 8 +- docs/images/QOI.html | 8 +- docs/images/WebP.html | 8 +- docs/introduction/high-dynamic-range.html | 8 +- docs/introduction/prologue.html | 8 +- docs/introduction/psychovisual.html | 8 +- docs/introduction/terminology.html | 8 +- docs/introduction/video-artifacts.html | 8 +- docs/metrics/PSNR.html | 8 +- docs/metrics/SSIM.html | 8 +- docs/metrics/SSIMULACRA2.html | 8 +- docs/metrics/VMAF.html | 8 +- docs/metrics/XPSNR.html | 8 +- docs/metrics/butteraugli.html | 8 +- docs/privacy-policy.html | 8 +- docs/resources.html | 8 +- docs/subtitles/SRT.html | 8 +- docs/subtitles/webvtt.html | 8 +- docs/terms-of-use.html | 8 +- docs/utilities/Aviator.html | 10 +- docs/utilities/FFMetrics.html | 8 +- docs/utilities/MKVToolNix.html | 8 +- docs/utilities/YUView.html | 8 +- docs/utilities/autocompressor.html | 8 +- docs/utilities/av1an-command-gen.html | 8 +- docs/utilities/av1an.html | 8 +- docs/utilities/dovi_tool.html | 8 +- docs/utilities/eac3to.html | 8 +- docs/utilities/ffmpeg.html | 8 +- docs/utilities/hdr10plus_tool.html | 8 +- docs/utilities/mp4box.html | 8 +- docs/utilities/nmkoder.html | 8 +- docs/utilities/rAV1ator.html | 8 +- docs/utilities/rav1ator-cli.html | 8 +- docs/video-players.html | 8 +- docs/video/AV1.html | 8 +- docs/video/AVC.html | 8 +- docs/video/AVS3.html | 8 +- docs/video/ECM.html | 8 +- docs/video/FFV1.html | 8 +- docs/video/HEVC.html | 8 +- docs/video/Theora.html | 8 +- docs/video/VC-1.html | 8 +- docs/video/VP8.html | 8 +- docs/video/VP9.html | 8 +- docs/video/VVC.html | 8 +- docs/video/prores.html | 8 +- docs/video/utvideo.html | 8 +- fonts/.DS_Store | Bin 6148 -> 0 bytes img/preset_7_meme.webp | Bin 0 -> 246962 bytes img/svt-2.1.0-testing-blog-image.webp | Bin 0 -> 73530 bytes index.html | 6 +- markdown-page.html | 6 +- search-index.json | 2 +- search.html | 6 +- sitemap.xml | 2 +- 177 files changed, 2125 insertions(+), 646 deletions(-) delete mode 100644 .DS_Store rename assets/css/{styles.d8c3d5e8.css => styles.a929805e.css} (58%) create mode 100644 assets/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp rename assets/js/{0630e3af.41380c38.js => 0630e3af.7a61a9e7.js} (68%) rename assets/js/{09a8bfdb.896da601.js => 09a8bfdb.2bff3c81.js} (96%) create mode 100644 assets/js/1599.5625342b.js rename assets/js/{772.fa094b13.js.LICENSE.txt => 1599.5625342b.js.LICENSE.txt} (80%) create mode 100644 assets/js/1fabe0bd.488a4260.js rename assets/js/{20d769d8.11611dbf.js => 20d769d8.53a493ba.js} (96%) create mode 100644 assets/js/25003e4f.10b014df.js delete mode 100644 assets/js/25003e4f.ea63b8ee.js create mode 100644 assets/js/37c719d6.7afdaca8.js rename assets/js/{41756ce8.dc9ab492.js => 41756ce8.12f3327b.js} (62%) create mode 100644 assets/js/48b7ca01.9b8dfff0.js delete mode 100644 assets/js/48b7ca01.fc8927d9.js rename assets/js/{53a3e6dc.5c1e50b8.js => 53a3e6dc.4219249c.js} (75%) rename assets/js/{5c30ba71.0d3ec2f2.js => 5c30ba71.a40f75cf.js} (68%) rename assets/js/{6549b2b5.70fda637.js => 6549b2b5.d50e32c1.js} (95%) delete mode 100644 assets/js/70de1c07.23bc15bd.js create mode 100644 assets/js/70de1c07.bce2655b.js delete mode 100644 assets/js/772.fa094b13.js create mode 100644 assets/js/7c110bd0.5e112286.js delete mode 100644 assets/js/7c110bd0.62d4bb39.js rename assets/js/{7f76a12e.ad92cdfd.js => 7f76a12e.32790757.js} (99%) create mode 100644 assets/js/814f3328.0981bb33.js delete mode 100644 assets/js/814f3328.d20d1a0f.js create mode 100644 assets/js/8f6f5e4c.93d7d4c9.js delete mode 100644 assets/js/915a111c.35484085.js create mode 100644 assets/js/915a111c.8e3ad7f3.js create mode 100644 assets/js/94782d2d.6eef689a.js rename assets/js/{ac6a717f.b3ed906d.js => ac6a717f.e9d17e1f.js} (66%) create mode 100644 assets/js/b261517a.e1c706d6.js create mode 100644 assets/js/b4030b4d.4b66c6e6.js delete mode 100644 assets/js/b4030b4d.55b3e3ac.js rename assets/js/{b8af02bf.e7886f70.js => b8af02bf.34f376f2.js} (97%) create mode 100644 assets/js/d96727fd.2dea97a9.js rename assets/js/{e1a437f7.a1a369c7.js => e1a437f7.a2870dea.js} (97%) create mode 100644 assets/js/edaea366.e58187a3.js create mode 100644 assets/js/fda0af90.cb7232d3.js create mode 100644 assets/js/main.5078de37.js rename assets/js/{main.a10a2874.js.LICENSE.txt => main.5078de37.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.a10a2874.js delete mode 100644 assets/js/runtime~main.de8f3bf6.js create mode 100644 assets/js/runtime~main.fd922b09.js create mode 100644 blog/svt-av1-second-deep-dive.html create mode 100644 docs/colorimetry/format.html create mode 100644 docs/colorimetry/intro.html create mode 100644 docs/colorimetry/matrix.html create mode 100644 docs/colorimetry/primaries.html create mode 100644 docs/colorimetry/range.html create mode 100644 docs/colorimetry/transfer.html delete mode 100644 fonts/.DS_Store create mode 100644 img/preset_7_meme.webp create mode 100644 img/svt-2.1.0-testing-blog-image.webp diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 378aa3355d140ee347a79b34f6f387bba983c293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO>Yx15FO{EcvT_g08%eVmU@laG(aW9Wl7ruhjL&mdZ1O3?_k=A)~W5>z6Y&0Eq9_{I(inC%gHVIieLdeN+R-}45(32u9O>SfdWDo?y&cxpbay@vlU5e*Z5g`JQLMGw@$AAX@v;{s2pIwRL52Tx%8d r1C)j1YKyliFia^%ESKU9s1f)T8^F+EZ4n-b{}C`W_{KBvM;Z7D<=lCw diff --git a/404.html b/404.html index 5ef5c4d6f..2ff96e923 100644 --- a/404.html +++ b/404.html @@ -13,9 +13,9 @@ - - - + + +
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.

diff --git a/assets/css/styles.d8c3d5e8.css b/assets/css/styles.a929805e.css similarity index 58% rename from assets/css/styles.d8c3d5e8.css rename to assets/css/styles.a929805e.css index 3cf2d8bda..e23fa0489 100644 --- a/assets/css/styles.d8c3d5e8.css +++ b/assets/css/styles.a929805e.css @@ -1 +1 @@ -.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))}.markdown li,body{word-wrap:break-word}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,code{vertical-align:middle}.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)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}: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;--docusaurus-progress-bar-color:var(--ifm-color-primary);--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;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.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%}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)}.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}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{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}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)}.centered-text,.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{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,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{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}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.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,.header-discord-link:hover,.header-github-link:hover,.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}.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;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;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)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.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)}.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)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.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,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{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}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";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}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.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-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);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__brand{margin:0}.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)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.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{-webkit-appearance:none;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:.9rem;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);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;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__link:hover,.sidebarItemLink_mo7H: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%;line-height:var(--ifm-heading-line-height);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}#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}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.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 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:24px;width:24px}html[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='%23fff' 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}.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}.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;z-index:calc(var(--ifm-z-index-fixed) + 1)}.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,.hideAction_vcyE>svg,.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}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.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%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.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}.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}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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;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}.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%}.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}.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)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}: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);-webkit-clip-path:inset(0);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)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@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,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.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}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@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}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{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 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 +.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))}.markdown li,body{word-wrap:break-word}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,code{vertical-align:middle}.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)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}: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;--docusaurus-progress-bar-color:var(--ifm-color-primary);--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;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.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%}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)}.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}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{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}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)}.centered-text,.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{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,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{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}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.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,.header-discord-link:hover,.header-github-link:hover,.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}.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;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;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)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.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)}.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)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.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,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{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}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";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}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.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-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);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__brand{margin:0}.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)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.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:.9rem;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);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;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__link:hover,.sidebarItemLink_mo7H: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%;line-height:var(--ifm-heading-line-height);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}#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}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.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 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:24px;width:24px}html[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='%23fff' 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}.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}.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;z-index:calc(var(--ifm-z-index-fixed) + 1)}.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,.hideAction_vcyE>svg,.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}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.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%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.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}.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}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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;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}.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%}.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}.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)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}: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)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@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,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.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}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@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}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{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 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/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp b/assets/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp new file mode 100644 index 0000000000000000000000000000000000000000..e8020a7ef069ca3927432aeb3b47be4edb6964fa GIT binary patch literal 246962 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
oBIba? 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%0AND8JBmqi2-p+J%L1{(t32!Q?JSS$eR zishd9ROLx!^S3YH?%i+_(i*!d%{u)w>;6<z zD=$nim6PxtUom&O$$nGER80R7hhPk3%Y5jBP9(`BcQd3Z=Wy&@#T(Y=GHe;8FH%qh zT-3y~ZIB;v2DABSSOPLO{{qf`av7Y1mOZ$RoKsEme(XVf&25KUdpo#APpG`5wZqT)~& z@`NA&G%dG?W@Q|czo8H-02`TC*4v~e+89#E^jL7Es)UNMZn@d3!Hc{#W@3V+2n!yU zmW}Q@v`Ee!gS2B{c_WL z?t?Lz;;3fl_QPTYN}7jL&Cg!|MNw!H7@91^+|y!Y7}!bj@9cIAhE z`@r#dM9slufq{SLmVQHLNoKrU&efCsO!~>Cd06^y)Av*PtAUwzFN>y+o~-XJQ@)?{ zKT&^eE|S_^^(P*FG(cD%v*w~vdF?qof*!1IolYslS7zXP1!xA#47pd&C#0gH72rew zaDBv_XgCOkhl6`be2(3CtUV=_6KM;?YK{(kkyb5kD?O=@*1P1|g`l=Z{p?1dghw}B zc$xHRQ-Dk)B>_4rDcg>)qx`wLV$Qss^{(c7!*C5847lUsq}?q*OKXe;0U&@?&5hA{ z(i(W7Gcy5_=zICJpvzU64g>&d8J32cJ#ud_K+l_jBendX%NSb~8>(0luV~W@doomS zDA@w(yzkGx$iDx3XjrBVNeeu33EPjvW8s^5BEDg#G#2my9!aYV6dzGwu=MXnYb#n;=#A z_RXbU*@Ikd59*#P0WUGd6nCjm-9qJ9U0u73g=IXTiRrTglca6s23cNmL&=pWE};45 zgGmR3r;zoU!~{CR@=aNlY!W>!a`PC*5<2HQt&VltUDv$ZQ7icLJbDn1GxejED|EO& z;Jj-s)Fu*niBC7!LzUlQIgH!G?D5#&a-%GMlHEi}*!MZE^U7Cq?oQZ|mnz}uD;TfC z-=!NKD->Xm_2!p}E~mbXXStW-tfHQtdmndP?X6hf$ayn$ad$>TrDlObJqtUIf09Rn z!IGmh*wS%{^srtx{(?2jiL{EQNyI{a2~r)lgE?K|8^?hR@o)?P1oA2VA|4mT-+@5zn*ozxkRqNO#KZ*9#6mum@!nD8 z&5h4i~Hqam6!UeZLUZyE@9X`1^`E3-x?E>MqGe8AcHtXnenrml+O;`#bC@DB(Wgo04g9*e_5Eet!M*px;Y1=BLo>0HvSwnq z#RtL=(XlW2FkoMLAcbKR-XLZ@4jpu#mY0e^D^wWyrkcw$r}BMn<&Oa%R6sQKJ@>^l z|Lb(ewPp*3(#5%Ti;Y;RSdM^y%A|!ybj*BNy6km$`F3YFKM~P)H}Vt9&1}(O>}X z%a_c)XfqPPTKtwWy*{Ft$zfe_ba*e2!cLCs_A_6eVIA5g= zfHm%jg>P6#ifCvO8i}7^jr-1qU__N7?bEFa@ev*BDp-W9vY54|oPih#VFpm1WRaAK+U%>;An091=*M?MP&h|?yb-9#19Pag%! zBMkTW+4sx9(Cyp?%~vMrmSI~aldNvm6O6Er|$t-94^x7=k9wR4>tzi;Y!iQqpq<@5m!?L=qSY1~7PiLH}4PB3+Ruu}(6XJD%bQ&&ZI~jvh~= zLp0iB)xq0pfaaCLyKBQ|{#rs?XMh%xRclN*QDRJ2)~shY&($3Y$&^kc{nX^*BT0Ua zQCk5(q^*er^^hR4wc}^&dskb&4t-*6ii+y_@ki$GG+y=C+}%>>SrYQfcWGXwcWdP~ zX+uqEHU4cSKcx}mpp;V6m>W)Gm;xujb&0cRC0O6ir!Ywzf(ID78}9}w8(M(kZMY5H z(HZh$e9AA)8eJ~2e<>)Lx19Q>RQ+Ss@oI&0n6q@_I^yU>?c>+o&q6{Tt2`&how_Q# z(QB>oKf*9SH2_LK${sESWG{_1!;{H)eVqk0O5(40V^mYwTT_C8hW3VOrA>yXDuREN zZ+|Jo&^PY0G%MwL*gso6dsmARVb1hv`Bh(H1N&{cOY(=0q9!?5L{X?GInJp8VOeRo zj6p2+NP{1hnJG&i)wSJZmRA4hcVQimIt1BTh|v+_@!3Cl$9d1nn4p(Q(i5 z!T;9h?mEezIOf0Z4U;2iA^=k7p(}*flR>`Kc!9aol>lI{re>FZvwu_hm-ui+x*LXG zsHMWXposwf(TM6EsD$QjR{CA3*L9N%?89IRQWzwoCPesZdz;5zjY+)mUHi$ozc=@Q z^1Ckm^^Xd_3yUP*y_|ZitUhP$krJaYS~_-AmfJEvcb~UQJ%fCYu+MmRpa=`oXRO&QuiabB_;XHhyuNHQAB3BnAb@c^GTl8}<^ z8*<*HHyl7%C1`u|Nt1N(fcgAVyX~QF>Z4Bkco0g_9);u}&WIN-tRClGaF*ztLf|)P zSoB>j6}9@qCuKmL2L zaNUZgNqysuzaO;a@P0?NZP>5=cOe`vXnPsN(`eBcYjWd(DrS4kn8iSfkJnQq z#y!=xV{@$UVSi|=&Y`y=LD~`?EjBLKedmcJ@fAvixM$N&+Xle!mO0~wzWVz{+q09uFMr+Y zO$OaA1pp#Ko2|SkJUQr)Xqvo|V>$Pz{p2u^fg_aX{l`n6E_Hn_r)^fQjox`9Z;TwK zT<5qy$`sJV3d$}^gW;a{ii2qMU=qoOrBXr_V{oOb@uoXqy0rlhvza+2zVnQ`y5tNH zoRP5~!bAisPazaDaAPT68UQGM0B-A)qNbP?OF$wttPvVG6xuoCrgJCdBcpaQ1jS;a zdv`rlPcLL?3HU}eW_3U~1p`G!3lL?KUaCUS2|n6YGU+^t;sy{vJljv~*im9WM*PYb zq%;Bv0+?I8f}cI8Dw0TI9#do$L?W4))DDC>8l?7*KXU8SG6-uZdT=RH=XhaGRl#ES zj$7eRFBxb>2M-V5tZsQgyr?~4*o;wl32j7|S(UhqOBb2I9YenB%SVsA{7@K0;?x(= zi*nn_lXh2Jrs=z!W8^9E22OlrHf?^`UHd_)9jeKvh!mL+r!$k)6%CL<_i$tIVR_l= z!Y|qvLr(4=y>9#O*P(vx?-%|z>mA&NMAO_3!aC-Ecm12OLWw&0R$WCg(ZAqij29w$z?ok|X`TmD|y*heRES zFWOX{Z2~Mzqpb|!_!1q5+(9XrU)%9a&BB_n!`a`2|Y09yn zpa27K12u4>m|wG4Z74p}h)xRxz~(M3sYH1G`ti&9VbeGo@Wo=6N^3>t(0@O%2 z-UXR60}7xxOu%z(=o! z_c$xs$wJlKH4AI>((&R520LGhRA;fVtrAi6GyWs%QjV93v ziNx2Yjg}nVz4aB%tD|YmOzR{ZUF`dD#;t;dF-sD8V<>YB{%x~WZ}HncSbL3rb2C}$ zq-yW7rxcDgGKc2f8(uV(<=M7XwZy>b*+qAT0Vq=Uc^c};%CMP75 zDI4t*S{FaR*&+Bo*4ZkSWIW)CbZ()kgK6dG$@_N1;buJHOE0w3>mDJxxT{`6<2_#N zzTmk)(wYYd(^A#d^m(RXnVbzm&o1v&=G+hPk)yAvTV5I}iNN3lL}Y^YcX%OcB4F-v zV|XJ)4+wgP%HMX}X5$J4nd9eoLj+N_Y@*U!MlX36s1aUWd@>Z5V;@<3L1btw=1AhE z;myd)w+2ZDn1DX($Vop6 z=?lLx!7H_#&xLtxL1GLIK&5l}M(-`0aRI#4>!{9 z7{#mr(94Q27}^lVPZ9<&gBSqAU1T_n8TDoIrG;xE7@4sHm_}B0hyXsZgcL(p%TM3Gy z%+b{Fcs^IwnOU5Qq;$IPQID&pTRh2lI#$1poyhc55zl>Yu`o$0ZlEwc&5SfLU^0;u zC_RyLE%NrIsqc2bP7~(7K0R@5KhkUGd*wUpoOXsseNrT}oeKq{A4fUb#!(mux*=O*uaDs?G| z#E+%w)``+*#m^usQ&O!a_R3qP)~^M}P}hw5Un4LTJCi-tmg15>{khk@@qAOTp-NHb zlvPvOUF~FEfLAqAR+(mN6N3#%MPGKo$0~XB5o%|B+Vp4u{CxEQrq?5;uhlLox zvJE8P2mA42($72M>o6ZVVE@z@R(3GFyFq)qGy-~}WkyA-_qA5XUPBX5m%|-?eZI8R zUy0;RkC7Ub0j;3rALY^pQ{lmCRCo+fgitV!%vR_xQl+A!(o+WjR)X-=BwJ2tppTF^ zzy|>8yz$n$09Zyu9<`Tv`4JUA$@2~z1A&wS?jVRT02&lpDW{ApVb8urU^K|s0RR-p zgt4dU(YP`|iAC8A;^5tB##()cTPtKiP^oi|_ zdchhC&^%%D6yb~}=Fm&T>pdyC8Q3TY)bWBSP59HhW|^zU^DYm1|EZ@fpUR0{+e7PU zOQA{GyLHZu7ViX;uG~PP;hMmQ9SB7Eai5dn+xCVz93Ee8fZ(3Z@9-g<=TQ<}pMSq~ zR`mP*`R#oMasG*^osvE~IP71OiNL^jV&pTeNt9f69w$+4)cn#!Pr+0mPhdGegOaQE zxxG2p^`f8xCNzQ22ukB0w2_-L%!#gqz39?%p^}bC)D5k zAgxrw5?Y#oqQh7tAoVC?8ls3V&dvxR6zihmsQ>_>!KWI>lmy!-Akrj9 ztxT7QEa!{vhX??}fCd611i~>xr1{}hwvHe~GX(JkiX@7cZ{CaB!fA>FNDaCF~p~J;jd<<%%@S>K!i~LtZ;5z@5ERtJ~B9C8>4V z2qUd)CaMR+?MXafrvhVtjId~I?tom zVQ(Jh8p>fCE$!YKL-0tj?}xjB={yEG*X#Bbt{+;Zr`RCJr%>a?Iee=U8D062!@kXX zZ}>3Irqv0x1S!p~9Ajp=}l3Fvf(juhv>Kr%g+~c5Kcq zbG~fRh@keQc1`Ze@=szAs1I$n9CXPkixOTV(o}1t>r^Ok#3U(@qU4FXYHV*u55U#D zwl>BO=@ag~xwUn%?hpYbt&;05gs@>;_Z8Mv4RFHq+U}+G^nJdr9z!^`A161Min~T5l z&!c#j?@#qac0ErBeRlroJU>(?^%+=Qs(=Y4kzpJzBZ&7ha!c;9#s;U(d!2#o-S6wam9Fo9+InhpTY|O1i(_A(okH|l%E|dW?k;bp>a1~J!dSj4)6P%n^YB>EvDv@8d^XhU@&W& zxW=(ErG^@&X3NR>9o6?51{JJOAw#=Iv^Z&;UAmAaK8AM=^xnF53Ne}^XxTeR$7 zcBPrk6XV}9HHSuzPKY0JC7Du3XLIJpqkd~CR zgeZJ;qTO~Y4uuuVhV{ud)Y(Oi)*igF(rn+nc01TE)QGp3Os*=QqkUMnct06GAih=pVU3-+(ho>Bl;^OBm;DV&}l3>_9T%;Nf% z5KlV1*Xi?A4ovJzIk8cQansPd)5mEi5Y&0>@E<<#?z#43O}wxe!0Z5i^ukypOFU`5 z(p0d_epnh`+0sfJdSf&qv(0UWalN)D^+^x|LDA5FFjyj-2uA}0Pf2J73_z2y1!wOX zPIPm3%@`WK&htZSYj9WOk*BB%-N3NG*bLy(N@BxUrXX+Bm%c-Y`N8{3A7?K{^Wx1F zZBqajD7PS}lp3OQtt8OEZ4@ny*CgJvq9w!(-0Qw?`Fi^)mk3oz?Hv1gV!guuZ9W_ z!`APDK*+D5VuQ}~jLu8EY3Ofhk5DJhvAkNtDk63Lo8+6)<`u&&^mn-00uuNVx(!9nO!*S-u6HUBv! zsuW79Z&nM}bS!0+9e4+O)*gE)(57*!xkLsjurSqz4AJRQz%nF?F@tFCNAglhcFgUcM;# zi})$_s!Ss2u$!1vJCV8!=OOp5#NK-Ayd%>bZ}QFRZ-tigeyIB^Yw_N1N1uRN`TD-v z$6kxWAxmJRI&~3O4t7NUAVQs3O4TG~R?Et3II1Zd@Fp>nGs|yv&*s@Tay1XTj=>xl z6rS*;Tvx)z@oj;t8381o%};|S^S^KkoB`!U$H@QqdluTz!1%0-{-o0AGf{Lf!tBEn z4OhCk?)hvmhjv~{?%Vv6d{J`B^5sKw?rV3f?2adPqIl`F7*?I717nGv!GM#~r& zEzt~AnSaoTXRNogU336|NFCXiem+PV*xO!Z?t0vAR<2%1&%8URq-a-A)6>EZTAE<| z_=QAApg#;UvvtMx&a4*uxWqMg*NLo)kOE3vMw`RJSKshS2|L>e1ai!MHVZhbg+TC5 zn?A()YL-a6e)q!2#}6kO-nLr6AV2_9!2ul(m(edo42FNqGnEFg?o==hHW5v~!1|d; zzSnuMx3}mT^XvDLa@l=H;~bcHKE1Qhs>xsL|DK&i93>(M;M=J20Uu1L(8~y%yr@e7 z28ZJ>8ULVWZ1}z?a@vRz+(7y1DhMRNjzkg_@rccJyC`ePD*-<#2PeC1H_;`=phl1Hj4R&%G5#&A9AXD) zQkw-#pB^wDUvvB7E?<5-*sFE`@SkWVcXg%CTlM5UBNOb0bNU7?vT9?_l<6Y^<61(f zyS0l+(TdgnqHTHa@`^Y?6Uf%@9F0(8Z7$wdzXF8ohoZ|VxQGDvtKou1`7g#7$d@wL zyzU^CSMhU71t$y5BmMBjYqVW*1|4zD-1MWmmVjUj0qXC0lw4>SlYGLnZ^$w^j>mzBo@g~k?lBPtK~zx;|;;_*R=C*BbtO{`J;#89niA`y-QfM<9r z*J+nMB!}qL-8+mfVGP$7ZyH*?&F_GKgn>8UEI5Z-n=L(+RhJ9GH6hT2!~OcytLrX@AmP%&w74C{{*<2;8VVxk03R6Gwu zKZZMHU@L$XrYczfQ!zxeI_j4(L>Gc=m9-HeG@BX5k&B9}(aI)~yx|5p^5$mUd=(pe91|z#D`kM-{Dure3I75Ivm8m2d4~ zQSnA~NKU(Ovg(&+!+E#EyHDJ1-i+5TTK|l^uRX%qxBt0$7;>SrvHxrTdiSmAXC9H$ zdGpi9)mR(EM@e806O_*)s}W`ot^rN;ax&9pw* zmB}mI^nH14?}O?>r@fjK>Rm$cdJV^P-1}&S2-%J=br*}bA0DNh!3evFGM_Eqw+daN z4`%#(+H-L>1ndt<`BTmSoU?(shkJDKYsOxq(VZ$w2=(y zHKoIM6Bu9rYQsKnn?C;~8kD80QA&s%`9M%Dda&l0S`FFpwLw{aBBB*rQ;|%OR3H+9Z|j4@uT`x*Ir&jF|s3REQHIwb?RqQX8PTm zL3-3P+J&nxvkc(zXNn{Q9A|aT*3X}RB*@yYOIeM=I|qrzHYhL>{lT?y*(-;BNC7*Z ztU9Xx1{w0kEJYWNQ;gwl+G?{(u`!mP`FvOE3bauVBGPKgj4|nGA!GgRry_@&*3Vb& z)cfqURpv_zrTT=&%84nX8MjW6ntCR@CGxVCbna>MqvI44U}FT`&XlXJjSv^9cGOF3 z(~u_F0vhIgQV{@f-G-~^NH`J?K{<3WcjE~!vlSv|pbRSUq&UseJU`Ss>YjBUj}PDc zoM?{Zn%@bv+(ms_xqp`M(mHf8?1U|8cDZ1xhBG*5k^6Q@`CWN`_7E#CNTVkN77wrj zkR(laT5VEpZd!=j6E&0Ow4s99ncr70In+Hn_i@bQZhswnRcbH5rxEWLx#&qh_a*wr z6B$|;gN}O9(1^YlWexSwSR6-ehT4;YEEW%xq=M(5Nd@M3!#%CzG5*SlCyIS^?6J8T*F?s9ejMcW7#nBh4^}uu?h)h z(Z)q31A4hW|zR~LL@}K{|j?e%8rt)z{7fF7KNkXv-8MkK6znIBe zjk)(a^}X>j|9G*!s(!l5%lNNd%c){D*I>TdQ5in;UXY|&=7b3+=C*I$*z}{62?h|H z*gFUk0E4{BE2#)DVz>37p~UpvY-$r#1%_YXX%pl{Q);>N0i?jHE^MC2*^2!3F#$*G$VCn+~|f z#hnz^cqjo}ejZMkDxtp)RE=QrX|<~EhTHGgM0$}Bk%Y44C42v?uNeIP?u^}EQ+>6q zf+jQ2!#EA)W3;^GtR77Ch)$grdhm)q+@YR)_s(@X!PlqpSORJMmP=YX3r}f8Ij%@1 zHl!>r7v|>fvf&(~Y8;jP9187Sw1SS0B#*~l@2uK?Tm1gK{h9PvTy5F|i*DSf#!fYE z$qj**H;q28c&~c5WyAH>1E65S!q!)JT2Eq|JV#@FgyD!!Z9 zojE(f3(aie{{`MB&Fgj(mvtJ%*7-`@;Z3m0TF2FQXWLpPDFNSK-I)IO!`oNSf1zKQ zo8S2B#1~*XJG%%PtPGZ8`SkCp*0?4?ubRI}K!#u8=hlG0+dXy?Q)iaKKZhtth^6FMm@@>V) zpJ1noe_uf;Fdm(9{&-{h+UFVY7#uKGhM2e+ZtlEcZwxiOVk5#V4yd#6bWE^4y@hTH zMcFm|$SkxSVdz5=p)i015VvJ8lbzd~pohCSaZtav1$!NVqcgaHefQK_ID>&H3r5LW z0k^tKqu?d!fffMd=H@!9A4VTIgwi1z11>l@!Cd&eDr#6tRPaIM5Fkrb z`>3{G4|6=HySjAg+)xC93#FQ6&j}s;oAhW2WQt6I5J5OH;Trd#(QJeY zOyy6%5)E$*FPmPGR<~)z8`+|Jz;7$+fcjArQ%u zUjW9MT;`idFH&3dPySYMFRxmxy3DpU)h{R19ZgcSA^)~id~kVaMzWl_LqnqEI{g5;Rf4GD2_ZiR$+y zvyRQc@yIWUu_Q=lA1w!whu{{@vaamh=4Eq?6MM~O_j&6^idy(`b5m>v z1w5h=%{1cRXUQpND~TW3H7p&y@SmGZe(4+;Gb*{@XZFZeXl4nk?&yMGK?~$&n zBP4^UnUr}%Gsqm1YDF0kT>vQ<<*%gN1rgZBdwO49tawq!zRh{`0}0OXZH1C#saOD{ z4}J7%EF4Uwn_vvbM1{*n*Xq`$Y^*-EdCUi)IJv8ez zQV;h^R`z4hMiI+o9wXMNChFUL%*mJDvite$_c13hMq*L*QLIh$p3a#>sBV^4OWIXc z?!ur>THNAEsQUA!pYGN5$lWK1VI_j-7^1WX8`Z1%&fuiyq_v1n~}lBzjSB< zGY%~$bHH856nGI66(;^Ro{-V0E7B3T?8jpBnZ&I|g`3a}Un)#ots}vA+H60l@gWiD zyharG2@W`z@)V#-N#ltgpukdHhtV1sSSU$-?ttSr@(*o!D_j@|-&8pI22roENNJ>S zejd@0O0$#VvSY~rI)-OenTo3Rn%(;6qzk)sGSm2%ab{h#R%=qaQ*Mo(X;=BHL`h|K6d-HS*QLgRsYmq>P(S6a5x}2Pw`xw*_3D7og2rKvkKh=kN;X zOtLaE3Z3d8D(mQs)$kZcX_UTsV)a5%LEK!1bPI3QWZ(TfnOP5~zRmI9&6AvMr-v#X z+88acI-WquHH0uE?5{O7cihkP7R+e{_&VQ2;q`IbJTIfG-@#?|Fi+5}0)X%gJ_=5R zl4pYAEit?p{aeA)$EPX$!*@m*no_HCPqk$$n+B8E$*W5SuT^e>)CI7*r6JdX{DIS?*|}0h5=*c$0=y_FIj+#4N|^rn1JjWl&tfOCvJsmZbIlDYMp10>)=^f&>ZIEzk`D;S&gb83Yq#+rAK{4rPv$TA~fV{>uK|4&s+!^PP8pTMe z6;u7n#+~S-CX;LKB>QD@@of9)k zIITNAd2#W>|BA;uaKk|Etf#CgLZh=2ISh2~O6pg$BGm^MngBkK@q5yYO-O1th|2VEE(jea;;%##G(~ zma;lzxvU;rt+EkObZzz8vb*Lvij{TSJ8@ z+DDV1i3F2@3`$Q@g~4=Dx(d$9-8>W%63>r7C%c8gHkZ-kcA!Hvt?^(~f zw~Ln_RH({W^uM^0mu>eK&a+je69O!(skmZhqe3H8t}JwY($_$aRxs^j7!lu>T=bdL zX1@v|UWoUb01*PMx!&5E445k%bFeA-(`%IFgE|DWNvS!O>@5o>HKBRX#OY{|d?Q~o zJtV0ZMC1UZ)@U(ED&54JP%T<#(L+x$L=y?^G(w-008;Pca{)u4Y%FrR%r3FU`!kGi zK%d6`CKPVbQ6j`)iVzJg-U7;4tAIz~E^ciMsPT6!118YzqG2IM&RcM077o^ir}~Z^ zE;l3WZ9`-~5ir?pYtR_KMTJZ8jV=3ITWCw0T*G_;vQ5}Ud$lu%PxCla2q&9Hj8t^M z!ix$%O)fYbh~pH&Drq(Jt`u4;e)l7BsereV zUW~`nH~h?I?|pIQE`y2Fz2*0R{c4U$t^G)L;%#j9?u!D8h%p1yjpYT-kWePoC?-J5 zI9w3QglX0U7$n5yT=9~4$|>FO?Sgj-$nfZEHb8|yd!at?mCN~eEC;WO`&9|l-U3-Y zWbPf2<9_YC_2u#U$sKN{8=Cc}t>^hIo$ut>^YpS@6bb&plB!coBNM`6m)Z42$6Za~ zjL3LUb~`f4iRd;9@%_Ht7#Hp(7dU!xsCd~<(hL6(F6di|8DMY>3rN-0PcY{XJ zk5WM~be&%wr1w8SkF!-vTONbccDOdY%Nn z0En7e2I{l!&ePBSxjql`?0UIjgycquL)}hsV&6T{u}~;5(i{&Lj)lEq ztCzw6voAvrRNdoyJM-TPbX3@YT^asI(OEb&^|oR7Y;0q|fYBoz=_nl~jU%O{9qC55 zwAiB?=>`Gml9trbjdV8%Du^PA`O|OT->{wYp67k;`??}#n--t9CU9Kk>FO7#!qK6X zetB5W?wuk3-Tk|Dr{d%3&<8AOP(T`jK>B@~e(>thD8zYR%S{>z2LZ8UxKsYMO*Z)f-bnM` zueTYRqo@=eldam*B#(zCD&7)OY&s9jlE_l`WuWdsut}6TNdw@IkC#S(LkY27udSma z$jGoT@nMBHe<*es2?yXH5EC4iYjmZBsCJh+%;$324JtjcHGl85T`7Qt48YMPpfd@? zPT5yF%*|WO zlEY?hCLX3-LMm>CF#|@&q1Dk+z7!mslqX^~r?zboMP4n_^}qto9q}})O09A?V|puo zw_aabyz>|Qc+By8XU@OD?{jvGl38!+%LBle(}y41)+IzG5ZFkNze$|5zdjE1y>VQG zbqM@2J~(M}ab>~dI>#U4vTbL+eLr!h@G3Qy;_Hr8$d5Dm@Dijt47$v-w`xgOrFifw zX*=Zc%PNPPXoeUN1ET=tQ+D(-^hI-7v)^H=%mXg~aF;F5pbWy4gMzEAxXMKcgg~tBiGu-6AA7tTsxXnN$S#OklKy-6y-Wp8 zk6;0rrP!>|Qi+Z!t4}NUoSw=dlVg|$B@%I1zNh?vpa2R$!3NRU38U!Gmat*H9an&g zqPYU0WB9>j&60!!hwJ>*F;%xgU_C9t#_q{jJpmyw2+%}&sYeP_Mn!-V2lqeF>VE8c z(BP#0Y2NA7i92qDrL(vMOj1qu1BS5hMNR;Cng~MwF!3k#nNtyRG$I-m!em(KWwL%c z(BgR36SAFB$nuU}uAjEqyBvK!#uYFdW|)5tYGbYA3O;%e&3oAaeYHd*{uF;maF&1= z%`cLq?huwEcC9414*3MV%yCO6J+QjE+^G~lvtbBM`<1W+dlW;l6JB`NclklXp30BL zxUlI1JRR%zCxNV6Hu0lMWbqQ|s8Xy-E4G9S?Z z<|vaU>s$wykUX=brZ+`int{zwI#lH3b8M4A7M2uR7j%3m6A^ekGOW7r>Ss#`-}my{ z-$uy)=Ko%|QJ#1fCfwwE_l0IU=+@bZKWybk)@HwEg#LZ!Rd}{7DK>yMh_+PmqdU;X zvHYCz?)KZ`i-}hs9TacctG(K9xb<8|zgPg*YEuZi{rsr_-Ib2rG`SqDr*8dA%1uJip9H~k~oHHD!fS_S{&ejwP)zY``?~^dj0Ri`fPCRL`5mAgSOgApDxn>Oe!Hkgm`>1zNkj`ehHZ^ zXk%oVgc~C;3HI-B_Dso*u?{)Aq01XTHhOdVp~4X|B2_G+xBMh@#m;E)0%ixNJ%^Ti zQq%*6R%fnOkL0?=@cK)^?L()t@-NxHKZM^^y!X{LNO^`*ilZsXFc$47D;Cz84;mmM z$&1WQtojSSrZ%gmZ~bkAmy5WfTRPtM`rHELdR)j_auXeKS_Ni@r@#F^9_6`t9(D6> z4@^u;6>qoM3Y4@JHty02H}RDCSd~s6THxKh?5?t*7FeEle_n6 zyNJ#qc=m{{``=dou5W(YY!lDLP80`hdg>hmyQseOMyEkxv-X~YOP`+{Fj^RjidI*b zY&WdTS~2g+XB$Yo{xRh8^MK`NA9ePw=5)%-uk^xKGCz~y`6S+tWb5`?N^i8Lu`rU3#ikA{e#Gpj=E=)|+o zpAn4FL{Ms&6krD%9*c$kf8?Wr06Ra*83Q(W)6iNOzk%fdp-O2(ALxnt=bFedKnPTa zo)NKcsxkKmE&Nr#Sd*K}UrK8F4uLtdd(#vIAm-DhP|+ZM!!m&K8UlW#a$E+&tnZE4 zudlCPkwLz7wSGV9|f2!YFjQ+ZltKEO1Se+oo;qu zPY&B(euxy7q6sw*E7Y)L>1+5qC)cu4Aphy%_8E7OsO8d6`?;gO*c8DmZ$)iOi`lcq>k!iEGnL!djkzQ$>#`z5#P`h0bW@du0KILT}A zxt5@IFuof)N*`0Gy@)riad39@o*OGhwD0r<;_+R+wV4)4QuyM^I^IIK0?E>sJmVK? zl3m}d?rm!gSJ?D!#N=b8o4hyNd+gi3^>qGDxCnF&=`Oncq{E?p{@dk0I4bkR(L89b z&GPNnMx*;G4irjOtX&F`IlP25Hy&lCfhKwBOLrK@xRWeE)pd<9G zYuEr3it;sLl4Ch&!ViW3Da^v)*80yj=$&K`dMq4(GeyJ;$be{NW2s4a4{6qZYDWZ> ze5)^q1YSZH&rV3@D+PIsD=)04J^mKLyC!;Q!dql7*YvBib-Lb}&g+|~tasR7S~^4A z2XRLTDvDn~GMR=Cgn{kzBdAwgG>3PkSR+DNgm%th05cb*R1#K7VYK3oS2kWru~v!O zfptY;RA>N!Oi9$<(7v~YvI@JBLIuu@+Zlx-;V|9!g1J|i_pgR9L@U`7|7W071OQWS zHLD1h&r|>Dd%vpgwA;}fSOT;F_Wv@TO#Vrs?!NiLA}P4zz>zwBj)q<_P_bhUmcw$piI!>i>yzL z`E9^o8na6J$E#*fzIRQ$y<7Nm{g?Z)m)_JdsPe(GvdzldtZLTqSYk^}vdD^34&p8I zdREAFe8~BmhsQ&;x>zeuKRw45o6|oRohKju^ZXWW5r`;0uwhrenYzUG$@(W=hzl}M z(?(T=)iqRi7V$VX;RY71mI7Rq^q@5lek8WF(WtA1D@~&W?sSfc;a42E`pvW*=|v6$ zo?HulJSAqFL)U)v=;xnT)2zG?zSJxRJ$tH1HP&$3vxTN#46!jla@=jZIp1B2alO)( zOPc1Z$D0BCC<*S1#oi^W>l=T2_?i~IRG%H0Prv!Vkr<09K4K_2@O4veK$rxYOaXUG- z4>iXODZsmG%DR9R5cw(qt(ri#(lKepDhNOmeb}wIDTRO`eNY|(Nv0)&T(4TA{5k`v z5d;@15`V~pb?yvLj~mI&Zay>;pMNOj2A&J8x02)IbBnb*fkgY4OLa}qK|Wz{s)xU! zABxt5hmW8DCJgcFL-|o8GzFVN0zn>L10Wr&OkuTj1~T0`lM)e@&irZy$W~ZBDFxWY z({R4&?_OS=hzOqYqr>Z}X|3v)p;9Gm~kuQ7>W^4+V25D(gQZOX`Fk%uskr5dDAo;rRr^~;m zbu#|_o5T&-b(_VIm&xw)omaEimNz<1+qDao?(TDQ(@Q6{?LS&q4Ukv=73R7zB-@s7 zT>HE2?%P+pCY_t#Sg5z&y|)y}sP-fnyKN2|#UuyNvXtQbRIfxx}&-8yGz3qvPB~5;H zo+P(VmQ*?8T}#QtCC=r5C^Z?SZ%c3fux`#u$X!35+RUJl!MO1_vBz>7)T>2W(c-R-@k`V46m=&*Kl>E)%$OP8)6J$*0` zqZ%&AV)f)PckSgrX@SyoRy}+1X(Wonl$EAsX~jk{XlJ3?xREU*R7K8-Ck#BSS>_y6 zP|&9L^#t#dYo8Lg(XhAtqArDT6vlM>56KXy~Aeb^}s%L2pGe_$4ux!&{DS zP#hp63IUSnfp9tiIZWF6!fRW#l;J3C+l%#lE1YqWsZwINXg>%}fCwi*T3pp*Dj_HUiH;Qo zFqEnS>yU|-0mMubpFzr}-_ca4| z_zrz&$utl;O}@luslFgtT%Zk87}QIu>(YG?IFZMEQ^?d*U5GTmf}xSHQMAjUhzXdQ zqJFZYaPToUG?L(_+4l0!_^a_r4I3&jWj1YAH)Vxthwq#@sy+WOeEr$u@d458r3Jl+ zey7;?>5V?(xm?Dzmv~fvZ9gAqyIH`NeY{xn!&z09 z!=mE()uFJ5?Oa>AuS;1R*5!ls7~vKQsOOc`N(PJ@-^opFQRT*FRjh-o!z}0!@Aso{ zvJq*~x>PWYpGT)GVowMMgrg&4Bnx>x1Y)(dB$$MOf%Qb)K`?7oE6UEyB?;`u!-UDo zjV2(|!i0HQo8cC6H$giX`sh{2?n)dRK zgY{SU|K{0BLvyuU?aUETL>{f3qN(wPyxm%P1?RdwmxflPUe3dvyB8nVI1%pFt;QU3 z&5&@65KvNR0yO6fw<$ECSx&&KDX+;fRq`*9`E z%f~^~k3RO^^9iy$n@)x~+o%=)rOoL{dpVCKljTyx$xBF?HJ68H?RWU1+7y=-!T6@# zgHdyXAL?C|vWpx89CR2FNv`#QD>cfCezbLaHRZBV?BI@`n9buq#mhuS)fF-8KlCFU zB6_Ubq~KR615mUyJev>0K#^Vk^2E_NjZoHV1`f|tvG<;iI0`{Qc%8fjmX9>T=t z-nO=5i@jd{p5r|CvB(nBF@WK`+sDKB*V}p5>C>^sX~Llg{6=^4R>QlJC0tTFqvEvEi|c>|=dT-ydSs%Z&F%4uAGo zDTrjCa`^__@qv4)jE@FbVy=yjWqfugEb~QbuFTHN%%qy~K%;V*X-HUS5#fm9);<8h zxyg6sOBA??VBbPwQE1#}HT6_54qZlJXmElE=(e%aeBaPZDOalKp*nK@JE5fTejw7a zOx@!@muSTbj>W<}mpRuvs>e_1yzOmmj=l&T-Afz^^{lroGfl;X#7F!oAY*$n6Q72)UyPd;iC;ewB16DwKQ%R^RvhUvau#Vel-p;!WZkg+u6CHG(dc_6oMeSWlR%%r1WFb z?YnDWyLp3)s;Zolos>nf-F+FhbeD|KlFvp5-wapo%gLP zH@TuKrf7#;IOaFGFrx^QF=jCrPiL{%Eqv?p`Ri$ubH^_)RCEsRhVrlQlV4tmqI-noIx zsxq0iA#kWVq))%qNfS(py-aXs=Bz;PMo|>lfo=CRH8jg>>R{ z+y(BJ#9Eq>NVrH{(&(x_ArMNrXwJSID zWbc0z&^$U5gG&ob$01A*1DZi!GbptbDKOv&7li{AoMdM(6u?mlm?W;GT4|C9>_Vi_ z!tDbu7IrWd1Uyh*A-Os#aJ`BjvLlI(REWAc5%gZVJ)>S>>%wCsJUKa@iwaT2gt!rR z`Ad{EuXpOqB*GP~`K!N>le>Y9m5PlDsvac*5ncK<86F1^<6b+o9Yyzz~AW4c#)-Az8FuD7Vbt*!!3C*FXEJnNBc?3(*2?`>0%@yLIj(Y? zaPwLVdFx0z^x zEZcn3Dt0>iD@RIpZswMo`h~~U#5e_>vJB2e)!VDRIX@dimmEWa~@x*fK?5$q1(rI?);cL_Vn7+MB2kD*>Z%w9ZXui$&Uv~@HX)`vK})t0w}8J zEh(#drH?MdQy+VZY~Oo~o-8}*AWLX#hzUW+2)P_RefFhtH8Xli`iV88iFmeRXP1NI z<=)d~vxRpUysfSB8NGP>SFKnOOHL8oFEkX@Kaxa*D`tQb0E`5D$7&NN!h(z^2(U&= zRz!kRt9EEXCXjSI=6Q2ol`f}Vn#NklgVy;iJ3_Sek3ZMRs2mn6GewtN5$fd@jus7p z)b^rk$AIE$2F7!>-YWdT-sy+>G144JCd{CsaEROB>xOuMhEM8rKvj z`b*AL>asYNp)H%~Z-0?95Yr*STxn;C3R?US>>!|y1L-p5sRo7+OmHL-IK+8ZS2{b6 zUzC8$3*5Ev^pb=cy6S=&(SD)d*`t{XZYrV~)H#rFjSVOK(+s=Gztz!C8`8?x?o}z$ z-A@ETHQtaw@up@VY4tVGWje2=JW#aoc9u8=PN|QyGeuEJv0K8l`Oy)6Z!|yRI5X;7 z$KPqe_@p&<9@_yRvej!ohcB)5V+3GM$A-ox=dM@DOM{>w4!@ARdDYJsGMDyuq(YmA zLMWYv&w1&3=5CxdnUa@V4y0~b`#>`=e;iYM#jB~KiDFTpcNrpH?mFNb0=|M^=CbzE z8WcSw(m&FlA!Uorr&u)I;(|i>s%x}aZCggBXWucZcCYRr2AEJ}=};J{*cZNFC8bWP zpQ>FETY!@jlg3=W=2EXnNFO(h0gDWOWDZYn{g?FY+cN9OB+!^~i13uU(o%t})~|b> zy!_nSA@FAWaFn#szz5em-?Cm%SGI-&U;x&f1<{y{?UTzlEJS~vw0@muaBVGBVXv_O zG9a1JPz1v|KEpM#d3AZN%rYDJ(r9B=j`+>*{NlTc(z~C63Wv=^BUhSAokp_w7*j`` zOIh6#V^Y6r={CGi=cYk2gkv&8e57j{!9c7j5Gi09uX`jLT8n^&=VX{bomj;32vzn69qE<%&c%2ZogpurreQd)y;gN!bugD^ZY$SZL zpE8=bT^{P69v&saq9S#`=q0=ibBa0|dC?Vub{z*GI1`CT2nlSsVfm`zfCOTCGu(1o z9y6tRg1yznVw2kEbjKqWU}VxmaPCuDVj3a{Gw<}z|1iZQga(YCt_izk$y%p$DkE*<(aRskFIdqKT&$$q6`eM(UVVsbM5%vMw9BGr`qPov z80~Bo~8f~7FmBktd)0se5 zb`x42dxNyHu7W2PCOFFzU;2;s+E!@o-qSP8KVA95ddstM7B6~a<+41tI^s{ir-5=r zkeMe^30SFaCc}1bSy>|S5cjy|_8obgoJ`G_Gh$c=ts=;9g7zr2+GunTEhbTiUfi4H zq+z_wa)~ALrnP*0GtM1EmYi^!EU3PFGBQY3Y%;#ov(Mz0a8qmv;ekI zYG!%=KDDhlkUMwZw!!(>?Vi1JoP*@T`(O{;`^>vK&)Ex-3QjP9NK+vm_f1 ziUt!_yry_>ko1^hb8^dA{nhtOmJgnb9=kSe}r_;TRQ@>{? zlKyLTLu#-@KBsncx_sK1!0DQl`j-8eRINyzH@Mds(xr}Jx3FxS&@0Kv&-O);eO_Gf zZYPg7>}P77nv?o=WyKpIRnu68~(a7Uuz?|HyuT=@Vs!uYPT%^ zG?m$~vo^K31D>1{&hlJDwc>Al54r26Y{BxPPXJh#ugRJi=d7@N^Es>ER@uTz-SyGT z->|2U=a8@=I_>B}t87;<>rBb-YmyUZ%^iH4vs=AB;)4p2a=Ggly?4*25iJ=(*o`Tj zG?2QoqpQhkO1-shR`YW4EzkAsQ?-}d%N(%$oeU*5NhRt3j6-@N`JQRsS?+DUrS;)j z1~ryi<$&gU4v=N2P?%(XvyE2Jm`DyaK0>;XBWcUaHQ`8QC7$2x3zcs;x8Hns9oKdc zO&|)QaeM!MT(4?v`e45E@FNXCTCLA$vITVEXft)%=rDDX!p9(4Qikn!MZ>uVrbg*t zv0Si_9(aIY2to-`kS?HuZ}0xl*m`+-iB%LBchyZf)-NmBPo&pKTrH+cr<(^;rb-)| zwUiKCBs)DAw~+K{iEB~DHMN~@am?MftdB#S3f^svGhM5LheC$;t5BvOW{WWG+#*$)F)s8!J+%$xOg$@3ar{iP zq6fIdLnIvu@UVcj8O|ri`BrPA8a8gY&lXd*?v2f!9j}i$9;kH!UHqKQ=s8ze>#a58 zsm06)yT1$_8(jx^H-C;4sV3G5yX*FYNa&wmZjmNWZoM!fgpKZES!p>+=?>}Q;~8Eo zh$e*jsOLxZHLQ!Ug#Kn2035?uCb29gT(_UbB8}1pC&`(?v#%c#OhQF6MXutXGYs*1 zTusg8PJF3meZT3(l*y?e5@peoN#EGgRp>8O+-7C9lxC5X6K~RJ-|j8RK?#M%T@56b zoubNo`vMeguU~nTyv&2sbaVq8+wpXbKSqzIr%d05SlS=m$L?me_bhBNU6P0S)cZw7 z$wm|iqd*2a$Pkb*O&8@_0P|pOdMoJS`@*Nn_3Jysv_GMu(UVqF;o%u_>PK%rTu`5S zj#~hUp=3c3r0q4?IvN}5WVvevkCc1Xkm}8?BK!WWt)UFL{cz61u-^TiDUY8*+fL8G zUds{!F!jj5i~=mJk@BpiB`utY3R<=v>V7E(CsaY}!+4En<3R>exv^H^0&;OXX-!;K zFaQGJa7{e*=ByruDUI1mcU&@EaCdeZG4ZsvrwG~!M+punkdX!W(NO+yOg_iSmW24U z{f|WD9As2!d@Z3$#{koUNW!xIJg;ahkqj%9Vs=6>^|O|&uADn+L_)MFRzXgovG6!f z0KOY*FV7yWKB<+L0~u)1v)Q47z*xPjHN_a)0hw3JTpBD>|Fv9Yd{@+&sPA~gfTX9O zk_vjD0LN()#A2j{;Nfue?VorM0qNy9)^rHokX+pBn=4sZe@2X~Om#v=5{P93IG_A|^7WUg$HQp;33P@A|I~&2=DxvKpG#4tHG$0J z(8V43K?@3RTGJhZRsfA!t%t}!)K_^cs*gSffrs!5tU?geP?I(!OLp&NPj5nMvPS;0 zFl5#dK5BT1D$%=}lQOKE79H|ccomU@|7s><8~460rmkv_9b{<6hQ(}GUy;>Nop$jcW=6Y&vp`t zV5Z5;0jfwxemY{ZOQL!R*MSC?BnOg}Gy|@(R)+_7xM8+a5boVG>5oEdqgb4>hJ2+?oG*UoXne3mDo1`<- zEJnB3kq(ZplsEtpT5f4mH0~&~1U|{E%|Ko4w z%W_}`mC?p4SH}G>W*2YW+Kgw~952!Iz2D{$;o*@cbwy(gvbQ%^e`QH*J<~w2=aimT z?RAIKM3jRiG^z||8c1%#Te_~ZmtzO4=QluR@2B2gLyZ$qkc~iUb4zVz9i&MJhZXV% z`L*Ow(jxQyGa_Dhvu16l@w|zfqas1G<&GD1!Xh>rRh84+Q9V%eo~NliYEyzUBU6b7 zu<+n*n11^xC@;K=Q~$jB;}DN)s>Ai=Uj?yG7kjN*I8j=xlIZG(f`cj;*o_9;*Gr;n z?_8t*(7(yt`Ya?LA0P>^Q9%~qOstIz@N!jb`QHpxmvGRTjfy&>Jqp16q;soH9H#ha|53v{!l;k&sm8b%`(Z9*U_92@rI%!&32xc36>nigS~HcFF>glJH~@l}$G^89B{?06ga-==1P{6^YJZPsD6y0ij$@AY zPq!SXVrxTio152vmfOkjHgL=G^rd`&#_;eSe=|2X*RPyrTTUV-i+6|9$~GFUZ!Awo z^X7Iem^5r%Vi560l> z4#&5;%Dff&!NAh)t#;ehx*L^+jl73#`OqpQ1gN@|yo=Jvl{&1lf;lxpy%Y-OxyNxQZ&V#jI*smZ7hV3 zZ$cC{aZtchwP~!V??D(NSo6^LRil@|3~R@Sdwrk2N(OQv2p5tME$Z zm{i`Sb!w}cP0;e#D}5yBoCt>(F|qOT((L6Fy$Nq){bOi#Fi6)i8DK=~f z%AIEb%oLO56ozA%08;@Z*)(=27dQh3mSqP>phgS(G+l$<@j%t}M@8H3t9_ew1+Old zy*Uc*YBN8&J>rTuPu$Ab?XQ z$(YCCy#z$Y^6=^sFAXm9u|TRiXuec>4L8tTfS+*uoxfiAT`qz@S)%tz$ZPMm)820i z6Eftc(h*Rkp<_R*CNQ4y_sw=DOA9)L?)3;@rGX1=QFDAFZ}-kjKgth;!~y!|rLBPX z3>!dTbRr!F%MPL_!fJ^)wxVb{VEEG;o)6S?2}Cbqu<5WS;e+c-RlkdhgML>h%|yXP z_tliVX3r}#4!1ZMOD$*vbajcKTu+}Oq>38;+r{~CV#yEHO+ zg1HfBa38yY&P_f=uVcWRSP@ezkL%Sg?g9kGdt zsLF^=d_q%Jx8Jl!@g`S>G^`wn)~bvv2U%2y5u=%h?XBC_vTfHHVx<(qJH6Rpm?mTH zw7GV&Y~|PXx<);`)%<6!+f@Iy{t&hY?M;2~SdrMw0f+%APR_B|%m~0ok*qH9#hOk$ zh_;&ebnbbKX2hhJiA+MN_;J6x%^@_3DaNQ%W&%f&O-*Xo`>&nF|XyVPOBB0=4_O z@i?XT@$2&5jqkt33LCy3-*I?;@G`Ip0!Szb*MS?^JJbV_w@KPtTG z-q)*_)(c8F9p1cvHkT}BMmE+_XW zXQZ_7(P6S-5^;mH@L^v#6!;@5uC|!m)2{ApQ>yb$V)bN8b?u$UJFd6zSnY$DDQ=z4 ziZtkaaGT3waQjT zqoDTAMT=o;`7@xf8{z)BhetBThzR55PKQI#d&i0h+D1Uq6;C|&p`Cp>Pn>IcBIcUT@=c! zhf>MNWR8uY*aaV$N0-!f7Vx=s|GfX$Hv6kqWS;t2NU>9MLr3Y5CdM$F6Iq%b?_PV62)K$s2fI8c}Ef^I#%jl*@Mwin(>ILcfyM9jO&_wYpQ%_G7qL&Y&yq= zmz6*`KUR$lj5fs7Jt3Ad0`_gF;!g#ukZ{A;G|n=;4nI;DmhuoHkw6&GY8MGrKwu{b zTFhymXPxYZ=TIDAAPHD#wYEDC%Ho8g0s16@Ae>e`2@TKG7yP=`x!7}9(H7LQBNBK8 z+pOI@V}}a(;D7&$-J$eTE=B+AnInql`+p+N!=n|LH8>G^wK(ioI;sFuj2_w@=7DRZ z(M48qJ3;1r?tJ}wzV+Rq+wWt=-}Rd9f2Z<9t+lbj>DH!y1aIWDuw-7ni4~*1Zt&wu}^tG*r@ zvfOmd(B6q{RZtvdmehs9otgH(>#z==BY+`Lz6SHi~z2(7N3%1Mw zV2F)ajC1Tr7$rmNHz>z+FGD~hjTtOZrXv0^E4DL+Rhbs8XGGh7_58)T!;^ynU!(?! zy{#@pWTq-^jw#9Z`iJkouKyZ+V00gSCrt|NYT>*HDmn@bZ$ z#4|`Keu

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n'})}),"\n",(0,s.jsx)(i.p,{children:"< br />\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms)."}),"\n",(0,s.jsx)(i.h3,{id:"discords-end",children:"Discord's End"}),"\n",(0,s.jsx)(i.p,{children:'Traditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link "tricks" Discord by showing a "false face" first.'}),"\n",(0,s.jsx)(i.h2,{id:"strengths--limitations",children:"Strengths & Limitations"}),"\n",(0,s.jsx)(i.p,{children:"After a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below."}),"\n",(0,s.jsx)(i.h4,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can embed non-web compatible codecs such as ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"HEVC"})," in ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v",children:"MP4/MOV"}),", but the user must be using a compatible browser. ",(0,s.jsx)(i.a,{href:"https://thorium.rocks",children:"Thorium"})," or Safari version 13 or greater will work for HEVC playback."]}),"\n",(0,s.jsx)(i.li,{children:"There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can only use ",(0,s.jsx)(i.a,{href:"https://simple.wikipedia.org/wiki/Hotlinking",children:"hotlinks"}),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,s.jsx)(i.code,{children:".mp4"}),". Cloud services like Google Drive or OneDrive will not work for storage."]}),"\n",(0,s.jsxs)(i.li,{children:["You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,s.jsx)(i.strong,{children:"only discord.nfp.is can do this"}),", as it ",(0,s.jsx)(i.strong,{children:"proxies cdn.discordapp.com"})," itself."]}),"\n",(0,s.jsx)(i.li,{children:"You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"differences-between-sites",children:"Differences between Sites"}),"\n",(0,s.jsx)(i.p,{children:"As mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality."}),"\n",(0,s.jsx)(i.p,{children:"Here are the sites, each with one noteworthy special benefit:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})," - Recognition, as it is the OG."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})," - You can use Discord CDN as video source."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})," - Immediately input video source into the URL (",(0,s.jsx)(i.code,{children:"https://embeds.video/https://example.com/v/video.mp4"}),")"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})," - Attractive domain, simple layout."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})," - Lots of info dump, pretty advanced features."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"That concludes the technical overview! Next, let's cover the history of this exploit."}),"\n",(0,s.jsx)(i.h2,{id:"the-lore",children:"The Lore"}),"\n",(0,s.jsx)(i.h3,{id:"dwayne",children:"Dwayne"}),"\n",(0,s.jsxs)(i.p,{children:["In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh",children:"posted a video on r/discordapp"}),' of a link where a GIF of Dwayne "The Rock" Johnson plays caption with "Is this a GIF or is it a video?" When played, a low-quality music video of Rick Astley\'s "Never Gonna Give You Up" plays.']}),"\n",(0,s.jsxs)(i.p,{children:["The link used is now unfortunately ",(0,s.jsx)(i.a,{href:"https://archuser.de/the-rock",children:"removed"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"discovery",children:"Discovery"}),"\n",(0,s.jsxs)(i.p,{children:["On 23rd June 2022, a Discord user ",(0,s.jsx)(i.em,{children:"Clybius"})," on the AV1 Community server asked people for ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked."]}),"\n",(0,s.jsxs)(i.p,{children:["He tried shortly afterward with ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"}),". Eureka, it also worked:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"AV1",src:t(6364).A+"",width:"497",height:"421"})}),"\n",(0,s.jsx)(i.p,{children:"Clybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Dwayne",src:t(3312).A+"",width:"1108",height:"98"})}),"\n",(0,s.jsx)(i.h3,{id:"the-experiments--interactive-site",children:"The Experiments & Interactive Site"}),"\n",(0,s.jsxs)(i.p,{children:["After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,s.jsx)(i.em,{children:"any"})," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#container",children:"Containers"})," section on the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology",children:"Terminology"})," page."]}),"\n",(0,s.jsxs)(i.p,{children:["This applies to HEVC, ProRes, ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac",children:"xHE-AAC"}),", and other bizarre codecs that are rarely seen on the Web."]}),"\n",(0,s.jsxs)(i.p,{children:["While experimentating, Clybius converted one their idle domains ",(0,s.jsx)(i.code,{children:"stolen.shoes"})," into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding."]}),"\n",(0,s.jsx)(i.h3,{id:"virality",children:"Virality"}),"\n",(0,s.jsxs)(i.p,{children:["It's not long before people outside of the AV1 Community discovered ",(0,s.jsx)(i.code,{children:"stolen.shoes"}),", and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,s.jsx)(i.code,{children:"stolen.shoes"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"puss",src:t(6689).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,s.jsx)(i.code,{children:"stolen.shoes"})," as the embed site."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"mario",src:t(5716).A+"",width:"1307",height:"335"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/",children:"hundreds of upvotes within the r/discordapp subreddit"}),". The copy seems to be a compressed 720p encode. This example used ",(0,s.jsx)(i.code,{children:"discord.nfp.is"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"fnaf",src:t(3536).A+"",width:"1044",height:"409"})}),"\n",(0,s.jsx)(i.p,{children:"Note the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Top Gun Maverick (2022)"}),"\n",(0,s.jsx)(i.li,{children:"The SpongeBob trilogy (2005/2015/2020)"}),"\n",(0,s.jsx)(i.li,{children:"Spider-Man: Across the Spider-Verse (2023)"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"closing",children:"Closing"}),"\n",(0,s.jsx)(i.p,{children:"The ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies."}),"\n",(0,s.jsx)(i.p,{children:"While this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms."}),"\n",(0,s.jsx)(i.p,{children:"It is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform."}),"\n",(0,s.jsx)(i.p,{children:"Thank you for reading this blog post, I hope you learned something!"})]})}function c(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},6364:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},3312:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},9395:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},3536:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},5716:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},6689:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var s=t(6540);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5579],{1689:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var s=t(4848),n=t(8453);const o={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},h=[{value:"A Scenario",id:"a-scenario",level:2},{value:"But First, a Quick Disclosure",id:"but-first-a-quick-disclosure",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"Feature image",src:t(3808).A+"",width:"1920",height:"1080"}),"\n",(0,s.jsx)(i.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,s.jsx)(i.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,s.jsx)(i.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."}),"\n",(0,s.jsx)(i.p,{children:"It loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"stolen.shoes",src:t(7718).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.p,{children:["The truth is, there are ",(0,s.jsx)(i.em,{children:"multiple"})," site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["The big question is, ",(0,s.jsx)(i.strong,{children:"how do they work?"})," Let's get to dissecting."]}),"\n",(0,s.jsx)(i.h2,{id:"but-first-a-quick-disclosure",children:"But First, a Quick Disclosure"}),"\n",(0,s.jsx)(i.p,{children:"The Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately."}),"\n",(0,s.jsx)(i.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,s.jsx)(i.p,{children:"The entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park)."}),"\n",(0,s.jsx)(i.p,{children:"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."}),"\n",(0,s.jsx)(i.h3,{id:"the-websites-end",children:"The Website's End"}),"\n",(0,s.jsx)(i.p,{children:"If you view each website's source, you will find this specific line in each one but they may have a different order:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n\n\n'})}),"\n",(0,s.jsxs)(i.p,{children:["These are the ",(0,s.jsx)(i.code,{children:"head"})," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,s.jsx)(i.code,{children:""})," and ",(0,s.jsx)(i.code,{children:""})," tags. Here's an example of a static HTML site serving one specific video:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n \n \n some embed site\n \n \n \n \n \n\n\n

Hi

\n

Just your friendly neighborhood video embed site

\n \n\n'})}),"\n",(0,s.jsx)(i.p,{children:"< br />\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms)."}),"\n",(0,s.jsx)(i.h3,{id:"discords-end",children:"Discord's End"}),"\n",(0,s.jsx)(i.p,{children:'Traditionally, Discord\'s media embedder will impose it\'s own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link "tricks" Discord by showing a "false face" first.'}),"\n",(0,s.jsx)(i.h2,{id:"strengths--limitations",children:"Strengths & Limitations"}),"\n",(0,s.jsx)(i.p,{children:"After a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below."}),"\n",(0,s.jsx)(i.h4,{id:"strengths",children:"Strengths"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can embed non-web compatible codecs such as ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/HEVC",children:"HEVC"})," in ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v",children:"MP4/MOV"}),", but the user must be using a compatible browser. ",(0,s.jsx)(i.a,{href:"https://thorium.rocks",children:"Thorium"})," or Safari version 13 or greater will work for HEVC playback."]}),"\n",(0,s.jsx)(i.li,{children:"There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["You can only use ",(0,s.jsx)(i.a,{href:"https://simple.wikipedia.org/wiki/Hotlinking",children:"hotlinks"}),", which means direct linking to the video itself ending in the appropriate file extension such as ",(0,s.jsx)(i.code,{children:".mp4"}),". Cloud services like Google Drive or OneDrive will not work for storage."]}),"\n",(0,s.jsxs)(i.li,{children:["You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but ",(0,s.jsx)(i.strong,{children:"only discord.nfp.is can do this"}),", as it ",(0,s.jsx)(i.strong,{children:"proxies cdn.discordapp.com"})," itself."]}),"\n",(0,s.jsx)(i.li,{children:"You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"differences-between-sites",children:"Differences between Sites"}),"\n",(0,s.jsx)(i.p,{children:"As mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality."}),"\n",(0,s.jsx)(i.p,{children:"Here are the sites, each with one noteworthy special benefit:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})," - Recognition, as it is the OG."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})," - You can use Discord CDN as video source."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})," - Immediately input video source into the URL (",(0,s.jsx)(i.code,{children:"https://embeds.video/https://example.com/v/video.mp4"}),")"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})," - Attractive domain, simple layout."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})," - Lots of info dump, pretty advanced features."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"That concludes the technical overview! Next, let's cover the history of this exploit."}),"\n",(0,s.jsx)(i.h2,{id:"the-lore",children:"The Lore"}),"\n",(0,s.jsx)(i.h3,{id:"dwayne",children:"Dwayne"}),"\n",(0,s.jsxs)(i.p,{children:["In around April of 2022, a Reddit user going by the name of u/CreativeGamer03 ",(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh",children:"posted a video on r/discordapp"}),' of a link where a GIF of Dwayne "The Rock" Johnson plays caption with "Is this a GIF or is it a video?" When played, a low-quality music video of Rick Astley\'s "Never Gonna Give You Up" plays.']}),"\n",(0,s.jsxs)(i.p,{children:["The link used is now unfortunately ",(0,s.jsx)(i.a,{href:"https://archuser.de/the-rock",children:"removed"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"discovery",children:"Discovery"}),"\n",(0,s.jsxs)(i.p,{children:["On 23rd June 2022, a Discord user ",(0,s.jsx)(i.em,{children:"Clybius"})," on the AV1 Community server asked people for ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/VP9",children:"VP9"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AVC",children:"H.264"})," videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked."]}),"\n",(0,s.jsxs)(i.p,{children:["He tried shortly afterward with ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/video/AV1",children:"AV1"}),". Eureka, it also worked:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"AV1",src:t(5101).A+"",width:"497",height:"421"})}),"\n",(0,s.jsx)(i.p,{children:"Clybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Dwayne",src:t(8111).A+"",width:"1108",height:"98"})}),"\n",(0,s.jsx)(i.h3,{id:"the-experiments--interactive-site",children:"The Experiments & Interactive Site"}),"\n",(0,s.jsxs)(i.p,{children:["After the discovery of AV1 embedding, experimentation brought about the discovery that ",(0,s.jsx)(i.em,{children:"any"})," video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology#container",children:"Containers"})," section on the ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/introduction/terminology",children:"Terminology"})," page."]}),"\n",(0,s.jsxs)(i.p,{children:["This applies to HEVC, ProRes, ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/audio/AAC#xhe-aac",children:"xHE-AAC"}),", and other bizarre codecs that are rarely seen on the Web."]}),"\n",(0,s.jsxs)(i.p,{children:["While experimentating, Clybius converted one their idle domains ",(0,s.jsx)(i.code,{children:"stolen.shoes"})," into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding."]}),"\n",(0,s.jsx)(i.h3,{id:"virality",children:"Virality"}),"\n",(0,s.jsxs)(i.p,{children:["It's not long before people outside of the AV1 Community discovered ",(0,s.jsx)(i.code,{children:"stolen.shoes"}),", and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The first instance featured the DreamWorks sequel of "Puss in Boots (2011)", "Puss in Boots: The Last Wish (2022)". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used ',(0,s.jsx)(i.code,{children:"stolen.shoes"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"puss",src:t(7718).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The second instance was when highly-anticipated animated film "The Super Mario Bros. Movie (2023)" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used ',(0,s.jsx)(i.code,{children:"stolen.shoes"})," as the embed site."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"mario",src:t(6873).A+"",width:"1307",height:"335"})}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['The third instance is very recent as of the day this was posted. A streaming-service sourced "Five Nights at Freddy\'s (2023)" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining ',(0,s.jsx)(i.a,{href:"https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/",children:"hundreds of upvotes within the r/discordapp subreddit"}),". The copy seems to be a compressed 720p encode. This example used ",(0,s.jsx)(i.code,{children:"discord.nfp.is"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"fnaf",src:t(8869).A+"",width:"1044",height:"409"})}),"\n",(0,s.jsx)(i.p,{children:"Note the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Top Gun Maverick (2022)"}),"\n",(0,s.jsx)(i.li,{children:"The SpongeBob trilogy (2005/2015/2020)"}),"\n",(0,s.jsx)(i.li,{children:"Spider-Man: Across the Spider-Verse (2023)"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"closing",children:"Closing"}),"\n",(0,s.jsx)(i.p,{children:"The ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies."}),"\n",(0,s.jsx)(i.p,{children:"While this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms."}),"\n",(0,s.jsx)(i.p,{children:"It is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform."}),"\n",(0,s.jsx)(i.p,{children:"Thank you for reading this blog post, I hope you learned something!"})]})}function c(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},5101:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-av1-28dcfefe8d58784301332b8119d2e926.webp"},8111:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/clybius-dwayne-15341f187cb8e7dbfd5c4ee00451eabd.webp"},3808:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8869:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/discordnfpis-fnaf-dab5b24a63605605e7c7882d20a992a3.webp"},6873:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-mario-6de3b4071d4c09064d7323fec40530f4.webp"},7718:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/stolenshoes-puss-842a1f9165b7571d293a74be89da25c2.webp"},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var s=t(6540);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1599.5625342b.js b/assets/js/1599.5625342b.js new file mode 100644 index 000000000..416c1c450 --- /dev/null +++ b/assets/js/1599.5625342b.js @@ -0,0 +1,2 @@ +/*! For license information please see 1599.5625342b.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1599],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>S,cM:()=>b});var r=n(2456),o=n(6250),i=2,a=.16,c=.05,l=.05,s=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function v(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function m(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function h(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+c*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function g(e,t,n){var r;return(r=n?e.v+l*t:e.v-s*t)>1&&(r=1),Number(r.toFixed(2))}function b(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),c=v((0,o.RO)({h:m(a,i,!0),s:h(a,i,!0),v:g(a,i,!0)}));n.push(c)}n.push(v(r));for(var l=1;l<=d;l+=1){var s=p(r),b=v((0,o.RO)({h:m(s,l),s:h(s,l),v:g(s,l)}));n.push(b)}return"dark"===t.theme?f.map((function(e){var r,i,a,c=e.index,l=e.opacity;return v((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[c]),a=100*l/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var y={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},w={};Object.keys(y).forEach((function(e){A[e]=b(y[e]),A[e].primary=A[e][5],w[e]=b(y[e],{theme:"dark",backgroundColor:"#141414"}),w[e].primary=w[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var S=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>ct,an:()=>$,lO:()=>Z,Ki:()=>_,zA:()=>L,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(641),i=n(8339),a=n(9379);const c=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var l=n(5089),s=n(6540),u=n.t(s,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function v(e){return e.join(p)}const m=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(v(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(v(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var h="data-token-hash",g="data-css-hash",b="__cssinjs_instance__";function y(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(g,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[b]=t[b]||e,t[b]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(g,"]"))).forEach((function(t){var n,o=t.getAttribute(g);r[o]?t[b]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new m(e)}var A=s.createContext({hashPriority:"low",cache:y(),defaultCache:!0});const w=A;var S=n(2284),x=n(998);var C=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),O=new C;function $(e){var t=Array.isArray(e)?e:[e];return O.has(t)||O.set(t,new M(t)),O.get(t)}var T=new WeakMap,R={};var P=new WeakMap;function z(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=P.get(e)||"";return n||(Object.keys(e).forEach((function(r){var o=e[r];n+=r,o instanceof M?n+=o.id:o&&"object"===(0,S.A)(o)?n+=z(o,t):n+=o})),t&&(n=c(n)),P.set(e,n)),n}function I(e,t){return c("".concat(t,"_").concat(z(e,!0)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var N=(0,x.A)();function L(e){return"number"==typeof e?"".concat(e,"px"):e}function j(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var c=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,h,t),(0,r.A)(o,g,n),o)),l=Object.keys(c).map((function(e){var t=c[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var _=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},H=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,c=(0,o.A)(e,2),l=c[0],s=c[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[l])i[l]=s;else if(!("string"!=typeof s&&"number"!=typeof s||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[l])){var u,d=_(l,null==n?void 0:n.prefix);r[d]="number"!=typeof s||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[l]?String(s):"".concat(s,"px"),i[l]="var(".concat(d,")")}})),[i,H(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),W=(0,a.A)({},u).useInsertionEffect;const F=W?function(e,t,n){return W((function(){return e(),t()}),n)}:function(e,t,n){s.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return s.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const K=function(){return!1};function G(e,t,n,r,a){var c=s.useContext(w).cache,l=v([e].concat((0,i.A)(t))),u=X([l]),d=(K(),function(e){c.opUpdate(l,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var c=[void 0===a?0:a,i[1]||n()];return e?e(c):c}))});s.useMemo((function(){d()}),[l]);var f=c.opGet(l)[1];return F((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){c.opUpdate(l,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],s=void 0===a?0:a,d=i[1];return 0===s-1?(u((function(){!e&&c.opGet(l)||null==r||r(d,!1)})),null):[s-1,d]}))}}),[l]),f}var q={},Y="css",V=new Map;var U=0;function Q(e,t){V.set(e,(V.get(e)||0)-1);var n=Array.from(V.keys()),r=n.filter((function(e){return(V.get(e)||0)<=0}));n.length-r.length>U&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(h,'="').concat(e,'"]')).forEach((function(e){var n;e[b]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),V.delete(e)}))}var Z=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,s.useContext)(w),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,v=n.override,m=void 0===v?q:v,y=n.formatToken,A=n.getComputedToken,S=n.cssVar,x=function(e,t){for(var n=T,r=0;r0?ve(ke,--xe):0,we--,10===Ce&&(we=1,Ae--),Ce}function Oe(){return Ce=xe2||Pe(Ce)>3?"":" "}function je(e,t){for(;--t&&Oe()&&!(Ce<48||Ce>102||Ce>57&&Ce<65||Ce>70&&Ce<97););return Re(e,Te()+(t<6&&32==$e()&&32==Oe()))}function _e(e){for(;Oe();)switch(Ce){case e:return xe;case 34:case 39:34!==e&&39!==e&&_e(Ce);break;case 40:41===e&&_e(e);break;case 92:Oe()}return xe}function He(e,t){for(;Oe()&&e+Ce!==57&&(e+Ce!==84||47!==$e()););return"/*"+Re(t,xe-1)+"*"+ue(47===e?e:Oe())}function De(e){for(;!Pe($e());)Oe();return Re(e,xe)}function Be(e){return Ie(We("",null,null,null,[""],e=ze(e),0,[0],e))}function We(e,t,n,r,o,i,a,c,l){for(var s=0,u=0,d=a,f=0,p=0,v=0,m=1,h=1,g=1,b=0,y="",A=o,w=i,S=r,x=y;h;)switch(v=b,b=Oe()){case 40:if(108!=v&&58==ve(x,d-1)){-1!=pe(x+=fe(Ne(b),"&","&\f"),"&\f",se(s?c[s-1]:0))&&(g=-1);break}case 34:case 39:case 91:x+=Ne(b);break;case 9:case 10:case 13:case 32:x+=Le(v);break;case 92:x+=je(Te()-1,7);continue;case 47:switch($e()){case 42:case 47:ge(Xe(He(Oe(),Te()),t,n,l),l);break;default:x+="/"}break;case 123*m:c[s++]=he(x)*g;case 125*m:case 59:case 0:switch(b){case 0:case 125:h=0;case 59+u:-1==g&&(x=fe(x,/\f/g,"")),p>0&&he(x)-d&&ge(p>32?Ke(x+";",r,n,d-1,l):Ke(fe(x," ","")+";",r,n,d-2,l),l);break;case 59:x+=";";default:if(ge(S=Fe(x,t,n,s,u,o,c,y,A=[],w=[],d,i),i),123===b)if(0===u)We(x,t,S,S,A,i,d,c,w);else switch(99===f&&110===ve(x,3)?100:f){case 100:case 108:case 109:case 115:We(e,S,S,r&&ge(Fe(e,S,S,0,0,o,c,y,o,A=[],d,w),w),o,w,d,c,r?A:w);break;default:We(x,S,S,S,[""],w,0,c,w)}}s=u=p=0,m=g=1,y=x="",d=a;break;case 58:d=1+he(x),p=v;default:if(m<1)if(123==b)--m;else if(125==b&&0==m++&&125==Me())continue;switch(x+=ue(b),b*m){case 38:g=u>0?1:(x+="\f",-1);break;case 44:c[s++]=(he(x)-1)*g,g=1;break;case 64:45===$e()&&(x+=Ne(Oe())),f=$e(),u=d=he(y=x+=De(Te())),b++;break;case 45:45===v&&2==he(x)&&(m=0)}}return i}function Fe(e,t,n,r,o,i,a,c,l,s,u,d){for(var f=o-1,p=0===o?i:[""],v=function(e){return e.length}(p),m=0,h=0,g=0;m0?p[b]+" "+y:fe(y,/&\f/g,p[b])))&&(l[g++]=A);return Ee(e,t,n,0===o?oe:c,l,s,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(Ce),me(e,2,-2),0,r)}function Ke(e,t,n,r,o){return Ee(e,t,n,ie,me(e,0,r),me(e,r+1,-1),r,o)}var Ge,qe="data-ant-cssinjs-cache-path",Ye="_FILE_STYLE__";var Ve=!0;function Ue(e){return function(){if(!Ge&&(Ge={},(0,x.A)())){var e=document.createElement("div");e.className=qe,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ge[r]=i}));var n,r=document.querySelector("style[".concat(qe,"]"));r&&(Ve=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ge[e]}var Qe="_multi_value_";function Ze(e){return be(Be(e),ye).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},c=r.root,l=r.injectHash,s=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,v=void 0===p?[]:p,m=(n.linters,""),h={};function g(t){var r=t.getName(u);if(!h[r]){var i=e(t.style,n,{root:!1,parentSelectors:s}),a=(0,o.A)(i,1)[0];h[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var b=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return b.forEach((function(t){var r="string"!=typeof t||c?t:{};if("string"==typeof r)m+="".concat(r,"\n");else if(r._keyframe)g(r);else{var d=v.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,S.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,S.A)(e)&&e&&("_skip_check_"in e||Qe in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(g(t),r=t.getName(u)),m+="".concat(n,":").concat(r,";")}var v=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,S.A)(r)&&null!=r&&r[Qe]&&Array.isArray(v)?v.forEach((function(e){E(t,e)})):E(t,v)}else{var b=!1,y=t.trim(),A=!1;(c||l)&&u?y.startsWith("@")?b=!0:y=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!c||u||"&"!==y&&""!==y||(y="",A=!0);var w=e(r,n,{root:A,injectHash:b,parentSelectors:[].concat((0,i.A)(s),[y])}),x=(0,o.A)(w,2),C=x[0],k=x[1];h=(0,a.A)((0,a.A)({},h),k),m+="".concat(y).concat(C)}}))}})),c?d&&(m="@layer ".concat(d.name," {").concat(m,"}"),d.dependencies&&(h["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):m="{".concat(m,"}"),[m,h]};function et(e,t){return c("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,c=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,v=e.order,m=void 0===v?0:v,y=s.useContext(w),A=y.autoClear,S=(y.mock,y.defaultCache),C=y.hashPriority,k=y.container,E=y.ssrInline,M=y.transformers,O=y.linters,$=y.cache,T=y.layer,R=n._tokenKey,P=[R];T&&P.push("layer"),P.push.apply(P,(0,i.A)(c));var z=N;var I=G(nt,P,(function(){var e=P.join("|");if(Ue(e)){var n=function(e){var t=Ge[e],n=null;if(t&&(0,x.A)())if(Ve)n=Ye;else{var r=document.querySelector("style[".concat(g,'="').concat(Ge[e],'"]'));r?n=r.innerHTML:delete Ge[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,R,a,{},p,m]}var l=t(),s=Je(l,{hashId:u,hashPriority:C,layer:T?d:void 0,path:c.join("-"),transformers:M,linters:O}),f=(0,o.A)(s,2),v=f[0],h=f[1],b=Ze(v),y=et(P,b);return[b,R,y,h,p,m]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&N&&(0,l.m6)(n,{mark:g})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(z&&n!==Ye){var c={mark:g,prepend:!T&&"queue",attachTo:k,priority:m},s="function"==typeof f?f():f;s&&(c.csp={nonce:s});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,l.BD)(Ze(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},c),{},{prepend:!0}))}));var p=(0,l.BD)(n,r,c);p[b]=$.instanceId,p.setAttribute(h,R),d.forEach((function(e){(0,l.BD)(Ze(i[e]),"_effect-".concat(e),c)}))}})),L=(0,o.A)(I,3),j=L[0],_=L[1],H=L[2];return function(e){var t,n;E&&!z&&S?t=s.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,h,_),(0,r.A)(n,g,H),n),{dangerouslySetInnerHTML:{__html:j}})):t=s.createElement(tt,null);return s.createElement(s.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,c=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,s.useContext)(w),v=p.cache.instanceId,m=p.container,y=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,y]);return G(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:c,scope:f}),l=(0,o.A)(i,2),s=l[0],u=l[1];return[s,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];N&&(0,l.m6)(t,{mark:g})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,l.BD)(r,i,{mark:g,prepend:"queue",attachTo:m,priority:-999});a[b]=v,a.setAttribute(h,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],c=r[2],l=r[3],s=r[4],u=r[5],d=(n||{}).plain;if(s)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=j(i,a,c,p,d),l&&Object.keys(l).forEach((function(e){if(!t[e]){t[e]=!0;var n=j(Ze(l[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,c,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],c=r[4],l=(n||{}).plain;if(!a)return null;var s=i._tokenKey;return[-999,s,j(a,c,s,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},l)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],c=r[3],l=(n||{}).plain;if(!i)return null;return[-999,a,j(i,c,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},l)]}));const ct=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function lt(e){return e.notSplit=!0,e}lt(["borderTop","borderBottom"]),lt(["borderTop"]),lt(["borderBottom"]),lt(["borderLeft","borderRight"]),lt(["borderLeft"]),lt(["borderRight"])},6653:(e,t,n)=>{"use strict";n.d(t,{A:()=>$});var r=n(8168),o=n(641),i=n(4467),a=n(45),c=n(6540),l=n(6942),s=n.n(l),u=n(2200),d=n(1053),f=n(9379),p=n(2284),v=n(5089),m=n(2633),h=n(8210);function g(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function y(e,t,n){return n?c.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):c.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return y(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function A(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var S=["icon","className","onClick","style","primaryColor","secondaryColor"],x={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,l,s,u=e.icon,p=e.className,b=e.onClick,w=e.style,C=e.primaryColor,k=e.secondaryColor,E=(0,a.A)(e,S),M=c.useRef(),O=x;if(C&&(O={primaryColor:C,secondaryColor:k||A(C)}),t=M,n=(0,c.useContext)(d.A),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n align-items: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,c.useEffect)((function(){var e=t.current,n=(0,m.j)(e);(0,v.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:n})}),[]),l=g(u),s="icon should be icon definiton, but got ".concat(u),(0,h.Ay)(l,"[@ant-design/icons] ".concat(s)),!g(u))return null;var $=u;return $&&"function"==typeof $.icon&&($=(0,f.A)((0,f.A)({},$),{},{icon:$.icon(O.primaryColor,O.secondaryColor)})),y($.icon,"svg-".concat($.name),(0,f.A)((0,f.A)({className:p,onClick:b,style:w,"data-icon":$.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},x)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;x.primaryColor=t,x.secondaryColor=n||A(t),x.calculated=!!n};const k=C;function E(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return k.setTwoToneColors({primaryColor:r,secondaryColor:i})}var M=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];E(u.z1.primary);var O=c.forwardRef((function(e,t){var n=e.className,l=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,v=e.onClick,m=e.twoToneColor,h=(0,a.A)(e,M),g=c.useContext(d.A),b=g.prefixCls,y=void 0===b?"anticon":b,A=g.rootClassName,S=s()(A,y,(0,i.A)((0,i.A)({},"".concat(y,"-").concat(l.name),!!l.name),"".concat(y,"-spin"),!!u||"loading"===l.name),n),x=p;void 0===x&&v&&(x=-1);var C=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,E=w(m),O=(0,o.A)(E,2),$=O[0],T=O[1];return c.createElement("span",(0,r.A)({role:"img","aria-label":l.name},h,{ref:t,tabIndex:x,onClick:v,className:S}),c.createElement(k,{icon:l,primaryColor:$,secondaryColor:T,style:C}))}));O.displayName="AntdIcon",O.getTwoToneColor=function(){var e=k.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},O.setTwoToneColor=E;const $=O},1053:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=(0,n(6540).createContext)({})},6467:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var a=n(6653),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const l=o.forwardRef(c)},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(6653),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const l=o.forwardRef(c)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(6653),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const l=o.forwardRef(c)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>s,Ob:()=>u,YL:()=>c,_:()=>o,g8:()=>v,n6:()=>p,oS:()=>m,wE:()=>l});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=0,l=(o+i)/2;if(o===i)c=0,a=0;else{var s=o-i;switch(c=l>.5?s/(2-o-i):s/(o+i),o){case e:a=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function c(e,t,n){var o,i,c;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,c=n,o=n;else{var l=n<.5?n*(1+t):n+t-n*t,s=2*n-l;o=a(s,l,e+1/3),i=a(s,l,e),c=a(s,l,e-1/3)}return{r:255*o,g:255*i,b:255*c}}function l(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=o,l=o-i,s=0===o?0:l/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/l+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,c=null,l=null,s=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),s=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),c=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,c),s=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),l=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,l),s=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var c="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),l="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),s="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),u={CSS_UNIT:new RegExp(c),rgb:new RegExp("rgb"+l),rgba:new RegExp("rgba"+s),hsl:new RegExp("hsl"+l),hsla:new RegExp("hsla"+s),hsv:new RegExp("hsv"+l),hsva:new RegExp("hsva"+s),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>c});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),c=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],c=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+c)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function c(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>c})},5470:(e,t,n)=>{"use strict";n.d(t,{A:()=>y});var r=n(641),o=n(6540),i=n(961),a=n(998),c=(n(8210),n(8719));const l=o.createContext(null);var s=n(8339),u=n(981),d=[];var f=n(5089);function p(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var c=getComputedStyle(e,"::-webkit-scrollbar"),l=parseInt(c.width,10),s=parseInt(c.height,10);try{var u=l?"width: ".concat(c.width,";"):"",d=s?"height: ".concat(c.height,";"):"";(0,f.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(m){console.error(m),r=l,o=s}}document.body.appendChild(n);var p=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,v=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,f.m6)(t),{width:p,height:v}}var v="rc-util-locker-".concat(Date.now()),m=0;function h(e){var t=!!e,n=o.useState((function(){return m+=1,"".concat(v,"_").concat(m)})),i=(0,r.A)(n,1)[0];(0,u.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?p(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,f.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),i)}else(0,f.m6)(i);var r;return function(){(0,f.m6)(i)}}),[t,i])}var g=!1;var b=function(e){return!1!==e&&((0,a.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)};const y=o.forwardRef((function(e,t){var n=e.open,f=e.autoLock,p=e.getContainer,v=(e.debug,e.autoDestroy),m=void 0===v||v,y=e.children,A=o.useState(n),w=(0,r.A)(A,2),S=w[0],x=w[1],C=S||n;o.useEffect((function(){(m||n)&&x(n)}),[n,m]);var k=o.useState((function(){return b(p)})),E=(0,r.A)(k,2),M=E[0],O=E[1];o.useEffect((function(){var e=b(p);O(null!=e?e:null)}));var $=function(e,t){var n=o.useState((function(){return(0,a.A)()?document.createElement("div"):null})),i=(0,r.A)(n,1)[0],c=o.useRef(!1),f=o.useContext(l),p=o.useState(d),v=(0,r.A)(p,2),m=v[0],h=v[1],g=f||(c.current?void 0:function(e){h((function(t){return[e].concat((0,s.A)(t))}))});function b(){i.parentElement||document.body.appendChild(i),c.current=!0}function y(){var e;null===(e=i.parentElement)||void 0===e||e.removeChild(i),c.current=!1}return(0,u.A)((function(){return e?f?f(b):b():y(),y}),[e]),(0,u.A)((function(){m.length&&(m.forEach((function(e){return e()})),h(d))}),[m]),[i,g]}(C&&!M),T=(0,r.A)($,2),R=T[0],P=T[1],z=null!=M?M:R;h(f&&n&&(0,a.A)()&&(z===R||z===document.body));var I=null;y&&(0,c.f3)(y)&&t&&(I=y.ref);var N=(0,c.xK)(I,t);if(!C||!(0,a.A)()||void 0===M)return null;var L,j=!1===z||("boolean"==typeof L&&(g=L),g),_=y;return t&&(_=o.cloneElement(y,{ref:N})),o.createElement(l.Provider,{value:P},j?_:(0,i.createPortal)(_,z))}))},3723:(e,t,n)=>{"use strict";n.d(t,{b:()=>r});const r=(e,t,n)=>void 0!==n?n:`${e}-${t}`},1303:(e,t,n)=>{"use strict";n.d(t,{A:()=>ho});var r=n(6540),o=n(6942),i=n.n(o),a=n(9853),c=n(2279),l=n(8224);const s=e=>{const t=r.useContext(l.A);return r.useMemo((()=>e?"string"==typeof e?null!=e?e:t:e instanceof Function?e(t):t:t),[e,t])},u=e=>{const{prefixCls:t,className:n,style:o,size:a,shape:c}=e,l=i()({[`${t}-lg`]:"large"===a,[`${t}-sm`]:"small"===a}),s=i()({[`${t}-circle`]:"circle"===c,[`${t}-square`]:"square"===c,[`${t}-round`]:"round"===c}),u=r.useMemo((()=>"number"==typeof a?{width:a,height:a,lineHeight:`${a}px`}:{}),[a]);return r.createElement("span",{className:i()(t,l,s,n),style:Object.assign(Object.assign({},u),o)})};var d=n(1466),f=n(1173),p=n(336);const v=new d.Mo("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),m=e=>({height:e,lineHeight:(0,d.zA)(e)}),h=e=>Object.assign({width:e},m(e)),g=e=>({background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:v,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"}),b=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},m(e)),y=e=>{const{skeletonAvatarCls:t,gradientFromColor:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i}=e;return{[`${t}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:n},h(r)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},h(o)),[`${t}${t}-sm`]:Object.assign({},h(i))}},A=e=>{const{controlHeight:t,borderRadiusSM:n,skeletonInputCls:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:c}=e;return{[`${r}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:n},b(t,c)),[`${r}-lg`]:Object.assign({},b(o,c)),[`${r}-sm`]:Object.assign({},b(i,c))}},w=e=>Object.assign({width:e},m(e)),S=e=>{const{skeletonImageCls:t,imageSizeBase:n,gradientFromColor:r,borderRadiusSM:o,calc:i}=e;return{[`${t}`]:Object.assign(Object.assign({display:"flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",background:r,borderRadius:o},w(i(n).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},w(n)),{maxWidth:i(n).mul(4).equal(),maxHeight:i(n).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}},x=(e,t,n)=>{const{skeletonButtonCls:r}=e;return{[`${n}${r}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${n}${r}-round`]:{borderRadius:t}}},C=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},m(e)),k=e=>{const{borderRadiusSM:t,skeletonButtonCls:n,controlHeight:r,controlHeightLG:o,controlHeightSM:i,gradientFromColor:a,calc:c}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:t,width:c(r).mul(2).equal(),minWidth:c(r).mul(2).equal()},C(r,c))},x(e,r,n)),{[`${n}-lg`]:Object.assign({},C(o,c))}),x(e,o,`${n}-lg`)),{[`${n}-sm`]:Object.assign({},C(i,c))}),x(e,i,`${n}-sm`))},E=e=>{const{componentCls:t,skeletonAvatarCls:n,skeletonTitleCls:r,skeletonParagraphCls:o,skeletonButtonCls:i,skeletonInputCls:a,skeletonImageCls:c,controlHeight:l,controlHeightLG:s,controlHeightSM:u,gradientFromColor:d,padding:f,marginSM:p,borderRadius:v,titleHeight:m,blockRadius:b,paragraphLiHeight:w,controlHeightXS:x,paragraphMarginTop:C}=e;return{[`${t}`]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:f,verticalAlign:"top",[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:d},h(l)),[`${n}-circle`]:{borderRadius:"50%"},[`${n}-lg`]:Object.assign({},h(s)),[`${n}-sm`]:Object.assign({},h(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[`${r}`]:{width:"100%",height:m,background:d,borderRadius:b,[`+ ${o}`]:{marginBlockStart:u}},[`${o}`]:{padding:0,"> li":{width:"100%",height:w,listStyle:"none",background:d,borderRadius:b,"+ li":{marginBlockStart:x}}},[`${o}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${r}, ${o} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[`${r}`]:{marginBlockStart:p,[`+ ${o}`]:{marginBlockStart:C}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},k(e)),y(e)),A(e)),S(e)),[`${t}${t}-block`]:{width:"100%",[`${i}`]:{width:"100%"},[`${a}`]:{width:"100%"}},[`${t}${t}-active`]:{[`\n ${r},\n ${o} > li,\n ${n},\n ${i},\n ${a},\n ${c}\n `]:Object.assign({},g(e))}}},M=(0,f.OF)("Skeleton",(e=>{const{componentCls:t,calc:n}=e,r=(0,p.h1)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:n(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"});return[E(r)]}),(e=>{const{colorFillContent:t,colorFill:n}=e;return{color:t,colorGradientEnd:n,gradientFromColor:t,gradientToColor:n,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}}),{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),O=e=>{const{prefixCls:t,className:n,rootClassName:o,active:l,shape:s="circle",size:d="default"}=e,{getPrefixCls:f}=r.useContext(c.QO),p=f("skeleton",t),[v,m,h]=M(p),g=(0,a.A)(e,["prefixCls","className"]),b=i()(p,`${p}-element`,{[`${p}-active`]:l},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(u,Object.assign({prefixCls:`${p}-avatar`,shape:s,size:d},g))))},$=e=>{const{prefixCls:t,className:n,rootClassName:o,active:l,block:s=!1,size:d="default"}=e,{getPrefixCls:f}=r.useContext(c.QO),p=f("skeleton",t),[v,m,h]=M(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:l,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(u,Object.assign({prefixCls:`${p}-button`,size:d},g))))},T=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:l}=e,{getPrefixCls:s}=r.useContext(c.QO),u=s("skeleton",t),[d,f,p]=M(u),v=i()(u,`${u}-element`,{[`${u}-active`]:l},n,o,f,p);return d(r.createElement("div",{className:v},r.createElement("div",{className:i()(`${u}-image`,n),style:a},r.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${u}-image-svg`},r.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${u}-image-path`})))))},R=e=>{const{prefixCls:t,className:n,rootClassName:o,active:l,block:s,size:d="default"}=e,{getPrefixCls:f}=r.useContext(c.QO),p=f("skeleton",t),[v,m,h]=M(p),g=(0,a.A)(e,["prefixCls"]),b=i()(p,`${p}-element`,{[`${p}-active`]:l,[`${p}-block`]:s},n,o,m,h);return v(r.createElement("div",{className:b},r.createElement(u,Object.assign({prefixCls:`${p}-input`,size:d},g))))};var P=n(8168);const z={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 10128 0 64 64 0 10-128 0zm118-224a48 48 0 1096 0 48 48 0 10-96 0zm158 228a96 96 0 10192 0 96 96 0 10-192 0zm148-314a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"dot-chart",theme:"outlined"};var I=n(6653),N=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:z}))};const L=r.forwardRef(N),j=e=>{const{prefixCls:t,className:n,rootClassName:o,style:a,active:l,children:s}=e,{getPrefixCls:u}=r.useContext(c.QO),d=u("skeleton",t),[f,p,v]=M(d),m=i()(d,`${d}-element`,{[`${d}-active`]:l},p,n,o,v),h=null!=s?s:r.createElement(L,null);return f(r.createElement("div",{className:m},r.createElement("div",{className:i()(`${d}-image`,n),style:a},h)))};var _=n(8339);const H=(e,t)=>{const{width:n,rows:r=2}=t;return Array.isArray(n)?n[e]:r-1===e?n:void 0},D=e=>{const{prefixCls:t,className:n,style:o,rows:a}=e,c=(0,_.A)(Array(a)).map(((t,n)=>r.createElement("li",{key:n,style:{width:H(n,e)}})));return r.createElement("ul",{className:i()(t,n),style:o},c)},B=e=>{let{prefixCls:t,className:n,width:o,style:a}=e;return r.createElement("h3",{className:i()(t,n),style:Object.assign({width:o},a)})};function W(e){return e&&"object"==typeof e?e:{}}const F=e=>{const{prefixCls:t,loading:n,className:o,rootClassName:a,style:l,children:s,avatar:d=!1,title:f=!0,paragraph:p=!0,active:v,round:m}=e,{getPrefixCls:h,direction:g,skeleton:b}=r.useContext(c.QO),y=h("skeleton",t),[A,w,S]=M(y);if(n||!("loading"in e)){const e=!!d,t=!!f,n=!!p;let c,s;if(e){const e=Object.assign(Object.assign({prefixCls:`${y}-avatar`},function(e,t){return e&&!t?{size:"large",shape:"square"}:{size:"large",shape:"circle"}}(t,n)),W(d));c=r.createElement("div",{className:`${y}-header`},r.createElement(u,Object.assign({},e)))}if(t||n){let o,i;if(t){const t=Object.assign(Object.assign({prefixCls:`${y}-title`},function(e,t){return!e&&t?{width:"38%"}:e&&t?{width:"50%"}:{}}(e,n)),W(f));o=r.createElement(B,Object.assign({},t))}if(n){const n=Object.assign(Object.assign({prefixCls:`${y}-paragraph`},function(e,t){const n={};return e&&t||(n.width="61%"),n.rows=!e&&t?3:2,n}(e,t)),W(p));i=r.createElement(D,Object.assign({},n))}s=r.createElement("div",{className:`${y}-content`},o,i)}const h=i()(y,{[`${y}-with-avatar`]:e,[`${y}-active`]:v,[`${y}-rtl`]:"rtl"===g,[`${y}-round`]:m},null==b?void 0:b.className,o,a,w,S);return A(r.createElement("div",{className:h,style:Object.assign(Object.assign({},null==b?void 0:b.style),l)},c,s))}return null!=s?s:null};F.Button=$,F.Avatar=O,F.Input=R,F.Image=T,F.Node=j;const X=F;var K=n(6467);const G={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"ellipsis",theme:"outlined"};var q=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:G}))};const Y=r.forwardRef(q);const V={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"}},{tag:"path",attrs:{d:"M192 474h672q8 0 8 8v60q0 8-8 8H160q-8 0-8-8v-60q0-8 8-8z"}}]},name:"plus",theme:"outlined"};var U=function(e,t){return r.createElement(I.A,(0,P.A)({},e,{ref:t,icon:V}))};const Q=r.forwardRef(U);var Z=n(4467),J=n(9379),ee=n(641),te=n(2284),ne=n(45),re=n(2533);const oe=function(){if("undefined"==typeof navigator||"undefined"==typeof window)return!1;var e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(null==e?void 0:e.substr(0,4))},ie=(0,r.createContext)(null);var ae=n(6351);function ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];return r.Children.forEach(e,(function(e){(null!=e||t.keepEmpty)&&(Array.isArray(e)?n=n.concat(ce(e)):(0,ae.isFragment)(e)&&e.props?n=n.concat(ce(e.props.children,t)):n.push(e))})),n}var le=n(8210),se=n(4207),ue=n(8719),de=r.createContext(null);var fe=n(3591),pe=new Map;var ve=new fe.A((function(e){e.forEach((function(e){var t,n=e.target;null===(t=pe.get(n))||void 0===t||t.forEach((function(e){return e(n)}))}))}));var me=n(3029),he=n(2901),ge=n(5501),be=n(9426),ye=function(e){(0,ge.A)(n,e);var t=(0,be.A)(n);function n(){return(0,me.A)(this,n),t.apply(this,arguments)}return(0,he.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);function Ae(e,t){var n=e.children,o=e.disabled,i=r.useRef(null),a=r.useRef(null),c=r.useContext(de),l="function"==typeof n,s=l?n(i):n,u=r.useRef({width:-1,height:-1,offsetWidth:-1,offsetHeight:-1}),d=!l&&r.isValidElement(s)&&(0,ue.f3)(s),f=d?s.ref:null,p=(0,ue.xK)(f,i),v=function(){var e;return(0,se.A)(i.current)||(i.current&&"object"===(0,te.A)(i.current)?(0,se.A)(null===(e=i.current)||void 0===e?void 0:e.nativeElement):null)||(0,se.A)(a.current)};r.useImperativeHandle(t,(function(){return v()}));var m=r.useRef(e);m.current=e;var h=r.useCallback((function(e){var t=m.current,n=t.onResize,r=t.data,o=e.getBoundingClientRect(),i=o.width,a=o.height,l=e.offsetWidth,s=e.offsetHeight,d=Math.floor(i),f=Math.floor(a);if(u.current.width!==d||u.current.height!==f||u.current.offsetWidth!==l||u.current.offsetHeight!==s){var p={width:d,height:f,offsetWidth:l,offsetHeight:s};u.current=p;var v=l===Math.round(i)?i:l,h=s===Math.round(a)?a:s,g=(0,J.A)((0,J.A)({},p),{},{offsetWidth:v,offsetHeight:h});null==c||c(g,e,r),n&&Promise.resolve().then((function(){n(g,e)}))}}),[]);return r.useEffect((function(){var e,t,n=v();return n&&!o&&(e=n,t=h,pe.has(e)||(pe.set(e,new Set),ve.observe(e)),pe.get(e).add(t)),function(){return function(e,t){pe.has(e)&&(pe.get(e).delete(t),pe.get(e).size||(ve.unobserve(e),pe.delete(e)))}(n,h)}}),[i.current,o]),r.createElement(ye,{ref:a},d?r.cloneElement(s,{ref:p}):s)}const we=r.forwardRef(Ae);function Se(e,t){var n=e.children;return("function"==typeof n?[n]:ce(n)).map((function(n,o){var i=(null==n?void 0:n.key)||"".concat("rc-observer-key","-").concat(o);return r.createElement(we,(0,P.A)({},e,{key:i,ref:0===o?t:void 0}),n)}))}var xe=r.forwardRef(Se);xe.Collection=function(e){var t=e.children,n=e.onBatchResize,o=r.useRef(0),i=r.useRef([]),a=r.useContext(de),c=r.useCallback((function(e,t,r){o.current+=1;var c=o.current;i.current.push({size:e,element:t,data:r}),Promise.resolve().then((function(){c===o.current&&(null==n||n(i.current),i.current=[])})),null==a||a(e,t,r)}),[n,a]);return r.createElement(de.Provider,{value:c},t)};const Ce=xe;var ke=n(6956),Ee=n(5371);const Me=function(e){var t=e.activeTabOffset,n=e.horizontal,o=e.rtl,i=e.indicator,a=void 0===i?{}:i,c=a.size,l=a.align,s=void 0===l?"center":l,u=(0,r.useState)(),d=(0,ee.A)(u,2),f=d[0],p=d[1],v=(0,r.useRef)(),m=r.useCallback((function(e){return"function"==typeof c?c(e):"number"==typeof c?c:e}),[c]);function h(){Ee.A.cancel(v.current)}return(0,r.useEffect)((function(){var e={};if(t)if(n){e.width=m(t.width);var r=o?"right":"left";"start"===s&&(e[r]=t[r]),"center"===s&&(e[r]=t[r]+t.width/2,e.transform=o?"translateX(50%)":"translateX(-50%)"),"end"===s&&(e[r]=t[r]+t.width,e.transform="translateX(-100%)")}else e.height=m(t.height),"start"===s&&(e.top=t.top),"center"===s&&(e.top=t.top+t.height/2,e.transform="translateY(-50%)"),"end"===s&&(e.top=t.top+t.height,e.transform="translateY(-100%)");return h(),v.current=(0,Ee.A)((function(){p(e)})),h}),[t,n,o,s,m]),{style:f}};var Oe={width:0,height:0,left:0,top:0};function $e(e,t){var n=r.useRef(e),o=r.useState({}),i=(0,ee.A)(o,2)[1];return[n.current,function(e){var r="function"==typeof e?e(n.current):e;r!==n.current&&t(r,n.current),n.current=r,i({})}]}var Te=Math.pow(.995,20);var Re=n(981);function Pe(e){var t=(0,r.useState)(0),n=(0,ee.A)(t,2),o=n[0],i=n[1],a=(0,r.useRef)(0),c=(0,r.useRef)();return c.current=e,(0,Re.o)((function(){var e;null===(e=c.current)||void 0===e||e.call(c)}),[o]),function(){a.current===o&&(a.current+=1,i(a.current))}}var ze={width:0,height:0,left:0,top:0,right:0};function Ie(e){var t;return e instanceof Map?(t={},e.forEach((function(e,n){t[n]=e}))):t=e,JSON.stringify(t)}function Ne(e){return String(e).replace(/"/g,"TABS_DQ")}function Le(e,t,n,r){return!(!n||r||!1===e||void 0===e&&(!1===t||null===t))}var je=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.editable,i=e.locale,a=e.style;return o&&!1!==o.showAdd?r.createElement("button",{ref:t,type:"button",className:"".concat(n,"-nav-add"),style:a,"aria-label":(null==i?void 0:i.addAriaLabel)||"Add tab",onClick:function(e){o.onEdit("add",{event:e})}},o.addIcon||"+"):null}));const _e=je;const He=r.forwardRef((function(e,t){var n,o=e.position,i=e.prefixCls,a=e.extra;if(!a)return null;var c={};return"object"!==(0,te.A)(a)||r.isValidElement(a)?c.right=a:c=a,"right"===o&&(n=c.right),"left"===o&&(n=c.left),n?r.createElement("div",{className:"".concat(i,"-extra-content"),ref:t},n):null}));var De=n(5470),Be=n(2633),We=n(6855),Fe=n(8542);function Xe(e){var t=e.prefixCls,n=e.align,o=e.arrow,a=e.arrowPos,c=o||{},l=c.className,s=c.content,u=a.x,d=void 0===u?0:u,f=a.y,p=void 0===f?0:f,v=r.useRef();if(!n||!n.points)return null;var m={position:"absolute"};if(!1!==n.autoArrow){var h=n.points[0],g=n.points[1],b=h[0],y=h[1],A=g[0],w=g[1];b!==A&&["t","b"].includes(b)?"t"===b?m.top=0:m.bottom=0:m.top=p,y!==w&&["l","r"].includes(y)?"l"===y?m.left=0:m.right=0:m.left=d}return r.createElement("div",{ref:v,className:i()("".concat(t,"-arrow"),l),style:m},s)}function Ke(e){var t=e.prefixCls,n=e.open,o=e.zIndex,a=e.mask,c=e.motion;return a?r.createElement(Fe.Ay,(0,P.A)({},c,{motionAppear:!0,visible:n,removeOnLeave:!0}),(function(e){var n=e.className;return r.createElement("div",{style:{zIndex:o},className:i()("".concat(t,"-mask"),n)})})):null}const Ge=r.memo((function(e){return e.children}),(function(e,t){return t.cache}));var qe=r.forwardRef((function(e,t){var n=e.popup,o=e.className,a=e.prefixCls,c=e.style,l=e.target,s=e.onVisibleChanged,u=e.open,d=e.keepDom,f=e.fresh,p=e.onClick,v=e.mask,m=e.arrow,h=e.arrowPos,g=e.align,b=e.motion,y=e.maskMotion,A=e.forceRender,w=e.getPopupContainer,S=e.autoDestroy,x=e.portal,C=e.zIndex,k=e.onMouseEnter,E=e.onMouseLeave,M=e.onPointerEnter,O=e.ready,$=e.offsetX,T=e.offsetY,R=e.offsetR,z=e.offsetB,I=e.onAlign,N=e.onPrepare,L=e.stretch,j=e.targetWidth,_=e.targetHeight,H="function"==typeof n?n():n,D=u||d,B=(null==w?void 0:w.length)>0,W=r.useState(!w||!B),F=(0,ee.A)(W,2),X=F[0],K=F[1];if((0,Re.A)((function(){!X&&B&&l&&K(!0)}),[X,B,l]),!X)return null;var G="auto",q={left:"-1000vw",top:"-1000vh",right:G,bottom:G};if(O||!u){var Y,V=g.points,U=g.dynamicInset||(null===(Y=g._experimental)||void 0===Y?void 0:Y.dynamicInset),Q=U&&"r"===V[0][1],Z=U&&"b"===V[0][0];Q?(q.right=R,q.left=G):(q.left=$,q.right=G),Z?(q.bottom=z,q.top=G):(q.top=T,q.bottom=G)}var te={};return L&&(L.includes("height")&&_?te.height=_:L.includes("minHeight")&&_&&(te.minHeight=_),L.includes("width")&&j?te.width=j:L.includes("minWidth")&&j&&(te.minWidth=j)),u||(te.pointerEvents="none"),r.createElement(x,{open:A||D,getContainer:w&&function(){return w(l)},autoDestroy:S},r.createElement(Ke,{prefixCls:a,open:u,zIndex:C,mask:v,motion:y}),r.createElement(Ce,{onResize:I,disabled:!u},(function(e){return r.createElement(Fe.Ay,(0,P.A)({motionAppear:!0,motionEnter:!0,motionLeave:!0,removeOnLeave:!1,forceRender:A,leavedClassName:"".concat(a,"-hidden")},b,{onAppearPrepare:N,onEnterPrepare:N,visible:u,onVisibleChanged:function(e){var t;null==b||null===(t=b.onVisibleChanged)||void 0===t||t.call(b,e),s(e)}}),(function(n,l){var s=n.className,d=n.style,v=i()(a,s,o);return r.createElement("div",{ref:(0,ue.K4)(e,t,l),className:v,style:(0,J.A)((0,J.A)((0,J.A)((0,J.A)({"--arrow-x":"".concat(h.x||0,"px"),"--arrow-y":"".concat(h.y||0,"px")},q),te),d),{},{boxSizing:"border-box",zIndex:C},c),onMouseEnter:k,onMouseLeave:E,onPointerEnter:M,onClick:p},m&&r.createElement(Xe,{prefixCls:a,arrow:m,arrowPos:h,align:g}),r.createElement(Ge,{cache:!u&&!f},H))}))})))}));const Ye=qe;const Ve=r.forwardRef((function(e,t){var n=e.children,o=e.getTriggerDOMNode,i=(0,ue.f3)(n),a=r.useCallback((function(e){(0,ue.Xf)(t,o?o(e):e)}),[o]),c=(0,ue.xK)(a,n.ref);return i?r.cloneElement(n,{ref:c}):n}));const Ue=r.createContext(null);function Qe(e){return e?Array.isArray(e)?e:[e]:[]}const Ze=function(e){if(!e)return!1;if(e instanceof Element){if(e.offsetParent)return!0;if(e.getBBox){var t=e.getBBox(),n=t.width,r=t.height;if(n||r)return!0}if(e.getBoundingClientRect){var o=e.getBoundingClientRect(),i=o.width,a=o.height;if(i||a)return!0}}return!1};function Je(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return(arguments.length>2?arguments[2]:void 0)?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}function et(e,t,n,r){return t||(n?{motionName:"".concat(e,"-").concat(n)}:r?{motionName:r}:null)}function tt(e){return e.ownerDocument.defaultView}function nt(e){for(var t=[],n=null==e?void 0:e.parentElement,r=["hidden","scroll","clip","auto"];n;){var o=tt(n).getComputedStyle(n);[o.overflowX,o.overflowY,o.overflow].some((function(e){return r.includes(e)}))&&t.push(n),n=n.parentElement}return t}function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return Number.isNaN(e)?t:e}function ot(e){return rt(parseFloat(e),0)}function it(e,t){var n=(0,J.A)({},e);return(t||[]).forEach((function(e){if(!(e instanceof HTMLBodyElement||e instanceof HTMLHtmlElement)){var t=tt(e).getComputedStyle(e),r=t.overflow,o=t.overflowClipMargin,i=t.borderTopWidth,a=t.borderBottomWidth,c=t.borderLeftWidth,l=t.borderRightWidth,s=e.getBoundingClientRect(),u=e.offsetHeight,d=e.clientHeight,f=e.offsetWidth,p=e.clientWidth,v=ot(i),m=ot(a),h=ot(c),g=ot(l),b=rt(Math.round(s.width/f*1e3)/1e3),y=rt(Math.round(s.height/u*1e3)/1e3),A=(f-p-h-g)*b,w=(u-d-v-m)*y,S=v*y,x=m*y,C=h*b,k=g*b,E=0,M=0;if("clip"===r){var O=ot(o);E=O*b,M=O*y}var $=s.x+C-E,T=s.y+S-M,R=$+s.width+2*E-C-k-A,P=T+s.height+2*M-S-x-w;n.left=Math.max(n.left,$),n.top=Math.max(n.top,T),n.right=Math.min(n.right,R),n.bottom=Math.min(n.bottom,P)}})),n}function at(e){var t="".concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),n=t.match(/^(.*)\%$/);return n?e*(parseFloat(n[1])/100):parseFloat(t)}function ct(e,t){var n=t||[],r=(0,ee.A)(n,2),o=r[0],i=r[1];return[at(e.width,o),at(e.height,i)]}function lt(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return[e[0],e[1]]}function st(e,t){var n,r=t[0],o=t[1];return n="t"===r?e.y:"b"===r?e.y+e.height:e.y+e.height/2,{x:"l"===o?e.x:"r"===o?e.x+e.width:e.x+e.width/2,y:n}}function ut(e,t){var n={t:"b",b:"t",l:"r",r:"l"};return e.map((function(e,r){return r===t?n[e]||"c":e})).join("")}var dt=["prefixCls","children","action","showAction","hideAction","popupVisible","defaultPopupVisible","onPopupVisibleChange","afterPopupVisibleChange","mouseEnterDelay","mouseLeaveDelay","focusDelay","blurDelay","mask","maskClosable","getPopupContainer","forceRender","autoDestroy","destroyPopupOnHide","popup","popupClassName","popupStyle","popupPlacement","builtinPlacements","popupAlign","zIndex","stretch","getPopupClassNameFromAlign","fresh","alignPoint","onPopupClick","onPopupAlign","arrow","popupMotion","maskMotion","popupTransitionName","popupAnimation","maskTransitionName","maskAnimation","className","getTriggerDOMNode"];const ft=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:De.A,t=r.forwardRef((function(t,n){var o=t.prefixCls,a=void 0===o?"rc-trigger-popup":o,c=t.children,l=t.action,s=void 0===l?"hover":l,u=t.showAction,d=t.hideAction,f=t.popupVisible,p=t.defaultPopupVisible,v=t.onPopupVisibleChange,m=t.afterPopupVisibleChange,h=t.mouseEnterDelay,g=t.mouseLeaveDelay,b=void 0===g?.1:g,y=t.focusDelay,A=t.blurDelay,w=t.mask,S=t.maskClosable,x=void 0===S||S,C=t.getPopupContainer,k=t.forceRender,E=t.autoDestroy,M=t.destroyPopupOnHide,O=t.popup,$=t.popupClassName,T=t.popupStyle,R=t.popupPlacement,P=t.builtinPlacements,z=void 0===P?{}:P,I=t.popupAlign,N=t.zIndex,L=t.stretch,j=t.getPopupClassNameFromAlign,H=t.fresh,D=t.alignPoint,B=t.onPopupClick,W=t.onPopupAlign,F=t.arrow,X=t.popupMotion,K=t.maskMotion,G=t.popupTransitionName,q=t.popupAnimation,Y=t.maskTransitionName,V=t.maskAnimation,U=t.className,Q=t.getTriggerDOMNode,Z=(0,ne.A)(t,dt),te=E||M||!1,re=r.useState(!1),ie=(0,ee.A)(re,2),ae=ie[0],ce=ie[1];(0,Re.A)((function(){ce(oe())}),[]);var le=r.useRef({}),ue=r.useContext(Ue),de=r.useMemo((function(){return{registerSubPopup:function(e,t){le.current[e]=t,null==ue||ue.registerSubPopup(e,t)}}}),[ue]),fe=(0,We.A)(),pe=r.useState(null),ve=(0,ee.A)(pe,2),me=ve[0],he=ve[1],ge=r.useRef(null),be=(0,ke.A)((function(e){ge.current=e,(0,se.f)(e)&&me!==e&&he(e),null==ue||ue.registerSubPopup(fe,e)})),ye=r.useState(null),Ae=(0,ee.A)(ye,2),we=Ae[0],Se=Ae[1],xe=r.useRef(null),Ee=(0,ke.A)((function(e){(0,se.f)(e)&&we!==e&&(Se(e),xe.current=e)})),Me=r.Children.only(c),Oe=(null==Me?void 0:Me.props)||{},$e={},Te=(0,ke.A)((function(e){var t,n,r=we;return(null==r?void 0:r.contains(e))||(null===(t=(0,Be.j)(r))||void 0===t?void 0:t.host)===e||e===r||(null==me?void 0:me.contains(e))||(null===(n=(0,Be.j)(me))||void 0===n?void 0:n.host)===e||e===me||Object.values(le.current).some((function(t){return(null==t?void 0:t.contains(e))||e===t}))})),Pe=et(a,X,q,G),ze=et(a,K,V,Y),Ie=r.useState(p||!1),Ne=(0,ee.A)(Ie,2),Le=Ne[0],je=Ne[1],_e=null!=f?f:Le,He=(0,ke.A)((function(e){void 0===f&&je(e)}));(0,Re.A)((function(){je(f||!1)}),[f]);var De=r.useRef(_e);De.current=_e;var Fe=r.useRef([]);Fe.current=[];var Xe=(0,ke.A)((function(e){var t;He(e),(null!==(t=Fe.current[Fe.current.length-1])&&void 0!==t?t:_e)!==e&&(Fe.current.push(e),null==v||v(e))})),Ke=r.useRef(),Ge=function(){clearTimeout(Ke.current)},qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;Ge(),0===t?Xe(e):Ke.current=setTimeout((function(){Xe(e)}),1e3*t)};r.useEffect((function(){return Ge}),[]);var ot=r.useState(!1),at=(0,ee.A)(ot,2),ft=at[0],pt=at[1];(0,Re.A)((function(e){e&&!_e||pt(!0)}),[_e]);var vt=r.useState(null),mt=(0,ee.A)(vt,2),ht=mt[0],gt=mt[1],bt=r.useState([0,0]),yt=(0,ee.A)(bt,2),At=yt[0],wt=yt[1],St=function(e){wt([e.clientX,e.clientY])},xt=function(e,t,n,o,i,a,c){var l=r.useState({ready:!1,offsetX:0,offsetY:0,offsetR:0,offsetB:0,arrowX:0,arrowY:0,scaleX:1,scaleY:1,align:i[o]||{}}),s=(0,ee.A)(l,2),u=s[0],d=s[1],f=r.useRef(0),p=r.useMemo((function(){return t?nt(t):[]}),[t]),v=r.useRef({});e||(v.current={});var m=(0,ke.A)((function(){if(t&&n&&e){var r,l,s,u=t,f=u.ownerDocument,m=tt(u).getComputedStyle(u),h=m.width,g=m.height,b=m.position,y=u.style.left,A=u.style.top,w=u.style.right,S=u.style.bottom,x=u.style.overflow,C=(0,J.A)((0,J.A)({},i[o]),a),k=f.createElement("div");if(null===(r=u.parentElement)||void 0===r||r.appendChild(k),k.style.left="".concat(u.offsetLeft,"px"),k.style.top="".concat(u.offsetTop,"px"),k.style.position=b,k.style.height="".concat(u.offsetHeight,"px"),k.style.width="".concat(u.offsetWidth,"px"),u.style.left="0",u.style.top="0",u.style.right="auto",u.style.bottom="auto",u.style.overflow="hidden",Array.isArray(n))s={x:n[0],y:n[1],width:0,height:0};else{var E=n.getBoundingClientRect();s={x:E.x,y:E.y,width:E.width,height:E.height}}var M=u.getBoundingClientRect(),O=f.documentElement,$=O.clientWidth,T=O.clientHeight,R=O.scrollWidth,P=O.scrollHeight,z=O.scrollTop,I=O.scrollLeft,N=M.height,L=M.width,j=s.height,_=s.width,H={left:0,top:0,right:$,bottom:T},D={left:-I,top:-z,right:R-I,bottom:P-z},B=C.htmlRegion,W="visible",F="visibleFirst";"scroll"!==B&&B!==F&&(B=W);var X=B===F,K=it(D,p),G=it(H,p),q=B===W?G:K,Y=X?G:q;u.style.left="auto",u.style.top="auto",u.style.right="0",u.style.bottom="0";var V=u.getBoundingClientRect();u.style.left=y,u.style.top=A,u.style.right=w,u.style.bottom=S,u.style.overflow=x,null===(l=u.parentElement)||void 0===l||l.removeChild(k);var U=rt(Math.round(L/parseFloat(h)*1e3)/1e3),Q=rt(Math.round(N/parseFloat(g)*1e3)/1e3);if(0===U||0===Q||(0,se.f)(n)&&!Ze(n))return;var Z=C.offset,te=C.targetOffset,ne=ct(M,Z),re=(0,ee.A)(ne,2),oe=re[0],ie=re[1],ae=ct(s,te),ce=(0,ee.A)(ae,2),le=ce[0],ue=ce[1];s.x-=le,s.y-=ue;var de=C.points||[],fe=(0,ee.A)(de,2),pe=fe[0],ve=lt(fe[1]),me=lt(pe),he=st(s,ve),ge=st(M,me),be=(0,J.A)({},C),ye=he.x-ge.x+oe,Ae=he.y-ge.y+ie;function wt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:q,r=M.x+e,o=M.y+t,i=r+L,a=o+N,c=Math.max(r,n.left),l=Math.max(o,n.top),s=Math.min(i,n.right),u=Math.min(a,n.bottom);return Math.max(0,(s-c)*(u-l))}var we,Se,xe,Ce,ke=wt(ye,Ae),Ee=wt(ye,Ae,G),Me=st(s,["t","l"]),Oe=st(M,["t","l"]),$e=st(s,["b","r"]),Te=st(M,["b","r"]),Re=C.overflow||{},Pe=Re.adjustX,ze=Re.adjustY,Ie=Re.shiftX,Ne=Re.shiftY,Le=function(e){return"boolean"==typeof e?e:e>=0};function St(){we=M.y+Ae,Se=we+N,xe=M.x+ye,Ce=xe+L}St();var je=Le(ze),_e=me[0]===ve[0];if(je&&"t"===me[0]&&(Se>Y.bottom||v.current.bt)){var He=Ae;_e?He-=N-j:He=Me.y-Te.y-ie;var De=wt(ye,He),Be=wt(ye,He,G);De>ke||De===ke&&(!X||Be>=Ee)?(v.current.bt=!0,Ae=He,ie=-ie,be.points=[ut(me,0),ut(ve,0)]):v.current.bt=!1}if(je&&"b"===me[0]&&(weke||Fe===ke&&(!X||Xe>=Ee)?(v.current.tb=!0,Ae=We,ie=-ie,be.points=[ut(me,0),ut(ve,0)]):v.current.tb=!1}var Ke=Le(Pe),Ge=me[1]===ve[1];if(Ke&&"l"===me[1]&&(Ce>Y.right||v.current.rl)){var qe=ye;Ge?qe-=L-_:qe=Me.x-Te.x-oe;var Ye=wt(qe,Ae),Ve=wt(qe,Ae,G);Ye>ke||Ye===ke&&(!X||Ve>=Ee)?(v.current.rl=!0,ye=qe,oe=-oe,be.points=[ut(me,1),ut(ve,1)]):v.current.rl=!1}if(Ke&&"r"===me[1]&&(xeke||Qe===ke&&(!X||Je>=Ee)?(v.current.lr=!0,ye=Ue,oe=-oe,be.points=[ut(me,1),ut(ve,1)]):v.current.lr=!1}St();var et=!0===Ie?0:Ie;"number"==typeof et&&(xeG.right&&(ye-=Ce-G.right-oe,s.x>G.right-et&&(ye+=s.x-G.right+et)));var nt=!0===Ne?0:Ne;"number"==typeof nt&&(weG.bottom&&(Ae-=Se-G.bottom-ie,s.y>G.bottom-nt&&(Ae+=s.y-G.bottom+nt)));var ot=M.x+ye,at=ot+L,dt=M.y+Ae,ft=dt+N,pt=s.x,vt=pt+_,mt=s.y,ht=mt+j,gt=(Math.max(ot,pt)+Math.min(at,vt))/2-ot,bt=(Math.max(dt,mt)+Math.min(ft,ht))/2-dt;null==c||c(t,be);var yt=V.right-M.x-(ye+M.width),At=V.bottom-M.y-(Ae+M.height);d({ready:!0,offsetX:ye/U,offsetY:Ae/Q,offsetR:yt/U,offsetB:At/Q,arrowX:gt/U,arrowY:bt/Q,scaleX:U,scaleY:Q,align:be})}})),h=function(){d((function(e){return(0,J.A)((0,J.A)({},e),{},{ready:!1})}))};return(0,Re.A)(h,[o]),(0,Re.A)((function(){e||h()}),[e]),[u.ready,u.offsetX,u.offsetY,u.offsetR,u.offsetB,u.arrowX,u.arrowY,u.scaleX,u.scaleY,u.align,function(){f.current+=1;var e=f.current;Promise.resolve().then((function(){f.current===e&&m()}))}]}(_e,me,D?At:we,R,z,I,W),Ct=(0,ee.A)(xt,11),kt=Ct[0],Et=Ct[1],Mt=Ct[2],Ot=Ct[3],$t=Ct[4],Tt=Ct[5],Rt=Ct[6],Pt=Ct[7],zt=Ct[8],It=Ct[9],Nt=Ct[10],Lt=function(e,t,n,o){return r.useMemo((function(){var r=Qe(null!=n?n:t),i=Qe(null!=o?o:t),a=new Set(r),c=new Set(i);return e&&(a.has("hover")&&(a.delete("hover"),a.add("click")),c.has("hover")&&(c.delete("hover"),c.add("click"))),[a,c]}),[e,t,n,o])}(ae,s,u,d),jt=(0,ee.A)(Lt,2),_t=jt[0],Ht=jt[1],Dt=_t.has("click"),Bt=Ht.has("click")||Ht.has("contextMenu"),Wt=(0,ke.A)((function(){ft||Nt()}));!function(e,t,n,r,o){(0,Re.A)((function(){if(e&&t&&n){var i=n,a=nt(t),c=nt(i),l=tt(i),s=new Set([l].concat((0,_.A)(a),(0,_.A)(c)));function u(){r(),o()}return s.forEach((function(e){e.addEventListener("scroll",u,{passive:!0})})),l.addEventListener("resize",u,{passive:!0}),r(),function(){s.forEach((function(e){e.removeEventListener("scroll",u),l.removeEventListener("resize",u)}))}}}),[e,t,n])}(_e,we,me,Wt,(function(){De.current&&D&&Bt&&qe(!1)})),(0,Re.A)((function(){Wt()}),[At,R]),(0,Re.A)((function(){!_e||null!=z&&z[R]||Wt()}),[JSON.stringify(I)]);var Ft=r.useMemo((function(){var e=function(e,t,n,r){for(var o=n.points,i=Object.keys(e),a=0;a1?a-1:0),l=1;l1?n-1:0),o=1;o1?n-1:0),o=1;oh,ge=(0,r.useMemo)((function(){var e=c;return ve?e=null===$&&k?c:c.slice(0,Math.min(c.length,R/f)):"number"==typeof h&&(e=c.slice(0,h)),e}),[c,f,$,h,ve]),be=(0,r.useMemo)((function(){return ve?c.slice(ae+1):c.slice(ge.length)}),[c,ge,ve,ae]),ye=(0,r.useCallback)((function(e,t){var n;return"function"==typeof u?u(e):null!==(n=u&&(null==e?void 0:e[u]))&&void 0!==n?n:t}),[u]),Ae=(0,r.useCallback)(l||function(e){return e},[l]);function we(e,t,n){(oe!==e||void 0!==t&&t!==Q)&&(ie(e),n||(ue(eR){we(r-1,e-o-q+F);break}}y&&xe(0)+q>R&&Z(null)}}),[R,N,F,q,ye,ge]);var ke=se&&!!be.length,Ee={};null!==Q&&ve&&(Ee={position:"absolute",left:Q,top:0});var Me,Oe={prefixCls:de,responsive:ve,component:S,invalidate:me},$e=s?function(e,t){var n=ye(e,t);return r.createElement(Rt.Provider,{key:n,value:(0,J.A)((0,J.A)({},Oe),{},{order:t,item:e,itemKey:n,registerSize:Se,display:t<=ae})},s(e,t))}:function(e,t){var n=ye(e,t);return r.createElement(Mt,(0,P.A)({},Oe,{order:t,key:n,item:e,renderItem:Ae,itemKey:n,registerSize:Se,display:t<=ae}))},Te={order:ke?ae:Number.MAX_SAFE_INTEGER,className:"".concat(de,"-rest"),registerSize:function(e,t){X(t),D(F)},display:ke};if(b)b&&(Me=r.createElement(Rt.Provider,{value:(0,J.A)((0,J.A)({},Oe),Te)},b(be)));else{var Pe=g||Bt;Me=r.createElement(Mt,(0,P.A)({},Oe,Te),"function"==typeof Pe?Pe(be):Pe)}var ze=r.createElement(w,(0,P.A)({className:i()(!me&&o,m),style:v,ref:t},C),ge.map($e),he?Me:null,y&&r.createElement(Mt,(0,P.A)({},Oe,{responsive:pe,responsiveDisabled:!ve,order:ae,className:"".concat(de,"-suffix"),registerSize:function(e,t){Y(t)},display:!0,style:Ee}),y));return pe&&(ze=r.createElement(Ce,{onResize:function(e,t){T(t.clientWidth)},disabled:!ve},ze)),ze}var Ft=r.forwardRef(Wt);Ft.displayName="Overflow",Ft.Item=jt,Ft.RESPONSIVE=Ht,Ft.INVALIDATE=Dt;const Xt=Ft;var Kt=n(3210),Gt=r.createContext(null);function qt(e,t){return void 0===e?null:"".concat(e,"-").concat(t)}function Yt(e){return qt(r.useContext(Gt),e)}var Vt=n(8104),Ut=["children","locked"],Qt=r.createContext(null);function Zt(e){var t=e.children,n=e.locked,o=(0,ne.A)(e,Ut),i=r.useContext(Qt),a=(0,Vt.A)((function(){return e=i,t=o,n=(0,J.A)({},e),Object.keys(t).forEach((function(e){var r=t[e];void 0!==r&&(n[e]=r)})),n;var e,t,n}),[i,o],(function(e,t){return!(n||e[0]===t[0]&&(0,Kt.A)(e[1],t[1],!0))}));return r.createElement(Qt.Provider,{value:a},t)}var Jt=[],en=r.createContext(null);function tn(){return r.useContext(en)}var nn=r.createContext(Jt);function rn(e){var t=r.useContext(nn);return r.useMemo((function(){return void 0!==e?[].concat((0,_.A)(t),[e]):t}),[t,e])}var on=r.createContext(null);const an=r.createContext({});function cn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Ze(e)){var n=e.nodeName.toLowerCase(),r=["input","select","textarea","button"].includes(n)||e.isContentEditable||"a"===n&&!!e.getAttribute("href"),o=e.getAttribute("tabindex"),i=Number(o),a=null;return o&&!Number.isNaN(i)?a=i:r&&null===a&&(a=0),r&&e.disabled&&(a=null),null!==a&&(a>=0||t&&a<0)}return!1}function ln(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=(0,_.A)(e.querySelectorAll("*")).filter((function(e){return cn(e,t)}));return cn(e,t)&&n.unshift(e),n}var sn=pt.A.LEFT,un=pt.A.RIGHT,dn=pt.A.UP,fn=pt.A.DOWN,pn=pt.A.ENTER,vn=pt.A.ESC,mn=pt.A.HOME,hn=pt.A.END,gn=[dn,fn,sn,un];function bn(e,t){return ln(e,!0).filter((function(e){return t.has(e)}))}function yn(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(!e)return null;var o=bn(e,t),i=o.length,a=o.findIndex((function(e){return n===e}));return r<0?-1===a?a=i-1:a-=1:r>0&&(a+=1),o[a=(a+i)%i]}var An=function(e,t){var n=new Set,r=new Map,o=new Map;return e.forEach((function(e){var i=document.querySelector("[data-menu-id='".concat(qt(t,e),"']"));i&&(n.add(i),o.set(i,e),r.set(e,i))})),{elements:n,key2element:r,element2key:o}};function wn(e,t,n,o,i,a,c,l,s,u){var d=r.useRef(),f=r.useRef();f.current=t;var p=function(){Ee.A.cancel(d.current)};return r.useEffect((function(){return function(){p()}}),[]),function(r){var v=r.which;if([].concat(gn,[pn,vn,mn,hn]).includes(v)){var m=a(),h=An(m,o),g=h,b=g.elements,y=g.key2element,A=g.element2key,w=function(e,t){for(var n=e||document.activeElement;n;){if(t.has(n))return n;n=n.parentElement}return null}(y.get(t),b),S=A.get(w),x=function(e,t,n,r){var o,i="prev",a="next",c="children",l="parent";if("inline"===e&&r===pn)return{inlineTrigger:!0};var s=(0,Z.A)((0,Z.A)({},dn,i),fn,a),u=(0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)({},sn,n?a:i),un,n?i:a),fn,c),pn,c),d=(0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)({},dn,i),fn,a),pn,c),vn,l),sn,n?c:l),un,n?l:c);switch(null===(o={inline:s,horizontal:u,vertical:d,inlineSub:s,horizontalSub:d,verticalSub:d}["".concat(e).concat(t?"":"Sub")])||void 0===o?void 0:o[r]){case i:return{offset:-1,sibling:!0};case a:return{offset:1,sibling:!0};case l:return{offset:-1,sibling:!1};case c:return{offset:1,sibling:!1};default:return null}}(e,1===c(S,!0).length,n,v);if(!x&&v!==mn&&v!==hn)return;(gn.includes(v)||[mn,hn].includes(v))&&r.preventDefault();var C=function(e){if(e){var t=e,n=e.querySelector("a");null!=n&&n.getAttribute("href")&&(t=n);var r=A.get(e);l(r),p(),d.current=(0,Ee.A)((function(){f.current===r&&t.focus()}))}};if([mn,hn].includes(v)||x.sibling||!w){var k,E,M=bn(k=w&&"inline"!==e?function(e){for(var t=e;t;){if(t.getAttribute("data-menu-list"))return t;t=t.parentElement}return null}(w):i.current,b);E=v===mn?M[0]:v===hn?M[M.length-1]:yn(k,b,w,x.offset),C(E)}else if(x.inlineTrigger)s(S);else if(x.offset>0)s(S,!0),p(),d.current=(0,Ee.A)((function(){h=An(m,o);var e=w.getAttribute("aria-controls"),t=yn(document.getElementById(e),h.elements);C(t)}),5);else if(x.offset<0){var O=c(S,!0),$=O[O.length-2],T=y.get($);s($,!1),C(T)}}null==u||u(r)}}var Sn="__RC_UTIL_PATH_SPLIT__",xn=function(e){return e.join(Sn)},Cn="rc-menu-more";function kn(){var e=r.useState({}),t=(0,ee.A)(e,2)[1],n=(0,r.useRef)(new Map),o=(0,r.useRef)(new Map),i=r.useState([]),a=(0,ee.A)(i,2),c=a[0],l=a[1],s=(0,r.useRef)(0),u=(0,r.useRef)(!1),d=(0,r.useCallback)((function(e,r){var i=xn(r);o.current.set(i,e),n.current.set(e,i),s.current+=1;var a,c=s.current;a=function(){c===s.current&&(u.current||t({}))},Promise.resolve().then(a)}),[]),f=(0,r.useCallback)((function(e,t){var r=xn(t);o.current.delete(r),n.current.delete(e)}),[]),p=(0,r.useCallback)((function(e){l(e)}),[]),v=(0,r.useCallback)((function(e,t){var r=n.current.get(e)||"",o=r.split(Sn);return t&&c.includes(o[0])&&o.unshift(Cn),o}),[c]),m=(0,r.useCallback)((function(e,t){return e.some((function(e){return v(e,!0).includes(t)}))}),[v]),h=(0,r.useCallback)((function(e){var t="".concat(n.current.get(e)).concat(Sn),r=new Set;return(0,_.A)(o.current.keys()).forEach((function(e){e.startsWith(t)&&r.add(o.current.get(e))})),r}),[]);return r.useEffect((function(){return function(){u.current=!0}}),[]),{registerPath:d,unregisterPath:f,refreshOverflowKeys:p,isSubPathKey:m,getKeyPath:v,getKeys:function(){var e=(0,_.A)(n.current.keys());return c.length&&e.push(Cn),e},getSubPathKeys:h}}function En(e){var t=r.useRef(e);t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o1&&(y.motionAppear=!1);var A=y.onVisibleChanged;return y.onVisibleChanged=function(e){return p.current||e||g(!0),null==A?void 0:A(e)},h?null:r.createElement(Zt,{mode:a,locked:!p.current},r.createElement(Fe.Ay,(0,P.A)({visible:b},y,{forceRender:s,removeOnLeave:!1,leavedClassName:"".concat(l,"-hidden")}),(function(e){var n=e.className,o=e.style;return r.createElement(Xn,{id:t,className:n,style:o},i)})))}var Jn=["style","className","title","eventKey","warnKey","disabled","internalPopupClose","children","itemIcon","expandIcon","popupClassName","popupOffset","popupStyle","onClick","onMouseEnter","onMouseLeave","onTitleClick","onTitleMouseEnter","onTitleMouseLeave"],er=["active"],tr=r.forwardRef((function(e,t){var n=e.style,o=e.className,a=e.title,c=e.eventKey,l=(e.warnKey,e.disabled),s=e.internalPopupClose,u=e.children,d=e.itemIcon,f=e.expandIcon,p=e.popupClassName,v=e.popupOffset,m=e.popupStyle,h=e.onClick,g=e.onMouseEnter,b=e.onMouseLeave,y=e.onTitleClick,A=e.onTitleMouseEnter,w=e.onTitleMouseLeave,S=(0,ne.A)(e,Jn),x=Yt(c),C=r.useContext(Qt),k=C.prefixCls,E=C.mode,M=C.openKeys,O=C.disabled,$=C.overflowDisabled,T=C.activeKey,R=C.selectedKeys,z=C.itemIcon,I=C.expandIcon,N=C.onItemClick,L=C.onOpenChange,j=C.onActive,_=r.useContext(an)._internalRenderSubMenuItem,H=r.useContext(on).isSubPathKey,D=rn(),B="".concat(k,"-submenu"),W=O||l,F=r.useRef(),X=r.useRef();var K=null!=d?d:z,G=null!=f?f:I,q=M.includes(c),Y=!$&&q,V=H(R,c),U=$n(c,W,A,w),Q=U.active,te=(0,ne.A)(U,er),re=r.useState(!1),oe=(0,ee.A)(re,2),ie=oe[0],ae=oe[1],ce=function(e){W||ae(e)},le=r.useMemo((function(){return Q||"inline"!==E&&(ie||H([T],c))}),[E,Q,T,ie,c,H]),se=Tn(D.length),ue=En((function(e){null==h||h(zn(e)),N(e)})),de=x&&"".concat(x,"-popup"),fe=r.createElement("div",(0,P.A)({role:"menuitem",style:se,className:"".concat(B,"-title"),tabIndex:W?null:-1,ref:F,title:"string"==typeof a?a:null,"data-menu-id":$&&x?null:x,"aria-expanded":Y,"aria-haspopup":!0,"aria-controls":de,"aria-disabled":W,onClick:function(e){W||(null==y||y({key:c,domEvent:e}),"inline"===E&&L(c,!q))},onFocus:function(){j(c)}},te),a,r.createElement(Rn,{icon:"horizontal"!==E?G:void 0,props:(0,J.A)((0,J.A)({},e),{},{isOpen:Y,isSubMenu:!0})},r.createElement("i",{className:"".concat(B,"-arrow")}))),pe=r.useRef(E);if("inline"!==E&&D.length>1?pe.current="vertical":pe.current=E,!$){var ve=pe.current;fe=r.createElement(Qn,{mode:ve,prefixCls:B,visible:!s&&Y&&"inline"!==E,popupClassName:p,popupOffset:v,popupStyle:m,popup:r.createElement(Zt,{mode:"horizontal"===ve?"vertical":ve},r.createElement(Xn,{id:de,ref:X},u)),disabled:W,onVisibleChange:function(e){"inline"!==E&&L(c,e)}},fe)}var me=r.createElement(Xt.Item,(0,P.A)({ref:t,role:"none"},S,{component:"li",style:n,className:i()(B,"".concat(B,"-").concat(E),o,(0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)({},"".concat(B,"-open"),Y),"".concat(B,"-active"),le),"".concat(B,"-selected"),V),"".concat(B,"-disabled"),W)),onMouseEnter:function(e){ce(!0),null==g||g({key:c,domEvent:e})},onMouseLeave:function(e){ce(!1),null==b||b({key:c,domEvent:e})}}),fe,!$&&r.createElement(Zn,{id:de,open:Y,keyPath:D},u));return _&&(me=_(me,e,{selected:V,active:le,open:Y,disabled:W})),r.createElement(Zt,{onItemClick:ue,mode:"horizontal"===E?"vertical":E,itemIcon:K,expandIcon:G},me)}));const nr=r.forwardRef((function(e,t){var n,o=e.eventKey,i=e.children,a=rn(o),c=Kn(i,a),l=tn();return r.useEffect((function(){if(l)return l.registerPath(o,a),function(){l.unregisterPath(o,a)}}),[a]),n=l?c:r.createElement(tr,(0,P.A)({ref:t},e),c),r.createElement(nn.Provider,{value:a},n)}));function rr(e){var t=e.className,n=e.style,o=r.useContext(Qt).prefixCls;return tn()?null:r.createElement("li",{role:"separator",className:i()("".concat(o,"-item-divider"),t),style:n})}var or=["className","title","eventKey","children"],ir=r.forwardRef((function(e,t){var n=e.className,o=e.title,a=(e.eventKey,e.children),c=(0,ne.A)(e,or),l=r.useContext(Qt).prefixCls,s="".concat(l,"-item-group");return r.createElement("li",(0,P.A)({ref:t,role:"presentation"},c,{onClick:function(e){return e.stopPropagation()},className:i()(s,n)}),r.createElement("div",{role:"presentation",className:"".concat(s,"-title"),title:"string"==typeof o?o:void 0},o),r.createElement("ul",{role:"group",className:"".concat(s,"-list")},a))}));const ar=r.forwardRef((function(e,t){var n=e.eventKey,o=Kn(e.children,rn(n));return tn()?o:r.createElement(ir,(0,P.A)({ref:t},(0,a.A)(e,["warnKey"])),o)}));var cr=["label","children","key","type"];function lr(e,t){var n=t.item,o=t.group,i=t.submenu,a=t.divider;return(e||[]).map((function(e,c){if(e&&"object"===(0,te.A)(e)){var l=e,s=l.label,u=l.children,d=l.key,f=l.type,p=(0,ne.A)(l,cr),v=null!=d?d:"tmp-".concat(c);return u||"group"===f?"group"===f?r.createElement(o,(0,P.A)({key:v},p,{title:s}),lr(u,t)):r.createElement(i,(0,P.A)({key:v},p,{title:s}),lr(u,t)):"divider"===f?r.createElement(a,(0,P.A)({key:v},p)):r.createElement(n,(0,P.A)({key:v},p),s)}return null})).filter((function(e){return e}))}function sr(e,t,n,r){var o=e,i=(0,J.A)({divider:rr,item:Dn,group:ar,submenu:nr},r);return t&&(o=lr(t,i)),Kn(o,n)}var ur=["prefixCls","rootClassName","style","className","tabIndex","items","children","direction","id","mode","inlineCollapsed","disabled","disabledOverflow","subMenuOpenDelay","subMenuCloseDelay","forceSubMenuRender","defaultOpenKeys","openKeys","activeKey","defaultActiveFirst","selectable","multiple","defaultSelectedKeys","selectedKeys","onSelect","onDeselect","inlineIndent","motion","defaultMotions","triggerSubMenuAction","builtinPlacements","itemIcon","expandIcon","overflowedIndicator","overflowedIndicatorPopupClassName","getPopupContainer","onClick","onOpenChange","onKeyDown","openAnimation","openTransitionName","_internalRenderMenuItem","_internalRenderSubMenuItem","_internalComponents"],dr=[],fr=r.forwardRef((function(e,t){var n,o=e,a=o.prefixCls,c=void 0===a?"rc-menu":a,l=o.rootClassName,s=o.style,u=o.className,d=o.tabIndex,f=void 0===d?0:d,p=o.items,v=o.children,m=o.direction,h=o.id,g=o.mode,b=void 0===g?"vertical":g,y=o.inlineCollapsed,A=o.disabled,w=o.disabledOverflow,S=o.subMenuOpenDelay,x=void 0===S?.1:S,C=o.subMenuCloseDelay,k=void 0===C?.1:C,E=o.forceSubMenuRender,M=o.defaultOpenKeys,O=o.openKeys,$=o.activeKey,T=o.defaultActiveFirst,R=o.selectable,z=void 0===R||R,I=o.multiple,N=void 0!==I&&I,L=o.defaultSelectedKeys,j=o.selectedKeys,H=o.onSelect,D=o.onDeselect,B=o.inlineIndent,W=void 0===B?24:B,F=o.motion,X=o.defaultMotions,K=o.triggerSubMenuAction,G=void 0===K?"hover":K,q=o.builtinPlacements,Y=o.itemIcon,V=o.expandIcon,U=o.overflowedIndicator,Q=void 0===U?"...":U,te=o.overflowedIndicatorPopupClassName,oe=o.getPopupContainer,ie=o.onClick,ae=o.onOpenChange,ce=o.onKeyDown,le=(o.openAnimation,o.openTransitionName,o._internalRenderMenuItem),se=o._internalRenderSubMenuItem,ue=o._internalComponents,de=(0,ne.A)(o,ur),fe=r.useMemo((function(){return[sr(v,p,dr,ue),sr(v,p,dr,{})]}),[v,p,ue]),pe=(0,ee.A)(fe,2),ve=pe[0],me=pe[1],he=r.useState(!1),ge=(0,ee.A)(he,2),be=ge[0],ye=ge[1],Ae=r.useRef(),we=function(e){var t=(0,re.A)(e,{value:e}),n=(0,ee.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){On+=1;var e="".concat(Mn,"-").concat(On);i("rc-menu-uuid-".concat(e))}),[]),o}(h),Se="rtl"===m;var xe=(0,re.A)(M,{value:O,postState:function(e){return e||dr}}),Ce=(0,ee.A)(xe,2),ke=Ce[0],Ee=Ce[1],Me=function(e){function t(){Ee(e),null==ae||ae(e)}arguments.length>1&&void 0!==arguments[1]&&arguments[1]?(0,Ot.flushSync)(t):t()},Oe=r.useState(ke),$e=(0,ee.A)(Oe,2),Te=$e[0],Re=$e[1],Pe=r.useRef(!1),ze=r.useMemo((function(){return"inline"!==b&&"vertical"!==b||!y?[b,!1]:["vertical",y]}),[b,y]),Ie=(0,ee.A)(ze,2),Ne=Ie[0],Le=Ie[1],je="inline"===Ne,_e=r.useState(Ne),He=(0,ee.A)(_e,2),De=He[0],Be=He[1],We=r.useState(Le),Fe=(0,ee.A)(We,2),Xe=Fe[0],Ke=Fe[1];r.useEffect((function(){Be(Ne),Ke(Le),Pe.current&&(je?Ee(Te):Me(dr))}),[Ne,Le]);var Ge=r.useState(0),qe=(0,ee.A)(Ge,2),Ye=qe[0],Ve=qe[1],Ue=Ye>=ve.length-1||"horizontal"!==De||w;r.useEffect((function(){je&&Re(ke)}),[ke]),r.useEffect((function(){return Pe.current=!0,function(){Pe.current=!1}}),[]);var Qe=kn(),Ze=Qe.registerPath,Je=Qe.unregisterPath,et=Qe.refreshOverflowKeys,tt=Qe.isSubPathKey,nt=Qe.getKeyPath,rt=Qe.getKeys,ot=Qe.getSubPathKeys,it=r.useMemo((function(){return{registerPath:Ze,unregisterPath:Je}}),[Ze,Je]),at=r.useMemo((function(){return{isSubPathKey:tt}}),[tt]);r.useEffect((function(){et(Ue?dr:ve.slice(Ye+1).map((function(e){return e.key})))}),[Ye,Ue]);var ct=(0,re.A)($||T&&(null===(n=ve[0])||void 0===n?void 0:n.key),{value:$}),lt=(0,ee.A)(ct,2),st=lt[0],ut=lt[1],dt=En((function(e){ut(e)})),ft=En((function(){ut(void 0)}));(0,r.useImperativeHandle)(t,(function(){return{list:Ae.current,focus:function(e){var t,n,r=rt(),o=An(r,we),i=o.elements,a=o.key2element,c=o.element2key,l=bn(Ae.current,i),s=null!=st?st:l[0]?c.get(l[0]):null===(t=ve.find((function(e){return!e.props.disabled})))||void 0===t?void 0:t.key,u=a.get(s);s&&u&&(null==u||null===(n=u.focus)||void 0===n||n.call(u,e))}}}));var pt=(0,re.A)(L||[],{value:j,postState:function(e){return Array.isArray(e)?e:null==e?dr:[e]}}),vt=(0,ee.A)(pt,2),mt=vt[0],ht=vt[1],gt=En((function(e){null==ie||ie(zn(e)),function(e){if(z){var t,n=e.key,r=mt.includes(n);t=N?r?mt.filter((function(e){return e!==n})):[].concat((0,_.A)(mt),[n]):[n],ht(t);var o=(0,J.A)((0,J.A)({},e),{},{selectedKeys:t});r?null==D||D(o):null==H||H(o)}!N&&ke.length&&"inline"!==De&&Me(dr)}(e)})),bt=En((function(e,t){var n=ke.filter((function(t){return t!==e}));if(t)n.push(e);else if("inline"!==De){var r=ot(e);n=n.filter((function(e){return!r.has(e)}))}(0,Kt.A)(ke,n,!0)||Me(n,!0)})),yt=wn(De,st,Se,we,Ae,rt,nt,ut,(function(e,t){var n=null!=t?t:!ke.includes(e);bt(e,n)}),ce);r.useEffect((function(){ye(!0)}),[]);var At=r.useMemo((function(){return{_internalRenderMenuItem:le,_internalRenderSubMenuItem:se}}),[le,se]),wt="horizontal"!==De||w?ve:ve.map((function(e,t){return r.createElement(Zt,{key:e.key,overflowDisabled:t>Ye},e)})),St=r.createElement(Xt,(0,P.A)({id:h,ref:Ae,prefixCls:"".concat(c,"-overflow"),component:"ul",itemComponent:Dn,className:i()(c,"".concat(c,"-root"),"".concat(c,"-").concat(De),u,(0,Z.A)((0,Z.A)({},"".concat(c,"-inline-collapsed"),Xe),"".concat(c,"-rtl"),Se),l),dir:m,style:s,role:"menu",tabIndex:f,data:wt,renderRawItem:function(e){return e},renderRawRest:function(e){var t=e.length,n=t?ve.slice(-t):null;return r.createElement(nr,{eventKey:Cn,title:Q,disabled:Ue,internalPopupClose:0===t,popupClassName:te},n)},maxCount:"horizontal"!==De||w?Xt.INVALIDATE:Xt.RESPONSIVE,ssr:"full","data-menu-list":!0,onVisibleChange:function(e){Ve(e)},onKeyDown:yt},de));return r.createElement(an.Provider,{value:At},r.createElement(Gt.Provider,{value:we},r.createElement(Zt,{prefixCls:c,rootClassName:l,mode:De,openKeys:ke,rtl:Se,disabled:A,motion:be?F:null,defaultMotions:be?X:null,activeKey:st,onActive:dt,onInactive:ft,selectedKeys:mt,inlineIndent:W,subMenuOpenDelay:x,subMenuCloseDelay:k,forceSubMenuRender:E,builtinPlacements:q,triggerSubMenuAction:G,getPopupContainer:oe,itemIcon:Y,expandIcon:V,onItemClick:gt,onOpenChange:bt},r.createElement(on.Provider,{value:at},St),r.createElement("div",{style:{display:"none"},"aria-hidden":!0},r.createElement(en.Provider,{value:it},me)))))}));var pr=fr;pr.Item=Dn,pr.SubMenu=nr,pr.ItemGroup=ar,pr.Divider=rr;const vr=pr;var mr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.id,a=e.tabs,c=e.locale,l=e.mobile,s=e.more,u=void 0===s?{}:s,d=e.style,f=e.className,p=e.editable,v=e.tabBarGutter,m=e.rtl,h=e.removeAriaLabel,g=e.onTabClick,b=e.getPopupContainer,y=e.popupClassName,A=(0,r.useState)(!1),w=(0,ee.A)(A,2),S=w[0],x=w[1],C=(0,r.useState)(null),k=(0,ee.A)(C,2),E=k[0],M=k[1],O=u.icon,$=void 0===O?"More":O,T="".concat(o,"-more-popup"),R="".concat(n,"-dropdown"),z=null!==E?"".concat(T,"-").concat(E):null,I=null==c?void 0:c.dropdownAriaLabel;var N=r.createElement(vr,{onClick:function(e){var t=e.key,n=e.domEvent;g(t,n),x(!1)},prefixCls:"".concat(R,"-menu"),id:T,tabIndex:-1,role:"listbox","aria-activedescendant":z,selectedKeys:[E],"aria-label":void 0!==I?I:"expanded dropdown"},a.map((function(e){var t=e.closable,n=e.disabled,i=e.closeIcon,a=e.key,c=e.label,l=Le(t,i,p,n);return r.createElement(Dn,{key:a,id:"".concat(T,"-").concat(a),role:"option","aria-controls":o&&"".concat(o,"-panel-").concat(a),disabled:n},r.createElement("span",null,c),l&&r.createElement("button",{type:"button","aria-label":h||"remove",tabIndex:0,className:"".concat(R,"-menu-item-remove"),onClick:function(e){e.stopPropagation(),function(e,t){e.preventDefault(),e.stopPropagation(),p.onEdit("remove",{key:t,event:e})}(e,a)}},i||p.removeIcon||"\xd7"))})));function L(e){for(var t=a.filter((function(e){return!e.disabled})),n=t.findIndex((function(e){return e.key===E}))||0,r=t.length,o=0;ot?"left":"right"})})),R=(0,ee.A)(T,2),z=R[0],I=R[1],N=$e(0,(function(e,t){!$&&g&&g({direction:e>t?"top":"bottom"})})),L=(0,ee.A)(N,2),j=L[0],H=L[1],D=(0,r.useState)([0,0]),B=(0,ee.A)(D,2),W=B[0],F=B[1],X=(0,r.useState)([0,0]),K=(0,ee.A)(X,2),G=K[0],q=K[1],Y=(0,r.useState)([0,0]),V=(0,ee.A)(Y,2),U=V[0],Q=V[1],te=(0,r.useState)([0,0]),ne=(0,ee.A)(te,2),re=ne[0],oe=ne[1],ae=function(e){var t=(0,r.useRef)([]),n=(0,r.useState)({}),o=(0,ee.A)(n,2)[1],i=(0,r.useRef)("function"==typeof e?e():e),a=Pe((function(){var e=i.current;t.current.forEach((function(t){e=t(e)})),t.current=[],i.current=e,o({})}));return[i.current,function(e){t.current.push(e),a()}]}(new Map),ce=(0,ee.A)(ae,2),le=ce[0],se=ce[1],de=function(e,t,n){return(0,r.useMemo)((function(){for(var n,r=new Map,o=t.get(null===(n=e[0])||void 0===n?void 0:n.key)||Oe,i=o.left+o.width,a=0;aAe?Ae:e}$&&s?(ye=0,Ae=Math.max(0,pe-ge)):(ye=Math.min(0,ge-pe),Ae=0);var Se=(0,r.useRef)(null),xe=(0,r.useState)(),Ee=(0,ee.A)(xe,2),Re=Ee[0],Le=Ee[1];function je(){Le(Date.now())}function De(){Se.current&&clearTimeout(Se.current)}!function(e,t){var n=(0,r.useState)(),o=(0,ee.A)(n,2),i=o[0],a=o[1],c=(0,r.useState)(0),l=(0,ee.A)(c,2),s=l[0],u=l[1],d=(0,r.useState)(0),f=(0,ee.A)(d,2),p=f[0],v=f[1],m=(0,r.useState)(),h=(0,ee.A)(m,2),g=h[0],b=h[1],y=(0,r.useRef)(),A=(0,r.useRef)(),w=(0,r.useRef)(null);w.current={onTouchStart:function(e){var t=e.touches[0],n=t.screenX,r=t.screenY;a({x:n,y:r}),window.clearInterval(y.current)},onTouchMove:function(e){if(i){e.preventDefault();var n=e.touches[0],r=n.screenX,o=n.screenY;a({x:r,y:o});var c=r-i.x,l=o-i.y;t(c,l);var d=Date.now();u(d),v(d-s),b({x:c,y:l})}},onTouchEnd:function(){if(i&&(a(null),b(null),g)){var e=g.x/p,n=g.y/p,r=Math.abs(e),o=Math.abs(n);if(Math.max(r,o)<.1)return;var c=e,l=n;y.current=window.setInterval((function(){Math.abs(c)<.01&&Math.abs(l)<.01?window.clearInterval(y.current):t(20*(c*=Te),20*(l*=Te))}),20)}},onWheel:function(e){var n=e.deltaX,r=e.deltaY,o=0,i=Math.abs(n),a=Math.abs(r);i===a?o="x"===A.current?n:r:i>a?(o=n,A.current="x"):(o=r,A.current="y"),t(-o,-o)&&e.preventDefault()}},r.useEffect((function(){function t(e){w.current.onTouchMove(e)}function n(e){w.current.onTouchEnd(e)}return document.addEventListener("touchmove",t,{passive:!1}),document.addEventListener("touchend",n,{passive:!1}),e.current.addEventListener("touchstart",(function(e){w.current.onTouchStart(e)}),{passive:!1}),e.current.addEventListener("wheel",(function(e){w.current.onWheel(e)})),function(){document.removeEventListener("touchmove",t),document.removeEventListener("touchend",n)}}),[])}(k,(function(e,t){function n(e,t){e((function(e){return we(e+t)}))}return!!he&&($?n(I,e):n(H,t),De(),je(),!0)})),(0,r.useEffect)((function(){return De(),Re&&(Se.current=setTimeout((function(){Le(0)}),100)),De}),[Re]);var Be=function(e,t,n,o,i,a,c){var l,s,u,d=c.tabs,f=c.tabPosition,p=c.rtl;return["top","bottom"].includes(f)?(l="width",s=p?"right":"left",u=Math.abs(n)):(l="height",s="top",u=-n),(0,r.useMemo)((function(){if(!d.length)return[0,0];for(var n=d.length,r=n,o=0;ou+t){r=o-1;break}}for(var a=0,c=n-1;c>=0;c-=1)if((e.get(d[c].key)||ze)[s]=r?[0,0]:[a,r]}),[e,t,o,i,a,u,f,d.map((function(e){return e.key})).join("_"),p])}(de,ge,$?z:j,pe,ve,me,(0,J.A)((0,J.A)({},e),{},{tabs:w})),We=(0,ee.A)(Be,2),Fe=We[0],Xe=We[1],Ke=(0,ke.A)((function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l,t=de.get(e)||{width:0,height:0,left:0,right:0,top:0};if($){var n=z;s?t.rightz+ge&&(n=t.right+t.width-ge):t.left<-z?n=-t.left:t.left+t.width>-z+ge&&(n=-(t.left+t.width-ge)),H(0),I(we(n))}else{var r=j;t.top<-j?r=-t.top:t.top+t.height>-j+ge&&(r=-(t.top+t.height-ge)),I(0),H(we(r))}})),Ge={};"top"===p||"bottom"===p?Ge[s?"marginRight":"marginLeft"]=v:Ge.marginTop=v;var qe=w.map((function(e,t){var n=e.key;return r.createElement(gr,{id:a,prefixCls:A,key:n,tab:e,style:0===t?void 0:Ge,closable:e.closable,editable:d,active:n===l,renderWrapper:m,removeAriaLabel:null==f?void 0:f.removeAriaLabel,onClick:function(e){h(n,e)},onFocus:function(){Ke(n),je(),k.current&&(s||(k.current.scrollLeft=0),k.current.scrollTop=0)}})})),Ye=function(){return se((function(){var e,t=new Map,n=null===(e=E.current)||void 0===e?void 0:e.getBoundingClientRect();return w.forEach((function(e){var r,o=e.key,i=null===(r=E.current)||void 0===r?void 0:r.querySelector('[data-node-key="'.concat(Ne(o),'"]'));if(i){var a=function(e,t){var n=e.offsetWidth,r=e.offsetHeight,o=e.offsetTop,i=e.offsetLeft,a=e.getBoundingClientRect(),c=a.width,l=a.height,s=a.x,u=a.y;return Math.abs(c-n)<1?[c,l,s-t.x,u-t.y]:[n,r,i,o]}(i,n),c=(0,ee.A)(a,4),l=c[0],s=c[1],u=c[2],d=c[3];t.set(o,{width:l,height:s,left:u,top:d})}})),t}))};(0,r.useEffect)((function(){Ye()}),[w.map((function(e){return e.key})).join("_")]);var Ve=Pe((function(){var e=br(S),t=br(x),n=br(C);F([e[0]-t[0]-n[0],e[1]-t[1]-n[1]]);var r=br(O);Q(r);var o=br(M);oe(o);var i=br(E);q([i[0]-r[0],i[1]-r[1]]),Ye()})),Ue=w.slice(0,Fe),Qe=w.slice(Xe+1),Ze=[].concat((0,_.A)(Ue),(0,_.A)(Qe)),Je=de.get(l),et=Me({activeTabOffset:Je,horizontal:$,indicator:b,rtl:s}).style;(0,r.useEffect)((function(){Ke()}),[l,ye,Ae,Ie(Je),Ie(de),$]),(0,r.useEffect)((function(){Ve()}),[s]);var tt,nt,rt,ot,it=!!Ze.length,at="".concat(A,"-nav-wrap");return $?s?(nt=z>0,tt=z!==Ae):(tt=z<0,nt=z!==ye):(rt=j<0,ot=j!==ye),r.createElement(Ce,{onResize:Ve},r.createElement("div",{ref:(0,ue.xK)(t,S),role:"tablist",className:i()("".concat(A,"-nav"),n),style:o,onKeyDown:function(){je()}},r.createElement(He,{ref:x,position:"left",extra:u,prefixCls:A}),r.createElement(Ce,{onResize:Ve},r.createElement("div",{className:i()(at,(0,Z.A)((0,Z.A)((0,Z.A)((0,Z.A)({},"".concat(at,"-ping-left"),tt),"".concat(at,"-ping-right"),nt),"".concat(at,"-ping-top"),rt),"".concat(at,"-ping-bottom"),ot)),ref:k},r.createElement(Ce,{onResize:Ve},r.createElement("div",{ref:E,className:"".concat(A,"-nav-list"),style:{transform:"translate(".concat(z,"px, ").concat(j,"px)"),transition:Re?"none":void 0}},qe,r.createElement(_e,{ref:O,prefixCls:A,locale:f,editable:d,style:(0,J.A)((0,J.A)({},0===qe.length?void 0:Ge),{},{visibility:it?"hidden":null})}),r.createElement("div",{className:i()("".concat(A,"-ink-bar"),(0,Z.A)({},"".concat(A,"-ink-bar-animated"),c.inkBar)),style:et}))))),r.createElement(hr,(0,P.A)({},e,{removeAriaLabel:null==f?void 0:f.removeAriaLabel,ref:M,prefixCls:A,tabs:Ze,className:!it&&be,tabMoving:!!Re})),r.createElement(He,{ref:C,position:"right",extra:u,prefixCls:A})))}));const wr=Ar;var Sr=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,c=e.id,l=e.active,s=e.tabKey,u=e.children;return r.createElement("div",{id:c&&"".concat(c,"-panel-").concat(s),role:"tabpanel",tabIndex:l?0:-1,"aria-labelledby":c&&"".concat(c,"-tab-").concat(s),"aria-hidden":!l,style:a,className:i()(n,l&&"".concat(n,"-active"),o),ref:t},u)}));const xr=Sr;var Cr=["renderTabBar"],kr=["label","key"];const Er=function(e){var t=e.renderTabBar,n=(0,ne.A)(e,Cr),o=r.useContext(ie).tabs;return t?t((0,J.A)((0,J.A)({},n),{},{panes:o.map((function(e){var t=e.label,n=e.key,o=(0,ne.A)(e,kr);return r.createElement(xr,(0,P.A)({tab:t,key:n,tabKey:n},o))}))}),wr):r.createElement(wr,n)};var Mr=["key","forceRender","style","className","destroyInactiveTabPane"];const Or=function(e){var t=e.id,n=e.activeKey,o=e.animated,a=e.tabPosition,c=e.destroyInactiveTabPane,l=r.useContext(ie),s=l.prefixCls,u=l.tabs,d=o.tabPane,f="".concat(s,"-tabpane");return r.createElement("div",{className:i()("".concat(s,"-content-holder"))},r.createElement("div",{className:i()("".concat(s,"-content"),"".concat(s,"-content-").concat(a),(0,Z.A)({},"".concat(s,"-content-animated"),d))},u.map((function(e){var a=e.key,l=e.forceRender,s=e.style,u=e.className,p=e.destroyInactiveTabPane,v=(0,ne.A)(e,Mr),m=a===n;return r.createElement(Fe.Ay,(0,P.A)({key:a,visible:m,forceRender:l,removeOnLeave:!(!c&&!p),leavedClassName:"".concat(f,"-hidden")},o.tabPaneMotion),(function(e,n){var o=e.style,c=e.className;return r.createElement(xr,(0,P.A)({},v,{prefixCls:f,id:t,tabKey:a,animated:d,active:m,style:(0,J.A)((0,J.A)({},s),o),className:i()(u,c),ref:n}))}))}))))};var $r=["id","prefixCls","className","items","direction","activeKey","defaultActiveKey","editable","animated","tabPosition","tabBarGutter","tabBarStyle","tabBarExtraContent","locale","more","destroyInactiveTabPane","renderTabBar","onChange","onTabClick","onTabScroll","getPopupContainer","popupClassName","indicator"],Tr=0;const Rr=r.forwardRef((function(e,t){var n=e.id,o=e.prefixCls,a=void 0===o?"rc-tabs":o,c=e.className,l=e.items,s=e.direction,u=e.activeKey,d=e.defaultActiveKey,f=e.editable,p=e.animated,v=e.tabPosition,m=void 0===v?"top":v,h=e.tabBarGutter,g=e.tabBarStyle,b=e.tabBarExtraContent,y=e.locale,A=e.more,w=e.destroyInactiveTabPane,S=e.renderTabBar,x=e.onChange,C=e.onTabClick,k=e.onTabScroll,E=e.getPopupContainer,M=e.popupClassName,O=e.indicator,$=(0,ne.A)(e,$r),T=r.useMemo((function(){return(l||[]).filter((function(e){return e&&"object"===(0,te.A)(e)&&"key"in e}))}),[l]),R="rtl"===s,z=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{inkBar:!0,tabPane:!1};return(e=!1===t?{inkBar:!1,tabPane:!1}:!0===t?{inkBar:!0,tabPane:!1}:(0,J.A)({inkBar:!0},"object"===(0,te.A)(t)?t:{})).tabPaneMotion&&void 0===e.tabPane&&(e.tabPane=!0),!e.tabPaneMotion&&e.tabPane&&(e.tabPane=!1),e}(p),I=(0,r.useState)(!1),N=(0,ee.A)(I,2),L=N[0],j=N[1];(0,r.useEffect)((function(){j(oe())}),[]);var _=(0,re.A)((function(){var e;return null===(e=T[0])||void 0===e?void 0:e.key}),{value:u,defaultValue:d}),H=(0,ee.A)(_,2),D=H[0],B=H[1],W=(0,r.useState)((function(){return T.findIndex((function(e){return e.key===D}))})),F=(0,ee.A)(W,2),X=F[0],K=F[1];(0,r.useEffect)((function(){var e,t=T.findIndex((function(e){return e.key===D}));-1===t&&(t=Math.max(0,Math.min(X,T.length-1)),B(null===(e=T[t])||void 0===e?void 0:e.key));K(t)}),[T.map((function(e){return e.key})).join("_"),D,X]);var G=(0,re.A)(null,{value:n}),q=(0,ee.A)(G,2),Y=q[0],V=q[1];(0,r.useEffect)((function(){n||(V("rc-tabs-".concat(Tr)),Tr+=1)}),[]);var U={id:Y,activeKey:D,animated:z,tabPosition:m,rtl:R,mobile:L},Q=(0,J.A)((0,J.A)({},U),{},{editable:f,locale:y,more:A,tabBarGutter:h,onTabClick:function(e,t){null==C||C(e,t);var n=e!==D;B(e),n&&(null==x||x(e))},onTabScroll:k,extra:b,style:g,panes:null,getPopupContainer:E,popupClassName:M,indicator:O});return r.createElement(ie.Provider,{value:{tabs:T,prefixCls:a}},r.createElement("div",(0,P.A)({ref:t,id:n,className:i()(a,"".concat(a,"-").concat(m),(0,Z.A)((0,Z.A)((0,Z.A)({},"".concat(a,"-mobile"),L),"".concat(a,"-editable"),f),"".concat(a,"-rtl"),R),c)},$),r.createElement(Er,(0,P.A)({},Q,{renderTabBar:S})),r.createElement(Or,(0,P.A)({destroyInactiveTabPane:w},U,{animated:z}))))}));var Pr=n(934),zr=n(3723);const Ir={motionAppear:!1,motionEnter:!0,motionLeave:!0};var Nr=function(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{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=_r[t];return[(0,jr.b)(r,o,i,e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:e.motionEaseOutQuint,"&-prepare":{transform:"scale(1)"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInQuint}}]},Dr=e=>{const{componentCls:t,motionDurationSlow:n}=e;return[{[t]:{[`${t}-switch`]:{"&-appear, &-enter":{transition:"none","&-start":{opacity:0},"&-active":{opacity:1,transition:`opacity ${n}`}},"&-leave":{position:"absolute",transition:"none",inset:0,"&-start":{opacity:1},"&-active":{opacity:0,transition:`opacity ${n}`}}}}},[Hr(e,"slide-up"),Hr(e,"slide-down")]]},Br=e=>{const{componentCls:t,tabsCardPadding:n,cardBg:r,cardGutter:o,colorBorderSecondary:i,itemSelectedColor:a}=e;return{[`${t}-card`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{margin:0,padding:n,background:r,border:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${i}`,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`},[`${t}-tab-active`]:{color:a,background:e.colorBgContainer},[`${t}-ink-bar`]:{visibility:"hidden"}},[`&${t}-top, &${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginLeft:{_skip_check_:!0,value:(0,d.zA)(o)}}}},[`&${t}-top`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0 0`},[`${t}-tab-active`]:{borderBottomColor:e.colorBgContainer}}},[`&${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:`0 0 ${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)}`},[`${t}-tab-active`]:{borderTopColor:e.colorBgContainer}}},[`&${t}-left, &${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginTop:(0,d.zA)(o)}}},[`&${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,d.zA)(e.borderRadiusLG)} 0 0 ${(0,d.zA)(e.borderRadiusLG)}`}},[`${t}-tab-active`]:{borderRightColor:{_skip_check_:!0,value:e.colorBgContainer}}}},[`&${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0`}},[`${t}-tab-active`]:{borderLeftColor:{_skip_check_:!0,value:e.colorBgContainer}}}}}}},Wr=e=>{const{componentCls:t,itemHoverColor:n,dropdownEdgeChildVerticalPadding:r}=e;return{[`${t}-dropdown`]:Object.assign(Object.assign({},(0,Lr.dF)(e)),{position:"absolute",top:-9999,left:{_skip_check_:!0,value:-9999},zIndex:e.zIndexPopup,display:"block","&-hidden":{display:"none"},[`${t}-dropdown-menu`]:{maxHeight:e.tabsDropdownHeight,margin:0,padding:`${(0,d.zA)(r)} 0`,overflowX:"hidden",overflowY:"auto",textAlign:{_skip_check_:!0,value:"left"},listStyleType:"none",backgroundColor:e.colorBgContainer,backgroundClip:"padding-box",borderRadius:e.borderRadiusLG,outline:"none",boxShadow:e.boxShadowSecondary,"&-item":Object.assign(Object.assign({},Lr.L9),{display:"flex",alignItems:"center",minWidth:e.tabsDropdownWidth,margin:0,padding:`${(0,d.zA)(e.paddingXXS)} ${(0,d.zA)(e.paddingSM)}`,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"> span":{flex:1,whiteSpace:"nowrap"},"&-remove":{flex:"none",marginLeft:{_skip_check_:!0,value:e.marginSM},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:0,cursor:"pointer","&:hover":{color:n}},"&:hover":{background:e.controlItemBgHover},"&-disabled":{"&, &:hover":{color:e.colorTextDisabled,background:"transparent",cursor:"not-allowed"}}})}})}},Fr=e=>{const{componentCls:t,margin:n,colorBorderSecondary:r,horizontalMargin:o,verticalItemPadding:i,verticalItemMargin:a,calc:c}=e;return{[`${t}-top, ${t}-bottom`]:{flexDirection:"column",[`> ${t}-nav, > div > ${t}-nav`]:{margin:o,"&::before":{position:"absolute",right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},borderBottom:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${r}`,content:"''"},[`${t}-ink-bar`]:{height:e.lineWidthBold,"&-animated":{transition:`width ${e.motionDurationSlow}, left ${e.motionDurationSlow},\n right ${e.motionDurationSlow}`}},[`${t}-nav-wrap`]:{"&::before, &::after":{top:0,bottom:0,width:e.controlHeight},"&::before":{left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowLeft},"&::after":{right:{_skip_check_:!0,value:0},boxShadow:e.boxShadowTabsOverflowRight},[`&${t}-nav-wrap-ping-left::before`]:{opacity:1},[`&${t}-nav-wrap-ping-right::after`]:{opacity:1}}}},[`${t}-top`]:{[`> ${t}-nav,\n > div > ${t}-nav`]:{"&::before":{bottom:0},[`${t}-ink-bar`]:{bottom:0}}},[`${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,marginTop:n,marginBottom:0,"&::before":{top:0},[`${t}-ink-bar`]:{top:0}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0}},[`${t}-left, ${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{flexDirection:"column",minWidth:c(e.controlHeight).mul(1.25).equal(),[`${t}-tab`]:{padding:i,textAlign:"center"},[`${t}-tab + ${t}-tab`]:{margin:a},[`${t}-nav-wrap`]:{flexDirection:"column","&::before, &::after":{right:{_skip_check_:!0,value:0},left:{_skip_check_:!0,value:0},height:e.controlHeight},"&::before":{top:0,boxShadow:e.boxShadowTabsOverflowTop},"&::after":{bottom:0,boxShadow:e.boxShadowTabsOverflowBottom},[`&${t}-nav-wrap-ping-top::before`]:{opacity:1},[`&${t}-nav-wrap-ping-bottom::after`]:{opacity:1}},[`${t}-ink-bar`]:{width:e.lineWidthBold,"&-animated":{transition:`height ${e.motionDurationSlow}, top ${e.motionDurationSlow}`}},[`${t}-nav-list, ${t}-nav-operations`]:{flex:"1 0 auto",flexDirection:"column"}}},[`${t}-left`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-ink-bar`]:{right:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{marginLeft:{_skip_check_:!0,value:(0,d.zA)(c(e.lineWidth).mul(-1).equal())},borderLeft:{_skip_check_:!0,value:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingLeft:{_skip_check_:!0,value:e.paddingLG}}}},[`${t}-right`]:{[`> ${t}-nav, > div > ${t}-nav`]:{order:1,[`${t}-ink-bar`]:{left:{_skip_check_:!0,value:0}}},[`> ${t}-content-holder, > div > ${t}-content-holder`]:{order:0,marginRight:{_skip_check_:!0,value:c(e.lineWidth).mul(-1).equal()},borderRight:{_skip_check_:!0,value:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},[`> ${t}-content > ${t}-tabpane`]:{paddingRight:{_skip_check_:!0,value:e.paddingLG}}}}}},Xr=e=>{const{componentCls:t,cardPaddingSM:n,cardPaddingLG:r,horizontalItemPaddingSM:o,horizontalItemPaddingLG:i}=e;return{[t]:{"&-small":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:o,fontSize:e.titleFontSizeSM}}},"&-large":{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:i,fontSize:e.titleFontSizeLG}}}},[`${t}-card`]:{[`&${t}-small`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:n}},[`&${t}-bottom`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`0 0 ${(0,d.zA)(e.borderRadius)} ${(0,d.zA)(e.borderRadius)}`}},[`&${t}-top`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:`${(0,d.zA)(e.borderRadius)} ${(0,d.zA)(e.borderRadius)} 0 0`}},[`&${t}-right`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`0 ${(0,d.zA)(e.borderRadius)} ${(0,d.zA)(e.borderRadius)} 0`}}},[`&${t}-left`]:{[`> ${t}-nav ${t}-tab`]:{borderRadius:{_skip_check_:!0,value:`${(0,d.zA)(e.borderRadius)} 0 0 ${(0,d.zA)(e.borderRadius)}`}}}},[`&${t}-large`]:{[`> ${t}-nav`]:{[`${t}-tab`]:{padding:r}}}}}},Kr=e=>{const{componentCls:t,itemActiveColor:n,itemHoverColor:r,iconCls:o,tabsHorizontalItemMargin:i,horizontalItemPadding:a,itemSelectedColor:c,itemColor:l}=e,s=`${t}-tab`;return{[s]:{position:"relative",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",display:"inline-flex",alignItems:"center",padding:a,fontSize:e.titleFontSize,background:"transparent",border:0,outline:"none",cursor:"pointer",color:l,"&-btn, &-remove":Object.assign({"&:focus:not(:focus-visible), &:active":{color:n}},(0,Lr.K8)(e)),"&-btn":{outline:"none",transition:`all ${e.motionDurationSlow}`,[`${s}-icon:not(:last-child)`]:{marginInlineEnd:e.marginSM}},"&-remove":{flex:"none",marginRight:{_skip_check_:!0,value:e.calc(e.marginXXS).mul(-1).equal()},marginLeft:{_skip_check_:!0,value:e.marginXS},color:e.colorTextDescription,fontSize:e.fontSizeSM,background:"transparent",border:"none",outline:"none",cursor:"pointer",transition:`all ${e.motionDurationSlow}`,"&:hover":{color:e.colorTextHeading}},"&:hover":{color:r},[`&${s}-active ${s}-btn`]:{color:c,textShadow:e.tabsActiveTextShadow},[`&${s}-disabled`]:{color:e.colorTextDisabled,cursor:"not-allowed"},[`&${s}-disabled ${s}-btn, &${s}-disabled ${t}-remove`]:{"&:focus, &:active":{color:e.colorTextDisabled}},[`& ${s}-remove ${o}`]:{margin:0},[`${o}:not(:last-child)`]:{marginRight:{_skip_check_:!0,value:e.marginSM}}},[`${s} + ${s}`]:{margin:{_skip_check_:!0,value:i}}}},Gr=e=>{const{componentCls:t,tabsHorizontalItemMarginRTL:n,iconCls:r,cardGutter:o,calc:i}=e,a=`${t}-rtl`;return{[a]:{direction:"rtl",[`${t}-nav`]:{[`${t}-tab`]:{margin:{_skip_check_:!0,value:n},[`${t}-tab:last-of-type`]:{marginLeft:{_skip_check_:!0,value:0}},[r]:{marginRight:{_skip_check_:!0,value:0},marginLeft:{_skip_check_:!0,value:(0,d.zA)(e.marginSM)}},[`${t}-tab-remove`]:{marginRight:{_skip_check_:!0,value:(0,d.zA)(e.marginXS)},marginLeft:{_skip_check_:!0,value:(0,d.zA)(i(e.marginXXS).mul(-1).equal())},[r]:{margin:0}}}},[`&${t}-left`]:{[`> ${t}-nav`]:{order:1},[`> ${t}-content-holder`]:{order:0}},[`&${t}-right`]:{[`> ${t}-nav`]:{order:0},[`> ${t}-content-holder`]:{order:1}},[`&${t}-card${t}-top, &${t}-card${t}-bottom`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-tab + ${t}-tab`]:{marginRight:{_skip_check_:!0,value:o},marginLeft:{_skip_check_:!0,value:0}}}}},[`${t}-dropdown-rtl`]:{direction:"rtl"},[`${t}-menu-item`]:{[`${t}-dropdown-rtl`]:{textAlign:{_skip_check_:!0,value:"right"}}}}},qr=e=>{const{componentCls:t,tabsCardPadding:n,cardHeight:r,cardGutter:o,itemHoverColor:i,itemActiveColor:a,colorBorderSecondary:c}=e;return{[t]:Object.assign(Object.assign(Object.assign(Object.assign({},(0,Lr.dF)(e)),{display:"flex",[`> ${t}-nav, > div > ${t}-nav`]:{position:"relative",display:"flex",flex:"none",alignItems:"center",[`${t}-nav-wrap`]:{position:"relative",display:"flex",flex:"auto",alignSelf:"stretch",overflow:"hidden",whiteSpace:"nowrap",transform:"translate(0)","&::before, &::after":{position:"absolute",zIndex:1,opacity:0,transition:`opacity ${e.motionDurationSlow}`,content:"''",pointerEvents:"none"}},[`${t}-nav-list`]:{position:"relative",display:"flex",transition:`opacity ${e.motionDurationSlow}`},[`${t}-nav-operations`]:{display:"flex",alignSelf:"stretch"},[`${t}-nav-operations-hidden`]:{position:"absolute",visibility:"hidden",pointerEvents:"none"},[`${t}-nav-more`]:{position:"relative",padding:n,background:"transparent",border:0,color:e.colorText,"&::after":{position:"absolute",right:{_skip_check_:!0,value:0},bottom:0,left:{_skip_check_:!0,value:0},height:e.calc(e.controlHeightLG).div(8).equal(),transform:"translateY(100%)",content:"''"}},[`${t}-nav-add`]:Object.assign({minWidth:r,minHeight:r,marginLeft:{_skip_check_:!0,value:o},padding:`0 ${(0,d.zA)(e.paddingXS)}`,background:"transparent",border:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${c}`,borderRadius:`${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0 0`,outline:"none",cursor:"pointer",color:e.colorText,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOut}`,"&:hover":{color:i},"&:active, &:focus:not(:focus-visible)":{color:a}},(0,Lr.K8)(e))},[`${t}-extra-content`]:{flex:"none"},[`${t}-ink-bar`]:{position:"absolute",background:e.inkBarColor,pointerEvents:"none"}}),Kr(e)),{[`${t}-content`]:{position:"relative",width:"100%"},[`${t}-content-holder`]:{flex:"auto",minWidth:0,minHeight:0},[`${t}-tabpane`]:{outline:"none","&-hidden":{display:"none"}}}),[`${t}-centered`]:{[`> ${t}-nav, > div > ${t}-nav`]:{[`${t}-nav-wrap`]:{[`&:not([class*='${t}-nav-wrap-ping'])`]:{justifyContent:"center"}}}}}},Yr=(0,f.OF)("Tabs",(e=>{const t=(0,p.h1)(e,{tabsCardPadding:e.cardPadding,dropdownEdgeChildVerticalPadding:e.paddingXXS,tabsActiveTextShadow:"0 0 0.25px currentcolor",tabsDropdownHeight:200,tabsDropdownWidth:120,tabsHorizontalItemMargin:`0 0 0 ${(0,d.zA)(e.horizontalItemGutter)}`,tabsHorizontalItemMarginRTL:`0 0 0 ${(0,d.zA)(e.horizontalItemGutter)}`});return[Xr(t),Gr(t),Fr(t),Wr(t),Br(t),qr(t),Dr(t)]}),(e=>{const t=e.controlHeightLG;return{zIndexPopup:e.zIndexPopupBase+50,cardBg:e.colorFillAlter,cardHeight:t,cardPadding:`${(t-Math.round(e.fontSize*e.lineHeight))/2-e.lineWidth}px ${e.padding}px`,cardPaddingSM:`${1.5*e.paddingXXS}px ${e.padding}px`,cardPaddingLG:`${e.paddingXS}px ${e.padding}px ${1.5*e.paddingXXS}px`,titleFontSize:e.fontSize,titleFontSizeLG:e.fontSizeLG,titleFontSizeSM:e.fontSize,inkBarColor:e.colorPrimary,horizontalMargin:`0 0 ${e.margin}px 0`,horizontalItemGutter:32,horizontalItemMargin:"",horizontalItemMarginRTL:"",horizontalItemPadding:`${e.paddingSM}px 0`,horizontalItemPaddingSM:`${e.paddingXS}px 0`,horizontalItemPaddingLG:`${e.padding}px 0`,verticalItemPadding:`${e.paddingXS}px ${e.paddingLG}px`,verticalItemMargin:`${e.margin}px 0 0 0`,itemColor:e.colorText,itemSelectedColor:e.colorPrimary,itemHoverColor:e.colorPrimaryHover,itemActiveColor:e.colorPrimaryActive,cardGutter:e.marginXXS/2}}));var Vr=function(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{var t,n,o,a,l,u,d,f,p,v,m;const{type:h,className:g,rootClassName:b,size:y,onEdit:A,hideAdd:w,centered:S,addIcon:x,removeIcon:C,moreIcon:k,more:E,popupClassName:M,children:O,items:$,animated:T,style:R,indicatorSize:P,indicator:z}=e,I=Vr(e,["type","className","rootClassName","size","onEdit","hideAdd","centered","addIcon","removeIcon","moreIcon","more","popupClassName","children","items","animated","style","indicatorSize","indicator"]),{prefixCls:N}=I,{direction:L,tabs:j,getPrefixCls:_,getPopupContainer:H}=r.useContext(c.QO),D=_("tabs",N),B=(0,Pr.A)(D),[W,F,X]=Yr(D,B);let G;"editable-card"===h&&(G={onEdit:(e,t)=>{let{key:n,event:r}=t;null==A||A("add"===e?r:n,e)},removeIcon:null!==(t=null!=C?C:null==j?void 0:j.removeIcon)&&void 0!==t?t:r.createElement(K.A,null),addIcon:(null!=x?x:null==j?void 0:j.addIcon)||r.createElement(Q,null),showAdd:!0!==w});const q=_();const V=s(y),U=function(e,t){return e||function(e){return e.filter((e=>e))}(ce(t).map((e=>{if(r.isValidElement(e)){const{key:t,props:n}=e,r=n||{},{tab:o}=r,i=Nr(r,["tab"]);return Object.assign(Object.assign({key:String(t)},i),{label:o})}return null})))}($,O),Z=function(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{inkBar:!0,tabPane:!1};return t=!1===n?{inkBar:!1,tabPane:!1}:!0===n?{inkBar:!0,tabPane:!0}:Object.assign({inkBar:!0},"object"==typeof n?n:{}),t.tabPane&&(t.tabPaneMotion=Object.assign(Object.assign({},Ir),{motionName:(0,zr.b)(e,"switch")})),t}(D,T),J=Object.assign(Object.assign({},null==j?void 0:j.style),R),ee={align:null!==(n=null==z?void 0:z.align)&&void 0!==n?n:null===(o=null==j?void 0:j.indicator)||void 0===o?void 0:o.align,size:null!==(d=null!==(l=null!==(a=null==z?void 0:z.size)&&void 0!==a?a:P)&&void 0!==l?l:null===(u=null==j?void 0:j.indicator)||void 0===u?void 0:u.size)&&void 0!==d?d:null==j?void 0:j.indicatorSize};return W(r.createElement(Rr,Object.assign({direction:L,getPopupContainer:H},I,{items:U,className:i()({[`${D}-${V}`]:V,[`${D}-card`]:["card","editable-card"].includes(h),[`${D}-editable-card`]:"editable-card"===h,[`${D}-centered`]:S},null==j?void 0:j.className,g,b,F,X,B),popupClassName:i()(M,F,X,B),style:J,editable:G,more:Object.assign({icon:null!==(m=null!==(v=null!==(p=null===(f=null==j?void 0:j.more)||void 0===f?void 0:f.icon)&&void 0!==p?p:null==j?void 0:j.moreIcon)&&void 0!==v?v:k)&&void 0!==m?m:r.createElement(Y,null),transitionName:`${q}-slide-up`},E),prefixCls:D,animated:Z,indicator:ee})))};Ur.TabPane=()=>null;const Qr=Ur;var Zr=function(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{var{prefixCls:t,className:n,hoverable:o=!0}=e,a=Zr(e,["prefixCls","className","hoverable"]);const{getPrefixCls:l}=r.useContext(c.QO),s=l("card",t),u=i()(`${s}-grid`,n,{[`${s}-grid-hoverable`]:o});return r.createElement("div",Object.assign({},a,{className:u}))},eo=e=>{const{antCls:t,componentCls:n,headerHeight:r,cardPaddingBase:o,tabsMarginBottom:i}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:r,marginBottom:-1,padding:`0 ${(0,d.zA)(o)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0 0`},(0,Lr.t6)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},Lr.L9),{[`\n > ${n}-typography,\n > ${n}-typography-edit-content\n `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:i,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})},to=e=>{const{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:r,lineWidth:o}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:`\n ${(0,d.zA)(o)} 0 0 0 ${n},\n 0 ${(0,d.zA)(o)} 0 0 ${n},\n ${(0,d.zA)(o)} ${(0,d.zA)(o)} 0 0 ${n},\n ${(0,d.zA)(o)} 0 0 0 ${n} inset,\n 0 ${(0,d.zA)(o)} 0 0 ${n} inset;\n `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:r}}},no=e=>{const{componentCls:t,iconCls:n,actionsLiMargin:r,cardActionsIconSize:o,colorBorderSecondary:i,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${i}`,display:"flex",borderRadius:`0 0 ${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)}`},(0,Lr.t6)()),{"& > li":{margin:r,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorTextDescription,lineHeight:(0,d.zA)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:o,lineHeight:(0,d.zA)(e.calc(o).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${i}`}}})},ro=e=>Object.assign(Object.assign({margin:`${(0,d.zA)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,Lr.t6)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},Lr.L9),"&-description":{color:e.colorTextDescription}}),oo=e=>{const{componentCls:t,cardPaddingBase:n,colorFillAlter:r}=e;return{[`${t}-head`]:{padding:`0 ${(0,d.zA)(n)}`,background:r,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,d.zA)(e.padding)} ${(0,d.zA)(n)}`}}},io=e=>{const{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}},ao=e=>{const{antCls:t,componentCls:n,cardShadow:r,cardHeadPadding:o,colorBorderSecondary:i,boxShadowTertiary:a,cardPaddingBase:c,extraColor:l}=e;return{[n]:Object.assign(Object.assign({},(0,Lr.dF)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${n}-bordered)`]:{boxShadow:a},[`${n}-head`]:eo(e),[`${n}-extra`]:{marginInlineStart:"auto",color:l,fontWeight:"normal",fontSize:e.fontSize},[`${n}-body`]:Object.assign({padding:c,borderRadius:`0 0 ${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)}`},(0,Lr.t6)()),[`${n}-grid`]:to(e),[`${n}-cover`]:{"> *":{display:"block",width:"100%"},[`img, img + ${t}-image-mask`]:{borderRadius:`${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0 0`}},[`${n}-actions`]:no(e),[`${n}-meta`]:ro(e)}),[`${n}-bordered`]:{border:`${(0,d.zA)(e.lineWidth)} ${e.lineType} ${i}`,[`${n}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${n}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:r}},[`${n}-contain-grid`]:{borderRadius:`${(0,d.zA)(e.borderRadiusLG)} ${(0,d.zA)(e.borderRadiusLG)} 0 0 `,[`${n}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${n}-loading) ${n}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${n}-contain-tabs`]:{[`> div${n}-head`]:{minHeight:0,[`${n}-head-title, ${n}-extra`]:{paddingTop:o}}},[`${n}-type-inner`]:oo(e),[`${n}-loading`]:io(e),[`${n}-rtl`]:{direction:"rtl"}}},co=e=>{const{componentCls:t,cardPaddingSM:n,headerHeightSM:r,headerFontSizeSM:o}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:r,padding:`0 ${(0,d.zA)(n)}`,fontSize:o,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}},lo=(0,f.OF)("Card",(e=>{const t=(0,p.h1)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize,cardPaddingSM:12});return[ao(t),co(t)]}),(e=>({headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText})));var so=function(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{const{actionClasses:t,actions:n=[],actionStyle:o}=e;return r.createElement("ul",{className:t,style:o},n.map(((e,t)=>{const o=`action-${t}`;return r.createElement("li",{style:{width:100/n.length+"%"},key:o},r.createElement("span",null,e))})))},fo=r.forwardRef(((e,t)=>{const{prefixCls:n,className:o,rootClassName:l,style:u,extra:d,headStyle:f={},bodyStyle:p={},title:v,loading:m,bordered:h=!0,size:g,type:b,cover:y,actions:A,tabList:w,children:S,activeTabKey:x,defaultActiveTabKey:C,tabBarExtraContent:k,hoverable:E,tabProps:M={},classNames:O,styles:$}=e,T=so(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:R,direction:P,card:z}=r.useContext(c.QO);const I=e=>{var t;return i()(null===(t=null==z?void 0:z.classNames)||void 0===t?void 0:t[e],null==O?void 0:O[e])},N=e=>{var t;return Object.assign(Object.assign({},null===(t=null==z?void 0:z.styles)||void 0===t?void 0:t[e]),null==$?void 0:$[e])},L=r.useMemo((()=>{let e=!1;return r.Children.forEach(S,(t=>{t&&t.type&&t.type===Jr&&(e=!0)})),e}),[S]),j=R("card",n),[_,H,D]=lo(j),B=r.createElement(X,{loading:!0,active:!0,paragraph:{rows:4},title:!1},S),W=void 0!==x,F=Object.assign(Object.assign({},M),{[W?"activeKey":"defaultActiveKey"]:W?x:C,tabBarExtraContent:k});let K;const G=s(g),q=G&&"default"!==G?G:"large",Y=w?r.createElement(Qr,Object.assign({size:q},F,{className:`${j}-head-tabs`,onChange:t=>{var n;null===(n=e.onTabChange)||void 0===n||n.call(e,t)},items:w.map((e=>{var{tab:t}=e,n=so(e,["tab"]);return Object.assign({label:t},n)}))})):null;if(v||d||Y){const e=i()(`${j}-head`,I("header")),t=i()(`${j}-head-title`,I("title")),n=i()(`${j}-extra`,I("extra")),o=Object.assign(Object.assign({},f),N("header"));K=r.createElement("div",{className:e,style:o},r.createElement("div",{className:`${j}-head-wrapper`},v&&r.createElement("div",{className:t,style:N("title")},v),d&&r.createElement("div",{className:n,style:N("extra")},d)),Y)}const V=i()(`${j}-cover`,I("cover")),U=y?r.createElement("div",{className:V,style:N("cover")},y):null,Q=i()(`${j}-body`,I("body")),Z=Object.assign(Object.assign({},p),N("body")),J=r.createElement("div",{className:Q,style:Z},m?B:S),ee=i()(`${j}-actions`,I("actions")),te=A&&A.length?r.createElement(uo,{actionClasses:ee,actionStyle:N("actions"),actions:A}):null,ne=(0,a.A)(T,["onTabChange"]),re=i()(j,null==z?void 0:z.className,{[`${j}-loading`]:m,[`${j}-bordered`]:h,[`${j}-hoverable`]:E,[`${j}-contain-grid`]:L,[`${j}-contain-tabs`]:w&&w.length,[`${j}-${G}`]:G,[`${j}-type-${b}`]:!!b,[`${j}-rtl`]:"rtl"===P},o,l,H,D),oe=Object.assign(Object.assign({},null==z?void 0:z.style),u);return _(r.createElement("div",Object.assign({ref:t},ne,{className:re,style:oe}),K,U,J,te))}));var po=function(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{const{prefixCls:t,className:n,avatar:o,title:a,description:l}=e,s=po(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:u}=r.useContext(c.QO),d=u("card",t),f=i()(`${d}-meta`,n),p=o?r.createElement("div",{className:`${d}-meta-avatar`},o):null,v=a?r.createElement("div",{className:`${d}-meta-title`},a):null,m=l?r.createElement("div",{className:`${d}-meta-description`},l):null,h=v||m?r.createElement("div",{className:`${d}-meta-detail`},v,m):null;return r.createElement("div",Object.assign({},s,{className:f}),p,h)},mo=fo;mo.Grid=Jr,mo.Meta=vo;const ho=mo},3517:(e,t,n)=>{"use strict";n.d(t,{A:()=>be});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),c=n(2901),l=n(6822),s=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),v=n(45);const m={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function h(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,c=o.noLeading,l=void 0!==c&&c,s=o.debounceMode,u=void 0===s?void 0:s,d=!1,f=0;function p(){r&&clearTimeout(r)}function v(){for(var n=arguments.length,o=new Array(n),i=0;ie?l?(f=Date.now(),a||(r=setTimeout(u?m:v,e))):v():!0!==a&&(r=setTimeout(u?m:v,void 0===u?e-s:e)))}return v.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},v}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var g=n(6942),b=n.n(g);const y={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var w=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},S=function(e){for(var t=[],n=x(e),r=C(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},O=function(e){return e&&e.offsetHeight||0},$=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},T=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},R=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},P=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},I=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},N=function(e){var t,n;(I(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",c=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:c})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},L=function(e){I(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=N(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},j=function(e){if(e.unslick)return 0;I(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,c=e.slideCount,l=e.slidesToShow,s=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,v=e.fade,m=e.vertical;if(v||1===e.slideCount)return 0;var h=0;if(i?(h=-_(e),c%s!=0&&r+s>c&&(h=-(r>c?l-(r-c):c%s)),a&&(h+=parseInt(l/2))):(c%s!=0&&r+s>c&&(h=l-c%s),a&&(h=parseInt(l/2))),t=m?r*p*-1+h*p:r*u*-1+h*u,!0===f){var g,b=o&&o.node;if(g=r+_(e),t=(n=b&&b.childNodes[g])?-1*n.offsetLeft:0,!0===a){g=i?r+_(e):r,n=b&&b.children[g],t=0;for(var y=0;ye.currentSlide?e.targetSlide>e.currentSlide+W(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},F=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},K=Object.keys(y);var G=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},q=function(e,t){return e.key+"-"+t},Y=function(e){var t,n=[],o=[],a=[],c=r.Children.count(e.children),l=x(e),s=C(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var v=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),m=f.props.className||"",h=G((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+q(f,d),"data-index":d,className:b()(h,m),tabIndex:"-1","aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&c>1&&!1===e.fade&&!e.unslick){var g=c-d;g<=_(e)&&((t=-g)>=l&&(f=u),h=G((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+q(f,t),"data-index":t,tabIndex:"-1",className:b()(h,m),"aria-hidden":!h["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),v),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=c+d)=w&&d<=g:d===w}),x={message:"dots",index:m,slidesToScroll:l,currentSlide:d},C=this.clickHandler.bind(this,x);v=v.concat(r.createElement("li",{key:m,className:S},r.cloneElement(this.props.customPaging(m),{onClick:C})))}return r.cloneElement(this.props.appendDots(v),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Q(e,t,n){return t=(0,u.A)(t),(0,l.A)(e,(0,s.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Z=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Q(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});T(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:b()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=n(3591),te=["animating"];var ne=function(e){function t(e){var n,c,d,p;(0,a.A)(this,t),c=this,d=t,p=[e],d=(0,u.A)(d),n=(0,l.A)(c,(0,s.A)()?Reflect.construct(d,p||[],(0,u.A)(c).constructor):d.apply(c,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=O(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=S((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new ee.A((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=S((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=h(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),c=e.trackRef&&e.trackRef.node,l=Math.ceil(M(c));if(e.vertical)t=a;else{var s=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(s*=a/100),t=Math.ceil((a-s)/e.slidesToShow)}var u=o&&O(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],v=S((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),m={slideCount:n,slideWidth:t,listWidth:a,trackWidth:l,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(v)};return null===e.autoplaying&&e.autoplay&&(m.autoplaying="playing"),m}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var c=j(e);e=(0,i.A)((0,i.A)({},e),{},{left:c});var l=N(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=l),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),c=H((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var l=0;l=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-_(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,c=r.onLazyLoad,l=r.speed,s=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,c=e.slideCount,l=e.lazyLoad,s=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,v=e.lazyLoadedList;if(t&&n)return{};var m,h,g,b=a,y={},w={},x=o?a:A(a,0,c-1);if(r){if(!o&&(a<0||a>=c))return{};a<0?b=a+c:a>=c&&(b=a-c),l&&v.indexOf(b)<0&&(v=v.concat(b)),y={animating:!0,currentSlide:b,lazyLoadedList:v,targetSlide:b},w={animating:!1,targetSlide:b}}else m=b,b<0?(m=b+c,o?c%d!=0&&(m=c-c%d):m=0):!T(e)&&b>s?b=m=s:u&&b>=c?(b=o?c:c-1,m=o?0:c-1):b>=c&&(m=b-c,o?c%d!=0&&(m=0):m=c-f),!o&&b+f>=c&&(m=c-f),h=j((0,i.A)((0,i.A)({},e),{},{slideIndex:b})),g=j((0,i.A)((0,i.A)({},e),{},{slideIndex:m})),o||(h===g&&(b=m),h=g),l&&(v=v.concat(S((0,i.A)((0,i.A)({},e),{},{currentSlide:b})))),p?(y={animating:!0,currentSlide:m,trackStyle:L((0,i.A)((0,i.A)({},e),{},{left:h})),lazyLoadedList:v,targetSlide:x},w={animating:!1,currentSlide:m,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:g})),swipeLeft:null,targetSlide:x}):y={currentSlide:m,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:v,targetSlide:x};return{state:y,nextState:w}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var m=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));c&&m.length>0&&c(m),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),s&&s(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,v.A)(p,te);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),s&&s(f.currentSlide),delete n.animationEndCallback}))}),l))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,c=e.slidesToScroll,l=e.slidesToShow,s=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=s%c!=0?0:(s-u)%c,"previous"===t.message)a=u-(o=0===n?c:l-n),f&&!p&&(a=-1==(r=u-o)?s-1:r),p||(a=d-c);else if("next"===t.message)a=u+(o=0===n?c:n),f&&!p&&(a=(u+c)%s+n),p||(a=d+c);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var v=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===v?a-=s:a10)return{scrolling:!0};c&&(b.swipeLength=E);var M=(l?-1:1)*(b.curX>b.startX?1:-1);c&&(M=b.curY>b.startY?1:-1);var O=Math.ceil(m/h),R=$(t.touchObject,c),P=b.swipeLength;return g||(0===s&&("right"===R||"down"===R)||s+1>=O&&("left"===R||"up"===R)||!T(t)&&("left"===R||"up"===R))&&(P=b.swipeLength*u,!1===d&&f&&(f(R),C.edgeDragged=!0)),!p&&y&&(y(R),C.swiped=!0),x=o?k+P*(A/S)*M:l?k-P*M:k+P*M,c&&(x=k+P*M),C=(0,i.A)((0,i.A)({},C),{},{touchObject:b,swipeLeft:x,trackStyle:N((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(b.curX-b.startX)<.8*Math.abs(b.curY-b.startY)||b.swipeLength>10&&(C.swiping=!0,w(e)),C}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,c=t.touchThreshold,l=t.verticalSwiping,s=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,v=t.currentSlide,m=t.infinite;if(!n)return r&&w(e),{};var h=l?s/c:a/c,g=$(o,l),b={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return b;if(!o.swipeLength)return b;if(o.swipeLength>h){var y,A;w(e),f&&f(g);var S=m?v:p;switch(g){case"left":case"up":A=S+z(t),y=u?P(t,A):A,b.currentDirection=0;break;case"right":case"down":A=S-z(t),y=u?P(t,A):A,b.currentDirection=1;break;default:y=S}b.triggerSlideHandler=y}else{var x=j(t);b.trackStyle=L((0,i.A)((0,i.A)({},t),{},{left:x}))}return b}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!T((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,c=b()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),l=(0,i.A)((0,i.A)({},n.props),n.state),s=R(l,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(s=(0,i.A)((0,i.A)({},s),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=R(l,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(U,d)}var p=R(l,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Z,p),a=r.createElement(J,p));var v=null;n.props.vertical&&(v={height:n.state.listHeight});var m=null;!1===n.props.vertical?!0===n.props.centerMode&&(m={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(m={padding:n.props.centerPadding+" 0px"});var h=(0,i.A)((0,i.A)({},v),m),g=n.props.touchMove,y={className:"slick-list",style:h,onClick:n.clickHandler,onMouseDown:g?n.swipeStart:null,onMouseMove:n.state.dragging&&g?n.swipeMove:null,onMouseUp:g?n.swipeEnd:null,onMouseLeave:n.state.dragging&&g?n.swipeEnd:null,onTouchStart:g?n.swipeStart:null,onTouchMove:n.state.dragging&&g?n.swipeMove:null,onTouchEnd:g?n.touchEnd:null,onTouchCancel:n.state.dragging&&g?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:c,dir:"ltr",style:n.props.style};return n.props.unslick&&(y={className:"slick-list"},A={className:c,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},y),r.createElement(V,(0,o.A)({ref:n.trackRefHandler},s),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},m),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var g=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),g),n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?oe()({minWidth:0,maxWidth:n}):oe()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=oe()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},y),this.props),t[0].settings):(0,i.A)((0,i.A)({},y),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var c=[],l=null,s=0;s=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*s+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*s+d},f))}e.variableWidth?c.push(r.createElement("div",{key:s,style:{width:l}},u)):c.push(r.createElement("div",{key:s},u))}if("unslick"===e){var v="regular slider "+(this.props.className||"");return r.createElement("div",{className:v},a)}return c.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(ne,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return K.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),c)}}])}(r.Component);var ae=n(2279),ce=n(1466),le=n(5905),se=n(1173);const ue=e=>{const{componentCls:t,antCls:n}=e;return{[t]:Object.assign(Object.assign({},(0,le.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"}})}},de=e=>{const{componentCls:t,motionDurationSlow:n,arrowSize:r,arrowOffset:o}=e,i=e.calc(r).div(1.414).equal();return[{[t]:{".slick-prev, .slick-next":{position:"absolute",top:"50%",width:r,height:r,transform:"translateY(-50%)",color:"#fff",opacity:.4,background:"transparent",padding:0,lineHeight:0,border:0,outline:"none",cursor:"pointer",zIndex:1,transition:`opacity ${n}`,"&:hover, &:focus":{opacity:1},"&.slick-disabled":{pointerEvents:"none",opacity:0},"&::after":{boxSizing:"border-box",position:"absolute",top:e.calc(r).sub(i).div(2).equal(),insetInlineStart:e.calc(r).sub(i).div(2).equal(),display:"inline-block",width:i,height:i,border:"0 solid currentcolor",borderInlineWidth:"2px 0",borderBlockWidth:"2px 0",borderRadius:1,content:'""'}},".slick-prev":{insetInlineStart:o,"&::after":{transform:"rotate(-45deg)"}},".slick-next":{insetInlineEnd:o,"&::after":{transform:"rotate(135deg)"}}}}]},fe=e=>{const{componentCls:t,dotOffset:n,dotWidth:r,dotHeight:o,dotGap:i,colorBgContainer:a,motionDurationSlow:c}=e;return[{[t]:{".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:n},"&-top":{top:n,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:r,height:o,marginInline:i,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${c}`,button:{position:"relative",display:"block",width:"100%",height:o,padding:0,color:"transparent",fontSize:0,background:a,border:0,borderRadius:o,outline:"none",cursor:"pointer",opacity:.2,transition:`all ${c}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(i).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:a,opacity:1},"&: hover, &:focus":{opacity:1}}}}}}]},pe=e=>{const{componentCls:t,dotOffset:n,arrowOffset:r,marginXXS:o}=e,i={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-prev, .slick-next":{insetInlineStart:"50%",marginBlockStart:"unset",transform:"translateX(-50%)"},".slick-prev":{insetBlockStart:r,insetInlineStart:"50%","&::after":{transform:"rotate(45deg)"}},".slick-next":{insetBlockStart:"auto",insetBlockEnd:r,"&::after":{transform:"rotate(-135deg)"}},".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},i),{margin:`${(0,ce.zA)(o)} 0`,verticalAlign:"baseline",button:i,"&.slick-active":Object.assign(Object.assign({},i),{button:i})})}}}},ve=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},me=(0,se.OF)("Carousel",(e=>[ue(e),de(e),fe(e),pe(e),ve(e)]),(e=>({arrowSize:16,arrowOffset:e.marginXS,dotWidth:16,dotHeight:3,dotGap:e.marginXXS,dotOffset:12,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var he=function(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{const{dots:n=!0,arrows:o=!1,prevArrow:i=r.createElement("button",{type:"button","aria-label":"prev"}),nextArrow:a=r.createElement("button",{type:"button","aria-label":"next"}),draggable:c=!1,waitForAnimate:l=!1,dotPosition:s="bottom",vertical:u="left"===s||"right"===s,rootClassName:d,className:f,style:p,id:v}=e,m=he(e,["dots","arrows","prevArrow","nextArrow","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:h,direction:g,carousel:y}=r.useContext(ae.QO),A=r.useRef(),w=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];A.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:w,autoPlay:A.current.innerSlider.autoPlay,innerSlider:A.current.innerSlider,prev:A.current.slickPrev,next:A.current.slickNext})),[A.current]);const S=r.useRef(r.Children.count(e.children));r.useEffect((()=>{S.current!==r.Children.count(e.children)&&(w(e.initialSlide||0,!1),S.current=r.Children.count(e.children))}),[e.children]);const x=Object.assign({vertical:u,className:b()(f,null==y?void 0:y.className),style:Object.assign(Object.assign({},null==y?void 0:y.style),p)},m);"fade"===x.effect&&(x.fade=!0);const C=h("carousel",x.prefixCls),k="slick-dots",E=!!n,M=b()(k,`${k}-${s}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[O,$,T]=me(C),R=b()(C,{[`${C}-rtl`]:"rtl"===g,[`${C}-vertical`]:x.vertical},$,T,d);return O(r.createElement("div",{className:R,id:v},r.createElement(ie,Object.assign({ref:A},x,{dots:E,dotsClass:M,arrows:o,prevArrow:i,nextArrow:a,draggable:c,verticalSwiping:u,waitForAnimate:l}))))}));const be=ge},8224:(e,t,n)=>{"use strict";n.d(t,{A:()=>a,c:()=>i});var r=n(6540);const o=r.createContext(void 0),i=e=>{let{children:t,size:n}=e;const i=r.useContext(o);return r.createElement(o.Provider,{value:n||i},t)},a=o},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>i,pM:()=>o});var r=n(6540);const o="anticon",i=r.createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:o}),{Consumer:a}=i},934:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6613);const o=e=>{const[,,,,t]=(0,r.Ay)();return t?`${e}-css-var`:""}},1412:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>Q});var r=n(6540),o=n.t(r,2),i=n(1466),a=n(1053),c=n(8104),l=n(1526);n(8210);function s(){}const u=r.createContext({}),d=()=>{const e=()=>{};return e.deprecated=s,e},f=(0,r.createContext)(void 0);var p=n(2130);let v=Object.assign({},p.A.Modal),m=[];const h=()=>m.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),p.A.Modal);const g=(0,r.createContext)(void 0);const b=e=>{const{locale:t={},children:n,_ANT_MARK__:o}=e;r.useEffect((()=>{const e=function(e){if(e){const t=Object.assign({},e);return m.push(t),v=h(),()=>{m=m.filter((e=>e!==t)),v=h()}}v=Object.assign({},p.A.Modal)}(t&&t.Modal);return e}),[t]);const i=r.useMemo((()=>Object.assign(Object.assign({},t),{exist:!0})),[t]);return r.createElement(g.Provider,{value:i},n)};var y=n(9806),A=n(723),w=n(2279),S=n(2200),x=n(4978),C=n(998),k=n(5089);const E=`-ant-${Date.now()}-${Math.random()}`;function M(e,t){const n=function(e,t){const n={},r=(e,t)=>{let n=e.clone();return n=(null==t?void 0:t(n))||n,n.toRgbString()},o=(e,t)=>{const o=new x.q(e),i=(0,S.cM)(o.toRgbString());n[`${t}-color`]=r(o),n[`${t}-color-disabled`]=i[1],n[`${t}-color-hover`]=i[4],n[`${t}-color-active`]=i[6],n[`${t}-color-outline`]=o.clone().setAlpha(.2).toRgbString(),n[`${t}-color-deprecated-bg`]=i[0],n[`${t}-color-deprecated-border`]=i[2]};if(t.primaryColor){o(t.primaryColor,"primary");const e=new x.q(t.primaryColor),i=(0,S.cM)(e.toRgbString());i.forEach(((e,t)=>{n[`primary-${t+1}`]=e})),n["primary-color-deprecated-l-35"]=r(e,(e=>e.lighten(35))),n["primary-color-deprecated-l-20"]=r(e,(e=>e.lighten(20))),n["primary-color-deprecated-t-20"]=r(e,(e=>e.tint(20))),n["primary-color-deprecated-t-50"]=r(e,(e=>e.tint(50))),n["primary-color-deprecated-f-12"]=r(e,(e=>e.setAlpha(.12*e.getAlpha())));const a=new x.q(i[0]);n["primary-color-active-deprecated-f-30"]=r(a,(e=>e.setAlpha(.3*e.getAlpha()))),n["primary-color-active-deprecated-d-02"]=r(a,(e=>e.darken(2)))}return t.successColor&&o(t.successColor,"success"),t.warningColor&&o(t.warningColor,"warning"),t.errorColor&&o(t.errorColor,"error"),t.infoColor&&o(t.infoColor,"info"),`\n :root {\n ${Object.keys(n).map((t=>`--${e}-${t}: ${n[t]};`)).join("\n")}\n }\n `.trim()}(e,t);(0,C.A)()&&(0,k.BD)(n,`${E}-dynamic-theme`)}const O=r.createContext(!1),$=e=>{let{children:t,disabled:n}=e;const o=r.useContext(O);return r.createElement(O.Provider,{value:null!=n?n:o},t)},T=O;var R=n(8224);const P=function(){return{componentDisabled:(0,r.useContext)(T),componentSize:(0,r.useContext)(R.A)}};var z=n(3210);const I=Object.assign({},o),{useId:N}=I,L=void 0===N?()=>"":N;var j=n(8542),_=n(6613);function H(e){const{children:t}=e,[,n]=(0,_.Ay)(),{motion:o}=n,i=r.useRef(!1);return i.current=i.current||!1===o,i.current?r.createElement(j.Kq,{motion:o},t):t}const D=()=>null;var B=n(2366),W=function(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{const{children:t,csp:n,autoInsertSpaceInButton:o,alert:s,anchor:v,form:m,locale:h,componentSize:g,direction:S,space:x,virtual:C,dropdownMatchSelectWidth:k,popupMatchSelectWidth:E,popupOverflow:M,legacyLocale:O,parentContext:T,iconPrefixCls:P,theme:I,componentDisabled:N,segmented:j,statistic:_,spin:X,calendar:K,carousel:G,cascader:q,collapse:Y,typography:V,checkbox:U,descriptions:Q,divider:Z,drawer:J,skeleton:ee,steps:te,image:ne,layout:re,list:oe,mentions:ie,modal:ae,progress:ce,result:le,slider:se,breadcrumb:ue,menu:de,pagination:fe,input:pe,textArea:ve,empty:me,badge:he,radio:ge,rate:be,switch:ye,transfer:Ae,avatar:we,message:Se,tag:xe,table:Ce,card:ke,tabs:Ee,timeline:Me,timePicker:Oe,upload:$e,notification:Te,tree:Re,colorPicker:Pe,datePicker:ze,rangePicker:Ie,flex:Ne,wave:Le,dropdown:je,warning:_e,tour:He,floatButtonGroup:De}=e,Be=r.useCallback(((t,n)=>{const{prefixCls:r}=e;if(n)return n;const o=r||T.getPrefixCls("");return t?`${o}-${t}`:o}),[T.getPrefixCls,e.prefixCls]),We=P||T.iconPrefixCls||w.pM,Fe=n||T.csp;(0,B.A)(We,Fe);const Xe=function(e,t,n){var r;d("ConfigProvider");const o=e||{},i=!1!==o.inherit&&t?t:Object.assign(Object.assign({},y.sb),{hashed:null!==(r=null==t?void 0:t.hashed)&&void 0!==r?r:y.sb.hashed,cssVar:null==t?void 0:t.cssVar}),a=L();return(0,c.A)((()=>{var r,c;if(!e)return t;const l=Object.assign({},i.components);Object.keys(e.components||{}).forEach((t=>{l[t]=Object.assign(Object.assign({},l[t]),e.components[t])}));const s=`css-var-${a.replace(/:/g,"")}`,u=(null!==(r=o.cssVar)&&void 0!==r?r:i.cssVar)&&Object.assign(Object.assign(Object.assign({prefix:null==n?void 0:n.prefixCls},"object"==typeof i.cssVar?i.cssVar:{}),"object"==typeof o.cssVar?o.cssVar:{}),{key:"object"==typeof o.cssVar&&(null===(c=o.cssVar)||void 0===c?void 0:c.key)||s});return Object.assign(Object.assign(Object.assign({},i),o),{token:Object.assign(Object.assign({},i.token),o.token),components:l,cssVar:u})}),[o,i],((e,t)=>e.some(((e,n)=>{const r=t[n];return!(0,z.A)(e,r,!0)}))))}(I,T.theme,{prefixCls:Be("")});const Ke={csp:Fe,autoInsertSpaceInButton:o,alert:s,anchor:v,locale:h||O,direction:S,space:x,virtual:C,popupMatchSelectWidth:null!=E?E:k,popupOverflow:M,getPrefixCls:Be,iconPrefixCls:We,theme:Xe,segmented:j,statistic:_,spin:X,calendar:K,carousel:G,cascader:q,collapse:Y,typography:V,checkbox:U,descriptions:Q,divider:Z,drawer:J,skeleton:ee,steps:te,image:ne,input:pe,textArea:ve,layout:re,list:oe,mentions:ie,modal:ae,progress:ce,result:le,slider:se,breadcrumb:ue,menu:de,pagination:fe,empty:me,badge:he,radio:ge,rate:be,switch:ye,transfer:Ae,avatar:we,message:Se,tag:xe,table:Ce,card:ke,tabs:Ee,timeline:Me,timePicker:Oe,upload:$e,notification:Te,tree:Re,colorPicker:Pe,datePicker:ze,rangePicker:Ie,flex:Ne,wave:Le,dropdown:je,warning:_e,tour:He,floatButtonGroup:De};const Ge=Object.assign({},T);Object.keys(Ke).forEach((e=>{void 0!==Ke[e]&&(Ge[e]=Ke[e])})),F.forEach((t=>{const n=e[t];n&&(Ge[t]=n)})),void 0!==o&&(Ge.button=Object.assign({autoInsertSpace:o},Ge.button));const qe=(0,c.A)((()=>Ge),Ge,((e,t)=>{const n=Object.keys(e),r=Object.keys(t);return n.length!==r.length||n.some((n=>e[n]!==t[n]))})),Ye=r.useMemo((()=>({prefixCls:We,csp:Fe})),[We,Fe]);let Ve=r.createElement(r.Fragment,null,r.createElement(D,{dropdownMatchSelectWidth:k}),t);const Ue=r.useMemo((()=>{var e,t,n,r;return(0,l.h)((null===(e=p.A.Form)||void 0===e?void 0:e.defaultValidateMessages)||{},(null===(n=null===(t=qe.locale)||void 0===t?void 0:t.Form)||void 0===n?void 0:n.defaultValidateMessages)||{},(null===(r=qe.form)||void 0===r?void 0:r.validateMessages)||{},(null==m?void 0:m.validateMessages)||{})}),[qe,null==m?void 0:m.validateMessages]);Object.keys(Ue).length>0&&(Ve=r.createElement(f.Provider,{value:Ue},Ve)),h&&(Ve=r.createElement(b,{locale:h,_ANT_MARK__:"internalMark"},Ve)),(We||Fe)&&(Ve=r.createElement(a.A.Provider,{value:Ye},Ve)),g&&(Ve=r.createElement(R.c,{size:g},Ve)),Ve=r.createElement(H,null,Ve);const Qe=r.useMemo((()=>{const e=Xe||{},{algorithm:t,token:n,components:r,cssVar:o}=e,a=W(e,["algorithm","token","components","cssVar"]),c=t&&(!Array.isArray(t)||t.length>0)?(0,i.an)(t):y.zQ,l={};Object.entries(r||{}).forEach((e=>{let[t,n]=e;const r=Object.assign({},n);"algorithm"in r&&(!0===r.algorithm?r.theme=c:(Array.isArray(r.algorithm)||"function"==typeof r.algorithm)&&(r.theme=(0,i.an)(r.algorithm)),delete r.algorithm),l[t]=r}));const s=Object.assign(Object.assign({},A.A),n);return Object.assign(Object.assign({},a),{theme:c,token:s,components:l,override:Object.assign({override:s},l),cssVar:o})}),[Xe]);return I&&(Ve=r.createElement(y.vG.Provider,{value:Qe},Ve)),qe.warning&&(Ve=r.createElement(u.Provider,{value:qe.warning},Ve)),void 0!==N&&(Ve=r.createElement($,{disabled:N},Ve)),r.createElement(w.QO.Provider,{value:qe},Ve)},U=e=>{const t=r.useContext(w.QO),n=r.useContext(g);return r.createElement(V,Object.assign({parentContext:t,legacyLocale:n},e))};U.ConfigContext=w.QO,U.SizeContext=R.A,U.config=e=>{const{prefixCls:t,iconPrefixCls:n,theme:r,holderRender:o}=e;void 0!==t&&(X=t),void 0!==n&&(K=n),"holderRender"in e&&(q=o),r&&(!function(e){return Object.keys(e).some((e=>e.endsWith("Color")))}(r)?G=r:M(Y(),r))},U.useConfig=P,Object.defineProperty(U,"SizeContext",{get:()=>R.A});const Q=U},943:(e,t,n)=>{"use strict";n.d(t,{A:()=>xt});var r=n(6540),o=n(8168);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var a=n(6653),c=function(e,t){return r.createElement(a.A,(0,o.A)({},e,{ref:t,icon:i}))};const l=r.forwardRef(c);var s=n(6942),u=n.n(s),d=n(9379),f=n(4467),p=n(641),v=n(2284),m=n(45);function h(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var g=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],y=r.createContext(null),A=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,p.A)(i,2),c=a[0],l=a[1],s=(0,r.useRef)(!1),u="error"===c;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&l("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!s.current?l("loading"):u&&l("normal")}),[t]);var d=function(){l("normal")};return[function(e){s.current=!1,"loading"===c&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(s.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},c]}var S=n(5470),x=r.createContext({}),C=n(4808),k=n(6855),E=n(6928),M="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),O="aria-",$="data-";function T(e,t){return 0===e.indexOf(t)}function R(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,d.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||T(n,O))||t.data&&T(n,$)||t.attr&&M.includes(n))&&(r[n]=e[n])})),r}function P(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function z(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}var I=n(8542),N=n(8719);const L=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var j={width:0,height:0,overflow:"hidden",outline:"none"},_={outline:"none"},H=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.className,a=e.style,c=e.title,l=e.ariaId,s=e.footer,f=e.closable,p=e.closeIcon,m=e.onClose,h=e.children,g=e.bodyStyle,b=e.bodyProps,y=e.modalRender,A=e.onMouseDown,w=e.onMouseUp,S=e.holderRef,C=e.visible,k=e.forceRender,E=e.width,M=e.height,O=e.classNames,$=e.styles,T=r.useContext(x).panel,P=(0,N.xK)(S,T),z=(0,r.useRef)(),I=(0,r.useRef)(),H=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=H.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===I.current?z.current.focus():e||t!==z.current||I.current.focus()}}}));var D,B,W={};void 0!==E&&(W.width=E),void 0!==M&&(W.height=M),s&&(D=r.createElement("div",{className:u()("".concat(n,"-footer"),null==O?void 0:O.footer),style:(0,d.A)({},null==$?void 0:$.footer)},s)),c&&(B=r.createElement("div",{className:u()("".concat(n,"-header"),null==O?void 0:O.header),style:(0,d.A)({},null==$?void 0:$.header)},r.createElement("div",{className:"".concat(n,"-title"),id:l},c)));var F,X=(0,r.useMemo)((function(){return"object"===(0,v.A)(f)&&null!==f?f:f?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[f,p]),K=R(X,!0);f&&(F=r.createElement("button",(0,o.A)({type:"button",onClick:m,"aria-label":"Close"},K,{className:"".concat(n,"-close")}),X.closeIcon));var G=r.createElement("div",{className:u()("".concat(n,"-content"),null==O?void 0:O.content),style:null==$?void 0:$.content},F,B,r.createElement("div",(0,o.A)({className:u()("".concat(n,"-body"),null==O?void 0:O.body),style:(0,d.A)((0,d.A)({},g),null==$?void 0:$.body)},b),h),D);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":c?l:null,"aria-modal":"true",ref:P,style:(0,d.A)((0,d.A)({},a),W),className:u()(n,i),onMouseDown:A,onMouseUp:w},r.createElement("div",{tabIndex:0,ref:z,style:j,"aria-hidden":"true"}),r.createElement("div",{ref:H,tabIndex:-1,style:_},r.createElement(L,{shouldUpdate:C||k},y?y(G):G)),r.createElement("div",{tabIndex:0,ref:I,style:j,"aria-hidden":"true"}))}));const D=H;var B=r.forwardRef((function(e,t){var n=e.prefixCls,i=e.title,a=e.style,c=e.className,l=e.visible,s=e.forceRender,f=e.destroyOnClose,v=e.motionName,m=e.ariaId,h=e.onVisibleChanged,g=e.mousePosition,b=(0,r.useRef)(),y=r.useState(),A=(0,p.A)(y,2),w=A[0],S=A[1],x={};function C(){var e,t,n,r,o,i=(e=b.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=z(o),n.top+=z(o,!0),n);S(g?"".concat(g.x-i.left,"px ").concat(g.y-i.top,"px"):"")}return w&&(x.transformOrigin=w),r.createElement(I.Ay,{visible:l,onVisibleChanged:h,onAppearPrepare:C,onEnterPrepare:C,forceRender:s,motionName:v,removeOnLeave:f,ref:b},(function(l,s){var f=l.className,p=l.style;return r.createElement(D,(0,o.A)({},e,{ref:t,title:i,ariaId:m,prefixCls:n,holderRef:s,style:(0,d.A)((0,d.A)((0,d.A)({},p),a),x),className:u()(c,f)}))}))}));B.displayName="Content";const W=B;function F(e){var t=e.prefixCls,n=e.style,i=e.visible,a=e.maskProps,c=e.motionName,l=e.className;return r.createElement(I.Ay,{key:"mask",visible:i,motionName:c,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,i){var c=e.className,s=e.style;return r.createElement("div",(0,o.A)({ref:i,style:(0,d.A)((0,d.A)({},s),n),className:u()("".concat(t,"-mask"),c,l)},a))}))}var X=n(8210);function K(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,i=e.zIndex,a=e.visible,c=void 0!==a&&a,l=e.keyboard,s=void 0===l||l,f=e.focusTriggerAfterClose,v=void 0===f||f,m=e.wrapStyle,h=e.wrapClassName,g=e.wrapProps,b=e.onClose,y=e.afterOpenChange,A=e.afterClose,w=e.transitionName,S=e.animation,x=e.closable,M=void 0===x||x,O=e.mask,$=void 0===O||O,T=e.maskTransitionName,z=e.maskAnimation,I=e.maskClosable,N=void 0===I||I,L=e.maskStyle,j=e.maskProps,_=e.rootClassName,H=e.classNames,D=e.styles;var B=(0,r.useRef)(),X=(0,r.useRef)(),K=(0,r.useRef)(),G=r.useState(c),q=(0,p.A)(G,2),Y=q[0],V=q[1],U=(0,k.A)();function Q(e){null==b||b(e)}var Z=(0,r.useRef)(!1),J=(0,r.useRef)(),ee=null;return N&&(ee=function(e){Z.current?Z.current=!1:X.current===e.target&&Q(e)}),(0,r.useEffect)((function(){c&&(V(!0),(0,C.A)(X.current,document.activeElement)||(B.current=document.activeElement))}),[c]),(0,r.useEffect)((function(){return function(){clearTimeout(J.current)}}),[]),r.createElement("div",(0,o.A)({className:u()("".concat(n,"-root"),_)},R(e,{data:!0})),r.createElement(F,{prefixCls:n,visible:$&&c,motionName:P(n,T,z),style:(0,d.A)((0,d.A)({zIndex:i},L),null==D?void 0:D.mask),maskProps:j,className:null==H?void 0:H.mask}),r.createElement("div",(0,o.A)({tabIndex:-1,onKeyDown:function(e){if(s&&e.keyCode===E.A.ESC)return e.stopPropagation(),void Q(e);c&&e.keyCode===E.A.TAB&&K.current.changeActive(!e.shiftKey)},className:u()("".concat(n,"-wrap"),h,null==H?void 0:H.wrapper),ref:X,onClick:ee,style:(0,d.A)((0,d.A)((0,d.A)({zIndex:i},m),null==D?void 0:D.wrapper),{},{display:Y?null:"none"})},g),r.createElement(W,(0,o.A)({},e,{onMouseDown:function(){clearTimeout(J.current),Z.current=!0},onMouseUp:function(){J.current=setTimeout((function(){Z.current=!1}))},ref:K,closable:M,ariaId:U,prefixCls:n,visible:c&&Y,onClose:Q,onVisibleChanged:function(e){if(e)(0,C.A)(X.current,document.activeElement)||null===(t=K.current)||void 0===t||t.focus();else{if(V(!1),$&&B.current&&v){try{B.current.focus({preventScroll:!0})}catch(n){}B.current=null}Y&&(null==A||A())}var t;null==y||y(e)},motionName:P(n,w,S)}))))}var G=function(e){var t=e.visible,n=e.getContainer,i=e.forceRender,a=e.destroyOnClose,c=void 0!==a&&a,l=e.afterClose,s=e.panelRef,u=r.useState(t),d=(0,p.A)(u,2),f=d[0],v=d[1],m=r.useMemo((function(){return{panel:s}}),[s]);return r.useEffect((function(){t&&v(!0)}),[t]),i||!c||f?r.createElement(x.Provider,{value:m},r.createElement(S.A,{open:t||i||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(K,(0,o.A)({},e,{destroyOnClose:c,afterClose:function(){null==l||l(),v(!1)}})))):null};G.displayName="Dialog";const q=G;var Y=n(961);function V(e,t,n,r){var o=Y.unstable_batchedUpdates?function(e){Y.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var U=n(3210),Q=n(5371),Z={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function J(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,f.A)({},e,i);if(t<0&&or)return(0,f.A)({},e,t<0?i:-i);return{}}function ee(e,t,n,r){var o=h(),i=o.width,a=o.height,c=null;return e<=i&&t<=a?c={x:0,y:0}:(e>i||t>a)&&(c=(0,d.A)((0,d.A)({},J("x",n,e,i)),J("y",r,t,a))),c}function te(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function ne(e,t,n,o,i,a,c){var l=i.rotate,s=i.scale,u=i.x,f=i.y,v=(0,r.useState)(!1),m=(0,p.A)(v,2),h=m[0],g=m[1],b=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),y=function(e){b.current=(0,d.A)((0,d.A)({},b.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=V(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:h,onTouchStart:function(e){if(t){e.stopPropagation(),g(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?y({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):y({point1:{x:r[0].clientX-u,y:r[0].clientY-f},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=b.current,o=r.point1,i=r.point2,l=r.eventType;if(n.length>1&&"touchZoom"===l){var s={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=te(e,n),i=te(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,s,u),f=(0,p.A)(d,2),v=f[0],m=f[1],h=te(s,u)/te(o,i);c(h,"touchZoom",v,m,!0),y({point1:s,point2:u,eventType:"touchZoom"})}else"move"===l&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),y({eventType:"move"}))},onTouchEnd:function(){if(n){if(h&&g(!1),y({eventType:"none"}),o>s)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*s,r=e.current.offsetHeight*s,i=e.current.getBoundingClientRect(),c=i.left,u=i.top,f=l%180!=0,p=ee(f?r:t,f?t:r,c,u);p&&a((0,d.A)({},p),"dragRebound")}}}}const re=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,c=e.icons,l=e.countRender,s=e.showSwitch,p=e.showProgress,v=e.current,m=e.transform,h=e.count,g=e.scale,b=e.minScale,A=e.maxScale,w=e.closeIcon,x=e.onSwitchLeft,C=e.onSwitchRight,k=e.onClose,M=e.onZoomIn,O=e.onZoomOut,$=e.onRotateRight,T=e.onRotateLeft,R=e.onFlipX,P=e.onFlipY,z=e.toolbarRender,N=e.zIndex,L=(0,r.useContext)(y),j=c.rotateLeft,_=c.rotateRight,H=c.zoomIn,D=c.zoomOut,B=c.close,W=c.left,F=c.right,X=c.flipX,K=c.flipY,G="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===E.A.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var q=[{icon:K,onClick:P,type:"flipY"},{icon:X,onClick:R,type:"flipX"},{icon:j,onClick:T,type:"rotateLeft"},{icon:_,onClick:$,type:"rotateRight"},{icon:D,onClick:O,type:"zoomOut",disabled:g<=b},{icon:H,onClick:M,type:"zoomIn",disabled:g===A}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,c=e.disabled;return r.createElement("div",{className:u()(G,(t={},(0,f.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,f.A)(t,"".concat(i,"-operations-operation-disabled"),!!c),t)),onClick:o,key:a},n)})),Y=r.createElement("div",{className:"".concat(i,"-operations")},q);return r.createElement(I.Ay,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(S.A,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:u()("".concat(i,"-operations-wrapper"),t,a),style:(0,d.A)((0,d.A)({},n),{},{zIndex:N})},null===w?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},w||B),s&&r.createElement(r.Fragment,null,r.createElement("div",{className:u()("".concat(i,"-switch-left"),(0,f.A)({},"".concat(i,"-switch-left-disabled"),0===v)),onClick:x},W),r.createElement("div",{className:u()("".concat(i,"-switch-right"),(0,f.A)({},"".concat(i,"-switch-right-disabled"),v===h-1)),onClick:C},F)),r.createElement("div",{className:"".concat(i,"-footer")},p&&r.createElement("div",{className:"".concat(i,"-progress")},l?l(v+1,h):"".concat(v+1," / ").concat(h)),z?z(Y,(0,d.A)({icons:{flipYIcon:q[0],flipXIcon:q[1],rotateLeftIcon:q[2],rotateRightIcon:q[3],zoomOutIcon:q[4],zoomInIcon:q[5]},actions:{onFlipY:P,onFlipX:R,onRotateLeft:T,onRotateRight:$,onZoomOut:O,onZoomIn:M},transform:m},L?{current:v,total:h}:{})):Y)))}))};var oe=["fallback","src","imgRef"],ie=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],ae=function(e){var t=e.fallback,n=e.src,i=e.imgRef,a=(0,m.A)(e,oe),c=w({src:n,fallback:t}),l=(0,p.A)(c,2),s=l[0],u=l[1];return r.createElement("img",(0,o.A)({ref:function(e){i.current=e,s(e)}},a,u))};const ce=function(e){var t=e.prefixCls,n=e.src,i=e.alt,a=e.fallback,c=e.movable,l=void 0===c||c,s=e.onClose,v=e.visible,g=e.icons,b=void 0===g?{}:g,A=e.rootClassName,w=e.closeIcon,S=e.getContainer,x=e.current,C=void 0===x?0:x,k=e.count,M=void 0===k?1:k,O=e.countRender,$=e.scaleStep,T=void 0===$?.5:$,R=e.minScale,P=void 0===R?1:R,z=e.maxScale,I=void 0===z?50:z,N=e.transitionName,L=void 0===N?"zoom":N,j=e.maskTransitionName,_=void 0===j?"fade":j,H=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,W=e.onTransform,F=e.onChange,K=(0,m.A)(e,ie),G=(0,r.useRef)(),Y=(0,r.useContext)(y),J=Y&&M>1,te=Y&&M>=1,oe=(0,r.useState)(!0),ce=(0,p.A)(oe,2),le=ce[0],se=ce[1],ue=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),c=(0,r.useState)(Z),l=(0,p.A)(c,2),s=l[0],u=l[1],f=function(e,t){null===i.current&&(a.current=[],i.current=(0,Q.A)((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,d.A)((0,d.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,d.A)((0,d.A)({},s),e))};return{transform:s,resetTransform:function(e){u(Z),o&&!(0,U.A)(Z,s)&&o({transform:Z,action:e})},updateTransform:f,dispatchZoomChange:function(r,o,i,a,c){var l=e.current,u=l.width,d=l.height,p=l.offsetWidth,v=l.offsetHeight,m=l.offsetLeft,g=l.offsetTop,b=r,y=s.scale*r;y>n?(y=n,b=n/s.scale):y0&&(r=1/r),c(r,"wheel",e.clientX,e.clientY)}}}}(G,l,v,T,de,pe,ve),he=me.isMoving,ge=me.onMouseDown,be=me.onWheel,ye=ne(G,l,v,P,de,pe,ve),Ae=ye.isTouching,we=ye.onTouchStart,Se=ye.onTouchMove,xe=ye.onTouchEnd,Ce=de.rotate,ke=de.scale,Ee=u()((0,f.A)({},"".concat(t,"-moving"),he));(0,r.useEffect)((function(){le||se(!0)}),[le]);var Me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C>0&&(se(!1),fe("prev"),null==F||F(C-1,C))},Oe=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),C1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[(0,qe.b)(r,Ye,Ve,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},Qe=new Xe.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),Ze=new Xe.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),Je=new Xe.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),et=new Xe.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),tt=new Xe.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),nt=new Xe.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),rt={zoom:{inKeyframes:Qe,outKeyframes:Ze},"zoom-big":{inKeyframes:Je,outKeyframes:et},"zoom-big-fast":{inKeyframes:Je,outKeyframes:et},"zoom-left":{inKeyframes:new Xe.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Xe.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Xe.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Xe.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:tt,outKeyframes:nt},"zoom-down":{inKeyframes:new Xe.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Xe.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},ot=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=rt[t];return[(0,qe.b)(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var it=n(336),at=n(1173);function ct(e){return{position:e,inset:0}}const lt=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},ct("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},ct("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:Ue(e)}]},st=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Xe.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,Ge.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Xe.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Xe.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,Ge.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Xe.zA)(e.borderRadiusLG)} ${(0,Xe.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},ut=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},dt=((0,at.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,it.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[st(t),ut(t),lt(t),ot(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Xe.zA)(e.paddingMD)} ${(0,Xe.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Xe.zA)(e.padding)} ${(0,Xe.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Xe.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Xe.zA)(e.paddingXS)} ${(0,Xe.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Xe.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Xe.zA)(e.borderRadiusLG)} ${(0,Xe.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Xe.zA)(2*e.padding)} ${(0,Xe.zA)(2*e.padding)} ${(0,Xe.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),ft=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new Ke.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},Ge.L9),{padding:`0 ${(0,Xe.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},pt=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:c,previewOperationHoverColor:l,motionDurationSlow:s,iconCls:u,colorTextLightSolid:d}=e,f=new Ke.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${s}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Xe.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${s}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:l},"&-disabled":{color:c,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},vt=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,c=new Ke.q(t).setAlpha(.1),l=c.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:c.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:l.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},mt=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},dt()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},dt()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[pt(e),vt(e)]}]},ht=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},ft(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},dt())}}},gt=e=>{const{previewCls:t}=e;return{[`${t}-root`]:ot(e,"zoom"),"&":Ue(e,!0)}},bt=(0,at.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,it.h1)(e,{previewCls:t,modalMaskBg:new Ke.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[ht(n),mt(n),lt((0,it.h1)(n,{componentCls:t})),gt(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new Ke.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new Ke.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new Ke.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var yt=function(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{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:c}=e,s=wt(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:d,locale:f=ke.A,getPopupContainer:p,image:v}=r.useContext(xe.QO),m=d("image",n),h=d(),g=f.Image||ke.A.Image,b=(0,Ce.A)(m),[y,A,w]=bt(m,b),S=u()(a,A,w,b),x=u()(i,A,null==v?void 0:v.className),[C]=we("ImagePreview","object"==typeof o?o.zIndex:void 0),k=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=wt(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${m}-mask-info`},r.createElement(l,null),null==g?void 0:g.preview),icons:At},a),{getContainer:null!=n?n:p,transitionName:(0,Se.b)(h,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(h,"fade",t.maskTransitionName),zIndex:C,closeIcon:null!=i?i:null===(e=null==v?void 0:v.preview)||void 0===e?void 0:e.closeIcon})}),[o,g,null===(t=null==v?void 0:v.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==v?void 0:v.style),c);return y(r.createElement(me,Object.assign({prefixCls:m,preview:k,rootClassName:S,className:x,style:E},s)))};St.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=yt(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(xe.QO),a=i("image",t),c=`${a}-preview`,l=i(),s=(0,Ce.A)(a),[d,f,p]=bt(a,s),[v]=we("ImagePreview","object"==typeof n?n.zIndex:void 0),m=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=u()(f,p,s,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:(0,Se.b)(l,"zoom",t.transitionName),maskTransitionName:(0,Se.b)(l,"fade",t.maskTransitionName),rootClassName:r,zIndex:v})}),[n]);return d(r.createElement(me.PreviewGroup,Object.assign({preview:m,previewPrefixCls:c,icons:At},o)))};const xt=St},2130:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});const r={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"};const o={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"},i={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},a={lang:Object.assign({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},o),timePickerLocale:Object.assign({},i)},c="${label} is not a valid ${type}",l={locale:"en",Pagination:r,DatePicker:a,TimePicker:i,Calendar:a,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Tour:{Next:"Next",Previous:"Previous",Finish:"Finish"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",deselectAll:"Deselect all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:c,method:c,array:c,object:c,number:c,date:c,boolean:c,integer:c,float:c,regexp:c,email:c,url:c,hex:c},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"},QRCode:{expired:"QR code expired",refresh:"Refresh",scanned:"Scanned"},ColorPicker:{presetEmpty:"Empty"}}},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>d,L9:()=>o,Nk:()=>a,av:()=>l,dF:()=>i,t6:()=>c,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),c=()=>({"&::before":{display:"table",content:'""'},"&::after":{display:"table",clear:"both",content:'""'}}),l=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n,r)=>{const o=`[class^="${t}"], [class*=" ${t}"]`,i=n?`.${n}`:o,a={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let c={};return!1!==r&&(c={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[i]:Object.assign(Object.assign(Object.assign({},c),a),{[o]:a})}},u=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),d=e=>({"&:focus-visible":Object.assign({},u(e))})},4980:(e,t,n)=>{"use strict";n.d(t,{b:()=>i});const r=e=>({animationDuration:e,animationFillMode:"both"}),o=e=>({animationDuration:e,animationFillMode:"both"}),i=function(e,t,n,i){const a=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${a}${e}-enter,\n ${a}${e}-appear\n `]:Object.assign(Object.assign({},r(i)),{animationPlayState:"paused"}),[`${a}${e}-leave`]:Object.assign(Object.assign({},o(i)),{animationPlayState:"paused"}),[`\n ${a}${e}-enter${e}-enter-active,\n ${a}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${a}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}}},9806:(e,t,n)=>{"use strict";n.d(t,{sb:()=>l,vG:()=>s,zQ:()=>c});var r=n(6540),o=n(1466),i=n(5967),a=n(723);const c=(0,o.an)(i.A),l={token:a.A,override:{override:a.A},hashed:!0},s=r.createContext(l)},9522:(e,t,n)=>{"use strict";n.d(t,{A:()=>w});var r=n(1466),o=n(5967),i=n(723),a=n(318);const c=e=>{const t=(null==e?void 0:e.algorithm)?(0,r.an)(e.algorithm):(0,r.an)(o.A),n=Object.assign(Object.assign({},i.A),null==e?void 0:e.token);return(0,r.lO)(n,{override:null==e?void 0:e.token},t,a.A)};var l=n(6613),s=n(9806),u=n(8690),d=n(4488);const f=(e,t)=>{const n=null!=t?t:(0,o.A)(e),r=n.fontSizeSM,i=n.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n),function(e){const{sizeUnit:t,sizeStep:n}=e,r=n-2;return{sizeXXL:t*(r+10),sizeXL:t*(r+6),sizeLG:t*(r+2),sizeMD:t*(r+2),sizeMS:t*(r+1),size:t*r,sizeSM:t*r,sizeXS:t*(r-1),sizeXXS:t*(r-1)}}(null!=t?t:e)),(0,d.A)(r)),{controlHeight:i}),(0,u.A)(Object.assign(Object.assign({},n),{controlHeight:i})))};var p=n(2200),v=n(7484),m=n(4978);const h=(e,t)=>new m.q(e).setAlpha(t).toRgbString(),g=(e,t)=>new m.q(e).lighten(t).toHexString(),b=e=>{const t=(0,p.cM)(e,{theme:"dark"});return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[6],6:t[5],7:t[4],8:t[6],9:t[5],10:t[4]}},y=(e,t)=>{const n=e||"#000",r=t||"#fff";return{colorBgBase:n,colorTextBase:r,colorText:h(r,.85),colorTextSecondary:h(r,.65),colorTextTertiary:h(r,.45),colorTextQuaternary:h(r,.25),colorFill:h(r,.18),colorFillSecondary:h(r,.12),colorFillTertiary:h(r,.08),colorFillQuaternary:h(r,.04),colorBgElevated:g(n,12),colorBgContainer:g(n,8),colorBgLayout:g(n,0),colorBgSpotlight:g(n,26),colorBgBlur:h(r,.04),colorBorder:g(n,26),colorBorderSecondary:g(n,19)}},A=(e,t)=>{const n=Object.keys(i.r).map((t=>{const n=(0,p.cM)(e[t],{theme:"dark"});return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{}),r=null!=t?t:(0,o.A)(e);return Object.assign(Object.assign(Object.assign({},r),n),(0,v.A)(e,{generateColorPalettes:b,generateNeutralColorPalettes:y}))};const w={defaultConfig:s.sb,defaultSeed:s.sb.token,useToken:function(){const[e,t,n]=(0,l.Ay)();return{theme:e,token:t,hashId:n}},defaultAlgorithm:o.A,darkAlgorithm:A,compactAlgorithm:f,getDesignToken:c}},5967:(e,t,n)=>{"use strict";n.d(t,{A:()=>v});var r=n(2200),o=n(723),i=n(7484);const a=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};var c=n(8690),l=n(4488);var s=n(4978);const u=(e,t)=>new s.q(e).setAlpha(t).toRgbString(),d=(e,t)=>new s.q(e).darken(t).toHexString(),f=e=>{const t=(0,r.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},p=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:u(r,.88),colorTextSecondary:u(r,.65),colorTextTertiary:u(r,.45),colorTextQuaternary:u(r,.25),colorFill:u(r,.15),colorFillSecondary:u(r,.06),colorFillTertiary:u(r,.04),colorFillQuaternary:u(r,.02),colorBgLayout:d(n,4),colorBgContainer:d(n,0),colorBgElevated:d(n,0),colorBgSpotlight:u(r,.85),colorBgBlur:"transparent",colorBorder:d(n,15),colorBorderSecondary:d(n,6)}};function v(e){const t=Object.keys(o.r).map((t=>{const n=(0,r.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),(0,i.A)(e,{generateColorPalettes:f,generateNeutralColorPalettes:p})),(0,l.A)(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),(0,c.A)(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},a(r))}(e))}},723:(e,t,n)=>{"use strict";n.d(t,{A:()=>o,r:()=>r});const r={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},o=Object.assign(Object.assign({},r),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0})},7484:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(4978);function o(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:o}=t;const{colorSuccess:i,colorWarning:a,colorError:c,colorInfo:l,colorPrimary:s,colorBgBase:u,colorTextBase:d}=e,f=n(s),p=n(i),v=n(a),m=n(c),h=n(l),g=o(u,d),b=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},g),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:m[1],colorErrorBgHover:m[2],colorErrorBgActive:m[3],colorErrorBorder:m[3],colorErrorBorderHover:m[4],colorErrorHover:m[5],colorError:m[6],colorErrorActive:m[7],colorErrorTextHover:m[8],colorErrorText:m[9],colorErrorTextActive:m[10],colorWarningBg:v[1],colorWarningBgHover:v[2],colorWarningBorder:v[3],colorWarningBorderHover:v[4],colorWarningHover:v[4],colorWarning:v[6],colorWarningActive:v[7],colorWarningTextHover:v[8],colorWarningText:v[9],colorWarningTextActive:v[10],colorInfoBg:h[1],colorInfoBgHover:h[2],colorInfoBorder:h[3],colorInfoBorderHover:h[4],colorInfoHover:h[4],colorInfo:h[6],colorInfoActive:h[7],colorInfoTextHover:h[8],colorInfoText:h[9],colorInfoTextActive:h[10],colorLinkHover:b[4],colorLink:b[6],colorLinkActive:b[7],colorBgMask:new r.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}},8690:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}}},4488:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],c=r[1],l=r[0],s=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:c,lineHeightLG:s,lineHeightSM:l,fontHeight:Math.round(c*o),fontHeightLG:Math.round(s*a),fontHeightSM:Math.round(l*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}}},6613:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>v,Xe:()=>d,Is:()=>u});var r=n(6540),o=n(1466);const i="5.17.3";var a=n(9806),c=n(723),l=n(318),s=function(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{const r=n.getDerivativeToken(e),{override:o}=t,i=s(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=(0,l.A)(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=s(n,["theme"]);let i=o;r&&(i=p(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function v(){const{token:e,hashed:t,theme:n,override:s,cssVar:v}=r.useContext(a.vG),m=`${i}-${t||""}`,h=n||a.zQ,[g,b,y]=(0,o.hV)(h,[c.A,e],{salt:m,override:s,getComputedToken:p,formatToken:l.A,cssVar:v&&{prefix:v.prefix,key:v.key,unitless:u,ignore:d,preserve:f}});return[h,y,t?b:"",g,v]}},318:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(4978),o=n(723);function i(e){return e>=0&&e<=255}const a=function(e,t){const{r:n,g:o,b:a,a:c}=new r.q(e).toRgb();if(c<1)return e;const{r:l,g:s,b:u}=new r.q(t).toRgb();for(let d=.01;d<=1;d+=.01){const e=Math.round((n-l*(1-d))/d),t=Math.round((o-s*(1-d))/d),c=Math.round((a-u*(1-d))/d);if(i(e)&&i(t)&&i(c))return new r.q({r:e,g:t,b:c,a:Math.round(100*d)/100}).toRgbString()}return new r.q({r:n,g:o,b:a,a:1}).toRgbString()};var c=function(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{delete i[e]}));const l=Object.assign(Object.assign({},n),i),s=1200,u=1600;if(!1===l.motion){const e="0s";l.motionDurationFast=e,l.motionDurationMid=e,l.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},l),{colorFillContent:l.colorFillSecondary,colorFillContentHover:l.colorFill,colorFillAlter:l.colorFillQuaternary,colorBgContainerDisabled:l.colorFillTertiary,colorBorderBg:l.colorBgContainer,colorSplit:a(l.colorBorderSecondary,l.colorBgContainer),colorTextPlaceholder:l.colorTextQuaternary,colorTextDisabled:l.colorTextQuaternary,colorTextHeading:l.colorText,colorTextLabel:l.colorTextSecondary,colorTextDescription:l.colorTextTertiary,colorTextLightSolid:l.colorWhite,colorHighlight:l.colorError,colorBgTextHover:l.colorFillSecondary,colorBgTextActive:l.colorFill,colorIcon:l.colorTextTertiary,colorIconHover:l.colorText,colorErrorOutline:a(l.colorErrorBg,l.colorBgContainer),colorWarningOutline:a(l.colorWarningBg,l.colorBgContainer),fontSizeIcon:l.fontSizeSM,lineWidthFocus:4*l.lineWidth,lineWidth:l.lineWidth,controlOutlineWidth:2*l.lineWidth,controlInteractiveSize:l.controlHeight/2,controlItemBgHover:l.colorFillTertiary,controlItemBgActive:l.colorPrimaryBg,controlItemBgActiveHover:l.colorPrimaryBgHover,controlItemBgActiveDisabled:l.colorFill,controlTmpOutline:l.colorFillQuaternary,controlOutline:a(l.colorPrimaryBg,l.colorBgContainer),lineType:l.lineType,borderRadius:l.borderRadius,borderRadiusXS:l.borderRadiusXS,borderRadiusSM:l.borderRadiusSM,borderRadiusLG:l.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:l.sizeXXS,paddingXS:l.sizeXS,paddingSM:l.sizeSM,padding:l.size,paddingMD:l.sizeMD,paddingLG:l.sizeLG,paddingXL:l.sizeXL,paddingContentHorizontalLG:l.sizeLG,paddingContentVerticalLG:l.sizeMS,paddingContentHorizontal:l.sizeMS,paddingContentVertical:l.sizeSM,paddingContentHorizontalSM:l.size,paddingContentVerticalSM:l.sizeXS,marginXXS:l.sizeXXS,marginXS:l.sizeXS,marginSM:l.sizeSM,margin:l.size,marginMD:l.sizeMD,marginLG:l.sizeLG,marginXL:l.sizeXL,marginXXL:l.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:s,screenXLMin:s,screenXLMax:1599,screenXXL:u,screenXXLMin:u,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new r.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new r.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new r.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),i)}},1173:(e,t,n)=>{"use strict";n.d(t,{OF:()=>M});var r=n(6540),o=n(1466),i=(n(9089),n(2279)),a=n(5905),c=n(6613),l=n(3029),s=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var v=n(5501);const m=(0,s.A)((function e(){(0,l.A)(this,e)})),h="CALC_UNIT",g=new RegExp(h,"g");function b(e){return"number"==typeof e?`${e}${h}`:e}let y=function(e){function t(e){var n;return(0,l.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=b(e):"string"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${b(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${b(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{};return this.result=this.result.replace(g,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(m),A=function(e){function t(e){var n;return(0,l.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,v.A)(t,e),(0,s.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(m);const w=e=>{const t="css"===e?y:A;return e=>new t(e)};var S=n(336),x=n(2366);const C=(e,t,n)=>{var r;return"function"==typeof n?n((0,S.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},k=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function E(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const s=Array.isArray(e)?e:[e,e],[u]=s,d=s.join("-");return function(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,v,m,h]=(0,c.Ay)(),{getPrefixCls:g,iconPrefixCls:b,csp:y}=(0,r.useContext)(i.QO),A=g(),E=h?"css":"js",M=w(E),{max:O,min:$}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),T={theme:f,token:m,hashId:v,nonce:()=>null==y?void 0:y.nonce,clientOnly:l.clientOnly,layer:{name:"antd"},order:l.order||-999};(0,o.IV)(Object.assign(Object.assign({},T),{clientOnly:!1,path:["Shared",A]}),(()=>[{"&":(0,a.av)(m)}])),(0,x.A)(b,y);const R=(0,o.IV)(Object.assign(Object.assign({},T),{path:[d,e,b]}),(()=>{if(!1===l.injectStyle)return[];const{token:r,flush:i}=(0,S.Ay)(m),c=C(u,p,n),d=`.${e}`,f=k(u,p,c,{deprecatedTokens:l.deprecatedTokens});h&&Object.keys(c).forEach((e=>{c[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,h.prefix))})`}));const g=(0,S.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${b}`,antCls:`.${A}`,calc:M,max:O,min:$},h?c:f),y=t(g,{hashId:v,prefixCls:e,rootPrefixCls:A,iconPrefixCls:b});return i(u,f),[!1===l.resetStyle?null:(0,a.vj)(g,e,s,l.resetFont),y]}));return[R,v]}}const M=(e,t,n,i)=>{const a=E(e,t,n,i),l=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:l=!0}=null!=n?n:{},s={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{s[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:l}=r;const[,u]=(0,c.Ay)();return(0,o.RC)({path:[e],prefix:l.prefix,key:null==l?void 0:l.key,unitless:Object.assign(Object.assign({},c.Is),s),ignore:c.Xe,token:u,scope:a},(()=>{const r=C(e,u,t),o=k(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,c.Ay)();return[o=>l&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=l(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function c(){}const l=e=>{let t,n=e,i=c;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},2366:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(1466),o=n(5905),i=n(6613);const a=(e,t)=>{const[n,a]=(0,i.Ay)();return(0,r.IV)({theme:n,token:a,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce,layer:{name:"antd"}},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,o.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";n.d(t,{Kq:()=>m,Ay:()=>he});var r=n(4467),o=n(9379),i=n(641),a=n(2284),c=n(6942),l=n.n(c),s=n(4207),u=n(8719),d=n(6540),f=n(45),p=["children"],v=d.createContext({});function m(e){var t=e.children,n=(0,f.A)(e,p);return d.createElement(v.Provider,{value:n},t)}var h=n(3029),g=n(2901),b=n(5501),y=n(9426);const A=function(e){(0,b.A)(n,e);var t=(0,y.A)(n);function n(){return(0,h.A)(this,n),t.apply(this,arguments)}return(0,g.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(d.Component);var w=n(9089),S=n(1233),x="none",C="appear",k="enter",E="leave",M="none",O="prepare",$="start",T="active",R="end",P="prepared",z=n(998);function I(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var N,L,j,_=(N=(0,z.A)(),L="undefined"!=typeof window?window:{},j={animationend:I("Animation","AnimationEnd"),transitionend:I("Transition","TransitionEnd")},N&&("AnimationEvent"in L||delete j.animationend.animation,"TransitionEvent"in L||delete j.transitionend.transition),j),H={};if((0,z.A)()){var D=document.createElement("div");H=D.style}var B={};function W(e){if(B[e])return B[e];var t=_[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:2;t();var i=(0,Q.A)((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),s=(0,i.A)(l,2),u=s[0],f=s[1];var p=t?J:Z;return U((function(){if(a!==M&&a!==R){var e=p.indexOf(a),t=p[e+1],r=n(a);r===ee?c(t,!0):t&&u((function(e){function n(){e.isCanceled()||c(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),d.useEffect((function(){return function(){f()}}),[]),[function(){c(O,!0)},a]};const oe=function(e){var t=e;"object"===(0,a.A)(e)&&(t=e.transitionSupport);var n=d.forwardRef((function(e,n){var a=e.visible,c=void 0===a||a,f=e.removeOnLeave,p=void 0===f||f,m=e.forceRender,h=e.children,g=e.motionName,b=e.leavedClassName,y=e.eventProps,M=function(e,n){return!(!e.motionName||!t||!1===n)}(e,d.useContext(v).motion),R=(0,d.useRef)(),z=(0,d.useRef)();var I=function(e,t,n,a){var c=a.motionEnter,l=void 0===c||c,s=a.motionAppear,u=void 0===s||s,f=a.motionLeave,p=void 0===f||f,v=a.motionDeadline,m=a.motionLeaveImmediately,h=a.onAppearPrepare,g=a.onEnterPrepare,b=a.onLeavePrepare,y=a.onAppearStart,A=a.onEnterStart,M=a.onLeaveStart,R=a.onAppearActive,z=a.onEnterActive,I=a.onLeaveActive,N=a.onAppearEnd,L=a.onEnterEnd,j=a.onLeaveEnd,_=a.onVisibleChanged,H=(0,S.A)(),D=(0,i.A)(H,2),B=D[0],W=D[1],F=(0,S.A)(x),X=(0,i.A)(F,2),K=X[0],G=X[1],q=(0,S.A)(null),Y=(0,i.A)(q,2),Q=Y[0],Z=Y[1],J=(0,d.useRef)(!1),oe=(0,d.useRef)(null);function ie(){return n()}var ae=(0,d.useRef)(!1);function ce(){G(x,!0),Z(null,!0)}var le=(0,w._q)((function(e){if(K!==x){var t=ie();if(!e||e.deadline||e.target===t){var n,r=ae.current;K===C&&r?n=null==N?void 0:N(t,e):K===k&&r?n=null==L?void 0:L(t,e):K===E&&r&&(n=null==j?void 0:j(t,e)),r&&!1!==n&&ce()}}})),se=V(le),ue=(0,i.A)(se,1)[0],de=function(e){switch(e){case C:return(0,r.A)((0,r.A)((0,r.A)({},O,h),$,y),T,R);case k:return(0,r.A)((0,r.A)((0,r.A)({},O,g),$,A),T,z);case E:return(0,r.A)((0,r.A)((0,r.A)({},O,b),$,M),T,I);default:return{}}},fe=d.useMemo((function(){return de(K)}),[K]),pe=re(K,!e,(function(e){if(e===O){var t=fe[O];return t?t(ie()):ee}var n;return he in fe&&Z((null===(n=fe[he])||void 0===n?void 0:n.call(fe,ie(),null))||null),he===T&&K!==x&&(ue(ie()),v>0&&(clearTimeout(oe.current),oe.current=setTimeout((function(){le({deadline:!0})}),v))),he===P&&ce(),te})),ve=(0,i.A)(pe,2),me=ve[0],he=ve[1],ge=ne(he);ae.current=ge,U((function(){W(t);var n,r=J.current;J.current=!0,!r&&t&&u&&(n=C),r&&t&&l&&(n=k),(r&&!t&&p||!r&&m&&!t&&p)&&(n=E);var o=de(n);n&&(e||o[O])?(G(n),me()):G(x)}),[t]),(0,d.useEffect)((function(){(K===C&&!u||K===k&&!l||K===E&&!p)&&G(x)}),[u,l,p]),(0,d.useEffect)((function(){return function(){J.current=!1,clearTimeout(oe.current)}}),[]);var be=d.useRef(!1);(0,d.useEffect)((function(){B&&(be.current=!0),void 0!==B&&K===x&&((be.current||B)&&(null==_||_(B)),be.current=!0)}),[B,K]);var ye=Q;return fe[O]&&he===$&&(ye=(0,o.A)({transition:"none"},ye)),[K,he,ye,null!=B?B:t]}(M,c,(function(){try{return R.current instanceof HTMLElement?R.current:(0,s.A)(z.current)}catch(e){return null}}),e),N=(0,i.A)(I,4),L=N[0],j=N[1],_=N[2],H=N[3],D=d.useRef(H);H&&(D.current=!0);var B,W=d.useCallback((function(e){R.current=e,(0,u.Xf)(n,e)}),[n]),F=(0,o.A)((0,o.A)({},y),{},{visible:c});if(h)if(L===x)B=H?h((0,o.A)({},F),W):!p&&D.current&&b?h((0,o.A)((0,o.A)({},F),{},{className:b}),W):m||!p&&!b?h((0,o.A)((0,o.A)({},F),{},{style:{display:"none"}}),W):null;else{var X;j===O?X="prepare":ne(j)?X="active":j===$&&(X="start");var K=Y(g,"".concat(L,"-").concat(X));B=h((0,o.A)((0,o.A)({},F),{},{className:l()(Y(g,L),(0,r.A)((0,r.A)({},K,K&&X),g,"string"==typeof g)),style:_}),W)}else B=null;d.isValidElement(B)&&(0,u.f3)(B)&&(B.ref||(B=d.cloneElement(B,{ref:W})));return d.createElement(A,{ref:z},B)}));return n.displayName="CSSMotion",n}(K);var ie=n(8168),ae=n(9417),ce="add",le="keep",se="remove",ue="removed";function de(e){var t;return t=e&&"object"===(0,a.A)(e)&&"key"in e?e:{key:e},(0,o.A)((0,o.A)({},t),{},{key:String(t.key)})}function fe(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(de)}var pe=["component","children","onVisibleChanged","onAllRemoved"],ve=["status"],me=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oe,n=function(e){(0,b.A)(i,e);var n=(0,y.A)(i);function i(){var e;(0,h.A)(this,i);for(var t=arguments.length,a=new Array(t),c=0;c0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,i=t.length,a=fe(e),c=fe(t);a.forEach((function(e){for(var t=!1,a=r;a1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==se}))).forEach((function(t){t.key===e&&(t.status=le)}))})),n}(r,i);return{keyEntities:a.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==ue||e.status!==se}))}}}]),i}(d.Component);(0,r.A)(n,"defaultProps",{component:"div"})}(K);const he=oe},998:(e,t,n)=>{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>h,m6:()=>m});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",c="data-rc-priority",l="rc-util-key",s=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):l}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((s.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,l=void 0===i?0:i,s=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===s,p=document.createElement("style");p.setAttribute(a,s),u&&l&&p.setAttribute(c,"".concat(l)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var v=d(t),m=v.firstChild;if(r){if(u){var h=(t.styles||f(v)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(c)||0);return l>=t}));if(h.length)return v.insertBefore(p,h[h.length-1].nextSibling),p}v.insertBefore(p,m)}else v.appendChild(p);return p}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=v(e,t);n&&d(t).removeChild(n)}function h(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),c=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=s.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;s.set(e,o),e.removeChild(r)}}(o,c);var l=v(t,c);if(l){var m,h,g;if(null!==(m=c.csp)&&void 0!==m&&m.nonce&&l.nonce!==(null===(h=c.csp)||void 0===h?void 0:h.nonce))l.nonce=null===(g=c.csp)||void 0===g?void 0:g.nonce;return l.innerHTML!==e&&(l.innerHTML=e),l}var b=p(e,c);return b.setAttribute(u(c),t),b}},4207:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,f:()=>a});var r=n(2284),o=n(6540),i=n(961);function a(e){return e instanceof HTMLElement||e instanceof SVGElement}function c(e){return e&&"object"===(0,r.A)(e)&&a(e.nativeElement)?e.nativeElement:a(e)?e:e instanceof o.Component?i.findDOMNode(e):null}},2633:(e,t,n)=>{"use strict";function r(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function o(e){return function(e){return r(e)instanceof ShadowRoot}(e)?r(e):null}n.d(t,{j:()=>o})},6928:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=r.F1&&t<=r.F12)return!1;switch(t){case r.ALT:case r.CAPS_LOCK:case r.CONTEXT_MENU:case r.CTRL:case r.DOWN:case r.END:case r.ESC:case r.HOME:case r.INSERT:case r.LEFT:case r.MAC_FF_META:case r.META:case r.NUMLOCK:case r.NUM_CENTER:case r.PAGE_DOWN:case r.PAGE_UP:case r.PAUSE:case r.PRINT_SCREEN:case r.RIGHT:case r.SHIFT:case r.UP:case r.WIN_KEY:case r.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=r.ZERO&&e<=r.NINE)return!0;if(e>=r.NUM_ZERO&&e<=r.NUM_MULTIPLY)return!0;if(e>=r.A&&e<=r.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case r.SPACE:case r.QUESTION_MARK:case r.NUM_PLUS:case r.NUM_MINUS:case r.NUM_PERIOD:case r.NUM_DIVISION:case r.SEMICOLON:case r.DASH:case r.EQUALS:case r.COMMA:case r.PERIOD:case r.SLASH:case r.APOSTROPHE:case r.SINGLE_QUOTE:case r.OPEN_SQUARE_BRACKET:case r.BACKSLASH:case r.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const o=r},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";var r;n.d(t,{A:()=>s});var o=n(641),i=n(9379),a=n(6540);var c=0;var l=(0,i.A)({},r||(r=n.t(a,2))).useId;const s=l?function(e){var t=l();return e||t}:function(e){var t=a.useState("ssr-id"),n=(0,o.A)(t,2),r=n[0],i=n[1];return a.useEffect((function(){var e=c;c+=1,i("rc_unique_".concat(e))}),[]),e||r}},981:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const c=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(641),o=n(6956),i=n(981),a=n(1233);function c(e){return void 0!==e}function l(e,t){var n=t||{},l=n.defaultValue,s=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return c(s)?s:c(l)?"function"==typeof l?l():l:"function"==typeof e?e():e})),p=(0,r.A)(f,2),v=p[0],m=p[1],h=void 0!==s?s:v,g=d?d(h):h,b=(0,o.A)(u),y=(0,a.A)([h]),A=(0,r.A)(y,2),w=A[0],S=A[1];return(0,i.o)((function(){var e=w[0];v!==e&&b(v,e)}),[w]),(0,i.o)((function(){c(s)||m(s)}),[s]),[g,(0,o.A)((function(e,t){m(e,t),S([h],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(641),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],c=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||c(e)}]}},9089:(e,t,n)=>{"use strict";n.d(t,{_q:()=>r.A});var r=n(6956);n(2533),n(8719),n(1526),n(8210)},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,l=i.has(t);if((0,o.Ay)(!l,"Warning: There may be circular references"),l)return!1;if(t===a)return!0;if(n&&c>1)return!1;i.add(t);var s=c+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{A:()=>o});var r=n(9379);function o(e,t){var n=(0,r.A)({},e);return Array.isArray(t)&&t.forEach((function(e){delete n[e]})),n}},5371:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=function(e){return+setTimeout(e,16)},o=function(e){return clearTimeout(e)};"undefined"!=typeof window&&"requestAnimationFrame"in window&&(r=function(e){return window.requestAnimationFrame(e)},o=function(e){return window.cancelAnimationFrame(e)});var i=0,a=new Map;function c(e){a.delete(e)}var l=function(e){var t=i+=1;return function n(o){if(0===o)c(t),e();else{var i=r((function(){n(o-1)}));a.set(t,i)}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:1),t};l.cancel=function(e){var t=a.get(e);return c(e),o(t)};const s=l},8719:(e,t,n)=>{"use strict";n.d(t,{K4:()=>c,Xf:()=>a,f3:()=>s,xK:()=>l});var r=n(2284),o=(n(6540),n(6351)),i=n(8104),a=function(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)},c=function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{h:()=>m});var r=n(2284),o=n(9379),i=n(8339),a=n(6369),c=n(3893),l=n(7800),s=n(6562);function u(e,t){for(var n=e,r=0;r3&&void 0!==arguments[3]&&arguments[3];return t.length&&r&&void 0===n&&!u(e,t.slice(0,-1))?e:d(e,t,n,r)}function p(e){return Array.isArray(e)?[]:{}}var v="undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;function m(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>s});var r={},o=[];function i(e,t){}function a(e,t){}function c(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function l(e,t){c(i,e,t)}l.preMessage=function(e){o.push(e)},l.resetWarned=function(){r={}},l.noteOnce=function(e,t){c(a,e,t)};const s=l},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),v=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),h=Symbol.for("react.offscreen");function g(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case c:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case s:case d:case m:case v:case l:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isFragment=function(e){return g(e)===i},t.isMemo=function(e){return g(e)===v}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},3591:(e,t,n)=>{"use strict";n.d(t,{A:()=>C});var r=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){o&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),l?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){o&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;c.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),u=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),S="undefined"!=typeof WeakMap?new WeakMap:new r,x=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=s.getInstance(),r=new w(t,n,this);S.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){x.prototype[e]=function(){var t;return(t=S.get(this))[e].apply(t,arguments)}}));const C=void 0!==i.ResizeObserver?i.ResizeObserver:x},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nr})},6369:(e,t,n)=>{"use strict";function r(e){if(Array.isArray(e))return e}n.d(t,{A:()=>r})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>a});var r=n(3954),o=n(2176),i=n(6822);function a(e){var t=(0,o.A)();return function(){var n,o=(0,r.A)(e);if(t){var a=(0,r.A)(this).constructor;n=Reflect.construct(o,arguments,a)}else n=o.apply(this,arguments);return(0,i.A)(this,n)}}},4467:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(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&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},3893:(e,t,n)=>{"use strict";function r(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}n.d(t,{A:()=>r})},6562:(e,t,n)=>{"use strict";function r(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(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 i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},6822:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"===(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},641:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6369);var o=n(7800),i=n(6562);function a(e,t){return(0,r.A)(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,c=[],l=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){s=!0,o=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(s)throw o}}return c}}(e,t)||(0,o.A)(e,t)||(0,i.A)()}},8339:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(3145);var o=n(3893),i=n(7800);function a(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||(0,o.A)(e)||(0,i.A)(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.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="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},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(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)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/772.fa094b13.js.LICENSE.txt b/assets/js/1599.5625342b.js.LICENSE.txt similarity index 80% rename from assets/js/772.fa094b13.js.LICENSE.txt rename to assets/js/1599.5625342b.js.LICENSE.txt index 73f26d97f..babfc3b74 100644 --- a/assets/js/772.fa094b13.js.LICENSE.txt +++ b/assets/js/1599.5625342b.js.LICENSE.txt @@ -14,7 +14,9 @@ * LICENSE file in the root directory of this source tree. */ -/**![close](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNzk5Ljg2IDE2Ni4zMWMuMDIgMCAuMDQuMDIuMDguMDZsNTcuNjkgNTcuN2MuMDQuMDMuMDUuMDUuMDYuMDhhLjEyLjEyIDAgMDEwIC4wNmMwIC4wMy0uMDIuMDUtLjA2LjA5TDU2OS45MyA1MTJsMjg3LjcgMjg3LjdjLjA0LjA0LjA1LjA2LjA2LjA5YS4xMi4xMiAwIDAxMCAuMDdjMCAuMDItLjAyLjA0LS4wNi4wOGwtNTcuNyA1Ny42OWMtLjAzLjA0LS4wNS4wNS0uMDcuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMyAwLS4wNS0uMDItLjA5LS4wNkw1MTIgNTY5LjkzbC0yODcuNyAyODcuN2MtLjA0LjA0LS4wNi4wNS0uMDkuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMiAwLS4wNC0uMDItLjA4LS4wNmwtNTcuNjktNTcuN2MtLjA0LS4wMy0uMDUtLjA1LS4wNi0uMDdhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMy4wMi0uMDUuMDYtLjA5TDQ1NC4wNyA1MTJsLTI4Ny43LTI4Ny43Yy0uMDQtLjA0LS4wNS0uMDYtLjA2LS4wOWEuMTIuMTIgMCAwMTAtLjA3YzAtLjAyLjAyLS4wNC4wNi0uMDhsNTcuNy01Ny42OWMuMDMtLjA0LjA1LS4wNS4wNy0uMDZhLjEyLjEyIDAgMDEuMDcgMGMuMDMgMCAuMDUuMDIuMDkuMDZMNTEyIDQ1NC4wN2wyODcuNy0yODcuN2MuMDQtLjA0LjA2LS4wNS4wOS0uMDZhLjEyLjEyIDAgMDEuMDcgMHoiIC8+PC9zdmc+) */ +/**![ellipsis](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE3NiA1MTFhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6bTI4MCAwYTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0yODAgMGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHoiIC8+PC9zdmc+) */ + +/**![plus](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQ4MiAxNTJoNjBxOCAwIDggOHY3MDRxMCA4LTggOGgtNjBxLTggMC04LThWMTYwcTAtOCA4LTh6IiAvPjxwYXRoIGQ9Ik0xOTIgNDc0aDY3MnE4IDAgOCA4djYwcTAgOC04IDhIMTYwcS04IDAtOC04di02MHEwLTggOC04eiIgLz48L3N2Zz4=) */ /**![rotate-left](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHN0eWxlIC8+PC9kZWZzPjxwYXRoIGQ9Ik02NzIgNDE4SDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMTg4VjQ5NGg0NDB2MzI2eiIgLz48cGF0aCBkPSJNODE5LjMgMzI4LjVjLTc4LjgtMTAwLjctMTk2LTE1My42LTMxNC42LTE1NC4ybC0uMi02NGMwLTYuNS03LjYtMTAuMS0xMi42LTYuMWwtMTI4IDEwMWMtNCAzLjEtMy45IDkuMSAwIDEyLjNMNDkyIDMxOC42YzUuMSA0IDEyLjcuNCAxMi42LTYuMXYtNjMuOWMxMi45LjEgMjUuOS45IDM4LjggMi41IDQyLjEgNS4yIDgyLjEgMTguMiAxMTkgMzguNyAzOC4xIDIxLjIgNzEuMiA0OS43IDk4LjQgODQuMyAyNy4xIDM0LjcgNDYuNyA3My43IDU4LjEgMTE1LjhhMzI1Ljk1IDMyNS45NSAwIDAxNi41IDE0MC45aDc0LjljMTQuOC0xMDMuNi0xMS4zLTIxMy04MS0zMDIuM3oiIC8+PC9zdmc+) */ diff --git a/assets/js/1fabe0bd.488a4260.js b/assets/js/1fabe0bd.488a4260.js new file mode 100644 index 000000000..c31947821 --- /dev/null +++ b/assets/js/1fabe0bd.488a4260.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5562],{8942:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=o(4848),r=o(8453);const i={title:"Intro",sidebar_position:1},s="Intro",c={id:"colorimetry/intro",title:"Intro",description:"There are many aspects which determine how the color information",source:"@site/docs/colorimetry/intro.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/intro",permalink:"/docs/colorimetry/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/intro.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Intro",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Color Formats",permalink:"/docs/colorimetry/format"}},a={},d=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"intro",children:"Intro"}),"\n",(0,n.jsx)(t.p,{children:"There are many aspects which determine how the color information\nfor a video is stored and how it is rendered. As technology has improved,\nnew standards developed, and with new techologies such as HDR,\nnew standards continue to develop. However, the result is that\nit can be confusing to know which color settings to use for\na given video."}),"\n",(0,n.jsx)(t.p,{children:"Some properties such as the color format must be set.\nHowever, properties such as color range, primaries, matrix coefficients,\nand transfer function are optional. It is always best practice to set these\nwhen you are encoding a video, because if they are not set, the player\nmust make a guess as to what the correct settings are. If it guesses\nincorrectly, this can lead to the colors of the video being different\nfrom what was intended."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>c});var n=o(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/20d769d8.11611dbf.js b/assets/js/20d769d8.53a493ba.js similarity index 96% rename from assets/js/20d769d8.11611dbf.js rename to assets/js/20d769d8.53a493ba.js index 0ec2a3079..9e9558d83 100644 --- a/assets/js/20d769d8.11611dbf.js +++ b/assets/js/20d769d8.53a493ba.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3121],{7114:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var n=i(4848),o=i(8453);const s={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},c=[{value:"A Scenario",id:"a-scenario",level:2}];function m(e){const t={h2:"h2",img:"img",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.img,{alt:"Feature image",src:i(9395).A+"",width:"1920",height:"1080"}),"\n",(0,n.jsx)(t.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,n.jsx)(t.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,n.jsx)(t.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},9395:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3121],{7114:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var n=i(4848),o=i(8453);const s={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},c=[{value:"A Scenario",id:"a-scenario",level:2}];function m(e){const t={h2:"h2",img:"img",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.img,{alt:"Feature image",src:i(3808).A+"",width:"1920",height:"1080"}),"\n",(0,n.jsx)(t.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,n.jsx)(t.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,n.jsx)(t.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},3808:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/discord-embed-blog-image-2bcaf4f73f5fa33664328756753f3041.webp"},8453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/25003e4f.10b014df.js b/assets/js/25003e4f.10b014df.js new file mode 100644 index 000000000..7222e34ce --- /dev/null +++ b/assets/js/25003e4f.10b014df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2838],{4351:e=>{e.exports=JSON.parse("{\"archive\":{\"blogPosts\":[{\"id\":\"svt-av1-second-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-second-deep-dive\",\"source\":\"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx\",\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"date\":\"2024-05-19T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":38.77,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"frontMatter\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"description\":\"SVT-AV1 2.1.0 just released, how does it compare to the previous version?\",\"slug\":\"svt-av1-second-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-2.1.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"}},\"content\":\"import { CarouselGenerator, TabbedCarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\nimport { Flex } from \\\"antd\\\";\\n\\n\\nSVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.\\n\\n\x3c!--truncate--\x3e\\n\\n## Feedback\\n\\nI unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.\\n\\nI have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!\\n\\n## Methodology\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP, for real this time). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2), XPSNR scores on the other hand are calculated using a [ffmpeg filter](https://github.com/fraunhoferhhi/xpsnr), and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v2.0.0 and v2.1.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements.\\n- 13s `Blue Lock` clip which sports rapid camera movements, complex geometry and high-contrast elements.\\n- 5s `Spy x Family` first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.\\n- 12s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 5s `The Garden of Sinners` clean but fast-paced 3DCG scene with explosions.\\n\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 6` to `--crf 46`, by increments of 4.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> ~~13~~ 12)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 12`.**\\n> Yes, you heard that right. Preset 7 and 13 are no more in __v2.1.0__. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map `preset 7` to `preset 6` and `preset 13` to `preset 12` due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\n\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n### Efficiency\\n\\n- First of all, here are the full efficiency graphs:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nThis is all very cool, but visually bloated.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF6 -> 22):\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Same, but now focusing on the \\\"low quality\\\" range (CRF26 -> 46):\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- If we now focus on __presets 4__ and below, where it's more difficult to discern the differences between presets, we get this at \\\"high quality\\\":\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- And the following at \\\"low quality\\\":\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n### Speed\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nOnce is not custom, __preset -1__ is so abysmally slow it makes the graph unusable.\\n\\n- Same, but without the placebo __preset -1__:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\n- Lastly, here is what it looks like with a logarithmic scale:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\n### Interpretation\\n\\nAs for interpreting the results, it would seem like **preset 2** and **preset 4** remain all-around very balanced presets, with **preset 3** being in a nice in-between spot, an improvement over v2.0.0's **preset 3** in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.\\n\\nThe quality gap between **preset 2** and **preset 1** is usually pretty narrow, however the speed penalty from going to **preset 1** is ~2x, when the penalty of going from **preset 3** to **preset 2** is closer to ~1.5x. As such, **preset 1** enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on **preset 0** and **preset -1**. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.\\n\\nWhen we start talking about faster presets though, things are pretty different from previous versions: **presets 5 to 9** behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of **preset 4**, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, **presets 5 through 9** will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.\\n\\n**Presets 10 to 12** are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.\\n\\n### TLDR\\n\\nThe same conclusions as the previous blog post can be made: \\n**clear quality gains can be observed as we decrease presets, until __preset 2__, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.**\\n\\nIn the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.\\n\\n## SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:\\n\\nTwo months ago, I conducted a similar test to this one to compare the presets evolution between versions __1.8.0__ and __2.0.0__. The results were pretty unsatisfying: I noticed that **presets -1 to 8** in __v2.0.0__ performed like the old **presets 0 to 9** did in __v1.8.0__. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions. \\n\\nSo the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!\\n\\n### `preset -1`: v2.0.0 vs v2.1.0\\n\\n- **Let's start off with a battle of the placebos, with the efficiency at \\\"high quality\\\":**\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- And the efficiency at \\\"low quality\\\":\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nYes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?\\n\\n- Now, let's compare their respective speeds:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nLet's be grateful it became ever so slightly faster, I guess.\\n\\n### `preset 0`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nOverall, efficiency wise, this new **preset 0** places itself in-between old **preset -1** and **0**\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nInterestingly enough, its speed is much closer to the old **preset 0** than to the old **preset -1**. This means **preset 0** was genuinely improved over v2.0.0!\\n\\n### `preset 1`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nIn efficiency, this new **preset 1** is often equal to old **preset 0**, else in-between old **preset 0 and 1**.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nWe observe that the new preset is a bit closer to old **preset 1** speeds than it is to old **preset 0** speeds. Good news!\\n\\n### `preset 2`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nOh well, that's awkward.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nSpeed was left untouched too, meaning **preset 2** is unchanged in v2.1.0.\\n\\n### `preset 3`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nThe new **preset 3**'s efficiency is the same as the old one.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nHowever, the preset got slightly faster, so this is a speedup!\\n\\n### `preset 4`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nWe can observe that **preset 4** got slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nFortunately, the consequence of that slight efficiency decrease is a big performance improvement!\\n\\n### `preset 5`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n**Preset 5** seems to have gotten ever so slightly worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nYet it became slightly faster, this is overall a good trade-off.\\n\\n### `preset 6`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nThe new **preset 6** has a huge responsibility: being able to compensate in the absence of its **preset 7** sibling. It seems to performs in-between old **preset 6 and 7**, usually closer to old **7**.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\n**Preset 6** is now ever so slightly slower to old **7**, this is an interesting trade-off, overall a win over old **7**.\\n\\n### `preset 7`: v2.0.0 vs v2.1.0\\n\\nAgain, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: `Svt[warn]: Preset M6 is mapped to M7.`\\n\\n![always_has_been](/img/preset_7_meme.webp)\\n\\n### `preset 8`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nIn efficiency, this new **preset 8** is sometimes equal or slightly worse to the old **8**, and sometimes equal or slightly worse than old **7**...\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nOverall, the speed is pretty much unchanged from old **8**. It looks like a slight regression, that's pretty disappointing.\\n\\n### `preset 9`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nThe new **preset 9** is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nIts speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.\\n\\n### `preset 10`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n**Preset 10** is slightly to moderately worse efficiency wise.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nIts speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!\\n\\n### `preset 11`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n**Preset 11**'s efficiency is untouched.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\n**Preset 11**'s speed is unchanged as well.\\n\\n### `preset 12`: v2.0.0 vs v2.1.0\\n\\n- Efficiency graphs, high quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\n- Efficiency graphs, low quality:\\n\\n\\n
\\n \\n },\\n xpsnr: {\\n label: 'XPSNR',\\n component: \\n },\\n }}\\n />\\n
\\n\\n\\nJust as **preset 6**, **preset 12** is now mapped to **13**, and unsurprisingly, its efficiency is equal to old **13**.\\n\\n- Speed graphs:\\n\\n\\n
\\n \\n },\\n }}\\n />\\n
\\n\\n\\nThe speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.\\n\\n### TLDR\\n\\nFrom these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\\nSome presets, like **-1**, **0**, **1** and **3**, received the most significant improvements, followed by **4**, **5** and **6** with overall beneficial new trade-offs. **Preset 12** got slightly faster too. On the other hand, **presets 8 and 10** seemed to have regressed slightly, and **presets 2 and 9** are perfectly unchanged from v2.0.0.\\n\\n## Conclusion\\n\\nSVT-AV1 2.1.0 introduced some welcomed improvements. **Presets 2 through 4** remain the king of optimal AV1 encoding, while **presets 5 through 9** stand as good options for the people that find **2-4** to be too slow for their liking.\\n\\nLet's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!\\n\\nBy the way, did you know that the **[SVT-AV1-PSY project](https://github.com/gianni-rosato/svt-av1-psy/)** was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!\\n\\nHopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.\\n\\n## Future\\n\\nMy plans for the future regarding the blog post include:\\n- polishing this blog post and aggrementing it of image comparisons.\\n- a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.\\n- an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.\\n\\nThanks for reading!\\n\\n{}\"},{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.32,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive\",\"permalink\":\"/blog/svt-av1-second-deep-dive\"},\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- And here is the speed difference:\\n\\n\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `` and `` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":15.865,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1 \\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n \\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n \\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``. \\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}}")}}]); \ No newline at end of file diff --git a/assets/js/25003e4f.ea63b8ee.js b/assets/js/25003e4f.ea63b8ee.js deleted file mode 100644 index bbb93b818..000000000 --- a/assets/js/25003e4f.ea63b8ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2838],{4351:e=>{e.exports=JSON.parse("{\"archive\":{\"blogPosts\":[{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.32,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- And here is the speed difference:\\n\\n\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `` and `` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":15.865,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1 \\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n \\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n \\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``. \\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}}")}}]); \ No newline at end of file diff --git a/assets/js/37c719d6.7afdaca8.js b/assets/js/37c719d6.7afdaca8.js new file mode 100644 index 000000000..517da7c09 --- /dev/null +++ b/assets/js/37c719d6.7afdaca8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1227],{1165:(e,t,s)=>{s.d(t,{Ck:()=>h,kS:()=>b});var i=s(4848),n=s(5293),o=s(6540),r=s(3517),a=s(943),c=s(1412),m=s(9522),l=s(1303),p=s(8633),u=s(363);const h=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:s,...n})=>"left"===t?(0,i.jsx)(p.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(u.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,i.jsx)(r.A,{arrows:!0,prevArrow:(0,i.jsx)(t,{direction:"left"}),nextArrow:(0,i.jsx)(t,{direction:"right"}),children:e.map((e=>(0,i.jsx)(a.A,{src:e.src},e.src)))})},b=({tabMap:e})=>{const[t,s]=(0,o.useState)(Object.keys(e)[0]),{colorMode:r,setColorMode:a}=(0,n.G)();return(0,i.jsx)(c.Ay,{theme:{algorithm:"dark"===r?m.A.darkAlgorithm:m.A.defaultAlgorithm},children:(0,i.jsx)(l.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:t,onTabChange:e=>{s(e)},children:e[t].component})})}},9168:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>q,contentTitle:()=>G,default:()=>O,frontMatter:()=>E,metadata:()=>V,toc:()=>N});var i=s(4848),n=s(8453),o=s(1165),r=s(6540),a=s(6942),c=s.n(a),m=s(9853);function l(e){return["small","middle","large"].includes(e)}var p=s(2279),u=s(1173),h=s(336);const b=["wrap","nowrap","wrap-reverse"],v=["flex-start","flex-end","start","end","center","space-between","space-around","space-evenly","stretch","normal","left","right"],g=["center","start","end","flex-start","flex-end","self-start","self-end","baseline","normal","stretch"];const d=function(e,t){return c()(Object.assign(Object.assign(Object.assign({},((e,t)=>{const s=!0===t.wrap?"wrap":t.wrap;return{[`${e}-wrap-${s}`]:s&&b.includes(s)}})(e,t)),((e,t)=>{const s={};return g.forEach((i=>{s[`${e}-align-${i}`]=t.align===i})),s[`${e}-align-stretch`]=!t.align&&!!t.vertical,s})(e,t)),((e,t)=>{const s={};return v.forEach((i=>{s[`${e}-justify-${i}`]=t.justify===i})),s})(e,t)))},y=e=>{const{componentCls:t}=e;return{[t]:{display:"flex","&-vertical":{flexDirection:"column"},"&-rtl":{direction:"rtl"},"&:empty":{display:"none"}}}},f=e=>{const{componentCls:t}=e;return{[t]:{"&-gap-small":{gap:e.flexGapSM},"&-gap-middle":{gap:e.flexGap},"&-gap-large":{gap:e.flexGapLG}}}},_=e=>{const{componentCls:t}=e,s={};return b.forEach((e=>{s[`${t}-wrap-${e}`]={flexWrap:e}})),s},x=e=>{const{componentCls:t}=e,s={};return g.forEach((e=>{s[`${t}-align-${e}`]={alignItems:e}})),s},w=e=>{const{componentCls:t}=e,s={};return v.forEach((e=>{s[`${t}-justify-${e}`]={justifyContent:e}})),s},k=(0,u.OF)("Flex",(e=>{const{paddingXS:t,padding:s,paddingLG:i}=e,n=(0,h.h1)(e,{flexGapSM:t,flexGap:s,flexGapLG:i});return[y(n),f(n),_(n),x(n),w(n)]}),(()=>({})),{resetStyle:!1});var S=function(e,t){var s={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(s[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(e);n{const{prefixCls:s,rootClassName:i,className:n,style:o,flex:a,gap:u,children:h,vertical:b=!1,component:v="div"}=e,g=S(e,["prefixCls","rootClassName","className","style","flex","gap","children","vertical","component"]),{flex:y,direction:f,getPrefixCls:_}=r.useContext(p.QO),x=_("flex",s),[w,j,T]=k(x),E=null!=b?b:null==y?void 0:y.vertical,G=c()(n,i,null==y?void 0:y.className,x,j,T,d(x,e),{[`${x}-rtl`]:"rtl"===f,[`${x}-gap-${u}`]:l(u),[`${x}-vertical`]:E}),V=Object.assign(Object.assign({},null==y?void 0:y.style),o);return a&&(V.flex=a),u&&!l(u)&&(V.gap=u),w(r.createElement(v,Object.assign({ref:t,className:G,style:V},(0,m.A)(g,["justify","wrap","align"])),h))}));const T=j,E={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},G="Introduction",V={permalink:"/blog/svt-av1-second-deep-dive",source:"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",date:"2024-05-19T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:38.77,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"}},q={authorsImageUrls:[void 0]},N=[{value:"Feedback",id:"feedback",level:2},{value:"Methodology",id:"methodology",level:2},{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13 12)",id:"presets-comparisons--1---13-12",level:2},{value:"Efficiency",id:"efficiency",level:3},{value:"Speed",id:"speed",level:3},{value:"Interpretation",id:"interpretation",level:3},{value:"TLDR",id:"tldr",level:3},{value:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:",id:"svt-av1-v200-vs-v210-presets-comparisons",level:2},{value:"preset -1: v2.0.0 vs v2.1.0",id:"preset--1-v200-vs-v210",level:3},{value:"preset 0: v2.0.0 vs v2.1.0",id:"preset-0-v200-vs-v210",level:3},{value:"preset 1: v2.0.0 vs v2.1.0",id:"preset-1-v200-vs-v210",level:3},{value:"preset 2: v2.0.0 vs v2.1.0",id:"preset-2-v200-vs-v210",level:3},{value:"preset 3: v2.0.0 vs v2.1.0",id:"preset-3-v200-vs-v210",level:3},{value:"preset 4: v2.0.0 vs v2.1.0",id:"preset-4-v200-vs-v210",level:3},{value:"preset 5: v2.0.0 vs v2.1.0",id:"preset-5-v200-vs-v210",level:3},{value:"preset 6: v2.0.0 vs v2.1.0",id:"preset-6-v200-vs-v210",level:3},{value:"preset 7: v2.0.0 vs v2.1.0",id:"preset-7-v200-vs-v210",level:3},{value:"preset 8: v2.0.0 vs v2.1.0",id:"preset-8-v200-vs-v210",level:3},{value:"preset 9: v2.0.0 vs v2.1.0",id:"preset-9-v200-vs-v210",level:3},{value:"preset 10: v2.0.0 vs v2.1.0",id:"preset-10-v200-vs-v210",level:3},{value:"preset 11: v2.0.0 vs v2.1.0",id:"preset-11-v200-vs-v210",level:3},{value:"preset 12: v2.0.0 vs v2.1.0",id:"preset-12-v200-vs-v210",level:3},{value:"TLDR",id:"tldr-1",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Future",id:"future",level:2}];function R(e){const t={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."}),"\n",(0,i.jsx)(t.h2,{id:"feedback",children:"Feedback"}),"\n",(0,i.jsx)(t.p,{children:"I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show."}),"\n",(0,i.jsx)(t.p,{children:"I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!"}),"\n",(0,i.jsx)(t.h2,{id:"methodology",children:"Methodology"}),"\n",(0,i.jsxs)(t.p,{children:["The resources available will range from ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"graphs"})})," to ",(0,i.jsx)(t.del,{children:(0,i.jsx)(t.strong,{children:"image comparisons"})})," (WIP, for real this time). The ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,i.jsx)(t.strong,{children:"latter"})," are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons."]}),"\n",(0,i.jsxs)(t.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,i.jsx)(t.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,i.jsx)(t.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(t.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"}),", XPSNR scores on the other hand are calculated using a ",(0,i.jsx)(t.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"ffmpeg filter"}),", and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the ",(0,i.jsx)(t.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,i.jsx)(t.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(t.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/",children:"v2.0.0 and v2.1.0 source code"})," using the provided ",(0,i.jsx)(t.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsxs)(t.p,{children:["This testing was conducted within the ",(0,i.jsx)(t.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(t.h2,{id:"samples",children:"Samples"}),"\n",(0,i.jsx)(t.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["11s ",(0,i.jsx)(t.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements."]}),"\n",(0,i.jsxs)(t.li,{children:["13s ",(0,i.jsx)(t.code,{children:"Blue Lock"})," clip which sports rapid camera movements, complex geometry and high-contrast elements."]}),"\n",(0,i.jsxs)(t.li,{children:["5s ",(0,i.jsx)(t.code,{children:"Spy x Family"})," first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set."]}),"\n",(0,i.jsxs)(t.li,{children:["12s ",(0,i.jsx)(t.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,i.jsxs)(t.li,{children:["5s ",(0,i.jsx)(t.code,{children:"The Garden of Sinners"})," clean but fast-paced 3DCG scene with explosions."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The resolution of every clip is 1080p, except for the first one which is 1920x804."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(t.code,{children:"--crf 6"})," to ",(0,i.jsx)(t.code,{children:"--crf 46"}),", by increments of 4."]})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsxs)(t.h2,{id:"presets-comparisons--1---13-12",children:["Presets comparisons (-1 -> ",(0,i.jsx)(t.del,{children:"13"})," 12)"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(t.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(t.code,{children:"--preset 12"}),"."]})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Yes, you heard that right. Preset 7 and 13 are no more in ",(0,i.jsx)(t.strong,{children:"v2.1.0"}),". This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map ",(0,i.jsx)(t.code,{children:"preset 7"})," to ",(0,i.jsx)(t.code,{children:"preset 6"})," and ",(0,i.jsx)(t.code,{children:"preset 13"})," to ",(0,i.jsx)(t.code,{children:"preset 12"})," due to the lack of spacing between the new presets. We will discuss the implications of this further ahead."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--tune 1"}),": tune PSNR"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 1"}),": temporal filtering enabled"]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"And more, like CDEF and restoration enabled, overlays and film-grain disabled..."}),"\n",(0,i.jsx)(t.h3,{id:"efficiency",children:"Efficiency"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"First of all, here are the full efficiency graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/full/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"This is all very cool, but visually bloated."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):'}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Same, but now focusing on the "low quality" range (CRF26 -> 46):'}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["If we now focus on ",(0,i.jsx)(t.strong,{children:"presets 4"}),' and below, where it\'s more difficult to discern the differences between presets, we get this at "high quality":']}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'And the following at "low quality":'}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/mrto4/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.h3,{id:"speed",children:"Speed"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Once is not custom, ",(0,i.jsx)(t.strong,{children:"preset -1"})," is so abysmally slow it makes the graph unusable."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Same, but without the placebo ",(0,i.jsx)(t.strong,{children:"preset -1"}),":"]}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speednomr/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Lastly, here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.1.0-only/allpresets/speedlog/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.h3,{id:"interpretation",children:"Interpretation"}),"\n",(0,i.jsxs)(t.p,{children:["As for interpreting the results, it would seem like ",(0,i.jsx)(t.strong,{children:"preset 2"})," and ",(0,i.jsx)(t.strong,{children:"preset 4"})," remain all-around very balanced presets, with ",(0,i.jsx)(t.strong,{children:"preset 3"})," being in a nice in-between spot, an improvement over v2.0.0's ",(0,i.jsx)(t.strong,{children:"preset 3"})," in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after."]}),"\n",(0,i.jsxs)(t.p,{children:["The quality gap between ",(0,i.jsx)(t.strong,{children:"preset 2"})," and ",(0,i.jsx)(t.strong,{children:"preset 1"})," is usually pretty narrow, however the speed penalty from going to ",(0,i.jsx)(t.strong,{children:"preset 1"})," is ~2x, when the penalty of going from ",(0,i.jsx)(t.strong,{children:"preset 3"})," to ",(0,i.jsx)(t.strong,{children:"preset 2"})," is closer to ~1.5x. As such, ",(0,i.jsx)(t.strong,{children:"preset 1"})," enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on ",(0,i.jsx)(t.strong,{children:"preset 0"})," and ",(0,i.jsx)(t.strong,{children:"preset -1"}),". This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets."]}),"\n",(0,i.jsxs)(t.p,{children:["When we start talking about faster presets though, things are pretty different from previous versions: ",(0,i.jsx)(t.strong,{children:"presets 5 to 9"})," behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of ",(0,i.jsx)(t.strong,{children:"preset 4"}),", you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, ",(0,i.jsx)(t.strong,{children:"presets 5 through 9"})," will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Presets 10 to 12"})," are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode."]}),"\n",(0,i.jsx)(t.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsxs)(t.p,{children:["The same conclusions as the previous blog post can be made:\n",(0,i.jsxs)(t.strong,{children:["clear quality gains can be observed as we decrease presets, until ",(0,i.jsx)(t.strong,{children:"preset 2"}),", however the effectiveness of dropping presets is noticeably less and less important as quality is increased."]})]}),"\n",(0,i.jsx)(t.p,{children:"In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone."}),"\n",(0,i.jsx)(t.h2,{id:"svt-av1-v200-vs-v210-presets-comparisons",children:"SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:"}),"\n",(0,i.jsxs)(t.p,{children:["Two months ago, I conducted a similar test to this one to compare the presets evolution between versions ",(0,i.jsx)(t.strong,{children:"1.8.0"})," and ",(0,i.jsx)(t.strong,{children:"2.0.0"}),". The results were pretty unsatisfying: I noticed that ",(0,i.jsx)(t.strong,{children:"presets -1 to 8"})," in ",(0,i.jsx)(t.strong,{children:"v2.0.0"})," performed like the old ",(0,i.jsx)(t.strong,{children:"presets 0 to 9"})," did in ",(0,i.jsx)(t.strong,{children:"v1.8.0"}),". We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions."]}),"\n",(0,i.jsx)(t.p,{children:"So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!"}),"\n",(0,i.jsxs)(t.h3,{id:"preset--1-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset -1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:'Let\'s start off with a battle of the placebos, with the efficiency at "high quality":'})}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'And the efficiency at "low quality":'}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT-1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Now, let's compare their respective speeds:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT-1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Let's be grateful it became ever so slightly faster, I guess."}),"\n",(0,i.jsxs)(t.h3,{id:"preset-0-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 0"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT0_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Overall, efficiency wise, this new ",(0,i.jsx)(t.strong,{children:"preset 0"})," places itself in-between old ",(0,i.jsx)(t.strong,{children:"preset -1"})," and ",(0,i.jsx)(t.strong,{children:"0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT0_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Interestingly enough, its speed is much closer to the old ",(0,i.jsx)(t.strong,{children:"preset 0"})," than to the old ",(0,i.jsx)(t.strong,{children:"preset -1"}),". This means ",(0,i.jsx)(t.strong,{children:"preset 0"})," was genuinely improved over v2.0.0!"]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-1-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 1"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT1_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["In efficiency, this new ",(0,i.jsx)(t.strong,{children:"preset 1"})," is often equal to old ",(0,i.jsx)(t.strong,{children:"preset 0"}),", else in-between old ",(0,i.jsx)(t.strong,{children:"preset 0 and 1"}),"."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT1_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["We observe that the new preset is a bit closer to old ",(0,i.jsx)(t.strong,{children:"preset 1"})," speeds than it is to old ",(0,i.jsx)(t.strong,{children:"preset 0"})," speeds. Good news!"]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-2-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 2"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT2_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Oh well, that's awkward."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT2_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Speed was left untouched too, meaning ",(0,i.jsx)(t.strong,{children:"preset 2"})," is unchanged in v2.1.0."]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-3-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 3"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT3_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["The new ",(0,i.jsx)(t.strong,{children:"preset 3"}),"'s efficiency is the same as the old one."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT3_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"However, the preset got slightly faster, so this is a speedup!"}),"\n",(0,i.jsxs)(t.h3,{id:"preset-4-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 4"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT4_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["We can observe that ",(0,i.jsx)(t.strong,{children:"preset 4"})," got slightly to moderately worse efficiency wise."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT4_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!"}),"\n",(0,i.jsxs)(t.h3,{id:"preset-5-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 5"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT5_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Preset 5"})," seems to have gotten ever so slightly worse efficiency wise."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT5_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Yet it became slightly faster, this is overall a good trade-off."}),"\n",(0,i.jsxs)(t.h3,{id:"preset-6-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 6"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT6_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["The new ",(0,i.jsx)(t.strong,{children:"preset 6"})," has a huge responsibility: being able to compensate in the absence of its ",(0,i.jsx)(t.strong,{children:"preset 7"})," sibling. It seems to performs in-between old ",(0,i.jsx)(t.strong,{children:"preset 6 and 7"}),", usually closer to old ",(0,i.jsx)(t.strong,{children:"7"}),"."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT6_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Preset 6"})," is now ever so slightly slower to old ",(0,i.jsx)(t.strong,{children:"7"}),", this is an interesting trade-off, overall a win over old ",(0,i.jsx)(t.strong,{children:"7"}),"."]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-7-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 7"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.p,{children:["Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: ",(0,i.jsx)(t.code,{children:"Svt[warn]: Preset M6 is mapped to M7."})]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"always_has_been",src:s(1759).A+"",width:"833",height:"466"})}),"\n",(0,i.jsxs)(t.h3,{id:"preset-8-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 8"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT8_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["In efficiency, this new ",(0,i.jsx)(t.strong,{children:"preset 8"})," is sometimes equal or slightly worse to the old ",(0,i.jsx)(t.strong,{children:"8"}),", and sometimes equal or slightly worse than old ",(0,i.jsx)(t.strong,{children:"7"}),"..."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT8_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Overall, the speed is pretty much unchanged from old ",(0,i.jsx)(t.strong,{children:"8"}),". It looks like a slight regression, that's pretty disappointing."]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-9-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 9"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT9_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["The new ",(0,i.jsx)(t.strong,{children:"preset 9"})," is the same as ever, ever so slightly better in some scenario but nothing groundbreaking."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT9_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder."}),"\n",(0,i.jsxs)(t.h3,{id:"preset-10-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 10"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT10_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Preset 10"})," is slightly to moderately worse efficiency wise."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT10_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!"}),"\n",(0,i.jsxs)(t.h3,{id:"preset-11-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 11"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT11_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Preset 11"}),"'s efficiency is untouched."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT11_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Preset 11"}),"'s speed is unchanged as well."]}),"\n",(0,i.jsxs)(t.h3,{id:"preset-12-v200-vs-v210",children:[(0,i.jsx)(t.code,{children:"preset 12"}),": v2.0.0 vs v2.1.0"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, high quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/hq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs, low quality:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"SSIMU2",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_ssimu2.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_ssimu2.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_ssimu2.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_ssimu2.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_ssimu2.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})},xpsnr:{label:"XPSNR",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_blame!_xpsnr.webp",alt:"Blame!.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_bluelock_xpsnr.webp",alt:"BlueLock.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_jigokuraku-001_xpsnr.webp",alt:"Jigokuraku.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_sxfed1_xpsnr.webp",alt:"SpyxFamily.mkv Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/lq/SVT13_THE_GARDEN_OF_SINNERS_9_xpsnr.webp",alt:"TheGardenOfSinners.mkv Efficiency Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsxs)(t.p,{children:["Just as ",(0,i.jsx)(t.strong,{children:"preset 6"}),", ",(0,i.jsx)(t.strong,{children:"preset 12"})," is now mapped to ",(0,i.jsx)(t.strong,{children:"13"}),", and unsurprisingly, its efficiency is equal to old ",(0,i.jsx)(t.strong,{children:"13"}),"."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsxs)(T,{justify:"space-between",vertical:!0,children:[(0,i.jsx)("div",{style:{height:"0px"}}),(0,i.jsx)(o.kS,{tabMap:{ssimu2:{label:"Speed",component:(0,i.jsx)(o.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_blame!_speed.webp",alt:"Blame!.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_bluelock_speed.webp",alt:"BlueLock.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_jigokuraku-001_speed.webp",alt:"Jigokuraku.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_sxfed1_speed.webp",alt:"SpyxFamily.mkv Speed Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-2.1.0-blogpost/2.0.0vs2.1.0/speed/SVT13_THE_GARDEN_OF_SINNERS_9_speed.webp",alt:"TheGardenOfSinners.mkv Speed Graph"}]})}}}),(0,i.jsx)("div",{style:{height:"24px"}})]}),"\n",(0,i.jsx)(t.p,{children:"The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at."}),"\n",(0,i.jsx)(t.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(t.p,{children:["From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off.\nSome presets, like ",(0,i.jsx)(t.strong,{children:"-1"}),", ",(0,i.jsx)(t.strong,{children:"0"}),", ",(0,i.jsx)(t.strong,{children:"1"})," and ",(0,i.jsx)(t.strong,{children:"3"}),", received the most significant improvements, followed by ",(0,i.jsx)(t.strong,{children:"4"}),", ",(0,i.jsx)(t.strong,{children:"5"})," and ",(0,i.jsx)(t.strong,{children:"6"})," with overall beneficial new trade-offs. ",(0,i.jsx)(t.strong,{children:"Preset 12"})," got slightly faster too. On the other hand, ",(0,i.jsx)(t.strong,{children:"presets 8 and 10"})," seemed to have regressed slightly, and ",(0,i.jsx)(t.strong,{children:"presets 2 and 9"})," are perfectly unchanged from v2.0.0."]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsxs)(t.p,{children:["SVT-AV1 2.1.0 introduced some welcomed improvements. ",(0,i.jsx)(t.strong,{children:"Presets 2 through 4"})," remain the king of optimal AV1 encoding, while ",(0,i.jsx)(t.strong,{children:"presets 5 through 9"})," stand as good options for the people that find ",(0,i.jsx)(t.strong,{children:"2-4"})," to be too slow for their liking."]}),"\n",(0,i.jsx)(t.p,{children:"Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!"}),"\n",(0,i.jsxs)(t.p,{children:["By the way, did you know that the ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/",children:"SVT-AV1-PSY project"})})," was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!"]}),"\n",(0,i.jsx)(t.p,{children:"Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0."}),"\n",(0,i.jsx)(t.h2,{id:"future",children:"Future"}),"\n",(0,i.jsx)(t.p,{children:"My plans for the future regarding the blog post include:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"polishing this blog post and aggrementing it of image comparisons."}),"\n",(0,i.jsx)(t.li,{children:"a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline."}),"\n",(0,i.jsx)(t.li,{children:"an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Thanks for reading!"}),"\n"]})}function O(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(R,{...e})}):R(e)}},1759:(e,t,s)=>{s.d(t,{A:()=>i});const i=s.p+"assets/images/preset_7_meme-db92f83a118086187f0de0dea1362caf.webp"}}]); \ No newline at end of file diff --git a/assets/js/41756ce8.dc9ab492.js b/assets/js/41756ce8.12f3327b.js similarity index 62% rename from assets/js/41756ce8.dc9ab492.js rename to assets/js/41756ce8.12f3327b.js index 85c42bea3..8d8ffe5ca 100644 --- a/assets/js/41756ce8.dc9ab492.js +++ b/assets/js/41756ce8.12f3327b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9616],{5205:e=>{e.exports=JSON.parse('{"tags":[{"label":"video","permalink":"/blog/tags/video","count":3},{"label":"compression","permalink":"/blog/tags/compression","count":3},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":1},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9616],{5205:e=>{e.exports=JSON.parse('{"tags":[{"label":"video","permalink":"/blog/tags/video","count":4},{"label":"compression","permalink":"/blog/tags/compression","count":4},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":2},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/48b7ca01.9b8dfff0.js b/assets/js/48b7ca01.9b8dfff0.js new file mode 100644 index 000000000..6103bb19a --- /dev/null +++ b/assets/js/48b7ca01.9b8dfff0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1347],{1165:(e,t,i)=>{i.d(t,{Ck:()=>g,kS:()=>p});var s=i(4848),n=i(5293),r=i(6540),a=i(3517),o=i(943),c=i(1412),l=i(9522),d=i(1303),h=i(8633),m=i(363);const g=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:i,...n})=>"left"===t?(0,s.jsx)(h.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(m.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,s.jsx)(a.A,{arrows:!0,prevArrow:(0,s.jsx)(t,{direction:"left"}),nextArrow:(0,s.jsx)(t,{direction:"right"}),children:e.map((e=>(0,s.jsx)(o.A,{src:e.src},e.src)))})},p=({tabMap:e})=>{const[t,i]=(0,r.useState)(Object.keys(e)[0]),{colorMode:a,setColorMode:o}=(0,n.G)();return(0,s.jsx)(c.Ay,{theme:{algorithm:"dark"===a?l.A.darkAlgorithm:l.A.defaultAlgorithm},children:(0,s.jsx)(d.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:t,onTabChange:e=>{i(e)},children:e[t].component})})}},9350:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var s=i(4848),n=i(8453);i(1165);const r={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},a="Introduction",o={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"},nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},c={authorsImageUrls:[void 0]},l=[];function d(e){const t={del:"del",em:"em",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,s.jsxs)(t.p,{children:["The resources available will range from ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"graphs"})})," to ",(0,s.jsx)(t.del,{children:(0,s.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,s.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/48b7ca01.fc8927d9.js b/assets/js/48b7ca01.fc8927d9.js deleted file mode 100644 index 6404fc403..000000000 --- a/assets/js/48b7ca01.fc8927d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1347],{1165:(e,t,i)=>{i.d(t,{Ck:()=>c});var s=i(4848),n=i(6943),r=i(4184),o=i(8633),a=i(363);const c=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:i,...n})=>"left"===t?(0,s.jsx)(o.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,s.jsx)(a.A,{...n,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,s.jsx)(n.A,{arrows:!0,prevArrow:(0,s.jsx)(t,{direction:"left"}),nextArrow:(0,s.jsx)(t,{direction:"right"}),children:e.map((e=>(0,s.jsx)(r.A,{src:e.src},e.src)))})}},9350:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=i(4848),n=i(8453);i(1165);const r={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},o="Introduction",a={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},c={authorsImageUrls:[void 0]},l=[];function d(e){const t={del:"del",em:"em",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,s.jsxs)(t.p,{children:["The resources available will range from ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"graphs"})})," to ",(0,s.jsx)(t.del,{children:(0,s.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,s.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/53a3e6dc.5c1e50b8.js b/assets/js/53a3e6dc.4219249c.js similarity index 75% rename from assets/js/53a3e6dc.5c1e50b8.js rename to assets/js/53a3e6dc.4219249c.js index 7d4f5baec..f15926c46 100644 --- a/assets/js/53a3e6dc.5c1e50b8.js +++ b/assets/js/53a3e6dc.4219249c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6261],{922:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6261],{922:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5c30ba71.0d3ec2f2.js b/assets/js/5c30ba71.a40f75cf.js similarity index 68% rename from assets/js/5c30ba71.0d3ec2f2.js rename to assets/js/5c30ba71.a40f75cf.js index 1d9d9a5c6..aa5ca096a 100644 --- a/assets/js/5c30ba71.0d3ec2f2.js +++ b/assets/js/5c30ba71.a40f75cf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3549],{9406:e=>{e.exports=JSON.parse('{"tag":{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3549],{9406:e=>{e.exports=JSON.parse('{"tag":{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/6549b2b5.70fda637.js b/assets/js/6549b2b5.d50e32c1.js similarity index 95% rename from assets/js/6549b2b5.70fda637.js rename to assets/js/6549b2b5.d50e32c1.js index 806c598da..ced3bec44 100644 --- a/assets/js/6549b2b5.70fda637.js +++ b/assets/js/6549b2b5.d50e32c1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4846],{2417:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=t(4848),o=t(8453);const n={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.25,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0]},c=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."}),"\n",(0,s.jsx)(i.admonition,{type:"caution",children:(0,s.jsxs)(i.p,{children:["These instructions are for ",(0,s.jsx)(i.em,{children:"photographic"})," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently."]})}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"}),(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})," | ",(0,s.jsxs)(i.em,{children:["Linux, ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/thorium/releases/",children:"Windows"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"Android"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://www.waterfox.net/",children:"Waterfox"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://flathub.org/apps/net.waterfox.waterfox",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"Windows"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Windows"})]})]}),"\n"]})]}),"\n",(0,s.jsx)(i.h2,{id:"fire--forget",children:"Fire & Forget"}),"\n",(0,s.jsxs)(i.p,{children:["First, we'll illustrate what ",(0,s.jsx)(i.em,{children:"not"})," to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"exported straight from Darktable at JPEG q90, with no scaling"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"bloated_jpeg",src:t(8456).A+"",width:"5470",height:"3656"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"2.2 MB"})}),"\n",(0,s.jsx)(i.h2,{id:"massive-improvement",children:"Massive Improvement"}),"\n",(0,s.jsx)(i.p,{children:"The easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"box-size-mac",src:t(4861).A+"",width:"2940",height:"1840"}),"\n",(0,s.jsx)(i.em,{children:"Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here."})]}),"\n",(0,s.jsxs)(i.p,{children:["The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,s.jsx)(i.code,{children:"cjpegli"}),", looks like this:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg",src:t(2599).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:["Obviously, there's lost fidelity compared to the original, but considering this is ",(0,s.jsx)(i.em,{children:"so much smaller"}),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,s.jsx)(i.code,{children:"cjpegli"}),", although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size."]}),"\n",(0,s.jsxs)(i.p,{children:["2.2 MB -> ",(0,s.jsx)(i.strong,{children:"233 kB"})]}),"\n",(0,s.jsx)(i.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,s.jsxs)(i.p,{children:["A bonus tip is to add the ",(0,s.jsx)(i.code,{children:'loading="lazy"'})," attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n alt text\n \n'})}),"\n",(0,s.jsx)(i.h2,{id:"new-codecs",children:"New Codecs"}),"\n",(0,s.jsxs)(i.p,{children:["If you desire further improvement, it may be time to consider using a newer codec like ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/AVIF",children:"AVIF"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/JXL",children:"JPEG-XL"}),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," or ",(0,s.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,s.jsx)(i.em,{children:"lossy"})," compression for ",(0,s.jsx)(i.em,{children:"photographic"})," images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now."]}),"\n",(0,s.jsx)(i.h3,{id:"fallbacks",children:"Fallbacks"}),"\n",(0,s.jsx)(i.p,{children:"AVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n \n alt text\n \n'})}),"\n",(0,s.jsx)(i.p,{children:"Here is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most."}),"\n",(0,s.jsx)(i.h3,{id:"compression-efficacy",children:"Compression Efficacy"}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,s.jsx)(i.code,{children:"cjpegli"})," (which scores ~",(0,s.jsx)(i.code,{children:"83.01"})," with the ",(0,s.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," visual fidelity metric)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl",src:t(5500).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"137.0 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image, encoded with ",(0,s.jsx)(i.code,{children:"cjxl lossless.png out.jxl -d 1.49 -e 9"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"3.06s user time"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_avif",src:t(6826).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"124.8 kB"})," ",(0,s.jsxs)(i.em,{children:["AVIF image, encoded with ",(0,s.jsx)(i.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.03"})]})," ",(0,s.jsx)(i.em,{children:"7.54s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,s.jsx)(i.code,{children:"ssimulacra2"})," program decodes JPEG & JXL. Either way, the scores are fairly close."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl_jpeg-recomp",src:t(8831).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"189.4 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image from JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"}),". Score: ~",(0,s.jsx)(i.code,{children:"84.92"})," (???)"]})," ",(0,s.jsx)(i.em,{children:"0.67s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,s.jsx)(i.code,{children:"cjpegli"})," encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg_xyb",src:t(6737).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"208.3 kB"})," ",(0,s.jsxs)(i.em,{children:["XYB JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjpegli lossless.png out.jpg --xyb -d 1.155"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"0.10s user time"})]}),"\n",(0,s.jsx)(i.p,{children:"In this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode."}),"\n",(0,s.jsx)(i.h2,{id:"responsive-images",children:"Responsive Images"}),"\n",(0,s.jsxs)(i.p,{children:["Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,s.jsx)(i.a,{href:"https://ausi.github.io/respimagelint/",children:"Responsive Image Linter"})," that can help us figure out which image sizes we should be using."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"responsive_image_linter",src:t(3357).A+"",width:"2308",height:"670"})}),"\n",(0,s.jsx)(i.p,{children:"In our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n alt text\n\n'})}),"\n",(0,s.jsx)(i.p,{children:"It is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"srcset"})," = the images available to your browser to serve, & their respective widths"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"sizes"})," = the conditions given to the browser explaining under what conditions should it serve which image"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"(min-width: XXXpx) YYYpx"})," = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels * display scaling."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"calc(100vw - 24px)"})," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,s.jsx)(i.code,{children:"(min-width: 997px) calc(75vw - 257px)"}),". This means given the viewport is at least 997px wide, calculate 0.75 * the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified."]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("img",{loading:"lazy",width:"1699",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})]}),"\n",(0,s.jsxs)(i.p,{children:["That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,s.jsx)(i.a,{href:"https://autocompressor.net/blog/reduce-image-load",children:"Reduce Your Page's Image Load"})," blog post when writing this entry. I have ",(0,s.jsx)(i.a,{href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI",children:"confirmed"})," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."]})]})}function d(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8831:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},6737:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},6826:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},2599:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},5500:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},8456:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},4861:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},3357:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4846],{2417:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>r,toc:()=>c});var s=t(4848),o=t(8453);const n={title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/site-optimization",source:"@site/blog/2023-07-21-site-optimization.mdx",title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",date:"2023-07-21T00:00:00.000Z",tags:[{label:"image",permalink:"/blog/tags/image"},{label:"web",permalink:"/blog/tags/web"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:9.25,hasTruncateMarker:!0,authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"Reducing Image Load Online",description:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.",slug:"site-optimization",authors:[{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["image","web","compression"],image:"/img/_DSC8466-smaller.jpg",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},l={authorsImageUrls:[void 0]},c=[{value:"Fire & Forget",id:"fire--forget",level:2},{value:"Massive Improvement",id:"massive-improvement",level:2},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"New Codecs",id:"new-codecs",level:2},{value:"Fallbacks",id:"fallbacks",level:3},{value:"Compression Efficacy",id:"compression-efficacy",level:3},{value:"Responsive Images",id:"responsive-images",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics."}),"\n",(0,s.jsx)(i.admonition,{type:"caution",children:(0,s.jsxs)(i.p,{children:["These instructions are for ",(0,s.jsx)(i.em,{children:"photographic"})," images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently."]})}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:"}),(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})," | ",(0,s.jsxs)(i.em,{children:["Linux, ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/thorium/releases/",children:"Windows"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Thorium-Special/releases",children:"Android"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://www.waterfox.net/",children:"Waterfox"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://flathub.org/apps/net.waterfox.waterfox",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"macOS"}),", ",(0,s.jsx)(i.a,{href:"https://www.waterfox.net/download/",children:"Windows"})]})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})," | ",(0,s.jsxs)(i.em,{children:[(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Linux"}),", ",(0,s.jsx)(i.a,{href:"https://github.com/Alex313031/Mercury/releases",children:"Windows"})]})]}),"\n"]})]}),"\n",(0,s.jsx)(i.h2,{id:"fire--forget",children:"Fire & Forget"}),"\n",(0,s.jsxs)(i.p,{children:["First, we'll illustrate what ",(0,s.jsx)(i.em,{children:"not"})," to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"exported straight from Darktable at JPEG q90, with no scaling"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"bloated_jpeg",src:t(4901).A+"",width:"5470",height:"3656"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"2.2 MB"})}),"\n",(0,s.jsx)(i.h2,{id:"massive-improvement",children:"Massive Improvement"}),"\n",(0,s.jsx)(i.p,{children:"The easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"box-size-mac",src:t(6666).A+"",width:"2940",height:"1840"}),"\n",(0,s.jsx)(i.em,{children:"Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here."})]}),"\n",(0,s.jsxs)(i.p,{children:["The width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with ",(0,s.jsx)(i.code,{children:"cjpegli"}),", looks like this:"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg",src:t(5390).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:["Obviously, there's lost fidelity compared to the original, but considering this is ",(0,s.jsx)(i.em,{children:"so much smaller"}),", it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of ",(0,s.jsx)(i.code,{children:"cjpegli"}),", although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size."]}),"\n",(0,s.jsxs)(i.p,{children:["2.2 MB -> ",(0,s.jsx)(i.strong,{children:"233 kB"})]}),"\n",(0,s.jsx)(i.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,s.jsxs)(i.p,{children:["A bonus tip is to add the ",(0,s.jsx)(i.code,{children:'loading="lazy"'})," attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n alt text\n \n'})}),"\n",(0,s.jsx)(i.h2,{id:"new-codecs",children:"New Codecs"}),"\n",(0,s.jsxs)(i.p,{children:["If you desire further improvement, it may be time to consider using a newer codec like ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/AVIF",children:"AVIF"})," or ",(0,s.jsx)(i.a,{href:"https://wiki.x266.mov/docs/images/JXL",children:"JPEG-XL"}),". These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider ",(0,s.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"})," or ",(0,s.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering ",(0,s.jsx)(i.em,{children:"lossy"})," compression for ",(0,s.jsx)(i.em,{children:"photographic"})," images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now."]}),"\n",(0,s.jsx)(i.h3,{id:"fallbacks",children:"Fallbacks"}),"\n",(0,s.jsx)(i.p,{children:"AVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n \n alt text\n \n'})}),"\n",(0,s.jsx)(i.p,{children:"Here is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most."}),"\n",(0,s.jsx)(i.h3,{id:"compression-efficacy",children:"Compression Efficacy"}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with ",(0,s.jsx)(i.code,{children:"cjpegli"})," (which scores ~",(0,s.jsx)(i.code,{children:"83.01"})," with the ",(0,s.jsx)(i.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," visual fidelity metric)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl",src:t(4405).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"137.0 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image, encoded with ",(0,s.jsx)(i.code,{children:"cjxl lossless.png out.jxl -d 1.49 -e 9"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"3.06s user time"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_avif",src:t(5437).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"124.8 kB"})," ",(0,s.jsxs)(i.em,{children:["AVIF image, encoded with ",(0,s.jsx)(i.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.03"})]})," ",(0,s.jsx)(i.em,{children:"7.54s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["JXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the ",(0,s.jsx)(i.code,{children:"ssimulacra2"})," program decodes JPEG & JXL. Either way, the scores are fairly close."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jxl_jpeg-recomp",src:t(3988).A+""})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"189.4 kB"})," ",(0,s.jsxs)(i.em,{children:["JPEG-XL image from JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11"}),". Score: ~",(0,s.jsx)(i.code,{children:"84.92"})," (???)"]})," ",(0,s.jsx)(i.em,{children:"0.67s user time"})]}),"\n",(0,s.jsxs)(i.p,{children:["The final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with ",(0,s.jsx)(i.code,{children:"cjpegli"})," encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine)."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"smaller_jpeg_xyb",src:t(7280).A+"",width:"1699",height:"1136"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"208.3 kB"})," ",(0,s.jsxs)(i.em,{children:["XYB JPEG, encoded with ",(0,s.jsx)(i.code,{children:"cjpegli lossless.png out.jpg --xyb -d 1.155"}),". Score: ~",(0,s.jsx)(i.code,{children:"83.04"})]})," ",(0,s.jsx)(i.em,{children:"0.10s user time"})]}),"\n",(0,s.jsx)(i.p,{children:"In this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode."}),"\n",(0,s.jsx)(i.h2,{id:"responsive-images",children:"Responsive Images"}),"\n",(0,s.jsxs)(i.p,{children:["Displaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the ",(0,s.jsx)(i.a,{href:"https://ausi.github.io/respimagelint/",children:"Responsive Image Linter"})," that can help us figure out which image sizes we should be using."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"responsive_image_linter",src:t(3548).A+"",width:"2308",height:"670"})}),"\n",(0,s.jsx)(i.p,{children:"In our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n \n \n alt text\n\n'})}),"\n",(0,s.jsx)(i.p,{children:"It is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"srcset"})," = the images available to your browser to serve, & their respective widths"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"sizes"})," = the conditions given to the browser explaining under what conditions should it serve which image"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"(min-width: XXXpx) YYYpx"})," = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels * display scaling."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"calc(100vw - 24px)"})," = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have ",(0,s.jsx)(i.code,{children:"(min-width: 997px) calc(75vw - 257px)"}),". This means given the viewport is at least 997px wide, calculate 0.75 * the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified."]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{type:"image/jxl",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jxl 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jxl 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jxl 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jxl 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jxl 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("source",{type:"image/avif",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.avif 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.avif 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.avif 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.avif 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.avif 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)"}),(0,s.jsx)("img",{loading:"lazy",width:"1699",alt:"alt text",srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_270.jpg 270w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_958.jpg 958w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1350.jpg 1350w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1660.jpg 1660w, https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/img_size/img_1916.jpg 1916w",sizes:"(min-width: 2000px) 1916px, (min-width: 1700px) 1660px, (min-width: 1400px) 1350px, (min-width: 1000px) 958px, calc(100vw - 24px)",src:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/deployment/img/_DSC8466-smaller.jpg"})]}),"\n",(0,s.jsxs)(i.p,{children:["That's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their ",(0,s.jsx)(i.a,{href:"https://autocompressor.net/blog/reduce-image-load",children:"Reduce Your Page's Image Load"})," blog post when writing this entry. I have ",(0,s.jsx)(i.a,{href:"https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI",children:"confirmed"})," with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0."]})]})}function d(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3988:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-recomp-f3af6d54a8c1c62cda0c2d3ba048e1fc.jxl"},7280:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-xyb-0372077e225cf7b460ec9238bb2a65f9.jpg"},5437:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-452ed8f5a33da727be398450e7e580a3.avif"},5390:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-48eaf650a417558ea976bf40eee82f67.jpg"},4405:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-smaller-492a0639fb771671738062a57b2015a2.jxl"},4901:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/_DSC8466-d51a7e87bed86d101412ba728ebc6be2.jpg"},6666:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/box-size-mac-f49e702b0cb4a531f65283ad604d4b4c.avif"},3548:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/responsive_image_linter-178eb56c12557c53a2b129dd75925fe9.avif"},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var s=t(6540);const o={},n=s.createContext(o);function a(e){const i=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70de1c07.23bc15bd.js b/assets/js/70de1c07.23bc15bd.js deleted file mode 100644 index 4613ebb2c..000000000 --- a/assets/js/70de1c07.23bc15bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[544],{1165:(e,t,s)=>{s.d(t,{Ck:()=>c});var i=s(4848),o=s(6943),n=s(4184),a=s(8633),r=s(363);const c=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:s,...o})=>"left"===t?(0,i.jsx)(a.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(r.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,i.jsx)(o.A,{arrows:!0,prevArrow:(0,i.jsx)(t,{direction:"left"}),nextArrow:(0,i.jsx)(t,{direction:"right"}),children:e.map((e=>(0,i.jsx)(n.A,{src:e.src},e.src)))})}},850:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var i=s(4848),o=s(8453),n=s(1165);const a={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},r="Introduction",c={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},l={authorsImageUrls:[void 0]},u=[{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13)",id:"presets-comparisons--1---13",level:2},{value:"TLDR",id:"tldr",level:3},{value:"Tunes comparisons",id:"tunes-comparisons",level:2},{value:"TLDR",id:"tldr-1",level:3},{value:"Parameters comparisons",id:"parameters-comparisons",level:2},{value:"--tile-rows 1 --tile-columns 1 vs default --tile-rows 0 --tile-columns 0",id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",level:3},{value:"--aq-mode 0 vs default --aq-mode 2",id:"--aq-mode-0-vs-default---aq-mode-2",level:3},{value:"--aq-mode 1 vs default --aq-mode 2",id:"--aq-mode-1-vs-default---aq-mode-2",level:3},{value:"--enable-cdef 0 vs default --enable-cdef 1",id:"--enable-cdef-0-vs-default---enable-cdef-1",level:3},{value:"--enable-dg 0 vs default --enable-dg 1",id:"--enable-dg-0-vs-default---enable-dg-1",level:3},{value:"--enable-dlf 0 vs default --enable-dlf 1",id:"--enable-dlf-0-vs-default---enable-dlf-1",level:3},{value:"--fast-decode 1 vs default --fast-decode 0",id:"--fast-decode-1-vs-default---fast-decode-0",level:3},{value:"--irefresh-type 1 vs default --irefresh-type 2",id:"--irefresh-type-1-vs-default---irefresh-type-2",level:3},{value:"--lookahead 0 vs default --lookahead -1 (auto)",id:"--lookahead-0-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 60 vs default --lookahead -1 (auto)",id:"--lookahead-60-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 120 (max) vs default --lookahead -1 (auto)",id:"--lookahead-120-max-vs-default---lookahead--1-auto",level:3},{value:"--enable-overlays 1 vs default --enable-overlays 0",id:"--enable-overlays-1-vs-default---enable-overlays-0",level:3},{value:"--enable-qm 1 vs default --enable-qm 0",id:"--enable-qm-1-vs-default---enable-qm-0",level:3},{value:"--enable-qm 1 --qm-min 0 vs --enable-qm 1",id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",level:3},{value:"--enable-restoration 0 vs default --enable-restoration 1",id:"--enable-restoration-0-vs-default---enable-restoration-1",level:3},{value:"--scm 0 vs default --scm 2 (content adaptive)",id:"--scm-0-vs-default---scm-2-content-adaptive",level:3},{value:"--scm 1 vs default --scm 2 (content adaptive)",id:"--scm-1-vs-default---scm-2-content-adaptive",level:3},{value:"--enable-tf 0 vs default --enable-tf 1",id:"--enable-tf-0-vs-default---enable-tf-1",level:3},{value:"--enable-tpl-la 0 vs default --enable-tpl-la 1",id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",level:3},{value:"superres:",id:"superres",level:3},{value:"Early TLDR on parameters results:",id:"early-tldr-on-parameters-results",level:3},{value:"Conclusion",id:"conclusion",level:2}];function m(e){const t={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,i.jsxs)(t.p,{children:["The resources available will range from ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"graphs"})})," to ",(0,i.jsx)(t.del,{children:(0,i.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,i.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]}),"\n",(0,i.jsxs)(t.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,i.jsx)(t.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,i.jsx)(t.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(t.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"})," and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the ",(0,i.jsx)(t.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,i.jsx)(t.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(t.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0",children:"v1.8.0 source code"})," using the provided ",(0,i.jsx)(t.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsxs)(t.p,{children:["This testing was conducted within the ",(0,i.jsx)(t.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(t.h2,{id:"samples",children:"Samples"}),"\n",(0,i.jsx)(t.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["11s ",(0,i.jsx)(t.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set."]}),"\n",(0,i.jsxs)(t.li,{children:["13s ",(0,i.jsx)(t.code,{children:"Blue Lock"})," clip which sports rapid camera movements and rotations + high-contrast elements."]}),"\n",(0,i.jsxs)(t.li,{children:["15s ",(0,i.jsx)(t.code,{children:"Fate/Grand Order: Babylonia"})," relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data."]}),"\n",(0,i.jsxs)(t.li,{children:["22s ",(0,i.jsx)(t.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,i.jsxs)(t.li,{children:["14s ",(0,i.jsx)(t.code,{children:"Kaguya-sama"})," opening sequence with lots of effects and fast change of scenery.\nThe resolution of every clip is 1080p, except for the first one which is 1920x804."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(t.code,{children:"--crf 8"})," to ",(0,i.jsx)(t.code,{children:"--crf 43"}),"."]})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsx)(t.h2,{id:"presets-comparisons--1---13",children:"Presets comparisons (-1 -> 13)"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(t.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(t.code,{children:"--preset 13"}),"."]}),"\n",(0,i.jsx)(t.em,{children:"Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why."})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--tune 1"}),": tune PSNR"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 1"}),": temporal filtering enabled\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled..."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"First of all, here are the efficiency graphs:"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_blame.webp",alt:"Blame!.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_bluelock.webp",alt:"BlueLock.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_fate.webp",alt:"Fate.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_jigokuraku.webp",alt:"Jigokuraku.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_kaguya.webp",alt:"Kaguya.h264 Efficiency Graph"}]}),"\n",(0,i.jsx)(t.p,{children:"This could be too much information."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_blame.webp",alt:"blame High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_bluelock.webp",alt:"bluelock High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_fate.webp",alt:"fate High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_jigokuraku.webp",alt:"jigokuraku High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_kaguya.webp",alt:"kaguya High Quality Efficiency Graph"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same again but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now for the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp",alt:"speed_overall"})}),"\n",(0,i.jsxs)(t.p,{children:["As we can see, preset -1 is so abysmally slow it makes the graph unusable\n(BTW, notice the ",(0,i.jsx)(t.code,{children:"1e6"})," in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here are speeds graphs for preset 1 to 6 with a linear scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.p,{children:["One interpretation we can have is that ",(0,i.jsx)(t.strong,{children:"presets 2 to 4"})," have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but ",(0,i.jsx)(t.strong,{children:"preset 2"})," is ",(0,i.jsx)(t.strong,{children:"2x slower than preset 4"}),". The quality gap between ",(0,i.jsx)(t.strong,{children:"preset 2"})," and ",(0,i.jsx)(t.strong,{children:"preset 1"})," is even narrower but the speed penalty is also ~2x."]}),"\n",(0,i.jsxs)(t.p,{children:["That makes it hard to recommend ",(0,i.jsx)(t.strong,{children:"preset 1"}),", while ",(0,i.jsx)(t.strong,{children:"preset 3"})," is in a strange middle ground between ",(0,i.jsx)(t.strong,{children:"2"})," and ",(0,i.jsx)(t.strong,{children:"4"})," where it makes little sense to choose it over those two: it's better to choose ",(0,i.jsx)(t.strong,{children:"preset 2"})," for the higher efficiency at 1.5x slower speeds, or ",(0,i.jsx)(t.strong,{children:"preset 4"})," for the 1.33 to 1.5x higher speeds. At least the option exists."]}),"\n",(0,i.jsxs)(t.p,{children:["A similar observation can be made between ",(0,i.jsx)(t.strong,{children:"preset 5"})," and ",(0,i.jsx)(t.strong,{children:"6"}),". They can be so close in scores in many samples (especially at HQ) while also being close in speeds that ",(0,i.jsx)(t.strong,{children:"preset 5"})," becomes rather obsolete most of the time."]}),"\n",(0,i.jsx)(t.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go."})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," only loses at maximum ",(0,i.jsx)(t.strong,{children:"2"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"})," compared to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," while being 50-60x faster. Though to be fair, the speed loss from ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 0"})}),' is "only" 5-10x for a maximum SSIMU2 difference close to ',(0,i.jsx)(t.strong,{children:"1.5 point"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["From CRF43 to CRF28, the difference between ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," and ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," can be as much as ",(0,i.jsx)(t.strong,{children:"5"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"}),", so lower presets become more attractive."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"tunes-comparisons",children:"Tunes comparisons"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default ",(0,i.jsx)(t.code,{children:"--tune 1"})," (PSNR) to the other two tunes: ",(0,i.jsx)(t.code,{children:"--tune 0"})," (VQ) and ",(0,i.jsx)(t.code,{children:"--tune 2"})," (SSIM)."]})}),"\n",(0,i.jsxs)(t.p,{children:["Except for the tunes, ",(0,i.jsx)(t.code,{children:"--preset 4"})," is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's compare the efficiency of every tunes:"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now let\'s focus on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'And the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"And here is the speed difference:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Graphs comparing the tunes individually between each others will be made available soon."}),"\n",(0,i.jsx)(t.li,{children:"The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["SSIMU2 favors ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," above ",(0,i.jsx)(t.strong,{children:"tune 0"}),". At high quality, ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," are matched, while at low quality ",(0,i.jsx)(t.strong,{children:"tune 2"})," takes the edge. ",(0,i.jsx)(t.strong,{children:"Tune 0"})," is sometimes a match for the other two on certain clips and other times fare pretty badly."]}),"\n",(0,i.jsxs)(t.strong,{children:["For some reason, ",(0,i.jsx)(t.strong,{children:"tune 0"})," is quite a bit faster now, compared to 1 and 2 which are basically the same."]})]}),"\n",(0,i.jsxs)(t.p,{children:["Keep in mind that I have observed multiple times in the past that ",(0,i.jsx)(t.strong,{children:"tune 0"})," kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay ",(0,i.jsx)(t.em,{children:"tuned"})," for these subjective comparisons."]}),"\n",(0,i.jsx)(t.h2,{id:"parameters-comparisons",children:"Parameters comparisons"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"In the following graphs, you may find comparisons between many SVT-AV1 parameters."}),"\n",(0,i.jsx)(t.em,{children:"Additional graphs focusing on the high and low qualities will be made available later down the line"})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset 4"})," is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.h3,{id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",children:[(0,i.jsx)(t.code,{children:"--tile-rows 1 --tile-columns 1"})," vs default ",(0,i.jsx)(t.code,{children:"--tile-rows 0 --tile-columns 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"tiles"})," here are both slightly harmful and slower."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-0-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 0"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Except for the Jigokuraku clip, ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-1-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"aq-mode 1"})," fares closer to ",(0,i.jsx)(t.strong,{children:"aq-mode 2"})," than ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," did, both in quality and speed, but is still overall inferior according to SSIMU2"]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-cdef-0-vs-default---enable-cdef-1",children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-cdef 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF ",(0,i.jsx)(t.em,{children:"can"})," be beneficial for the line-art."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dg-0-vs-default---enable-dg-1",children:[(0,i.jsx)(t.code,{children:"--enable-dg 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dg 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Dynamic GoP control"})," yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \"safe\" to keep the setting disabled at all times or not."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dlf-0-vs-default---enable-dlf-1",children:[(0,i.jsx)(t.code,{children:"--enable-dlf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dlf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Deblocking loop filter"})," can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--fast-decode-1-vs-default---fast-decode-0",children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--fast-decode 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"fast-decode 1"})," is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--irefresh-type-1-vs-default---irefresh-type-2",children:[(0,i.jsx)(t.code,{children:"--irefresh-type 1"})," vs default ",(0,i.jsx)(t.code,{children:"--irefresh-type 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Finally something interesting to analyse!"}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is either a match or beneficial compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at high CRF levels."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," either wins or lose to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set ",(0,i.jsx)(t.strong,{children:"irefresh-type"})," to ",(0,i.jsx)(t.strong,{children:"1"}),' at "high quality" as it might be harmful depending on the content.']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is always slower compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"}),", so I might argue it is more safe to leave ",(0,i.jsx)(t.strong,{children:"irefresh-type"}),' default at "high quality" than not.']}),"\n",(0,i.jsxs)(t.li,{children:["According to the content type of those clips, it appears that ",(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," may benefit ",(0,i.jsx)(t.em,{children:"extremely grainy"})," content while default ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," is better suited for ",(0,i.jsx)(t.em,{children:"cleanish"})," content. This needs to be confirmed with ",(0,i.jsx)(t.em,{children:"moar"})," testing though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-0-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 0"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-60-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 60"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-120-max-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 120"})," (max) vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"lookahead"})," seems to behave strangely when set..."]}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 0"})," shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 60"})," is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 120"})," is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide."}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-overlays-1-vs-default---enable-overlays-0",children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-overlays 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"overlays"})," do not seem to either improve efficiency or performance."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1-vs-default---enable-qm-0",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-qm 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"}),' alone increase efficiency at "high quality" with no real speed impact.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," vs ",(0,i.jsx)(t.code,{children:"--enable-qm 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Setting ",(0,i.jsx)(t.strong,{children:"qm-min"})," to ",(0,i.jsx)(t.strong,{children:"0"})," on top of enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"})," can be beneficial in some clips at no added compute time."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"I will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content."}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-restoration-0-vs-default---enable-restoration-1",children:[(0,i.jsx)(t.code,{children:"--enable-restoration 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-restoration 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the ",(0,i.jsx)(t.strong,{children:"loop restoration filter"})," isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-0-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 0"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-1-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Interestingly enough, ",(0,i.jsx)(t.strong,{children:"screen content tools"})," seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tf-0-vs-default---enable-tf-1",children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Disabled ",(0,i.jsx)(t.strong,{children:"temporal filtering"})," ",(0,i.jsx)(t.em,{children:"can"}),' sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",children:[(0,i.jsx)(t.code,{children:"--enable-tpl-la 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tpl-la 1"})]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"superres",children:[(0,i.jsx)(t.code,{children:"superres"}),":"]}),"\n",(0,i.jsx)(t.p,{children:"Kinda lazy to make, share and comment so much graphs for something that can be told in two lines..."}),"\n",(0,i.jsx)(t.p,{children:"All superres variants are freaking useless as they:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"do not improve efficiency"}),"\n",(0,i.jsx)(t.li,{children:"decrease encoding speeds"}),"\n",(0,i.jsx)(t.li,{children:"decrease decoding speeds when either bitrate or quality normalized."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"early-tldr-on-parameters-results",children:(0,i.jsx)(t.strong,{children:"Early TLDR on parameters results:"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.em,{children:(0,i.jsxs)(t.strong,{children:["For a previous test with SVT-AV1 1.7.0 I did all parameters tests with ",(0,i.jsx)(t.code,{children:"--preset 6 --tune 2"}),", now I did them with ",(0,i.jsx)(t.code,{children:"--preset 4 --tune 1"}),". Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line."]})})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Here is a quick run down of how each parameter affect encoding:"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--tile-rows --tile-columns"})," should never be used (except for decreasing decode complexity)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"})," is the most efficient / fastest"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," ",(0,i.jsx)(t.em,{children:"might"})," improve performance at almost no efficiency loss ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-dg"})," and ",(0,i.jsx)(t.code,{children:"--enable-dlf"})," barely do anything"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," decreases efficiency, improves encoding times, and the decoding gains still need to be determined."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type"})," should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--lookahead"})," should be kept default"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," does not improve efficiency, slight speed regression as well"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," should be set for increased efficiency especially at low CRF values at no perf cost"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-restoration"})," barely does anything but disabling yields better performance ",(0,i.jsx)(t.em,{children:"(needs visual confirmation)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--scm 1"})," screen content tools can improve efficiency with a big performance trade-off ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," is a mixed bag efficiency wise but improves performance"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"superres & resize"})," please don't."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(t.p,{children:"The extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking."}),"\n",(0,i.jsx)(t.p,{children:"The default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength."}),"\n",(0,i.jsx)(t.p,{children:"Further testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!"}),"\n"]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}}}]); \ No newline at end of file diff --git a/assets/js/70de1c07.bce2655b.js b/assets/js/70de1c07.bce2655b.js new file mode 100644 index 000000000..640e8d8bd --- /dev/null +++ b/assets/js/70de1c07.bce2655b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[544],{1165:(e,t,s)=>{s.d(t,{Ck:()=>d,kS:()=>b});var i=s(4848),o=s(5293),n=s(6540),a=s(3517),r=s(943),c=s(1412),l=s(9522),u=s(1303),m=s(8633),h=s(363);const d=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:s,...o})=>"left"===t?(0,i.jsx)(m.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(h.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,i.jsx)(a.A,{arrows:!0,prevArrow:(0,i.jsx)(t,{direction:"left"}),nextArrow:(0,i.jsx)(t,{direction:"right"}),children:e.map((e=>(0,i.jsx)(r.A,{src:e.src},e.src)))})},b=({tabMap:e})=>{const[t,s]=(0,n.useState)(Object.keys(e)[0]),{colorMode:a,setColorMode:r}=(0,o.G)();return(0,i.jsx)(c.Ay,{theme:{algorithm:"dark"===a?l.A.darkAlgorithm:l.A.defaultAlgorithm},children:(0,i.jsx)(u.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:t,onTabChange:e=>{s(e)},children:e[t].component})})}},850:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var i=s(4848),o=s(8453),n=s(1165);const a={title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},r="Introduction",c={permalink:"/blog/svt-av1-deep-dive",source:"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",date:"2023-12-30T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Encoding Animation with SVT-AV1: A Deep Dive",description:"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?",slug:"svt-av1-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-1.8.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",permalink:"/blog/svt-av1-second-deep-dive"},nextItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"}},l={authorsImageUrls:[void 0]},u=[{value:"Samples",id:"samples",level:2},{value:"Presets comparisons (-1 -> 13)",id:"presets-comparisons--1---13",level:2},{value:"TLDR",id:"tldr",level:3},{value:"Tunes comparisons",id:"tunes-comparisons",level:2},{value:"TLDR",id:"tldr-1",level:3},{value:"Parameters comparisons",id:"parameters-comparisons",level:2},{value:"--tile-rows 1 --tile-columns 1 vs default --tile-rows 0 --tile-columns 0",id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",level:3},{value:"--aq-mode 0 vs default --aq-mode 2",id:"--aq-mode-0-vs-default---aq-mode-2",level:3},{value:"--aq-mode 1 vs default --aq-mode 2",id:"--aq-mode-1-vs-default---aq-mode-2",level:3},{value:"--enable-cdef 0 vs default --enable-cdef 1",id:"--enable-cdef-0-vs-default---enable-cdef-1",level:3},{value:"--enable-dg 0 vs default --enable-dg 1",id:"--enable-dg-0-vs-default---enable-dg-1",level:3},{value:"--enable-dlf 0 vs default --enable-dlf 1",id:"--enable-dlf-0-vs-default---enable-dlf-1",level:3},{value:"--fast-decode 1 vs default --fast-decode 0",id:"--fast-decode-1-vs-default---fast-decode-0",level:3},{value:"--irefresh-type 1 vs default --irefresh-type 2",id:"--irefresh-type-1-vs-default---irefresh-type-2",level:3},{value:"--lookahead 0 vs default --lookahead -1 (auto)",id:"--lookahead-0-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 60 vs default --lookahead -1 (auto)",id:"--lookahead-60-vs-default---lookahead--1-auto",level:3},{value:"--lookahead 120 (max) vs default --lookahead -1 (auto)",id:"--lookahead-120-max-vs-default---lookahead--1-auto",level:3},{value:"--enable-overlays 1 vs default --enable-overlays 0",id:"--enable-overlays-1-vs-default---enable-overlays-0",level:3},{value:"--enable-qm 1 vs default --enable-qm 0",id:"--enable-qm-1-vs-default---enable-qm-0",level:3},{value:"--enable-qm 1 --qm-min 0 vs --enable-qm 1",id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",level:3},{value:"--enable-restoration 0 vs default --enable-restoration 1",id:"--enable-restoration-0-vs-default---enable-restoration-1",level:3},{value:"--scm 0 vs default --scm 2 (content adaptive)",id:"--scm-0-vs-default---scm-2-content-adaptive",level:3},{value:"--scm 1 vs default --scm 2 (content adaptive)",id:"--scm-1-vs-default---scm-2-content-adaptive",level:3},{value:"--enable-tf 0 vs default --enable-tf 1",id:"--enable-tf-0-vs-default---enable-tf-1",level:3},{value:"--enable-tpl-la 0 vs default --enable-tpl-la 1",id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",level:3},{value:"superres:",id:"superres",level:3},{value:"Early TLDR on parameters results:",id:"early-tldr-on-parameters-results",level:3},{value:"Conclusion",id:"conclusion",level:2}];function m(e){const t={a:"a",blockquote:"blockquote",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips."}),"\n",(0,i.jsxs)(t.p,{children:["The resources available will range from ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"graphs"})})," to ",(0,i.jsx)(t.del,{children:(0,i.jsx)(t.strong,{children:"image comparisons"})})," (WIP). The ",(0,i.jsx)(t.em,{children:(0,i.jsx)(t.strong,{children:"former"})})," has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the ",(0,i.jsx)(t.strong,{children:"latter"})," are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons."]}),"\n",(0,i.jsxs)(t.p,{children:["The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with ",(0,i.jsx)(t.code,{children:"x264 --qp 0"})," for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp ",(0,i.jsx)(t.em,{children:"directly"}),", meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the ",(0,i.jsx)(t.a,{href:"https://github.com/dnjulek/vapoursynth-ssimulacra2",children:"Zig implementation"})," and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the ",(0,i.jsx)(t.code,{children:"Metric / BPP"})," graphs may represent the closest we have to real efficiency."]}),"\n",(0,i.jsx)(t.p,{children:"The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy."}),"\n",(0,i.jsxs)(t.p,{children:["SvtAv1EncApp was compiled directly from the ",(0,i.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0",children:"v1.8.0 source code"})," using the provided ",(0,i.jsx)(t.code,{children:"Build/linux/build.sh"})," script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting."]}),"\n",(0,i.jsxs)(t.p,{children:["This testing was conducted within the ",(0,i.jsx)(t.a,{href:"https://discord.gg/83dRFDFDp7",children:"AV1 Weeb Edition"})," Discord server, which is focused on encoding animated content in AV1."]}),"\n",(0,i.jsx)(t.h2,{id:"samples",children:"Samples"}),"\n",(0,i.jsx)(t.p,{children:"The samples are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["11s ",(0,i.jsx)(t.code,{children:"Blame!"})," clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set."]}),"\n",(0,i.jsxs)(t.li,{children:["13s ",(0,i.jsx)(t.code,{children:"Blue Lock"})," clip which sports rapid camera movements and rotations + high-contrast elements."]}),"\n",(0,i.jsxs)(t.li,{children:["15s ",(0,i.jsx)(t.code,{children:"Fate/Grand Order: Babylonia"})," relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data."]}),"\n",(0,i.jsxs)(t.li,{children:["22s ",(0,i.jsx)(t.code,{children:"Jigokuraku (Hell's Paradise)"})," flashback clip with huge static grain in a very dark scenery and some action."]}),"\n",(0,i.jsxs)(t.li,{children:["14s ",(0,i.jsx)(t.code,{children:"Kaguya-sama"})," opening sequence with lots of effects and fast change of scenery.\nThe resolution of every clip is 1080p, except for the first one which is 1920x804."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["All clips have been encoded in a wide quality range, from ",(0,i.jsx)(t.code,{children:"--crf 8"})," to ",(0,i.jsx)(t.code,{children:"--crf 43"}),"."]})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Without further ado, let's start with the first comparisons!"}),"\n",(0,i.jsx)(t.h2,{id:"presets-comparisons--1---13",children:"Presets comparisons (-1 -> 13)"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest ",(0,i.jsx)(t.code,{children:"--preset -1"})," to the fastest ",(0,i.jsx)(t.code,{children:"--preset 13"}),"."]}),"\n",(0,i.jsx)(t.em,{children:"Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why."})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset X"})," is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--tune 1"}),": tune PSNR"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"}),": variance deltaq"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 0"}),": quantisation matrices disabled"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type 2"}),": closed GOP"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 1"}),": temporal filtering enabled\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled..."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"First of all, here are the efficiency graphs:"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_blame.webp",alt:"Blame!.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_bluelock.webp",alt:"BlueLock.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_fate.webp",alt:"Fate.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_jigokuraku.webp",alt:"Jigokuraku.h264 Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_kaguya.webp",alt:"Kaguya.h264 Efficiency Graph"}]}),"\n",(0,i.jsx)(t.p,{children:"This could be too much information."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_blame.webp",alt:"blame High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_bluelock.webp",alt:"bluelock High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_fate.webp",alt:"fate High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_jigokuraku.webp",alt:"jigokuraku High Quality Efficiency Graph"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_kaguya.webp",alt:"kaguya High Quality Efficiency Graph"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same again but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now for the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Same but without presets 9 to 13 for better clarity:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's now see speed comparisons between all presets:"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp",alt:"speed_overall"})}),"\n",(0,i.jsxs)(t.p,{children:["As we can see, preset -1 is so abysmally slow it makes the graph unusable\n(BTW, notice the ",(0,i.jsx)(t.code,{children:"1e6"})," in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here is what it looks like with a logarithmic scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Here are speeds graphs for preset 1 to 6 with a linear scale:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.p,{children:["One interpretation we can have is that ",(0,i.jsx)(t.strong,{children:"presets 2 to 4"})," have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but ",(0,i.jsx)(t.strong,{children:"preset 2"})," is ",(0,i.jsx)(t.strong,{children:"2x slower than preset 4"}),". The quality gap between ",(0,i.jsx)(t.strong,{children:"preset 2"})," and ",(0,i.jsx)(t.strong,{children:"preset 1"})," is even narrower but the speed penalty is also ~2x."]}),"\n",(0,i.jsxs)(t.p,{children:["That makes it hard to recommend ",(0,i.jsx)(t.strong,{children:"preset 1"}),", while ",(0,i.jsx)(t.strong,{children:"preset 3"})," is in a strange middle ground between ",(0,i.jsx)(t.strong,{children:"2"})," and ",(0,i.jsx)(t.strong,{children:"4"})," where it makes little sense to choose it over those two: it's better to choose ",(0,i.jsx)(t.strong,{children:"preset 2"})," for the higher efficiency at 1.5x slower speeds, or ",(0,i.jsx)(t.strong,{children:"preset 4"})," for the 1.33 to 1.5x higher speeds. At least the option exists."]}),"\n",(0,i.jsxs)(t.p,{children:["A similar observation can be made between ",(0,i.jsx)(t.strong,{children:"preset 5"})," and ",(0,i.jsx)(t.strong,{children:"6"}),". They can be so close in scores in many samples (especially at HQ) while also being close in speeds that ",(0,i.jsx)(t.strong,{children:"preset 5"})," becomes rather obsolete most of the time."]}),"\n",(0,i.jsx)(t.h3,{id:"tldr",children:"TLDR"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go."})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," only loses at maximum ",(0,i.jsx)(t.strong,{children:"2"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"})," compared to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," while being 50-60x faster. Though to be fair, the speed loss from ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," to ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 0"})}),' is "only" 5-10x for a maximum SSIMU2 difference close to ',(0,i.jsx)(t.strong,{children:"1.5 point"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["From CRF43 to CRF28, the difference between ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset 4"})})," and ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.strong,{children:"preset -1"})})," can be as much as ",(0,i.jsx)(t.strong,{children:"5"})," SSIMU2 ",(0,i.jsx)(t.strong,{children:"points"}),", so lower presets become more attractive."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"tunes-comparisons",children:"Tunes comparisons"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default ",(0,i.jsx)(t.code,{children:"--tune 1"})," (PSNR) to the other two tunes: ",(0,i.jsx)(t.code,{children:"--tune 0"})," (VQ) and ",(0,i.jsx)(t.code,{children:"--tune 2"})," (SSIM)."]})}),"\n",(0,i.jsxs)(t.p,{children:["Except for the tunes, ",(0,i.jsx)(t.code,{children:"--preset 4"})," is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Let's compare the efficiency of every tunes:"})}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'Now let\'s focus on the "high quality" range (CRF8 -> 23):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:'And the "low quality" range (CRF28 -> 43):'}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"And here is the speed difference:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Graphs comparing the tunes individually between each others will be made available soon."}),"\n",(0,i.jsx)(t.li,{children:"The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"tldr-1",children:"TLDR"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsxs)(t.strong,{children:["SSIMU2 favors ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," above ",(0,i.jsx)(t.strong,{children:"tune 0"}),". At high quality, ",(0,i.jsx)(t.strong,{children:"tune 1 and 2"})," are matched, while at low quality ",(0,i.jsx)(t.strong,{children:"tune 2"})," takes the edge. ",(0,i.jsx)(t.strong,{children:"Tune 0"})," is sometimes a match for the other two on certain clips and other times fare pretty badly."]}),"\n",(0,i.jsxs)(t.strong,{children:["For some reason, ",(0,i.jsx)(t.strong,{children:"tune 0"})," is quite a bit faster now, compared to 1 and 2 which are basically the same."]})]}),"\n",(0,i.jsxs)(t.p,{children:["Keep in mind that I have observed multiple times in the past that ",(0,i.jsx)(t.strong,{children:"tune 0"})," kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay ",(0,i.jsx)(t.em,{children:"tuned"})," for these subjective comparisons."]}),"\n",(0,i.jsx)(t.h2,{id:"parameters-comparisons",children:"Parameters comparisons"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"In the following graphs, you may find comparisons between many SVT-AV1 parameters."}),"\n",(0,i.jsx)(t.em,{children:"Additional graphs focusing on the high and low qualities will be made available later down the line"})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"--preset 4"})," is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above."]}),"\n",(0,i.jsxs)(t.h3,{id:"--tile-rows-1---tile-columns-1-vs-default---tile-rows-0---tile-columns-0",children:[(0,i.jsx)(t.code,{children:"--tile-rows 1 --tile-columns 1"})," vs default ",(0,i.jsx)(t.code,{children:"--tile-rows 0 --tile-columns 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"tiles"})," here are both slightly harmful and slower."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-0-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 0"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Except for the Jigokuraku clip, ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--aq-mode-1-vs-default---aq-mode-2",children:[(0,i.jsx)(t.code,{children:"--aq-mode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--aq-mode 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"aq-mode 1"})," fares closer to ",(0,i.jsx)(t.strong,{children:"aq-mode 2"})," than ",(0,i.jsx)(t.strong,{children:"aq-mode 0"})," did, both in quality and speed, but is still overall inferior according to SSIMU2"]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-cdef-0-vs-default---enable-cdef-1",children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-cdef 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF ",(0,i.jsx)(t.em,{children:"can"})," be beneficial for the line-art."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dg-0-vs-default---enable-dg-1",children:[(0,i.jsx)(t.code,{children:"--enable-dg 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dg 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Dynamic GoP control"})," yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \"safe\" to keep the setting disabled at all times or not."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-dlf-0-vs-default---enable-dlf-1",children:[(0,i.jsx)(t.code,{children:"--enable-dlf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-dlf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Deblocking loop filter"})," can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--fast-decode-1-vs-default---fast-decode-0",children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," vs default ",(0,i.jsx)(t.code,{children:"--fast-decode 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"fast-decode 1"})," is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--irefresh-type-1-vs-default---irefresh-type-2",children:[(0,i.jsx)(t.code,{children:"--irefresh-type 1"})," vs default ",(0,i.jsx)(t.code,{children:"--irefresh-type 2"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Finally something interesting to analyse!"}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is either a match or beneficial compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at high CRF levels."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," either wins or lose to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set ",(0,i.jsx)(t.strong,{children:"irefresh-type"})," to ",(0,i.jsx)(t.strong,{children:"1"}),' at "high quality" as it might be harmful depending on the content.']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," is always slower compared to ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"}),", so I might argue it is more safe to leave ",(0,i.jsx)(t.strong,{children:"irefresh-type"}),' default at "high quality" than not.']}),"\n",(0,i.jsxs)(t.li,{children:["According to the content type of those clips, it appears that ",(0,i.jsx)(t.strong,{children:"irefresh-type 1"})," may benefit ",(0,i.jsx)(t.em,{children:"extremely grainy"})," content while default ",(0,i.jsx)(t.strong,{children:"irefresh-type 2"})," is better suited for ",(0,i.jsx)(t.em,{children:"cleanish"})," content. This needs to be confirmed with ",(0,i.jsx)(t.em,{children:"moar"})," testing though."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-0-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 0"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-60-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 60"})," vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.h3,{id:"--lookahead-120-max-vs-default---lookahead--1-auto",children:[(0,i.jsx)(t.code,{children:"--lookahead 120"})," (max) vs default ",(0,i.jsx)(t.code,{children:"--lookahead -1"})," (auto)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"lookahead"})," seems to behave strangely when set..."]}),"\n"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 0"})," shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 60"})," is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"lookahead 120"})," is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences."]}),"\n"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide."}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-overlays-1-vs-default---enable-overlays-0",children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-overlays 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"overlays"})," do not seem to either improve efficiency or performance."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1-vs-default---enable-qm-0",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-qm 0"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"}),' alone increase efficiency at "high quality" with no real speed impact.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-qm-1---qm-min-0-vs---enable-qm-1",children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," vs ",(0,i.jsx)(t.code,{children:"--enable-qm 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_blame.webp",alt:"SVT4_qm1_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_bluelock.webp",alt:"SVT4_qm1_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_fate.webp",alt:"SVT4_qm1_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_jigokuraku.webp",alt:"SVT4_qm1_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_kaguya.webp",alt:"SVT4_qm1_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Setting ",(0,i.jsx)(t.strong,{children:"qm-min"})," to ",(0,i.jsx)(t.strong,{children:"0"})," on top of enabling ",(0,i.jsx)(t.strong,{children:"quantization matrices"})," can be beneficial in some clips at no added compute time."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"I will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content."}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-restoration-0-vs-default---enable-restoration-1",children:[(0,i.jsx)(t.code,{children:"--enable-restoration 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-restoration 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the ",(0,i.jsx)(t.strong,{children:"loop restoration filter"})," isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-0-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 0"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"--scm-1-vs-default---scm-2-content-adaptive",children:[(0,i.jsx)(t.code,{children:"--scm 1"})," vs default ",(0,i.jsx)(t.code,{children:"--scm 2"})," (content adaptive)"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Interestingly enough, ",(0,i.jsx)(t.strong,{children:"screen content tools"})," seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this."]}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tf-0-vs-default---enable-tf-1",children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tf 1"})]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Efficiency graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Speed graphs:"}),"\n"]}),"\n",(0,i.jsx)(n.Ck,{imageData:[{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_blame.webp",alt:"SVT4_blame"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_bluelock.webp",alt:"SVT4_bluelock"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_fate.webp",alt:"SVT4_fate"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_jigokuraku.webp",alt:"SVT4_jigokuraku"},{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_kaguya.webp",alt:"SVT4_kaguya"}]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["Disabled ",(0,i.jsx)(t.strong,{children:"temporal filtering"})," ",(0,i.jsx)(t.em,{children:"can"}),' sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.']}),"\n"]}),"\n",(0,i.jsxs)(t.h3,{id:"--enable-tpl-la-0-vs-default---enable-tpl-la-1",children:[(0,i.jsx)(t.code,{children:"--enable-tpl-la 0"})," vs default ",(0,i.jsx)(t.code,{children:"--enable-tpl-la 1"})]}),"\n",(0,i.jsx)(t.p,{children:"In all the clips, the results are bit-perfect and there is no notable performance difference."}),"\n",(0,i.jsxs)(t.h3,{id:"superres",children:[(0,i.jsx)(t.code,{children:"superres"}),":"]}),"\n",(0,i.jsx)(t.p,{children:"Kinda lazy to make, share and comment so much graphs for something that can be told in two lines..."}),"\n",(0,i.jsx)(t.p,{children:"All superres variants are freaking useless as they:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"do not improve efficiency"}),"\n",(0,i.jsx)(t.li,{children:"decrease encoding speeds"}),"\n",(0,i.jsx)(t.li,{children:"decrease decoding speeds when either bitrate or quality normalized."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"early-tldr-on-parameters-results",children:(0,i.jsx)(t.strong,{children:"Early TLDR on parameters results:"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.em,{children:(0,i.jsxs)(t.strong,{children:["For a previous test with SVT-AV1 1.7.0 I did all parameters tests with ",(0,i.jsx)(t.code,{children:"--preset 6 --tune 2"}),", now I did them with ",(0,i.jsx)(t.code,{children:"--preset 4 --tune 1"}),". Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line."]})})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Here is a quick run down of how each parameter affect encoding:"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--tile-rows --tile-columns"})," should never be used (except for decreasing decode complexity)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--aq-mode 2"})," is the most efficient / fastest"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-cdef 0"})," ",(0,i.jsx)(t.em,{children:"might"})," improve performance at almost no efficiency loss ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-dg"})," and ",(0,i.jsx)(t.code,{children:"--enable-dlf"})," barely do anything"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--fast-decode 1"})," decreases efficiency, improves encoding times, and the decoding gains still need to be determined."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--irefresh-type"})," should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--lookahead"})," should be kept default"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-overlays 1"})," does not improve efficiency, slight speed regression as well"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-qm 1 --qm-min 0"})," should be set for increased efficiency especially at low CRF values at no perf cost"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-restoration"})," barely does anything but disabling yields better performance ",(0,i.jsx)(t.em,{children:"(needs visual confirmation)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--scm 1"})," screen content tools can improve efficiency with a big performance trade-off ",(0,i.jsx)(t.em,{children:"(needs more thorough testing)"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"--enable-tf 0"})," is a mixed bag efficiency wise but improves performance"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"superres & resize"})," please don't."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(t.p,{children:"The extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking."}),"\n",(0,i.jsx)(t.p,{children:"The default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength."}),"\n",(0,i.jsx)(t.p,{children:"Further testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!"}),"\n"]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}}}]); \ No newline at end of file diff --git a/assets/js/772.fa094b13.js b/assets/js/772.fa094b13.js deleted file mode 100644 index b292d7f2c..000000000 --- a/assets/js/772.fa094b13.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 772.fa094b13.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[772],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>w,cM:()=>y});var r=n(2456),o=n(6250),i=2,a=.16,c=.05,s=.05,l=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function h(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function v(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function g(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+c*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function m(e,t,n){var r;return(r=n?e.v+s*t:e.v-l*t)>1&&(r=1),Number(r.toFixed(2))}function y(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),c=h((0,o.RO)({h:v(a,i,!0),s:g(a,i,!0),v:m(a,i,!0)}));n.push(c)}n.push(h(r));for(var s=1;s<=d;s+=1){var l=p(r),y=h((0,o.RO)({h:v(l,s),s:g(l,s),v:m(l,s)}));n.push(y)}return"dark"===t.theme?f.map((function(e){var r,i,a,c=e.index,s=e.opacity;return h((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[c]),a=100*s/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var b={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},S={};Object.keys(b).forEach((function(e){A[e]=y(b[e]),A[e].primary=A[e][5],S[e]=y(b[e],{theme:"dark",backgroundColor:"#141414"}),S[e].primary=S[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var w=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>ct,an:()=>T,Ki:()=>j,zA:()=>H,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(6636),i=n(4241),a=n(9379);const c=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var s=n(5089),l=n(6540),u=n.t(l,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function h(e){return e.join(p)}const v=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(h(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(h(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var g="data-token-hash",m="data-css-hash",y="__cssinjs_instance__";function b(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(m,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[y]=t[y]||e,t[y]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(m,"]"))).forEach((function(t){var n,o=t.getAttribute(m);r[o]?t[y]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new v(e)}var A=l.createContext({hashPriority:"low",cache:b(),defaultCache:!0});const S=A;var w=n(2284),x=n(998);var k=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),O=new k;function T(e){var t=Array.isArray(e)?e:[e];return O.has(t)||O.set(t,new M(t)),O.get(t)}var L=new WeakMap,I={};var R=new WeakMap;function z(e){var t=R.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof M?t+=r.id:r&&"object"===(0,w.A)(r)?t+=z(r):t+=r})),R.set(e,t)),t}function P(e,t){return c("".concat(t,"_").concat(z(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var N=(0,x.A)();function H(e){return"number"==typeof e?"".concat(e,"px"):e}function $(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var c=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,g,t),(0,r.A)(o,m,n),o)),s=Object.keys(c).map((function(e){var t=c[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var j=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},_=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,c=(0,o.A)(e,2),s=c[0],l=c[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[s])i[s]=l;else if(!("string"!=typeof l&&"number"!=typeof l||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[s])){var u,d=j(s,null==n?void 0:n.prefix);r[d]="number"!=typeof l||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[s]?String(l):"".concat(l,"px"),i[s]="var(".concat(d,")")}})),[i,_(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),F=(0,a.A)({},u).useInsertionEffect;const W=F?function(e,t,n){return F((function(){return e(),t()}),n)}:function(e,t,n){l.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return l.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const U=function(){return!1};function Y(e,t,n,r,a){var c=l.useContext(S).cache,s=h([e].concat((0,i.A)(t))),u=X([s]),d=(U(),function(e){c.opUpdate(s,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var c=[void 0===a?0:a,i[1]||n()];return e?e(c):c}))});l.useMemo((function(){d()}),[s]);var f=c.opGet(s)[1];return W((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){c.opUpdate(s,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],l=void 0===a?0:a,d=i[1];return 0===l-1?(u((function(){!e&&c.opGet(s)||null==r||r(d,!1)})),null):[l-1,d]}))}}),[s]),f}var G={},q="css",K=new Map;var V=0;function Z(e,t){K.set(e,(K.get(e)||0)-1);var n=Array.from(K.keys()),r=n.filter((function(e){return(K.get(e)||0)<=0}));n.length-r.length>V&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(g,'="').concat(e,'"]')).forEach((function(e){var n;e[y]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),K.delete(e)}))}var Q=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,l.useContext)(S),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,h=n.override,v=void 0===h?G:h,b=n.formatToken,A=n.getComputedToken,w=n.cssVar,x=function(e,t){for(var n=L,r=0;r0?he(Ce,--xe):0,Se--,10===ke&&(Se=1,Ae--),ke}function Oe(){return ke=xe2||Re(ke)>3?"":" "}function $e(e,t){for(;--t&&Oe()&&!(ke<48||ke>102||ke>57&&ke<65||ke>70&&ke<97););return Ie(e,Le()+(t<6&&32==Te()&&32==Oe()))}function je(e){for(;Oe();)switch(ke){case e:return xe;case 34:case 39:34!==e&&39!==e&&je(ke);break;case 40:41===e&&je(e);break;case 92:Oe()}return xe}function _e(e,t){for(;Oe()&&e+ke!==57&&(e+ke!==84||47!==Te()););return"/*"+Ie(t,xe-1)+"*"+ue(47===e?e:Oe())}function De(e){for(;!Re(Te());)Oe();return Ie(e,xe)}function Be(e){return Pe(Fe("",null,null,null,[""],e=ze(e),0,[0],e))}function Fe(e,t,n,r,o,i,a,c,s){for(var l=0,u=0,d=a,f=0,p=0,h=0,v=1,g=1,m=1,y=0,b="",A=o,S=i,w=r,x=b;g;)switch(h=y,y=Oe()){case 40:if(108!=h&&58==he(x,d-1)){-1!=pe(x+=fe(Ne(y),"&","&\f"),"&\f",le(l?c[l-1]:0))&&(m=-1);break}case 34:case 39:case 91:x+=Ne(y);break;case 9:case 10:case 13:case 32:x+=He(h);break;case 92:x+=$e(Le()-1,7);continue;case 47:switch(Te()){case 42:case 47:me(Xe(_e(Oe(),Le()),t,n,s),s);break;default:x+="/"}break;case 123*v:c[l++]=ge(x)*m;case 125*v:case 59:case 0:switch(y){case 0:case 125:g=0;case 59+u:-1==m&&(x=fe(x,/\f/g,"")),p>0&&ge(x)-d&&me(p>32?Ue(x+";",r,n,d-1,s):Ue(fe(x," ","")+";",r,n,d-2,s),s);break;case 59:x+=";";default:if(me(w=We(x,t,n,l,u,o,c,b,A=[],S=[],d,i),i),123===y)if(0===u)Fe(x,t,w,w,A,i,d,c,S);else switch(99===f&&110===he(x,3)?100:f){case 100:case 108:case 109:case 115:Fe(e,w,w,r&&me(We(e,w,w,0,0,o,c,b,o,A=[],d,S),S),o,S,d,c,r?A:S);break;default:Fe(x,w,w,w,[""],S,0,c,S)}}l=u=p=0,v=m=1,b=x="",d=a;break;case 58:d=1+ge(x),p=h;default:if(v<1)if(123==y)--v;else if(125==y&&0==v++&&125==Me())continue;switch(x+=ue(y),y*v){case 38:m=u>0?1:(x+="\f",-1);break;case 44:c[l++]=(ge(x)-1)*m,m=1;break;case 64:45===Te()&&(x+=Ne(Oe())),f=Te(),u=d=ge(b=x+=De(Le())),y++;break;case 45:45===h&&2==ge(x)&&(v=0)}}return i}function We(e,t,n,r,o,i,a,c,s,l,u,d){for(var f=o-1,p=0===o?i:[""],h=function(e){return e.length}(p),v=0,g=0,m=0;v0?p[y]+" "+b:fe(b,/&\f/g,p[y])))&&(s[m++]=A);return Ee(e,t,n,0===o?oe:c,s,l,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(ke),ve(e,2,-2),0,r)}function Ue(e,t,n,r,o){return Ee(e,t,n,ie,ve(e,0,r),ve(e,r+1,-1),r,o)}var Ye,Ge="data-ant-cssinjs-cache-path",qe="_FILE_STYLE__";var Ke=!0;function Ve(e){return function(){if(!Ye&&(Ye={},(0,x.A)())){var e=document.createElement("div");e.className=Ge,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ye[r]=i}));var n,r=document.querySelector("style[".concat(Ge,"]"));r&&(Ke=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ye[e]}var Ze="_multi_value_";function Qe(e){return ye(Be(e),be).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},c=r.root,s=r.injectHash,l=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,h=void 0===p?[]:p,v=(n.linters,""),g={};function m(t){var r=t.getName(u);if(!g[r]){var i=e(t.style,n,{root:!1,parentSelectors:l}),a=(0,o.A)(i,1)[0];g[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var y=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return y.forEach((function(t){var r="string"!=typeof t||c?t:{};if("string"==typeof r)v+="".concat(r,"\n");else if(r._keyframe)m(r);else{var d=h.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,w.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,w.A)(e)&&e&&("_skip_check_"in e||Ze in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(m(t),r=t.getName(u)),v+="".concat(n,":").concat(r,";")}var h=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,w.A)(r)&&null!=r&&r[Ze]&&Array.isArray(h)?h.forEach((function(e){E(t,e)})):E(t,h)}else{var y=!1,b=t.trim(),A=!1;(c||s)&&u?b.startsWith("@")?y=!0:b=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!c||u||"&"!==b&&""!==b||(b="",A=!0);var S=e(r,n,{root:A,injectHash:y,parentSelectors:[].concat((0,i.A)(l),[b])}),x=(0,o.A)(S,2),k=x[0],C=x[1];g=(0,a.A)((0,a.A)({},g),C),v+="".concat(b).concat(k)}}))}})),c?d&&(v="@layer ".concat(d.name," {").concat(v,"}"),d.dependencies&&(g["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):v="{".concat(v,"}"),[v,g]};function et(e,t){return c("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,c=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,h=e.order,v=void 0===h?0:h,b=l.useContext(S),A=b.autoClear,w=(b.mock,b.defaultCache),k=b.hashPriority,C=b.container,E=b.ssrInline,M=b.transformers,O=b.linters,T=b.cache,L=b.layer,I=n._tokenKey,R=[I];L&&R.push("layer"),R.push.apply(R,(0,i.A)(c));var z=N;var P=Y(nt,R,(function(){var e=R.join("|");if(Ve(e)){var n=function(e){var t=Ye[e],n=null;if(t&&(0,x.A)())if(Ke)n=qe;else{var r=document.querySelector("style[".concat(m,'="').concat(Ye[e],'"]'));r?n=r.innerHTML:delete Ye[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,I,a,{},p,v]}var s=t(),l=Je(s,{hashId:u,hashPriority:k,layer:L?d:void 0,path:c.join("-"),transformers:M,linters:O}),f=(0,o.A)(l,2),h=f[0],g=f[1],y=Qe(h),b=et(R,y);return[y,I,b,g,p,v]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&N&&(0,s.m6)(n,{mark:m})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(z&&n!==qe){var c={mark:m,prepend:!L&&"queue",attachTo:C,priority:v},l="function"==typeof f?f():f;l&&(c.csp={nonce:l});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,s.BD)(Qe(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},c),{},{prepend:!0}))}));var p=(0,s.BD)(n,r,c);p[y]=T.instanceId,p.setAttribute(g,I),d.forEach((function(e){(0,s.BD)(Qe(i[e]),"_effect-".concat(e),c)}))}})),H=(0,o.A)(P,3),$=H[0],j=H[1],_=H[2];return function(e){var t,n;E&&!z&&w?t=l.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,g,j),(0,r.A)(n,m,_),n),{dangerouslySetInnerHTML:{__html:$}})):t=l.createElement(tt,null);return l.createElement(l.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,c=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,l.useContext)(S),h=p.cache.instanceId,v=p.container,b=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,b]);return Y(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:c,scope:f}),s=(0,o.A)(i,2),l=s[0],u=s[1];return[l,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];N&&(0,s.m6)(t,{mark:m})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,s.BD)(r,i,{mark:m,prepend:"queue",attachTo:v,priority:-999});a[y]=h,a.setAttribute(g,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],c=r[2],s=r[3],l=r[4],u=r[5],d=(n||{}).plain;if(l)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=$(i,a,c,p,d),s&&Object.keys(s).forEach((function(e){if(!t[e]){t[e]=!0;var n=$(Qe(s[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,c,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],c=r[4],s=(n||{}).plain;if(!a)return null;var l=i._tokenKey;return[-999,l,$(a,c,l,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],c=r[3],s=(n||{}).plain;if(!i)return null;return[-999,a,$(i,c,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]}));const ct=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function st(e){return e.notSplit=!0,e}st(["borderTop","borderBottom"]),st(["borderTop"]),st(["borderBottom"]),st(["borderLeft","borderRight"]),st(["borderLeft"]),st(["borderRight"])},1783:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var r=n(8168),o=n(6636),i=n(4467),a=n(45),c=n(6540),s=n(6942),l=n.n(s),u=n(2200);const d=(0,c.createContext)({});var f=n(9379),p=n(2284),h=n(5089);function v(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function g(e){return function(e){return v(e)instanceof ShadowRoot}(e)?v(e):null}var m=n(8210);function y(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function A(e,t,n){return n?c.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):c.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function S(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var x=["icon","className","onClick","style","primaryColor","secondaryColor"],k={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,s,l,u=e.icon,p=e.className,v=e.onClick,b=e.style,w=e.primaryColor,C=e.secondaryColor,E=(0,a.A)(e,x),M=c.useRef(),O=k;if(w&&(O={primaryColor:w,secondaryColor:C||S(w)}),t=M,n=(0,c.useContext)(d),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n alignItems: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,c.useEffect)((function(){var e=g(t.current);(0,h.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:e})}),[]),s=y(u),l="icon should be icon definiton, but got ".concat(u),(0,m.Ay)(s,"[@ant-design/icons] ".concat(l)),!y(u))return null;var T=u;return T&&"function"==typeof T.icon&&(T=(0,f.A)((0,f.A)({},T),{},{icon:T.icon(O.primaryColor,O.secondaryColor)})),A(T.icon,"svg-".concat(T.name),(0,f.A)((0,f.A)({className:p,onClick:v,style:b,"data-icon":T.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},k)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;k.primaryColor=t,k.secondaryColor=n||S(t),k.calculated=!!n};const E=C;function M(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return E.setTwoToneColors({primaryColor:r,secondaryColor:i})}var O=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];M(u.z1.primary);var T=c.forwardRef((function(e,t){var n=e.className,s=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,h=e.onClick,v=e.twoToneColor,g=(0,a.A)(e,O),m=c.useContext(d),y=m.prefixCls,b=void 0===y?"anticon":y,A=m.rootClassName,S=l()(A,b,(0,i.A)((0,i.A)({},"".concat(b,"-").concat(s.name),!!s.name),"".concat(b,"-spin"),!!u||"loading"===s.name),n),x=p;void 0===x&&h&&(x=-1);var k=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,C=w(v),M=(0,o.A)(C,2),T=M[0],L=M[1];return c.createElement("span",(0,r.A)({role:"img","aria-label":s.name},g,{ref:t,tabIndex:x,onClick:h,className:S}),c.createElement(E,{icon:s,primaryColor:T,secondaryColor:L,style:k}))}));T.displayName="AntdIcon",T.getTwoToneColor=function(){var e=E.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},T.setTwoToneColor=M;const L=T},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(1783),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(1783),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>l,Ob:()=>u,YL:()=>c,_:()=>o,g8:()=>h,n6:()=>p,oS:()=>v,wE:()=>s});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=0,s=(o+i)/2;if(o===i)c=0,a=0;else{var l=o-i;switch(c=s>.5?l/(2-o-i):l/(o+i),o){case e:a=(t-n)/l+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function c(e,t,n){var o,i,c;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,c=n,o=n;else{var s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;o=a(l,s,e+1/3),i=a(l,s,e),c=a(l,s,e-1/3)}return{r:255*o,g:255*i,b:255*c}}function s(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=o,s=o-i,l=0===o?0:s/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/s+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,c=null,s=null,l=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),l=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),c=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,c),l=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),s=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,s),l=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:l,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var c="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),s="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),l="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),u={CSS_UNIT:new RegExp(c),rgb:new RegExp("rgb"+s),rgba:new RegExp("rgba"+l),hsl:new RegExp("hsl"+s),hsla:new RegExp("hsla"+l),hsv:new RegExp("hsv"+s),hsva:new RegExp("hsva"+l),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>c});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),c=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],c=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+c)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function c(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>c})},6943:(e,t,n)=>{"use strict";n.d(t,{A:()=>_e});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),c=n(2901),s=n(6822),l=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),h=n(45);const v={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function g(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,c=o.noLeading,s=void 0!==c&&c,l=o.debounceMode,u=void 0===l?void 0:l,d=!1,f=0;function p(){r&&clearTimeout(r)}function h(){for(var n=arguments.length,o=new Array(n),i=0;ie?s?(f=Date.now(),a||(r=setTimeout(u?v:h,e))):h():!0!==a&&(r=setTimeout(u?v:h,void 0===u?e-l:e)))}return h.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},h}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var m=n(6942),y=n.n(m);const b={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var S=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},w=function(e){for(var t=[],n=x(e),r=k(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},O=function(e){return e&&e.offsetHeight||0},T=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},L=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},I=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},R=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},P=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},N=function(e){var t,n;(P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",c=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:c})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},H=function(e){P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=N(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},$=function(e){if(e.unslick)return 0;P(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,c=e.slideCount,s=e.slidesToShow,l=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,h=e.fade,v=e.vertical;if(h||1===e.slideCount)return 0;var g=0;if(i?(g=-j(e),c%l!=0&&r+l>c&&(g=-(r>c?s-(r-c):c%l)),a&&(g+=parseInt(s/2))):(c%l!=0&&r+l>c&&(g=s-c%l),a&&(g=parseInt(s/2))),t=v?r*p*-1+g*p:r*u*-1+g*u,!0===f){var m,y=o&&o.node;if(m=r+j(e),t=(n=y&&y.childNodes[m])?-1*n.offsetLeft:0,!0===a){m=i?r+j(e):r,n=y&&y.children[m],t=0;for(var b=0;be.currentSlide?e.targetSlide>e.currentSlide+F(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},W=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},U=Object.keys(b);var Y=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},G=function(e,t){return e.key+"-"+t},q=function(e){var t,n=[],o=[],a=[],c=r.Children.count(e.children),s=x(e),l=k(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var h=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),v=f.props.className||"",g=Y((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+G(f,d),"data-index":d,className:y()(g,v),tabIndex:"-1","aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&c>1&&!1===e.fade&&!e.unslick){var m=c-d;m<=j(e)&&((t=-m)>=s&&(f=u),g=Y((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+G(f,t),"data-index":t,tabIndex:"-1",className:y()(g,v),"aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=c+d)=S&&d<=m:d===S}),x={message:"dots",index:v,slidesToScroll:s,currentSlide:d},k=this.clickHandler.bind(this,x);h=h.concat(r.createElement("li",{key:v,className:w},r.cloneElement(this.props.customPaging(v),{onClick:k})))}return r.cloneElement(this.props.appendDots(h),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Z(e,t,n){return t=(0,u.A)(t),(0,s.A)(e,(0,l.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Q=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});L(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){te&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ie?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){te&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;oe.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ce=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),be="undefined"!=typeof WeakMap?new WeakMap:new ee,Ae=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=ae.getInstance(),r=new ye(t,n,this);be.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){Ae.prototype[e]=function(){var t;return(t=be.get(this))[e].apply(t,arguments)}}));const Se=void 0!==ne.ResizeObserver?ne.ResizeObserver:Ae;var we=["animating"];var xe=function(e){function t(e){var n,c,d,p;(0,a.A)(this,t),c=this,d=t,p=[e],d=(0,u.A)(d),n=(0,s.A)(c,(0,l.A)()?Reflect.construct(d,p||[],(0,u.A)(c).constructor):d.apply(c,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=O(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=w((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new Se((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=w((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=g(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),c=e.trackRef&&e.trackRef.node,s=Math.ceil(M(c));if(e.vertical)t=a;else{var l=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(l*=a/100),t=Math.ceil((a-l)/e.slidesToShow)}var u=o&&O(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],h=w((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),v={slideCount:n,slideWidth:t,listWidth:a,trackWidth:s,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(h)};return null===e.autoplaying&&e.autoplay&&(v.autoplaying="playing"),v}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var c=$(e);e=(0,i.A)((0,i.A)({},e),{},{left:c});var s=N(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=s),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=j((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),c=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var s=0;s=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-j(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,c=r.onLazyLoad,s=r.speed,l=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,c=e.slideCount,s=e.lazyLoad,l=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,h=e.lazyLoadedList;if(t&&n)return{};var v,g,m,y=a,b={},S={},x=o?a:A(a,0,c-1);if(r){if(!o&&(a<0||a>=c))return{};a<0?y=a+c:a>=c&&(y=a-c),s&&h.indexOf(y)<0&&(h=h.concat(y)),b={animating:!0,currentSlide:y,lazyLoadedList:h,targetSlide:y},S={animating:!1,targetSlide:y}}else v=y,y<0?(v=y+c,o?c%d!=0&&(v=c-c%d):v=0):!L(e)&&y>l?y=v=l:u&&y>=c?(y=o?c:c-1,v=o?0:c-1):y>=c&&(v=y-c,o?c%d!=0&&(v=0):v=c-f),!o&&y+f>=c&&(v=c-f),g=$((0,i.A)((0,i.A)({},e),{},{slideIndex:y})),m=$((0,i.A)((0,i.A)({},e),{},{slideIndex:v})),o||(g===m&&(y=v),g=m),s&&(h=h.concat(w((0,i.A)((0,i.A)({},e),{},{currentSlide:y})))),p?(b={animating:!0,currentSlide:v,trackStyle:H((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:h,targetSlide:x},S={animating:!1,currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),swipeLeft:null,targetSlide:x}):b={currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),lazyLoadedList:h,targetSlide:x};return{state:b,nextState:S}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var v=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));c&&v.length>0&&c(v),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),l&&l(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,h.A)(p,we);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),l&&l(f.currentSlide),delete n.animationEndCallback}))}),s))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,c=e.slidesToScroll,s=e.slidesToShow,l=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=l%c!=0?0:(l-u)%c,"previous"===t.message)a=u-(o=0===n?c:s-n),f&&!p&&(a=-1==(r=u-o)?l-1:r),p||(a=d-c);else if("next"===t.message)a=u+(o=0===n?c:n),f&&!p&&(a=(u+c)%l+n),p||(a=d+c);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var h=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===h?a-=l:a10)return{scrolling:!0};c&&(y.swipeLength=E);var M=(s?-1:1)*(y.curX>y.startX?1:-1);c&&(M=y.curY>y.startY?1:-1);var O=Math.ceil(v/g),I=T(t.touchObject,c),R=y.swipeLength;return m||(0===l&&("right"===I||"down"===I)||l+1>=O&&("left"===I||"up"===I)||!L(t)&&("left"===I||"up"===I))&&(R=y.swipeLength*u,!1===d&&f&&(f(I),k.edgeDragged=!0)),!p&&b&&(b(I),k.swiped=!0),x=o?C+R*(A/w)*M:s?C-R*M:C+R*M,c&&(x=C+R*M),k=(0,i.A)((0,i.A)({},k),{},{touchObject:y,swipeLeft:x,trackStyle:N((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(y.curX-y.startX)<.8*Math.abs(y.curY-y.startY)||y.swipeLength>10&&(k.swiping=!0,S(e)),k}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,c=t.touchThreshold,s=t.verticalSwiping,l=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,h=t.currentSlide,v=t.infinite;if(!n)return r&&S(e),{};var g=s?l/c:a/c,m=T(o,s),y={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return y;if(!o.swipeLength)return y;if(o.swipeLength>g){var b,A;S(e),f&&f(m);var w=v?h:p;switch(m){case"left":case"up":A=w+z(t),b=u?R(t,A):A,y.currentDirection=0;break;case"right":case"down":A=w-z(t),b=u?R(t,A):A,y.currentDirection=1;break;default:b=w}y.triggerSlideHandler=b}else{var x=$(t);y.trackStyle=H((0,i.A)((0,i.A)({},t),{},{left:x}))}return y}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!L((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,c=y()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),s=(0,i.A)((0,i.A)({},n.props),n.state),l=I(s,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(l=(0,i.A)((0,i.A)({},l),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=I(s,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(V,d)}var p=I(s,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Q,p),a=r.createElement(J,p));var h=null;n.props.vertical&&(h={height:n.state.listHeight});var v=null;!1===n.props.vertical?!0===n.props.centerMode&&(v={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(v={padding:n.props.centerPadding+" 0px"});var g=(0,i.A)((0,i.A)({},h),v),m=n.props.touchMove,b={className:"slick-list",style:g,onClick:n.clickHandler,onMouseDown:m?n.swipeStart:null,onMouseMove:n.state.dragging&&m?n.swipeMove:null,onMouseUp:m?n.swipeEnd:null,onMouseLeave:n.state.dragging&&m?n.swipeEnd:null,onTouchStart:m?n.swipeStart:null,onTouchMove:n.state.dragging&&m?n.swipeMove:null,onTouchEnd:m?n.touchEnd:null,onTouchCancel:n.state.dragging&&m?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:c,dir:"ltr",style:n.props.style};return n.props.unslick&&(b={className:"slick-list"},A={className:c,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},b),r.createElement(K,(0,o.A)({ref:n.trackRefHandler},l),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},v),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var m=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),m),n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?Ce()({minWidth:0,maxWidth:n}):Ce()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=Ce()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},b),this.props),t[0].settings):(0,i.A)((0,i.A)({},b),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var c=[],s=null,l=0;l=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*l+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*l+d},f))}e.variableWidth?c.push(r.createElement("div",{key:l,style:{width:s}},u)):c.push(r.createElement("div",{key:l},u))}if("unslick"===e){var h="regular slider "+(this.props.className||"");return r.createElement("div",{className:h},a)}return c.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(xe,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return U.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),c)}}])}(r.Component);const Me=Ee;var Oe=n(2279),Te=n(1466),Le=n(5905),Ie=n(665),Re=n(336);const ze=e=>{const{componentCls:t,antCls:n,carouselArrowSize:r,carouselDotOffset:o,marginXXS:i}=e,a=e.calc(r).mul(-1.25).equal(),c=i;return{[t]:Object.assign(Object.assign({},(0,Le.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"},".slick-arrow.slick-hidden":{display:"none"},".slick-prev, .slick-next":{position:"absolute",top:"50%",display:"block",width:r,height:r,marginTop:e.calc(r).mul(-1).div(2).equal(),padding:0,color:"transparent",fontSize:0,lineHeight:0,background:"transparent",border:0,outline:"none",cursor:"pointer","&:hover, &:focus":{color:"transparent",background:"transparent",outline:"none","&::before":{opacity:1}},"&.slick-disabled::before":{opacity:.25}},".slick-prev":{insetInlineStart:a,"&::before":{content:'"\u2190"'}},".slick-next":{insetInlineEnd:a,"&::before":{content:'"\u2192"'}},".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:o},"&-top":{top:o,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:e.dotWidth,height:e.dotHeight,marginInline:c,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${e.motionDurationSlow}`,button:{position:"relative",display:"block",width:"100%",height:e.dotHeight,padding:0,color:"transparent",fontSize:0,background:e.colorBgContainer,border:0,borderRadius:e.dotHeight,outline:"none",cursor:"pointer",opacity:.3,transition:`all ${e.motionDurationSlow}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(c).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:e.colorBgContainer,opacity:1},"&: hover, &:focus":{opacity:1}}}}})}},Pe=e=>{const{componentCls:t,carouselDotOffset:n,marginXXS:r}=e,o={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},o),{margin:`${(0,Te.zA)(r)} 0`,verticalAlign:"baseline",button:o,"&.slick-active":Object.assign(Object.assign({},o),{button:o})})}}}},Ne=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},He=(0,Ie.OF)("Carousel",(e=>{const{controlHeightLG:t,controlHeightSM:n}=e,r=(0,Re.h1)(e,{carouselArrowSize:e.calc(t).div(2).equal(),carouselDotOffset:e.calc(n).div(2).equal()});return[ze(r),Pe(r),Ne(r)]}),(()=>({dotWidth:16,dotHeight:3,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var $e=function(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{const{dots:n=!0,arrows:o=!1,draggable:i=!1,waitForAnimate:a=!1,dotPosition:c="bottom",vertical:s="left"===c||"right"===c,rootClassName:l,className:u,style:d,id:f}=e,p=$e(e,["dots","arrows","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:h,direction:v,carousel:g}=r.useContext(Oe.QO),m=r.useRef(),b=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];m.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:b,autoPlay:m.current.innerSlider.autoPlay,innerSlider:m.current.innerSlider,prev:m.current.slickPrev,next:m.current.slickNext})),[m.current]);const A=r.useRef(r.Children.count(e.children));r.useEffect((()=>{A.current!==r.Children.count(e.children)&&(b(e.initialSlide||0,!1),A.current=r.Children.count(e.children))}),[e.children]);const S=Object.assign({vertical:s,className:y()(u,null==g?void 0:g.className),style:Object.assign(Object.assign({},null==g?void 0:g.style),d)},p);"fade"===S.effect&&(S.fade=!0);const w=h("carousel",S.prefixCls),x="slick-dots",k=!!n,C=y()(x,`${x}-${c}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[E,M,O]=He(w),T=y()(w,{[`${w}-rtl`]:"rtl"===v,[`${w}-vertical`]:S.vertical},M,O,l);return E(r.createElement("div",{className:T,id:f},r.createElement(Me,Object.assign({ref:m},S,{dots:k,dotsClass:C,arrows:o,draggable:i,verticalSwiping:s,waitForAnimate:a}))))}));const _e=je},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>r});const r=n(6540).createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:"anticon"}),{Consumer:o}=r},4184:(e,t,n)=>{"use strict";n.d(t,{A:()=>nr});var r=n(6540),o=n.t(r,2),i=n(8168);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var c=n(1783),s=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:a}))};const l=r.forwardRef(s);var u=n(6942),d=n.n(u),f=n(9379),p=n(4467),h=n(6636),v=n(2284),g=n(45);function m(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var y=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],A=r.createContext(null),S=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,h.A)(i,2),c=a[0],s=a[1],l=(0,r.useRef)(!1),u="error"===c;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&s("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!l.current?s("loading"):u&&s("normal")}),[t]);var d=function(){s("normal")};return[function(e){l.current=!1,"loading"===c&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(l.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},c]}var x=n(961),k=n(998),C=n(8210),E=n(8719);const M=r.createContext(null);var O=n(4241),T=n(981),L=[];var I=n(5089);function R(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var c=getComputedStyle(e,"::-webkit-scrollbar"),s=parseInt(c.width,10),l=parseInt(c.height,10);try{var u=s?"width: ".concat(c.width,";"):"",d=l?"height: ".concat(c.height,";"):"";(0,I.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(h){console.error(h),r=s,o=l}}document.body.appendChild(n);var f=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,p=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,I.m6)(t),{width:f,height:p}}var z="rc-util-locker-".concat(Date.now()),P=0;function N(e){var t=!!e,n=r.useState((function(){return P+=1,"".concat(z,"_").concat(P)})),o=(0,h.A)(n,1)[0];(0,T.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?R(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,I.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),o)}else(0,I.m6)(o);var r;return function(){(0,I.m6)(o)}}),[t,o])}var H=!1;var $=function(e){return!1!==e&&((0,k.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)},j=r.forwardRef((function(e,t){var n=e.open,o=e.autoLock,i=e.getContainer,a=(e.debug,e.autoDestroy),c=void 0===a||a,s=e.children,l=r.useState(n),u=(0,h.A)(l,2),d=u[0],f=u[1],p=d||n;r.useEffect((function(){(c||n)&&f(n)}),[n,c]);var v=r.useState((function(){return $(i)})),g=(0,h.A)(v,2),m=g[0],y=g[1];r.useEffect((function(){var e=$(i);y(null!=e?e:null)}));var b=function(e,t){var n=r.useState((function(){return(0,k.A)()?document.createElement("div"):null})),o=(0,h.A)(n,1)[0],i=r.useRef(!1),a=r.useContext(M),c=r.useState(L),s=(0,h.A)(c,2),l=s[0],u=s[1],d=a||(i.current?void 0:function(e){u((function(t){return[e].concat((0,O.A)(t))}))});function f(){o.parentElement||document.body.appendChild(o),i.current=!0}function p(){var e;null===(e=o.parentElement)||void 0===e||e.removeChild(o),i.current=!1}return(0,T.A)((function(){return e?a?a(f):f():p(),p}),[e]),(0,T.A)((function(){l.length&&(l.forEach((function(e){return e()})),u(L))}),[l]),[o,d]}(p&&!m),A=(0,h.A)(b,2),S=A[0],w=A[1],C=null!=m?m:S;N(o&&n&&(0,k.A)()&&(C===S||C===document.body));var I=null;s&&(0,E.f3)(s)&&t&&(I=s.ref);var R=(0,E.xK)(I,t);if(!p||!(0,k.A)()||void 0===m)return null;var z,P=!1===C||("boolean"==typeof z&&(H=z),H),j=s;return t&&(j=r.cloneElement(s,{ref:R})),r.createElement(M.Provider,{value:w},P?j:(0,x.createPortal)(j,C))}));const _=j;var D=r.createContext({}),B=n(4808);var F=0;var W=(0,f.A)({},o).useId;const X=W?function(e){var t=W();return e||t}:function(e){var t=r.useState("ssr-id"),n=(0,h.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){var e=F;F+=1,i("rc_unique_".concat(e))}),[]),e||o};var U={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=U.F1&&t<=U.F12)return!1;switch(t){case U.ALT:case U.CAPS_LOCK:case U.CONTEXT_MENU:case U.CTRL:case U.DOWN:case U.END:case U.ESC:case U.HOME:case U.INSERT:case U.LEFT:case U.MAC_FF_META:case U.META:case U.NUMLOCK:case U.NUM_CENTER:case U.PAGE_DOWN:case U.PAGE_UP:case U.PAUSE:case U.PRINT_SCREEN:case U.RIGHT:case U.SHIFT:case U.UP:case U.WIN_KEY:case U.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=U.ZERO&&e<=U.NINE)return!0;if(e>=U.NUM_ZERO&&e<=U.NUM_MULTIPLY)return!0;if(e>=U.A&&e<=U.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case U.SPACE:case U.QUESTION_MARK:case U.NUM_PLUS:case U.NUM_MINUS:case U.NUM_PERIOD:case U.NUM_DIVISION:case U.SEMICOLON:case U.DASH:case U.EQUALS:case U.COMMA:case U.PERIOD:case U.SLASH:case U.APOSTROPHE:case U.SINGLE_QUOTE:case U.OPEN_SQUARE_BRACKET:case U.BACKSLASH:case U.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const Y=U;var G="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),q="aria-",K="data-";function V(e,t){return 0===e.indexOf(t)}function Z(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,f.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||V(n,q))||t.data&&V(n,K)||t.attr&&G.includes(n))&&(r[n]=e[n])})),r}function Q(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function J(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}function ee(e){return function(e){return e instanceof HTMLElement||e instanceof SVGElement}(e)?e:e instanceof r.Component?x.findDOMNode(e):null}var te=r.createContext({});var ne=n(3029),re=n(2901),oe=n(5501),ie=n(3954),ae=n(2176),ce=n(6822);function se(e){var t=(0,ae.A)();return function(){var n,r=(0,ie.A)(e);if(t){var o=(0,ie.A)(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return(0,ce.A)(this,n)}}const le=function(e){(0,oe.A)(n,e);var t=se(n);function n(){return(0,ne.A)(this,n),t.apply(this,arguments)}return(0,re.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);var ue=n(1233),de="none",fe="appear",pe="enter",he="leave",ve="none",ge="prepare",me="start",ye="active",be="end",Ae="prepared";function Se(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var we,xe,ke,Ce=(we=(0,k.A)(),xe="undefined"!=typeof window?window:{},ke={animationend:Se("Animation","AnimationEnd"),transitionend:Se("Transition","TransitionEnd")},we&&("AnimationEvent"in xe||delete ke.animationend.animation,"TransitionEvent"in xe||delete ke.transitionend.transition),ke),Ee={};if((0,k.A)()){var Me=document.createElement("div");Ee=Me.style}var Oe={};function Te(e){if(Oe[e])return Oe[e];var t=Ce[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:1),t};We.cancel=function(e){var t=Be.get(e);return Fe(e),_e(t)};const Xe=We;var Ue=[ge,me,ye,be],Ye=[ge,Ae],Ge=!1,qe=!0;function Ke(e){return e===ye||e===be}const Ve=function(e,t,n){var o=(0,ue.A)(ve),i=(0,h.A)(o,2),a=i[0],c=i[1],s=function(){var e=r.useRef(null);function t(){Xe.cancel(e.current)}return r.useEffect((function(){return function(){t()}}),[]),[function n(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;t();var i=Xe((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),l=(0,h.A)(s,2),u=l[0],d=l[1];var f=t?Ye:Ue;return $e((function(){if(a!==ve&&a!==be){var e=f.indexOf(a),t=f[e+1],r=n(a);r===Ge?c(t,!0):t&&u((function(e){function n(){e.isCanceled()||c(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),r.useEffect((function(){return function(){d()}}),[]),[function(){c(ge,!0)},a]};const Ze=function(e){var t=e;"object"===(0,v.A)(e)&&(t=e.transitionSupport);var n=r.forwardRef((function(e,n){var o=e.visible,i=void 0===o||o,a=e.removeOnLeave,c=void 0===a||a,s=e.forceRender,l=e.children,u=e.motionName,v=e.leavedClassName,g=e.eventProps,m=function(e,n){return!(!e.motionName||!t||!1===n)}(e,r.useContext(te).motion),y=(0,r.useRef)(),b=(0,r.useRef)();var A=function(e,t,n,o){var i=o.motionEnter,a=void 0===i||i,c=o.motionAppear,s=void 0===c||c,l=o.motionLeave,u=void 0===l||l,d=o.motionDeadline,v=o.motionLeaveImmediately,g=o.onAppearPrepare,m=o.onEnterPrepare,y=o.onLeavePrepare,b=o.onAppearStart,A=o.onEnterStart,S=o.onLeaveStart,w=o.onAppearActive,x=o.onEnterActive,k=o.onLeaveActive,C=o.onAppearEnd,E=o.onEnterEnd,M=o.onLeaveEnd,O=o.onVisibleChanged,T=(0,ue.A)(),L=(0,h.A)(T,2),I=L[0],R=L[1],z=(0,ue.A)(de),P=(0,h.A)(z,2),N=P[0],H=P[1],$=(0,ue.A)(null),j=(0,h.A)($,2),_=j[0],D=j[1],B=(0,r.useRef)(!1),F=(0,r.useRef)(null);function W(){return n()}var X=(0,r.useRef)(!1);function U(){H(de,!0),D(null,!0)}function Y(e){var t=W();if(!e||e.deadline||e.target===t){var n,r=X.current;N===fe&&r?n=null==C?void 0:C(t,e):N===pe&&r?n=null==E?void 0:E(t,e):N===he&&r&&(n=null==M?void 0:M(t,e)),N!==de&&r&&!1!==n&&U()}}var G=He(Y),q=(0,h.A)(G,1)[0],K=function(e){var t,n,r;switch(e){case fe:return t={},(0,p.A)(t,ge,g),(0,p.A)(t,me,b),(0,p.A)(t,ye,w),t;case pe:return n={},(0,p.A)(n,ge,m),(0,p.A)(n,me,A),(0,p.A)(n,ye,x),n;case he:return r={},(0,p.A)(r,ge,y),(0,p.A)(r,me,S),(0,p.A)(r,ye,k),r;default:return{}}},V=r.useMemo((function(){return K(N)}),[N]),Z=Ve(N,!e,(function(e){if(e===ge){var t=V[ge];return t?t(W()):Ge}var n;return ee in V&&D((null===(n=V[ee])||void 0===n?void 0:n.call(V,W(),null))||null),ee===ye&&(q(W()),d>0&&(clearTimeout(F.current),F.current=setTimeout((function(){Y({deadline:!0})}),d))),ee===Ae&&U(),qe})),Q=(0,h.A)(Z,2),J=Q[0],ee=Q[1],te=Ke(ee);X.current=te,$e((function(){R(t);var n,r=B.current;B.current=!0,!r&&t&&s&&(n=fe),r&&t&&a&&(n=pe),(r&&!t&&u||!r&&v&&!t&&u)&&(n=he);var o=K(n);n&&(e||o[ge])?(H(n),J()):H(de)}),[t]),(0,r.useEffect)((function(){(N===fe&&!s||N===pe&&!a||N===he&&!u)&&H(de)}),[s,a,u]),(0,r.useEffect)((function(){return function(){B.current=!1,clearTimeout(F.current)}}),[]);var ne=r.useRef(!1);(0,r.useEffect)((function(){I&&(ne.current=!0),void 0!==I&&N===de&&((ne.current||I)&&(null==O||O(I)),ne.current=!0)}),[I,N]);var re=_;return V[ge]&&ee===me&&(re=(0,f.A)({transition:"none"},re)),[N,ee,re,null!=I?I:t]}(m,i,(function(){try{return y.current instanceof HTMLElement?y.current:ee(b.current)}catch(e){return null}}),e),S=(0,h.A)(A,4),w=S[0],x=S[1],k=S[2],C=S[3],M=r.useRef(C);C&&(M.current=!0);var O,T=r.useCallback((function(e){y.current=e,(0,E.Xf)(n,e)}),[n]),L=(0,f.A)((0,f.A)({},g),{},{visible:i});if(l)if(w===de)O=C?l((0,f.A)({},L),T):!c&&M.current&&v?l((0,f.A)((0,f.A)({},L),{},{className:v}),T):s||!c&&!v?l((0,f.A)((0,f.A)({},L),{},{style:{display:"none"}}),T):null;else{var I,R;x===ge?R="prepare":Ke(x)?R="active":x===me&&(R="start");var z=Ne(u,"".concat(w,"-").concat(R));O=l((0,f.A)((0,f.A)({},L),{},{className:d()(Ne(u,w),(I={},(0,p.A)(I,z,z&&R),(0,p.A)(I,u,"string"==typeof u),I)),style:k}),T)}else O=null;r.isValidElement(O)&&(0,E.f3)(O)&&(O.ref||(O=r.cloneElement(O,{ref:T})));return r.createElement(le,{ref:b},O)}));return n.displayName="CSSMotion",n}(Re);var Qe=n(9417),Je="add",et="keep",tt="remove",nt="removed";function rt(e){var t;return t=e&&"object"===(0,v.A)(e)&&"key"in e?e:{key:e},(0,f.A)((0,f.A)({},t),{},{key:String(t.key)})}function ot(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(rt)}var it=["component","children","onVisibleChanged","onAllRemoved"],at=["status"],ct=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ze,n=function(e){(0,oe.A)(o,e);var n=se(o);function o(){var e;(0,ne.A)(this,o);for(var t=arguments.length,r=new Array(t),i=0;i0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,o=t.length,i=ot(e),a=ot(t);i.forEach((function(e){for(var t=!1,i=r;i1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==tt}))).forEach((function(t){t.key===e&&(t.status=et)}))})),n}(r,o);return{keyEntities:i.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==nt||e.status!==tt}))}}}]),o}(r.Component);(0,p.A)(n,"defaultProps",{component:"div"})}(Re);const st=Ze,lt=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var ut={width:0,height:0,overflow:"hidden",outline:"none"},dt={outline:"none"},ft=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,c=e.title,s=e.ariaId,l=e.footer,u=e.closable,p=e.closeIcon,h=e.onClose,g=e.children,m=e.bodyStyle,y=e.bodyProps,b=e.modalRender,A=e.onMouseDown,S=e.onMouseUp,w=e.holderRef,x=e.visible,k=e.forceRender,C=e.width,M=e.height,O=e.classNames,T=e.styles,L=r.useContext(D).panel,I=(0,E.xK)(w,L),R=(0,r.useRef)(),z=(0,r.useRef)(),P=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=P.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===z.current?R.current.focus():e||t!==R.current||z.current.focus()}}}));var N,H,$={};void 0!==C&&($.width=C),void 0!==M&&($.height=M),l&&(N=r.createElement("div",{className:d()("".concat(n,"-footer"),null==O?void 0:O.footer),style:(0,f.A)({},null==T?void 0:T.footer)},l)),c&&(H=r.createElement("div",{className:d()("".concat(n,"-header"),null==O?void 0:O.header),style:(0,f.A)({},null==T?void 0:T.header)},r.createElement("div",{className:"".concat(n,"-title"),id:s},c)));var j,_=(0,r.useMemo)((function(){return"object"===(0,v.A)(u)&&null!==u?u:u?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[u,p]),B=Z(_,!0);u&&(j=r.createElement("button",(0,i.A)({type:"button",onClick:h,"aria-label":"Close"},B,{className:"".concat(n,"-close")}),_.closeIcon));var F=r.createElement("div",{className:d()("".concat(n,"-content"),null==O?void 0:O.content),style:null==T?void 0:T.content},j,H,r.createElement("div",(0,i.A)({className:d()("".concat(n,"-body"),null==O?void 0:O.body),style:(0,f.A)((0,f.A)({},m),null==T?void 0:T.body)},y),g),N);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":c?s:null,"aria-modal":"true",ref:I,style:(0,f.A)((0,f.A)({},a),$),className:d()(n,o),onMouseDown:A,onMouseUp:S},r.createElement("div",{tabIndex:0,ref:R,style:ut,"aria-hidden":"true"}),r.createElement("div",{ref:P,tabIndex:-1,style:dt},r.createElement(lt,{shouldUpdate:x||k},b?b(F):F)),r.createElement("div",{tabIndex:0,ref:z,style:ut,"aria-hidden":"true"}))}));const pt=ft;var ht=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.title,a=e.style,c=e.className,s=e.visible,l=e.forceRender,u=e.destroyOnClose,p=e.motionName,v=e.ariaId,g=e.onVisibleChanged,m=e.mousePosition,y=(0,r.useRef)(),b=r.useState(),A=(0,h.A)(b,2),S=A[0],w=A[1],x={};function k(){var e,t,n,r,o,i=(e=y.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=J(o),n.top+=J(o,!0),n);w(m?"".concat(m.x-i.left,"px ").concat(m.y-i.top,"px"):"")}return S&&(x.transformOrigin=S),r.createElement(st,{visible:s,onVisibleChanged:g,onAppearPrepare:k,onEnterPrepare:k,forceRender:l,motionName:p,removeOnLeave:u,ref:y},(function(s,l){var u=s.className,p=s.style;return r.createElement(pt,(0,i.A)({},e,{ref:t,title:o,ariaId:v,prefixCls:n,holderRef:l,style:(0,f.A)((0,f.A)((0,f.A)({},p),a),x),className:d()(c,u)}))}))}));ht.displayName="Content";const vt=ht;function gt(e){var t=e.prefixCls,n=e.style,o=e.visible,a=e.maskProps,c=e.motionName,s=e.className;return r.createElement(st,{key:"mask",visible:o,motionName:c,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,o){var c=e.className,l=e.style;return r.createElement("div",(0,i.A)({ref:o,style:(0,f.A)((0,f.A)({},l),n),className:d()("".concat(t,"-mask"),c,s)},a))}))}function mt(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,o=e.zIndex,a=e.visible,c=void 0!==a&&a,s=e.keyboard,l=void 0===s||s,u=e.focusTriggerAfterClose,p=void 0===u||u,v=e.wrapStyle,g=e.wrapClassName,m=e.wrapProps,y=e.onClose,b=e.afterOpenChange,A=e.afterClose,S=e.transitionName,w=e.animation,x=e.closable,k=void 0===x||x,C=e.mask,E=void 0===C||C,M=e.maskTransitionName,O=e.maskAnimation,T=e.maskClosable,L=void 0===T||T,I=e.maskStyle,R=e.maskProps,z=e.rootClassName,P=e.classNames,N=e.styles;var H=(0,r.useRef)(),$=(0,r.useRef)(),j=(0,r.useRef)(),_=r.useState(c),D=(0,h.A)(_,2),F=D[0],W=D[1],U=X();function G(e){null==y||y(e)}var q=(0,r.useRef)(!1),K=(0,r.useRef)(),V=null;return L&&(V=function(e){q.current?q.current=!1:$.current===e.target&&G(e)}),(0,r.useEffect)((function(){c&&(W(!0),(0,B.A)($.current,document.activeElement)||(H.current=document.activeElement))}),[c]),(0,r.useEffect)((function(){return function(){clearTimeout(K.current)}}),[]),r.createElement("div",(0,i.A)({className:d()("".concat(n,"-root"),z)},Z(e,{data:!0})),r.createElement(gt,{prefixCls:n,visible:E&&c,motionName:Q(n,M,O),style:(0,f.A)((0,f.A)({zIndex:o},I),null==N?void 0:N.mask),maskProps:R,className:null==P?void 0:P.mask}),r.createElement("div",(0,i.A)({tabIndex:-1,onKeyDown:function(e){if(l&&e.keyCode===Y.ESC)return e.stopPropagation(),void G(e);c&&e.keyCode===Y.TAB&&j.current.changeActive(!e.shiftKey)},className:d()("".concat(n,"-wrap"),g,null==P?void 0:P.wrapper),ref:$,onClick:V,style:(0,f.A)((0,f.A)((0,f.A)({zIndex:o},v),null==N?void 0:N.wrapper),{},{display:F?null:"none"})},m),r.createElement(vt,(0,i.A)({},e,{onMouseDown:function(){clearTimeout(K.current),q.current=!0},onMouseUp:function(){K.current=setTimeout((function(){q.current=!1}))},ref:j,closable:k,ariaId:U,prefixCls:n,visible:c&&F,onClose:G,onVisibleChanged:function(e){if(e)(0,B.A)($.current,document.activeElement)||null===(t=j.current)||void 0===t||t.focus();else{if(W(!1),E&&H.current&&p){try{H.current.focus({preventScroll:!0})}catch(n){}H.current=null}F&&(null==A||A())}var t;null==b||b(e)},motionName:Q(n,S,w)}))))}var yt=function(e){var t=e.visible,n=e.getContainer,o=e.forceRender,a=e.destroyOnClose,c=void 0!==a&&a,s=e.afterClose,l=e.panelRef,u=r.useState(t),d=(0,h.A)(u,2),f=d[0],p=d[1],v=r.useMemo((function(){return{panel:l}}),[l]);return r.useEffect((function(){t&&p(!0)}),[t]),o||!c||f?r.createElement(D.Provider,{value:v},r.createElement(_,{open:t||o||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(mt,(0,i.A)({},e,{destroyOnClose:c,afterClose:function(){null==s||s(),p(!1)}})))):null};yt.displayName="Dialog";const bt=yt;function At(e,t,n,r){var o=x.unstable_batchedUpdates?function(e){x.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var St=n(3210),wt={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function xt(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,p.A)({},e,i);if(t<0&&or)return(0,p.A)({},e,t<0?i:-i);return{}}function kt(e,t,n,r){var o=m(),i=o.width,a=o.height,c=null;return e<=i&&t<=a?c={x:0,y:0}:(e>i||t>a)&&(c=(0,f.A)((0,f.A)({},xt("x",n,e,i)),xt("y",r,t,a))),c}function Ct(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function Et(e,t,n,o,i,a,c){var s=i.rotate,l=i.scale,u=i.x,d=i.y,p=(0,r.useState)(!1),v=(0,h.A)(p,2),g=v[0],m=v[1],y=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),b=function(e){y.current=(0,f.A)((0,f.A)({},y.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=At(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:g,onTouchStart:function(e){if(t){e.stopPropagation(),m(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?b({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):b({point1:{x:r[0].clientX-u,y:r[0].clientY-d},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=y.current,o=r.point1,i=r.point2,s=r.eventType;if(n.length>1&&"touchZoom"===s){var l={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=Ct(e,n),i=Ct(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,l,u),f=(0,h.A)(d,2),p=f[0],v=f[1],g=Ct(l,u)/Ct(o,i);c(g,"touchZoom",p,v,!0),b({point1:l,point2:u,eventType:"touchZoom"})}else"move"===s&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),b({eventType:"move"}))},onTouchEnd:function(){if(n){if(g&&m(!1),b({eventType:"none"}),o>l)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*l,r=e.current.offsetHeight*l,i=e.current.getBoundingClientRect(),c=i.left,u=i.top,d=s%180!=0,p=kt(d?r:t,d?t:r,c,u);p&&a((0,f.A)({},p),"dragRebound")}}}}const Mt=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,c=e.icons,s=e.countRender,l=e.showSwitch,u=e.showProgress,h=e.current,v=e.transform,g=e.count,m=e.scale,y=e.minScale,b=e.maxScale,S=e.closeIcon,w=e.onSwitchLeft,x=e.onSwitchRight,k=e.onClose,C=e.onZoomIn,E=e.onZoomOut,M=e.onRotateRight,O=e.onRotateLeft,T=e.onFlipX,L=e.onFlipY,I=e.toolbarRender,R=e.zIndex,z=(0,r.useContext)(A),P=c.rotateLeft,N=c.rotateRight,H=c.zoomIn,$=c.zoomOut,j=c.close,D=c.left,B=c.right,F=c.flipX,W=c.flipY,X="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===Y.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var U=[{icon:W,onClick:L,type:"flipY"},{icon:F,onClick:T,type:"flipX"},{icon:P,onClick:O,type:"rotateLeft"},{icon:N,onClick:M,type:"rotateRight"},{icon:$,onClick:E,type:"zoomOut",disabled:m<=y},{icon:H,onClick:C,type:"zoomIn",disabled:m===b}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,c=e.disabled;return r.createElement("div",{className:d()(X,(t={},(0,p.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,p.A)(t,"".concat(i,"-operations-operation-disabled"),!!c),t)),onClick:o,key:a},n)})),G=r.createElement("div",{className:"".concat(i,"-operations")},U);return r.createElement(st,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(_,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:d()("".concat(i,"-operations-wrapper"),t,a),style:(0,f.A)((0,f.A)({},n),{},{zIndex:R})},null===S?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},S||j),l&&r.createElement(r.Fragment,null,r.createElement("div",{className:d()("".concat(i,"-switch-left"),(0,p.A)({},"".concat(i,"-switch-left-disabled"),0===h)),onClick:w},D),r.createElement("div",{className:d()("".concat(i,"-switch-right"),(0,p.A)({},"".concat(i,"-switch-right-disabled"),h===g-1)),onClick:x},B)),r.createElement("div",{className:"".concat(i,"-footer")},u&&r.createElement("div",{className:"".concat(i,"-progress")},s?s(h+1,g):"".concat(h+1," / ").concat(g)),I?I(G,(0,f.A)({icons:{flipYIcon:U[0],flipXIcon:U[1],rotateLeftIcon:U[2],rotateRightIcon:U[3],zoomOutIcon:U[4],zoomInIcon:U[5]},actions:{onFlipY:L,onFlipX:T,onRotateLeft:O,onRotateRight:M,onZoomOut:E,onZoomIn:C},transform:v},z?{current:h,total:g}:{})):G)))}))};var Ot=["fallback","src","imgRef"],Tt=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],Lt=function(e){var t=e.fallback,n=e.src,o=e.imgRef,a=(0,g.A)(e,Ot),c=w({src:n,fallback:t}),s=(0,h.A)(c,2),l=s[0],u=s[1];return r.createElement("img",(0,i.A)({ref:function(e){o.current=e,l(e)}},a,u))};const It=function(e){var t=e.prefixCls,n=e.src,o=e.alt,a=e.fallback,c=e.movable,s=void 0===c||c,l=e.onClose,u=e.visible,v=e.icons,y=void 0===v?{}:v,b=e.rootClassName,S=e.closeIcon,w=e.getContainer,x=e.current,k=void 0===x?0:x,E=e.count,M=void 0===E?1:E,O=e.countRender,T=e.scaleStep,L=void 0===T?.5:T,I=e.minScale,R=void 0===I?1:I,z=e.maxScale,P=void 0===z?50:z,N=e.transitionName,H=void 0===N?"zoom":N,$=e.maskTransitionName,j=void 0===$?"fade":$,_=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,F=e.onTransform,W=e.onChange,X=(0,g.A)(e,Tt),U=(0,r.useRef)(),G=(0,r.useContext)(A),q=G&&M>1,K=G&&M>=1,V=(0,r.useState)(!0),Z=(0,h.A)(V,2),Q=Z[0],J=Z[1],ee=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),c=(0,r.useState)(wt),s=(0,h.A)(c,2),l=s[0],u=s[1],d=function(e,t){null===i.current&&(a.current=[],i.current=Xe((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,f.A)((0,f.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,f.A)((0,f.A)({},l),e))};return{transform:l,resetTransform:function(e){u(wt),o&&!(0,St.A)(wt,l)&&o({transform:wt,action:e})},updateTransform:d,dispatchZoomChange:function(r,o,i,a,c){var s=e.current,u=s.width,f=s.height,p=s.offsetWidth,h=s.offsetHeight,v=s.offsetLeft,g=s.offsetTop,y=r,b=l.scale*r;b>n?(b=n,y=n/l.scale):b0&&(r=1/r),c(r,"wheel",e.clientX,e.clientY)}}}}(U,s,u,L,te,re,oe),ae=ie.isMoving,ce=ie.onMouseDown,se=ie.onWheel,le=Et(U,s,u,R,te,re,oe),ue=le.isTouching,de=le.onTouchStart,fe=le.onTouchMove,pe=le.onTouchEnd,he=te.rotate,ve=te.scale,ge=d()((0,p.A)({},"".concat(t,"-moving"),ae));(0,r.useEffect)((function(){Q||J(!0)}),[Q]);var me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),k>0&&(J(!1),ne("prev"),null==W||W(k-1,k))},ye=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),kvoid 0!==n?n:`${e}-${t}`;var Yt=n(2279);const Gt=e=>{const[,,,,t]=(0,_t.Ay)();return t?`${e}-css-var`:""};const qt={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"};const Kt={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"},Vt={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},Zt={lang:Object.assign({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},Kt),timePickerLocale:Object.assign({},Vt)},Qt="${label} is not a valid ${type}",Jt={locale:"en",Pagination:qt,DatePicker:Zt,TimePicker:Vt,Calendar:Zt,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Tour:{Next:"Next",Previous:"Previous",Finish:"Finish"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",deselectAll:"Deselect all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:Qt,method:Qt,array:Qt,object:Qt,number:Qt,date:Qt,boolean:Qt,integer:Qt,float:Qt,regexp:Qt,email:Qt,url:Qt,hex:Qt},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"},QRCode:{expired:"QR code expired",refresh:"Refresh",scanned:"Scanned"},ColorPicker:{presetEmpty:"Empty"}};const en={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var tn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:en}))};const nn=r.forwardRef(tn);var rn=n(8633),on=n(363);const an={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z"}},{tag:"path",attrs:{d:"M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z"}}]},name:"rotate-left",theme:"outlined"};var cn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:an}))};const sn=r.forwardRef(cn);const ln={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z"}},{tag:"path",attrs:{d:"M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z"}}]},name:"rotate-right",theme:"outlined"};var un=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:ln}))};const dn=r.forwardRef(un);const fn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"swap",theme:"outlined"};var pn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:fn}))};const hn=r.forwardRef(pn);const vn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-in",theme:"outlined"};var gn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:vn}))};const mn=r.forwardRef(gn);const yn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-out",theme:"outlined"};var bn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:yn}))};const An=r.forwardRef(bn);var Sn=n(1466),wn=n(4978),xn=n(5905);const kn=e=>({animationDuration:e,animationFillMode:"both"}),Cn=e=>({animationDuration:e,animationFillMode:"both"}),En=function(e,t,n,r){const o=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${o}${e}-enter,\n ${o}${e}-appear\n `]:Object.assign(Object.assign({},kn(r)),{animationPlayState:"paused"}),[`${o}${e}-leave`]:Object.assign(Object.assign({},Cn(r)),{animationPlayState:"paused"}),[`\n ${o}${e}-enter${e}-enter-active,\n ${o}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${o}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}},Mn=new Sn.Mo("antFadeIn",{"0%":{opacity:0},"100%":{opacity:1}}),On=new Sn.Mo("antFadeOut",{"0%":{opacity:1},"100%":{opacity:0}}),Tn=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[En(r,Mn,On,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},Ln=new Sn.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),In=new Sn.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),Rn=new Sn.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),zn=new Sn.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),Pn=new Sn.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),Nn=new Sn.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),Hn={zoom:{inKeyframes:Ln,outKeyframes:In},"zoom-big":{inKeyframes:Rn,outKeyframes:zn},"zoom-big-fast":{inKeyframes:Rn,outKeyframes:zn},"zoom-left":{inKeyframes:new Sn.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Sn.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Sn.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Sn.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:Pn,outKeyframes:Nn},"zoom-down":{inKeyframes:new Sn.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Sn.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},$n=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=Hn[t];return[En(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var jn=n(336),_n=n(665);function Dn(e){return{position:e,inset:0}}const Bn=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:Tn(e)}]},Fn=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Sn.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,xn.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Sn.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Sn.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,xn.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},Wn=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},Xn=((0,_n.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,jn.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[Fn(t),Wn(t),Bn(t),$n(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Sn.zA)(e.paddingMD)} ${(0,Sn.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Sn.zA)(e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Sn.zA)(e.paddingXS)} ${(0,Sn.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),Un=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new wn.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},xn.L9),{padding:`0 ${(0,Sn.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},Yn=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:c,previewOperationHoverColor:s,motionDurationSlow:l,iconCls:u,colorTextLightSolid:d}=e,f=new wn.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${l}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Sn.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${l}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:s},"&-disabled":{color:c,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},Gn=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,c=new wn.q(t).setAlpha(.1),s=c.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:c.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:s.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},qn=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},Xn()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},Xn()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[Yn(e),Gn(e)]}]},Kn=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},Un(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},Xn())}}},Vn=e=>{const{previewCls:t}=e;return{[`${t}-root`]:$n(e,"zoom"),"&":Tn(e,!0)}},Zn=(0,_n.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,jn.h1)(e,{previewCls:t,modalMaskBg:new wn.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[Kn(n),qn(n),Bn((0,jn.h1)(n,{componentCls:t})),Vn(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new wn.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new wn.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new wn.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var Qn=function(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{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:c}=e,s=er(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:u,locale:f=Jt,getPopupContainer:p,image:h}=r.useContext(Yt.QO),v=u("image",n),g=u(),m=f.Image||Jt.Image,y=Gt(v),[b,A,S]=Zn(v,y),w=d()(a,A,S,y),x=d()(i,A,null==h?void 0:h.className),[k]=Xt("ImagePreview","object"==typeof o?o.zIndex:void 0),C=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=er(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${v}-mask-info`},r.createElement(l,null),null==m?void 0:m.preview),icons:Jn},a),{getContainer:null!=n?n:p,transitionName:Ut(g,"zoom",t.transitionName),maskTransitionName:Ut(g,"fade",t.maskTransitionName),zIndex:k,closeIcon:null!=i?i:null===(e=null==h?void 0:h.preview)||void 0===e?void 0:e.closeIcon})}),[o,m,null===(t=null==h?void 0:h.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==h?void 0:h.style),c);return b(r.createElement(jt,Object.assign({prefixCls:v,preview:C,rootClassName:w,className:x,style:E},s)))};tr.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=Qn(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(Yt.QO),a=i("image",t),c=`${a}-preview`,s=i(),l=Gt(a),[u,f,p]=Zn(a,l),[h]=Xt("ImagePreview","object"==typeof n?n.zIndex:void 0),v=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=d()(f,p,l,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:Ut(s,"zoom",t.transitionName),maskTransitionName:Ut(s,"fade",t.maskTransitionName),rootClassName:r,zIndex:h})}),[n]);return u(r.createElement(jt.PreviewGroup,Object.assign({preview:v,previewPrefixCls:c,icons:Jn},o)))};const nr=tr},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>u,L9:()=>o,Nk:()=>a,av:()=>c,dF:()=>i,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),c=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n,r)=>{const o=`[class^="${t}"], [class*=" ${t}"]`,i=n?`.${n}`:o,a={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let c={};return!1!==r&&(c={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[i]:Object.assign(Object.assign(Object.assign({},c),a),{[o]:a})}},l=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),u=e=>({"&:focus-visible":Object.assign({},l(e))})},3511:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>T,Xe:()=>E,Is:()=>C});var r=n(6540),o=n(1466);const i="5.16.4";var a=n(2200);const c={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},s=Object.assign(Object.assign({},c),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});var l=n(4978);const u=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const d=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const f=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],c=r[1],s=r[0],l=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:c,lineHeightLG:l,lineHeightSM:s,fontHeight:Math.round(c*o),fontHeightLG:Math.round(l*a),fontHeightSM:Math.round(s*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const p=(e,t)=>new l.q(e).setAlpha(t).toRgbString(),h=(e,t)=>new l.q(e).darken(t).toHexString(),v=e=>{const t=(0,a.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},g=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:p(r,.88),colorTextSecondary:p(r,.65),colorTextTertiary:p(r,.45),colorTextQuaternary:p(r,.25),colorFill:p(r,.15),colorFillSecondary:p(r,.06),colorFillTertiary:p(r,.04),colorFillQuaternary:p(r,.02),colorBgLayout:h(n,4),colorBgContainer:h(n,0),colorBgElevated:h(n,0),colorBgSpotlight:p(r,.85),colorBgBlur:"transparent",colorBorder:h(n,15),colorBorderSecondary:h(n,6)}};const m=(0,o.an)((function(e){const t=Object.keys(c).map((t=>{const n=(0,a.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:i,colorError:a,colorInfo:c,colorPrimary:s,colorBgBase:u,colorTextBase:d}=e,f=n(s),p=n(o),h=n(i),v=n(a),g=n(c),m=r(u,d),y=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},m),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:v[1],colorErrorBgHover:v[2],colorErrorBorder:v[3],colorErrorBorderHover:v[4],colorErrorHover:v[5],colorError:v[6],colorErrorActive:v[7],colorErrorTextHover:v[8],colorErrorText:v[9],colorErrorTextActive:v[10],colorWarningBg:h[1],colorWarningBgHover:h[2],colorWarningBorder:h[3],colorWarningBorderHover:h[4],colorWarningHover:h[4],colorWarning:h[6],colorWarningActive:h[7],colorWarningTextHover:h[8],colorWarningText:h[9],colorWarningTextActive:h[10],colorInfoBg:g[1],colorInfoBgHover:g[2],colorInfoBorder:g[3],colorInfoBorderHover:g[4],colorInfoHover:g[4],colorInfo:g[6],colorInfoActive:g[7],colorInfoTextHover:g[8],colorInfoText:g[9],colorInfoTextActive:g[10],colorLinkHover:y[4],colorLink:y[6],colorLinkActive:y[7],colorBgMask:new l.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:v,generateNeutralColorPalettes:g})),f(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),d(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},u(r))}(e))})),y={token:s,override:{override:s},hashed:!0},b=r.createContext(y);function A(e){return e>=0&&e<=255}const S=function(e,t){const{r:n,g:r,b:o,a:i}=new l.q(e).toRgb();if(i<1)return e;const{r:a,g:c,b:s}=new l.q(t).toRgb();for(let u=.01;u<=1;u+=.01){const e=Math.round((n-a*(1-u))/u),t=Math.round((r-c*(1-u))/u),i=Math.round((o-s*(1-u))/u);if(A(e)&&A(t)&&A(i))return new l.q({r:e,g:t,b:i,a:Math.round(100*u)/100}).toRgbString()}return new l.q({r:n,g:r,b:o,a:1}).toRgbString()};var w=function(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{delete r[e]}));const o=Object.assign(Object.assign({},n),r),i=1200,a=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:S(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:S(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:S(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:4*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:S(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:i,screenXLMin:i,screenXLMax:1599,screenXXL:a,screenXXLMin:a,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new l.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new l.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new l.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var k=function(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{const r=n.getDerivativeToken(e),{override:o}=t,i=k(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=x(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=k(n,["theme"]);let i=o;r&&(i=O(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function T(){const{token:e,hashed:t,theme:n,override:a,cssVar:c}=r.useContext(b),l=`${i}-${t||""}`,u=n||m,[d,f,p]=(0,o.hV)(u,[s,e],{salt:l,override:a,getComputedToken:O,formatToken:x,cssVar:c&&{prefix:c.prefix,key:c.key,unitless:C,ignore:E,preserve:M}});return[u,p,t?f:"",d,c]}},665:(e,t,n)=>{"use strict";n.d(t,{OF:()=>M});var r=n(6540),o=n(1466);n(6956),n(2533),n(8719);"undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;n(8210);var i=n(2279),a=n(5905),c=n(3511),s=n(3029),l=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var h=n(5501);const v=(0,l.A)((function e(){(0,s.A)(this,e)})),g="CALC_UNIT",m=new RegExp(g,"g");function y(e){return"number"==typeof e?`${e}${g}`:e}let b=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=y(e):"string"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${y(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${y(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{};return this.result=this.result.replace(m,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(v),A=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(v);const S=e=>{const t="css"===e?b:A;return e=>new t(e)};var w=n(336);const x=(e,t)=>{const[n,r]=(0,c.Ay)();return(0,o.IV)({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,a.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))},k=(e,t,n)=>{var r;return"function"==typeof n?n((0,w.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},C=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function E(e,t,n){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const l=Array.isArray(e)?e:[e,e],[u]=l,d=l.join("-");return function(e){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,h,v,g]=(0,c.Ay)(),{getPrefixCls:m,iconPrefixCls:y,csp:b}=(0,r.useContext)(i.QO),A=m(),E=g?"css":"js",M=S(E),{max:O,min:T}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),L={theme:f,token:v,hashId:h,nonce:()=>null==b?void 0:b.nonce,clientOnly:s.clientOnly,order:s.order||-999};(0,o.IV)(Object.assign(Object.assign({},L),{clientOnly:!1,path:["Shared",A]}),(()=>[{"&":(0,a.av)(v)}])),x(y,b);const I=(0,o.IV)(Object.assign(Object.assign({},L),{path:[d,e,y]}),(()=>{if(!1===s.injectStyle)return[];const{token:r,flush:i}=(0,w.Ay)(v),c=k(u,p,n),d=`.${e}`,f=C(u,p,c,{deprecatedTokens:s.deprecatedTokens});g&&Object.keys(c).forEach((e=>{c[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,g.prefix))})`}));const m=(0,w.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${y}`,antCls:`.${A}`,calc:M,max:O,min:T},g?c:f),b=t(m,{hashId:h,prefixCls:e,rootPrefixCls:A,iconPrefixCls:y});return i(u,f),[!1===s.resetStyle?null:(0,a.vj)(m,e,l,s.resetFont),b]}));return[I,h]}}const M=(e,t,n,i)=>{const a=E(e,t,n,i),s=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:s=!0}=null!=n?n:{},l={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{l[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:s}=r;const[,u]=(0,c.Ay)();return(0,o.RC)({path:[e],prefix:s.prefix,key:null==s?void 0:s.key,unitless:Object.assign(Object.assign({},c.Is),l),ignore:c.Xe,token:u,scope:a},(()=>{const r=k(e,u,t),o=C(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,c.Ay)();return[o=>s&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=s(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function c(){}const s=e=>{let t,n=e,i=c;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>g,m6:()=>v});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",c="data-rc-priority",s="rc-util-key",l=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):s}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((l.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,s=void 0===i?0:i,l=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===l,p=document.createElement("style");p.setAttribute(a,l),u&&s&&p.setAttribute(c,"".concat(s)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var h=d(t),v=h.firstChild;if(r){if(u){var g=(t.styles||f(h)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(c)||0);return s>=t}));if(g.length)return h.insertBefore(p,g[g.length-1].nextSibling),p}h.insertBefore(p,v)}else h.appendChild(p);return p}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=h(e,t);n&&d(t).removeChild(n)}function g(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),c=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=l.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;l.set(e,o),e.removeChild(r)}}(o,c);var s=h(t,c);if(s){var v,g,m;if(null!==(v=c.csp)&&void 0!==v&&v.nonce&&s.nonce!==(null===(g=c.csp)||void 0===g?void 0:g.nonce))s.nonce=null===(m=c.csp)||void 0===m?void 0:m.nonce;return s.innerHTML!==e&&(s.innerHTML=e),s}var y=p(e,c);return y.setAttribute(u(c),t),y}},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";n.d(t,{A:()=>c,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const c=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(6636),o=n(6956),i=n(981),a=n(1233);function c(e){return void 0!==e}function s(e,t){var n=t||{},s=n.defaultValue,l=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return c(l)?l:c(s)?"function"==typeof s?s():s:"function"==typeof e?e():e})),p=(0,r.A)(f,2),h=p[0],v=p[1],g=void 0!==l?l:h,m=d?d(g):g,y=(0,o.A)(u),b=(0,a.A)([g]),A=(0,r.A)(b,2),S=A[0],w=A[1];return(0,i.o)((function(){var e=S[0];h!==e&&y(h,e)}),[S]),(0,i.o)((function(){c(l)||v(l)}),[l]),[m,(0,o.A)((function(e,t){v(e,t),w([g],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6636),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],c=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||c(e)}]}},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,s=i.has(t);if((0,o.Ay)(!s,"Warning: There may be circular references"),s)return!1;if(t===a)return!0;if(n&&c>1)return!1;i.add(t);var l=c+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{Xf:()=>a,f3:()=>l,xK:()=>s});var r=n(2284),o=(n(6540),n(6351)),i=n(8104);function a(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)}function c(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>l});var r={},o=[];function i(e,t){}function a(e,t){}function c(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function s(e,t){c(i,e,t)}s.preMessage=function(e){o.push(e)},s.resetWarned=function(){r={}},s.noteOnce=function(e,t){c(a,e,t)};const l=s},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),g=Symbol.for("react.offscreen");function m(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case c:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case l:case d:case v:case h:case s:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isMemo=function(e){return m(e)===h}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nr})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(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&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(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 i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},6822:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"===(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},6636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(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,i,a,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(e,t)||(0,r.A)(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.")}()}},4241:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3145);var o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(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.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="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},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(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)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c110bd0.5e112286.js b/assets/js/7c110bd0.5e112286.js new file mode 100644 index 000000000..267e17082 --- /dev/null +++ b/assets/js/7c110bd0.5e112286.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6877],{2614:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false}]},{"type":"category","label":"\ud83c\udfa8 Colorimetry","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/colorimetry/intro","docId":"colorimetry/intro","unlisted":false},{"type":"link","label":"Color Formats","href":"/docs/colorimetry/format","docId":"colorimetry/format","unlisted":false},{"type":"link","label":"Color Range","href":"/docs/colorimetry/range","docId":"colorimetry/range","unlisted":false},{"type":"link","label":"Color Primaries","href":"/docs/colorimetry/primaries","docId":"colorimetry/primaries","unlisted":false},{"type":"link","label":"Transfer Characteristics","href":"/docs/colorimetry/transfer","docId":"colorimetry/transfer","unlisted":false},{"type":"link","label":"Matrix Coefficients","href":"/docs/colorimetry/matrix","docId":"colorimetry/matrix","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"PSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"colorimetry/format":{"id":"colorimetry/format","title":"Color Formats","description":"To represent color values, a format is agreed upon. Color formats are","sidebar":"tutorialSidebar"},"colorimetry/intro":{"id":"colorimetry/intro","title":"Intro","description":"There are many aspects which determine how the color information","sidebar":"tutorialSidebar"},"colorimetry/matrix":{"id":"colorimetry/matrix","title":"Matrix Coefficients","description":"Matrix coefficients represent the multiplication matrix that is used when","sidebar":"tutorialSidebar"},"colorimetry/primaries":{"id":"colorimetry/primaries","title":"Color Primaries","description":"This section details the first of three settings that are important","sidebar":"tutorialSidebar"},"colorimetry/range":{"id":"colorimetry/range","title":"Color Range","description":"Range is a concept that describes the valid values for a pixel.","sidebar":"tutorialSidebar"},"colorimetry/transfer":{"id":"colorimetry/transfer","title":"Transfer Characteristics","description":"Transfer characteristics, also known as transfer functions, represent the","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"PSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=i(4848),t=i(8453);const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.865,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Reducing Image Load Online",permalink:"/blog/site-optimization"}},l={authorsImageUrls:[void 0,void 0]},c=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:2},{value:"The GUI Way",id:"the-gui-way",level:3},{value:"The WSL2 Way",id:"the-wsl2-way",level:3},{value:"The Automated Way",id:"the-automated-way",level:3},{value:"The Manual Way",id:"the-manual-way",level:3},{value:"macOS",id:"macos",level:2},{value:"Linux",id:"linux",level:2},{value:"The GUI Way",id:"the-gui-way-1",level:3},{value:"The TUI Way",id:"the-tui-way",level:3},{value:"The Compiling Route",id:"the-compiling-route",level:3},{value:"Ubuntu",id:"ubuntu",level:4},{value:"Arch",id:"arch",level:3},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This guide will show you how to encode in AV1 the ",(0,s.jsx)(n.em,{children:"right"})," and ",(0,s.jsx)(n.em,{children:"optimal"})," way. Yes, you using standalone ",(0,s.jsx)(n.code,{children:"libaom"}),", ",(0,s.jsx)(n.code,{children:"libsvtav1"}),", and ",(0,s.jsx)(n.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,s.jsx)(n.code,{children:"yuv4mpeg"})," into ",(0,s.jsx)(n.strong,{children:"mainline"})," aomenc are all unoptimal."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Compare",src:i(8602).A+"",width:"1045",height:"588"})}),"\n",(0,s.jsxs)(n.p,{children:["In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,s.jsx)(n.strong,{children:"RAM consumption"}),", encoding 2160p (4K) with ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})," with 4 workers could take upwards of ",(0,s.jsx)(n.strong,{children:"16GB"})," of RAM! So do keep this in mind."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-the-tools",children:"Installing the Tools"}),"\n",(0,s.jsx)(n.p,{children:"Given all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Jump to"}),": ",(0,s.jsx)(n.a,{href:"#microsoft-windows",children:"Windows"})," | ",(0,s.jsx)(n.a,{href:"#macos",children:"macOS"})," | ",(0,s.jsx)(n.a,{href:"#linux",children:"Linux"})]}),"\n",(0,s.jsx)(n.h2,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," which is a GUI front-end to av1an with all dependencies installed."]}),"\n",(0,s.jsx)(n.li,{children:"You're done, you can skip to the encoding part"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Almost abandonware",type:"danger",children:(0,s.jsx)(n.p,{children:"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal."})}),"\n",(0,s.jsx)(n.h3,{id:"the-wsl2-way",children:"The WSL2 Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsx)(n.p,{children:"If you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good."}),"\n",(0,s.jsxs)(n.p,{children:["The easiest way to encode with WSL2 is to use ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),", an interactive TUI for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"}),". An ArchWSL2 installation tutorial is provided ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"the-automated-way",children:"The Automated Way"}),"\n",(0,s.jsxs)(n.p,{children:["There is now a batch script for automating the install process, which can be found ",(0,s.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"here"}),". The instructions are in the README file."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The script will download outdated version encoders and tools such as ",(0,s.jsx)(n.code,{children:"aom-av1-psy"})," and MKVToolNix v76.0, if you are fine with these you can proceed."]})}),"\n",(0,s.jsx)(n.h3,{id:"the-manual-way",children:"The Manual Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.strong,{children:"Python 3.10.x, this will change so consult from the"})," ",(0,s.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"Vapoursynth website"})," ",(0,s.jsx)(n.strong,{children:"if you're reading this from the future"})," from ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/windows/",children:"here"}),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,s.jsx)(n.img,{alt:"Python PATH",src:i(9658).A+"",width:"672",height:"417"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download and install Vapoursynth from ",(0,s.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"here"}),' and select "VapourSynth64-RXX.exe"']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the terminal and type ",(0,s.jsx)(n.code,{children:"vsrepo.py install lsmas ffms2"})," to install some plugins for Av1an to work."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download MKVToolNix from ",(0,s.jsx)(n.a,{href:"https://mkvtoolnix.download/downloads.html#windows",children:"here"}),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,s.jsx)(n.strong,{children:"(Also available on winget!)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download Av1an from ",(0,s.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download ",(0,s.jsx)(n.strong,{children:"shared libraries"})," FFmpeg from ",(0,s.jsx)(n.a,{href:"https://www.gyan.dev/ffmpeg/builds",children:"gyan.dev"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download a pre-built fork of Aomenc (",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging",children:"aom-av1-lavish"}),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"here"})," ",(0,s.jsx)(n.em,{children:"(Current as of Sept 6, 2023)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation",children:"here"}),"."]})}),"\n",(0,s.jsxs)(n.ol,{start:"8",children:["\n",(0,s.jsxs)(n.li,{children:["Move Av1an, FFmpeg ",(0,s.jsx)(n.strong,{children:"(Including the FFmpeg DLLs)"}),", and aomenc to somewhere preferable, eg ",(0,s.jsx)(n.code,{children:"C:\\Encoding"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the folder ",(0,s.jsx)(n.strong,{children:"AND MKVTOOLNIX INSTALLATION FOLDER"})," to the ",(0,s.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path/",children:"Windows PATH environment"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(n.p,{children:"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Homebrew + Macports for Av1an + rav1e:"}),"\n",(0,s.jsxs)(n.em,{children:["Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]})]}),"\n",(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["As is installing MacPorts. Install the relevent ",(0,s.jsx)(n.code,{children:".pkg"})," for your macOS version from the MacPorts Project website:\n",(0,s.jsx)(n.a,{href:"https://www.macports.org/install.php",children:"www.macports.org/install.php"})]}),"\n",(0,s.jsx)(n.p,{children:"Now, you can run the following commands:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This is the easiest way to get everything set up & working to produce AV1 video with ",(0,s.jsx)(n.code,{children:"rav1e"})," or mainline ",(0,s.jsx)(n.code,{children:"aomenc"})," & Av1an. You can check that things are installed by running the following commands & parsing their output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% rav1e --version | grep "release" -C 1 \nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Notice ",(0,s.jsx)(n.code,{children:"systems.innocent.lsmas : Not found"})," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,s.jsx)(n.code,{children:"-m hybrid"}),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"More Difficult: Building aom-av1-lavish from Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until Clybius merges ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."]}),"\n",(0,s.jsx)(n.h2,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Yet again, try using Arch. It's way easier."})}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way-1",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/aviator",children:"Aviator"})," (",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/FFmpeg",children:"FFmpeg"}),") or ",(0,s.jsx)(n.a,{href:"https://giannirosato.com/blog/post/aviator-1/",children:"rAV1ator"})," basically same thing but ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an.mdx",children:"Av1an"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),". Both are only available as ",(0,s.jsx)(n.a,{href:"https://beta.flathub.org/apps/net.natesales.Aviator",children:"Flatpaks"}),". Keep in mind Aviator ships with ",(0,s.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,s.jsx)(n.strong,{children:"rav1e"})," instead of aomenc/AOM-AV1, which I will not be covering here."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-tui-way",children:"The TUI Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rav1ator-cli"}),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation",children:"this page"})," for more info. Can be easily used on any distro."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-compiling-route",children:"The Compiling Route"}),"\n",(0,s.jsx)(n.h4,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,s.jsxs)(n.p,{children:["The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,s.jsx)(n.code,{children:"rustup"})," first, as apt version of Rust is severely outdated, then you can continue."]}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install l-smash:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install zimg:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install ImageMagick:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install Vapoursynth R63:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The plugin directory will be located in ",(0,s.jsx)(n.code,{children:"/usr/lib/vapoursynth"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Install L-SMASH-Works Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"danger",children:(0,s.jsxs)(n.p,{children:["L-SMASH-Works doesn't work on ",(0,s.jsx)(n.strong,{children:"aarch64"}),", it is recommended to use other plugins instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Install FFMS2 Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install Av1an:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n'})}),"\n",(0,s.jsxs)(n.p,{children:["When there's no errors, proceed to compiling ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"arch",children:"Arch"}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n"})}),"\n",(0,s.jsx)(n.p,{children:"you're done, proceed."}),"\n",(0,s.jsx)(n.h4,{id:"compiling-aom-av1-lavish",children:"Compiling aom-av1-lavish"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsxs)(n.p,{children:["The moment you've all been waiting for, let's just get into it. Here's an example ",(0,s.jsx)(n.em,{children:"recommended"})," parameter as of now (09/03/23) [MM/DD/YY]:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Parameter Meta",type:"info",children:(0,s.jsxs)(n.p,{children:["It is strongly recommended to join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general."]})}),"\n",(0,s.jsx)(n.p,{children:"Now let's dissect it one-by-one"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Av1an parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-i"})," Input."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-x 300"})," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-w 4"}),' Specifies the amount of "workers" or amount of encoders working on the video.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--verbose"})," Sets logging to verbose."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--resume"})," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-e aom"})," Specifies we're using aomenc encoder which should be the default option."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-c mkvmerge"})," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-m lsmash"})," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-f " -an "'})," ",(0,s.jsx)(n.code,{children:"-f"})," Stands for ffmpeg parameters, ",(0,s.jsx)(n.code,{children:"-an"})," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,s.jsx)(n.code,{children:'-f " -an -vf crop=1920:800 "'})," for example to crop the video to 1920x800."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-v " "'})," Is where you put the encoder's parameters in."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-a " -an "'})," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,s.jsx)(n.code,{children:'-a " -c:a libopus -b:a 128k "'}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--photon-noise=10"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--set-thread-affinity=2"})," Pins the thread to the encoder, aligns with ",(0,s.jsx)(n.code,{children:"--threads=2"})," in the encoder parameter so set them accordingly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces ",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring",children:"banding"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--threads=2"})," Sets the amount of threads the encoder can use, aligns with ",(0,s.jsx)(n.code,{children:"--set-thread-affinity"})," in Av1an."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode"})," adaptive quantization mode, 0 is better most of the time"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Tunes to use",type:"info",children:(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"animation"})," if you're encoding above ",(0,s.jsx)(n.code,{children:"cq-level=30"})," A.K.A lower quality, despite it's name\nSet ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"psy"})," for everything else, ",(0,s.jsxs)(n.strong,{children:["do not use if you encode above ",(0,s.jsx)(n.code,{children:"cq-level=30"})]}),"\nFor ",(0,s.jsx)(n.code,{children:"tune"}),", this is a bit tricky. For now, the meta seems to be ",(0,s.jsx)(n.code,{children:"ssim"}),", but back then it was ",(0,s.jsx)(n.code,{children:"lavish"})," which is considered THE best tune because it's based on ",(0,s.jsx)(n.a,{href:"https://github.com/google/butteraugli",children:"butteraugli"}),". Now it's fallen behind because its more blurry than ",(0,s.jsx)(n.code,{children:"ssim"}),", and before that it was ",(0,s.jsx)(n.code,{children:"butteraugli"}),", and then ",(0,s.jsx)(n.code,{children:"ipq_vmaf_psy"}),", and finally just ",(0,s.jsx)(n.code,{children:"ipq"}),".\nIf you use any of the VMAF tunes, ",(0,s.jsxs)(n.strong,{children:["you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put it"]}),"."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode"})," set to 0 because its just better."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause ",(0,s.jsx)(n.strong,{children:"Av1an already did scene detection, so we wont have to."}),". And it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Concatenation Error on Linux",type:"info",children:(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"ulimit -n 200000"}),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,s.jsx)(n.code,{children:"mkvmerge @../options.json"})]})}),"\n",(0,s.jsx)(n.h2,{id:"merging-everything",children:"Merging Everything"}),"\n",(0,s.jsxs)(n.p,{children:["Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,s.jsx)(n.code,{children:"mp4"}),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=10"})," Alternative to ",(0,s.jsx)(n.code,{children:"photon-noise"}),", slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"final-thoughts",children:"Final Thoughts"}),"\n",(0,s.jsx)(n.p,{children:'Encoding has always been about experimentation for the best, there is really no "One size fits all" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:["Guide originally hosted on ",(0,s.jsx)(n.a,{href:"https://rentry.co/AV1",children:"https://rentry.co/AV1"}),", rewrite and migration by Simulping."]})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8602:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},9658:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1502],{2225:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=i(4848),t=i(8453);const o={title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/av1-encoding-for-dummies",source:"@site/blog/2023-09-03-av1-for-dummies.mdx",title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",date:"2023-09-03T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"}],readingTime:15.865,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],frontMatter:{title:"AV1 Encoding for Dummies",description:"This guide will show you how to encode in AV1 the *right* and *optimal* way.",slug:"av1-encoding-for-dummies",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"},{name:"Gianni Rosato",title:"Maintainer",url:"https://github.com/gianni-rosato",image_url:"https://avatars.githubusercontent.com/u/35711760?v=4",imageURL:"https://avatars.githubusercontent.com/u/35711760?v=4"}],tags:["video","compression"],image:"/img/compare-guide.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Embedding the Un-Embeddable",permalink:"/blog/embedding-the-un-embeddable"},nextItem:{title:"Reducing Image Load Online",permalink:"/blog/site-optimization"}},l={authorsImageUrls:[void 0,void 0]},c=[{value:"Installing the Tools",id:"installing-the-tools",level:2},{value:"Microsoft Windows",id:"microsoft-windows",level:2},{value:"The GUI Way",id:"the-gui-way",level:3},{value:"The WSL2 Way",id:"the-wsl2-way",level:3},{value:"The Automated Way",id:"the-automated-way",level:3},{value:"The Manual Way",id:"the-manual-way",level:3},{value:"macOS",id:"macos",level:2},{value:"Linux",id:"linux",level:2},{value:"The GUI Way",id:"the-gui-way-1",level:3},{value:"The TUI Way",id:"the-tui-way",level:3},{value:"The Compiling Route",id:"the-compiling-route",level:3},{value:"Ubuntu",id:"ubuntu",level:4},{value:"Arch",id:"arch",level:3},{value:"Compiling aom-av1-lavish",id:"compiling-aom-av1-lavish",level:4},{value:"Encoding",id:"encoding",level:2},{value:"Merging Everything",id:"merging-everything",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2},{value:"Final Thoughts",id:"final-thoughts",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This guide will show you how to encode in AV1 the ",(0,s.jsx)(n.em,{children:"right"})," and ",(0,s.jsx)(n.em,{children:"optimal"})," way. Yes, you using standalone ",(0,s.jsx)(n.code,{children:"libaom"}),", ",(0,s.jsx)(n.code,{children:"libsvtav1"}),", and ",(0,s.jsx)(n.code,{children:"librav1e"})," from FFmpeg or even piping ",(0,s.jsx)(n.code,{children:"yuv4mpeg"})," into ",(0,s.jsx)(n.strong,{children:"mainline"})," aomenc are all unoptimal."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Compare",src:i(1679).A+"",width:"1045",height:"588"})}),"\n",(0,s.jsxs)(n.p,{children:["In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is ",(0,s.jsx)(n.strong,{children:"RAM consumption"}),", encoding 2160p (4K) with ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc",children:"aomenc"})," with 4 workers could take upwards of ",(0,s.jsx)(n.strong,{children:"16GB"})," of RAM! So do keep this in mind."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-the-tools",children:"Installing the Tools"}),"\n",(0,s.jsx)(n.p,{children:"Given all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Jump to"}),": ",(0,s.jsx)(n.a,{href:"#microsoft-windows",children:"Windows"})," | ",(0,s.jsx)(n.a,{href:"#macos",children:"macOS"})," | ",(0,s.jsx)(n.a,{href:"#linux",children:"Linux"})]}),"\n",(0,s.jsx)(n.h2,{id:"microsoft-windows",children:"Microsoft Windows"}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/n00mkrad/nmkoder",children:"NMKODER"})," which is a GUI front-end to av1an with all dependencies installed."]}),"\n",(0,s.jsx)(n.li,{children:"You're done, you can skip to the encoding part"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Almost abandonware",type:"danger",children:(0,s.jsx)(n.p,{children:"Since Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal."})}),"\n",(0,s.jsx)(n.h3,{id:"the-wsl2-way",children:"The WSL2 Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsx)(n.p,{children:"If you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good."}),"\n",(0,s.jsxs)(n.p,{children:["The easiest way to encode with WSL2 is to use ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),", an interactive TUI for ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an",children:"Av1an"}),". An ArchWSL2 installation tutorial is provided ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"the-automated-way",children:"The Automated Way"}),"\n",(0,s.jsxs)(n.p,{children:["There is now a batch script for automating the install process, which can be found ",(0,s.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"here"}),". The instructions are in the README file."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The script will download outdated version encoders and tools such as ",(0,s.jsx)(n.code,{children:"aom-av1-psy"})," and MKVToolNix v76.0, if you are fine with these you can proceed."]})}),"\n",(0,s.jsx)(n.h3,{id:"the-manual-way",children:"The Manual Way"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.strong,{children:"Python 3.10.x, this will change so consult from the"})," ",(0,s.jsx)(n.a,{href:"http://www.vapoursynth.com/doc/installation.html",children:"Vapoursynth website"})," ",(0,s.jsx)(n.strong,{children:"if you're reading this from the future"})," from ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/windows/",children:"here"}),' and select "Windows Installer 64-bit". Upon installation check the tick for adding Python to PATH like so\n',(0,s.jsx)(n.img,{alt:"Python PATH",src:i(8547).A+"",width:"672",height:"417"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download and install Vapoursynth from ",(0,s.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"here"}),' and select "VapourSynth64-RXX.exe"']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the terminal and type ",(0,s.jsx)(n.code,{children:"vsrepo.py install lsmas ffms2"})," to install some plugins for Av1an to work."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download MKVToolNix from ",(0,s.jsx)(n.a,{href:"https://mkvtoolnix.download/downloads.html#windows",children:"here"}),', select "mkvtoolnix-64bit-XX.X.X-setup.exe", and install ',(0,s.jsx)(n.strong,{children:"(Also available on winget!)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download Av1an from ",(0,s.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases",children:"here"}),' (SELECT LATEST AND CLICK THE "ASSETS" DROPDOWN)']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download ",(0,s.jsx)(n.strong,{children:"shared libraries"})," FFmpeg from ",(0,s.jsx)(n.a,{href:"https://www.gyan.dev/ffmpeg/builds",children:"gyan.dev"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download a pre-built fork of Aomenc (",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging",children:"aom-av1-lavish"}),") which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows ",(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"here"})," ",(0,s.jsx)(n.em,{children:"(Current as of Sept 6, 2023)"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you opt to compile aomenc yourself, you can view the instructions on how to do that ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/aomenc/#installation",children:"here"}),"."]})}),"\n",(0,s.jsxs)(n.ol,{start:"8",children:["\n",(0,s.jsxs)(n.li,{children:["Move Av1an, FFmpeg ",(0,s.jsx)(n.strong,{children:"(Including the FFmpeg DLLs)"}),", and aomenc to somewhere preferable, eg ",(0,s.jsx)(n.code,{children:"C:\\Encoding"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the folder ",(0,s.jsx)(n.strong,{children:"AND MKVTOOLNIX INSTALLATION FOLDER"})," to the ",(0,s.jsx)(n.a,{href:"https://www.maketecheasier.com/what-is-the-windows-path/",children:"Windows PATH environment"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(n.p,{children:"macOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Homebrew + Macports for Av1an + rav1e:"}),"\n",(0,s.jsxs)(n.em,{children:["Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]})]}),"\n",(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["As is installing MacPorts. Install the relevent ",(0,s.jsx)(n.code,{children:".pkg"})," for your macOS version from the MacPorts Project website:\n",(0,s.jsx)(n.a,{href:"https://www.macports.org/install.php",children:"www.macports.org/install.php"})]}),"\n",(0,s.jsx)(n.p,{children:"Now, you can run the following commands:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install rav1e aom mkvtoolnix ffmpeg\n# Usually you must run MacPorts commands for package installations as root\nport upgrade outdated\nport install av1an\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This is the easiest way to get everything set up & working to produce AV1 video with ",(0,s.jsx)(n.code,{children:"rav1e"})," or mainline ",(0,s.jsx)(n.code,{children:"aomenc"})," & Av1an. You can check that things are installed by running the following commands & parsing their output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% av1an --version\nav1an 0.4.1-unstable (rev e10880d) (Release)\n\n* Compiler\n rustc 1.70.0 (LLVM 16.0)\n\n* Target Triple\n aarch64-apple-darwin\n\n* Date Info\n Commit Date: 2023-06-25\n\n* VapourSynth Plugins\n systems.innocent.lsmas : Not found\n com.vapoursynth.ffms2 : Not found\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% rav1e --version | grep "release" -C 1 \nrav1e 0.6.6 () (release)\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'% aomenc --help | grep "AOMedia" -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\n\n Use --codec to switch to a non-default encoder.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Notice ",(0,s.jsx)(n.code,{children:"systems.innocent.lsmas : Not found"})," in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through ",(0,s.jsx)(n.code,{children:"-m hybrid"}),". This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -i "input" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v " --tiles 8 -s 4 --quantizer 80 --no-scene-detection" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'brew install git rust nasm\ngit clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\ncd .. && cd target/release\ncp av1an /usr/local/bin\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"More Difficult: Building aom-av1-lavish from Source"})}),"\n",(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until Clybius merges ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root:\nmake install\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below."]}),"\n",(0,s.jsx)(n.h2,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Yet again, try using Arch. It's way easier."})}),"\n",(0,s.jsx)(n.h3,{id:"the-gui-way-1",children:"The GUI Way"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/aviator",children:"Aviator"})," (",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/SVT-AV1",children:"SVT-AV1"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/FFmpeg",children:"FFmpeg"}),") or ",(0,s.jsx)(n.a,{href:"https://giannirosato.com/blog/post/aviator-1/",children:"rAV1ator"})," basically same thing but ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/av1an.mdx",children:"Av1an"})," + ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/encoders/rav1e",children:"rav1e"}),". Both are only available as ",(0,s.jsx)(n.a,{href:"https://beta.flathub.org/apps/net.natesales.Aviator",children:"Flatpaks"}),". Keep in mind Aviator ships with ",(0,s.jsx)(n.strong,{children:"SVT-AV1"})," and rAV1ator with ",(0,s.jsx)(n.strong,{children:"rav1e"})," instead of aomenc/AOM-AV1, which I will not be covering here."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-tui-way",children:"The TUI Way"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(Recommended)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli",children:"rav1ator-cli"}),", a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See ",(0,s.jsx)(n.a,{href:"https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation",children:"this page"})," for more info. Can be easily used on any distro."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"the-compiling-route",children:"The Compiling Route"}),"\n",(0,s.jsx)(n.h4,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,s.jsxs)(n.p,{children:["The guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via ",(0,s.jsx)(n.code,{children:"rustup"})," first, as apt version of Rust is severely outdated, then you can continue."]}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install l-smash:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/l-smash/l-smash.git\ncd l-smash\n./configure --enable-shared --extra-cflags="-march=native"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install zimg:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone --recursive https://github.com/sekrit-twc/zimg.git\ncd zimg\n./autogen.sh\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install ImageMagick:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/ImageMagick/ImageMagick\ncd ImageMagick\n./configure\nmake -j$(nproc)\nsudo make install\n"})}),"\n",(0,s.jsx)(n.p,{children:"Install Vapoursynth R63:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'wget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\nunzip R63.zip\ncd vapoursynth-R63\n./autogen.sh\n./configure CFLAGS="-march=native" CXXFLAGS="-march=native" --libdir=/usr/lib\nmake -j$(nproc)\nsudo make install\nsudo mkdir /usr/lib/vapoursynth\nsudo ldconfig\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The plugin directory will be located in ",(0,s.jsx)(n.code,{children:"/usr/lib/vapoursynth"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Install L-SMASH-Works Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args="-march=native" -Dcpp_args="-march=native"\nninja -j$(nproc)\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"danger",children:(0,s.jsxs)(n.p,{children:["L-SMASH-Works doesn't work on ",(0,s.jsx)(n.strong,{children:"aarch64"}),", it is recommended to use other plugins instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Install FFMS2 Vapoursynth Plugin:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/FFMS/ffms2\ncd ffms2\n./autogen.sh\n./configure CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"\nmake -j$(nproc)\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\n'})}),"\n",(0,s.jsx)(n.p,{children:"Install Av1an:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\nsudo cp target/release/av1an /usr/local/bin\n'})}),"\n",(0,s.jsxs)(n.p,{children:["When there's no errors, proceed to compiling ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"arch",children:"Arch"}),"\n",(0,s.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\n"})}),"\n",(0,s.jsx)(n.p,{children:"you're done, proceed."}),"\n",(0,s.jsx)(n.h4,{id:"compiling-aom-av1-lavish",children:"Compiling aom-av1-lavish"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt"\nmake -j$(nproc)\nsudo make install\n'})}),"\n",(0,s.jsx)(n.h2,{id:"encoding",children:"Encoding"}),"\n",(0,s.jsxs)(n.p,{children:["The moment you've all been waiting for, let's just get into it. Here's an example ",(0,s.jsx)(n.em,{children:"recommended"})," parameter as of now (09/03/23) [MM/DD/YY]:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'av1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a " -an " -f " -an " -v " --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 " -o "output.mkv"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Parameter Meta",type:"info",children:(0,s.jsxs)(n.p,{children:["It is strongly recommended to join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general."]})}),"\n",(0,s.jsx)(n.p,{children:"Now let's dissect it one-by-one"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Av1an parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-i"})," Input."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-x 300"})," Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-w 4"}),' Specifies the amount of "workers" or amount of encoders working on the video.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--verbose"})," Sets logging to verbose."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--resume"})," Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \"resumed\" without the parameter in place."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-e aom"})," Specifies we're using aomenc encoder which should be the default option."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-c mkvmerge"})," Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"-m lsmash"})," Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-f " -an "'})," ",(0,s.jsx)(n.code,{children:"-f"})," Stands for ffmpeg parameters, ",(0,s.jsx)(n.code,{children:"-an"})," is to remove all audio since its better to encode and merge it separately. To crop use ",(0,s.jsx)(n.code,{children:'-f " -an -vf crop=1920:800 "'})," for example to crop the video to 1920x800."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-v " "'})," Is where you put the encoder's parameters in."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'-a " -an "'})," FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: ",(0,s.jsx)(n.code,{children:'-a " -c:a libopus -b:a 128k "'}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--photon-noise=10"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--set-thread-affinity=2"})," Pins the thread to the encoder, aligns with ",(0,s.jsx)(n.code,{children:"--threads=2"})," in the encoder parameter so set them accordingly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc parameters:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because it makes the video smaller and reduces ",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring",children:"banding"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--threads=2"})," Sets the amount of threads the encoder can use, aligns with ",(0,s.jsx)(n.code,{children:"--set-thread-affinity"})," in Av1an."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",width:"1280",height:"768",loading:"lazy"})]}),"\n",(0,s.jsx)(n.admonition,{title:"Tile usage",type:"note",children:(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode"})," adaptive quantization mode, 0 is better most of the time"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Tunes to use",type:"info",children:(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"animation"})," if you're encoding above ",(0,s.jsx)(n.code,{children:"cq-level=30"})," A.K.A lower quality, despite it's name\nSet ",(0,s.jsx)(n.code,{children:"tune-content"})," to ",(0,s.jsx)(n.code,{children:"psy"})," for everything else, ",(0,s.jsxs)(n.strong,{children:["do not use if you encode above ",(0,s.jsx)(n.code,{children:"cq-level=30"})]}),"\nFor ",(0,s.jsx)(n.code,{children:"tune"}),", this is a bit tricky. For now, the meta seems to be ",(0,s.jsx)(n.code,{children:"ssim"}),", but back then it was ",(0,s.jsx)(n.code,{children:"lavish"})," which is considered THE best tune because it's based on ",(0,s.jsx)(n.a,{href:"https://github.com/google/butteraugli",children:"butteraugli"}),". Now it's fallen behind because its more blurry than ",(0,s.jsx)(n.code,{children:"ssim"}),", and before that it was ",(0,s.jsx)(n.code,{children:"butteraugli"}),", and then ",(0,s.jsx)(n.code,{children:"ipq_vmaf_psy"}),", and finally just ",(0,s.jsx)(n.code,{children:"ipq"}),".\nIf you use any of the VMAF tunes, ",(0,s.jsxs)(n.strong,{children:["you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put it"]}),"."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode"})," set to 0 because its just better."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause ",(0,s.jsx)(n.strong,{children:"Av1an already did scene detection, so we wont have to."}),". And it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1"})," Parameters that give you free efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Concatenation Error on Linux",type:"info",children:(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"ulimit -n 200000"}),", resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ",(0,s.jsx)(n.code,{children:"mkvmerge @../options.json"})]})}),"\n",(0,s.jsx)(n.h2,{id:"merging-everything",children:"Merging Everything"}),"\n",(0,s.jsxs)(n.p,{children:["Once you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into ",(0,s.jsx)(n.code,{children:"mp4"}),", just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental."]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=10"})," Alternative to ",(0,s.jsx)(n.code,{children:"photon-noise"}),", slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"final-thoughts",children:"Final Thoughts"}),"\n",(0,s.jsx)(n.p,{children:'Encoding has always been about experimentation for the best, there is really no "One size fits all" for encoding content, as they differ from scene complexity, how it\'s captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:["Guide originally hosted on ",(0,s.jsx)(n.a,{href:"https://rentry.co/AV1",children:"https://rentry.co/AV1"}),", rewrite and migration by Simulping."]})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1679:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/compare-guide-6feb966fbd9d73be4a3097c41691c4ad.webp"},8547:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/python-path-a89fc4fe6c6eb4c2ea0a7610dd2cf09a.webp"},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(6540);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.0981bb33.js b/assets/js/814f3328.0981bb33.js new file mode 100644 index 000000000..cad40531e --- /dev/null +++ b/assets/js/814f3328.0981bb33.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Observing SVT-AV1 v2.1.0\'s improvements: A New Deep Dive","permalink":"/blog/svt-av1-second-deep-dive","unlisted":false},{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive","unlisted":false},{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable","unlisted":false},{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies","unlisted":false},{"title":"Reducing Image Load Online","permalink":"/blog/site-optimization","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.d20d1a0f.js b/assets/js/814f3328.d20d1a0f.js deleted file mode 100644 index 0b8d2e5a8..000000000 --- a/assets/js/814f3328.d20d1a0f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Encoding Animation with SVT-AV1: A Deep Dive","permalink":"/blog/svt-av1-deep-dive","unlisted":false},{"title":"Embedding the Un-Embeddable","permalink":"/blog/embedding-the-un-embeddable","unlisted":false},{"title":"AV1 Encoding for Dummies","permalink":"/blog/av1-encoding-for-dummies","unlisted":false},{"title":"Reducing Image Load Online","permalink":"/blog/site-optimization","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/8f6f5e4c.93d7d4c9.js b/assets/js/8f6f5e4c.93d7d4c9.js new file mode 100644 index 000000000..fa1c5d7cb --- /dev/null +++ b/assets/js/8f6f5e4c.93d7d4c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8760],{9483:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=r(4848),s=r(8453);const i={title:"Color Formats",sidebar_position:2},t="Color Formats",l={id:"colorimetry/format",title:"Color Formats",description:"To represent color values, a format is agreed upon. Color formats are",source:"@site/docs/colorimetry/format.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/format",permalink:"/docs/colorimetry/format",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/format.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Color Formats",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Intro",permalink:"/docs/colorimetry/intro"},next:{title:"Color Range",permalink:"/docs/colorimetry/range"}},a={},d=[{value:"Color Models",id:"color-models",level:2},{value:"RGB",id:"rgb",level:3},{value:"YUV",id:"yuv",level:3},{value:"Component order",id:"component-order",level:3},{value:"Bit depth",id:"bit-depth",level:2},{value:"Packed vs planar",id:"packed-vs-planar",level:2},{value:"Endianness",id:"endianness",level:2},{value:"Chroma subsampling",id:"chroma-subsampling",level:2},{value:"Common formats",id:"common-formats",level:2},{value:"References",id:"references",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"color-formats",children:"Color Formats"}),"\n",(0,o.jsxs)(n.p,{children:["To represent color values, a format is agreed upon. Color formats are\nmade up of three things, the ",(0,o.jsx)(n.a,{href:"#color-models",children:"color model"}),"--which includes the\n",(0,o.jsx)(n.a,{href:"#component-order",children:"order of the components"})," and sometimes ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"chroma subsampling"}),"--\nthe ",(0,o.jsx)(n.a,{href:"#bit-depth",children:"bit depth"}),", and whether it is a ",(0,o.jsx)(n.a,{href:"#packed-vs-planar",children:"packed or a planar format"}),".\nIn some cases, ",(0,o.jsx)(n.a,{href:"#endianness",children:"endianness"})," may be important."]}),"\n",(0,o.jsx)(n.h2,{id:"color-models",children:"Color Models"}),"\n",(0,o.jsx)(n.p,{children:"A color model is a method of representing colors in a video or image using data.\nDifferent color models store color and brightness information in different ways.\nThere are many different color models, but this section will cover the\nmodels most commonly used for images and video."}),"\n",(0,o.jsx)(n.h3,{id:"rgb",children:"RGB"}),"\n",(0,o.jsx)(n.p,{children:"RGB is probably the most well-known color model, and is primarily used\nin image encoding. RGB consists of three color channels, Red, Green,\nand Blue, which are then combined to determine the final color of each\npixel. Typically, RGB is the final model that a monitor or TV\nwill use to display images, because the pixels on a screen are made up\nof red, green, and blue LEDs, although it is not commonly used for video\nencoding because other models can provide better compression."}),"\n",(0,o.jsx)(n.h3,{id:"yuv",children:"YUV"}),"\n",(0,o.jsx)(n.p,{children:"YUV, also known as YCbCr, is the most widely used color model for\nvideo encoding. It consists of three components: Y aka Luma, which\nrepresents luminance or brightness, and two chroma planes, which\nrepresent color. Generally a video player will have to convert a YUV\nvideo into RGB before it can be rendered, but there are significant\ncompression benefits to using YUV over RGB for video."}),"\n",(0,o.jsxs)(n.p,{children:["The most notable reason to use YCbCr is an optimization called chroma\nsubsampling. This means that the chroma components can be encoded at a\nlower resolution than the luma components, which results in a smaller\noutput file. You can read more about chroma subsampling ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"further below"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"component-order",children:"Component order"}),"\n",(0,o.jsxs)(n.p,{children:["The order in which the components in a color model are arranged is simply\nrepresented by writing them out. For example, ",(0,o.jsx)(n.code,{children:"RGB"})," for red first,\nthen green, then blue, or ",(0,o.jsx)(n.code,{children:"BGR"})," for blue, green, red."]}),"\n",(0,o.jsx)(n.h2,{id:"bit-depth",children:"Bit depth"}),"\n",(0,o.jsx)(n.p,{children:"A bit depth is how many bits are available to store the sample\nvalue. There are two main ways to specify the bit depth in a :"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["bits per component. Here, ",(0,o.jsx)(n.code,{children:"RGB888"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 8 bits for the red component, 8 bits for the green component, and 8 bits for the blue component"})," and ",(0,o.jsx)(n.code,{children:"RGB565"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 5 bits for the red component, 6 bits for the green component, and 5 bits for the blue component"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["bits per sample. Here, ",(0,o.jsx)(n.code,{children:"RGB24"})," reads as ",(0,o.jsx)(n.code,{children:"RGB color model, with 24 bits in total for the red, green, and blue components"}),". This is\nambiguous, because one does not know exactly how many bits are\nallocated to each component. ",(0,o.jsx)(n.code,{children:"RGB565"}),", ",(0,o.jsx)(n.code,{children:"RGB556"}),", and ",(0,o.jsx)(n.code,{children:"RGB655"})," (even\nthough the latter ones do not make much sense as the eye is most\nsensitive to green light) all become ",(0,o.jsx)(n.code,{children:"RGB16"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"packed-vs-planar",children:"Packed vs planar"}),"\n",(0,o.jsxs)(n.p,{children:["Components can be stored either packed, where all\ncomponents are interleaved (here, ",(0,o.jsx)(n.code,{children:"RGB"}),"):"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: RGB RGB RGB RGB RGB\n"})}),"\n",(0,o.jsx)(n.p,{children:"or stored separately for each component:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Sample number: 1 2 3 4 5\nData: R R R R R...\nData: G G G G G...\nData: B B B B B...\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In planar formats, many operations can be easier to implement, as it\nis possible to implement the algorithm once and then operate on all\nplanes. On the other hand, packed formats are simpler and often used\nin hardware.",(0,o.jsx)(n.sup,{children:(0,o.jsx)(n.a,{href:"#user-content-fn-vlc-wiki-yuv",id:"user-content-fnref-vlc-wiki-yuv","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})]}),"\n",(0,o.jsx)(n.h2,{id:"endianness",children:"Endianness"}),"\n",(0,o.jsxs)(n.p,{children:["Different computer architectures store numbers differently. For more\ninformation, visit ",(0,o.jsx)(n.a,{href:"//wikipedia.org/wiki/Endianness",children:"the Wikipedia article on\nendianness"}),". There are two main ways\nto store numbers with more than 8 bits (1 is the least significant\nbyte and 4 is the most significant byte, here 4 bytes):"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Most significant byte first, little endian, ",(0,o.jsx)(n.code,{children:"4321"}),". This is what\nx86-family processors use."]}),"\n",(0,o.jsxs)(n.li,{children:["Least significant byte first, big endian, ",(0,o.jsx)(n.code,{children:"1234"}),". This is what\nPowerPC-family processors use."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"This can be important for color formats, as some computers might store\nit in their native endianness. VapourSynth doesn't seem to care about\nendianness, but FFmpeg does."}),"\n",(0,o.jsxs)(n.p,{children:["For example, ",(0,o.jsx)(n.code,{children:"RGB565"})," might store its two bytes in ",(0,o.jsx)(n.code,{children:"12"})," or ",(0,o.jsx)(n.code,{children:"21"})," order,\nand if they are read in the wrong order, it will produce garbage."]}),"\n",(0,o.jsx)(n.h2,{id:"chroma-subsampling",children:"Chroma subsampling"}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.a,{href:"#yuv",children:"Y'CbCr"})," signals, there are three widely used\nvariants of chroma subsampling:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"4:2:0 which has half the vertical and horizontal chroma resolution"}),"\n",(0,o.jsx)(n.li,{children:"4:2:2 which has half the horizontal chroma resolution but full\nvertical resolution"}),"\n",(0,o.jsx)(n.li,{children:"4:4:4 which has full chroma resolution (no subsampling)"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"4:2:2 is not particularly useful over the other options, so this guide\nwill focus on 4:2:0 and 4:4:4."}),"\n",(0,o.jsx)(n.p,{children:"4:2:0 is the most commonly used format for videos. Nearly every DVD,\nblu-ray, camera recording, etc. uses 4:2:0 subsampling. This is because,\nin the majority of cases, human eyes do not notice the reduction in\nchroma resolution. There is very little benefit to using 4:4:4 in the\naverage case."}),"\n",(0,o.jsx)(n.p,{children:"However, there are some exceptions. The most notable is screen\nrecordings. Things like text overlays, video game UI overlays,\netc. have very fine, color-dependent detail that can be destroyed by\nchroma subsampling and result in an aliased look to the\nvideo. Therefore, it is recommended to use 4:4:4 subsampling when\nrecording your screen, and 4:2:0 subsampling in most other cases."}),"\n",(0,o.jsx)(n.h2,{id:"common-formats",children:"Common formats"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"VS name"}),(0,o.jsx)(n.th,{children:"FFmpeg name"}),(0,o.jsx)(n.th,{children:"Meaning"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GRAY8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"gray8"})}),(0,o.jsx)(n.td,{children:"Brightness only, 8 bits, packed"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GRAY16"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"gray16le"}),", ",(0,o.jsx)(n.code,{children:"gray16be"})," (the suffix specifies the ",(0,o.jsx)(n.a,{href:"#endianness",children:"endianness"}),")"]}),(0,o.jsx)(n.td,{children:"Brightness only, 16 bits"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"RGB888"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"rgb24"})}),(0,o.jsx)(n.td,{children:"red, green, blue, 8 bits per component"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV420P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv420p"})}),(0,o.jsxs)(n.td,{children:["luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:0 ",(0,o.jsx)(n.a,{href:"#chroma-subsampling",children:"subsampling"})]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV422P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv422p"})}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, 4:2:2 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV444P8"})}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"yuv444p"})}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 8 bits per component, planar, no subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV420P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv420p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv420p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:0 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV422P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv422p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv422p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, 4:2:2 subsampling"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"YUV444P10"})}),(0,o.jsxs)(n.td,{children:[(0,o.jsx)(n.code,{children:"yuv444p10le"}),", ",(0,o.jsx)(n.code,{children:"yuv444p10le"})]}),(0,o.jsx)(n.td,{children:"luma, chroma blue, chroma red, 10 bits per component, planar, no subsampling"})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"references",children:"References"}),"\n","\n",(0,o.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,o.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{id:"user-content-fn-vlc-wiki-yuv",children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://wiki.videolan.org/YUV/#Packed_formats",children:"YUV - VideoLAN Wiki"})," ",(0,o.jsx)(n.a,{href:"#user-content-fnref-vlc-wiki-yuv","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var o=r(6540);const s={},i=o.createContext(s);function t(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(s):e.components||s:t(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/915a111c.35484085.js b/assets/js/915a111c.35484085.js deleted file mode 100644 index b7a32b132..000000000 --- a/assets/js/915a111c.35484085.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5889],{2622:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(4848),o=i(8453);const r={title:"Dehalo",sidebar_position:6},s="Dehalo",a={id:"filtering/dehalo",title:"Dehalo",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/dehalo.mdx",sourceDirName:"filtering",slug:"/filtering/dehalo",permalink:"/docs/filtering/dehalo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Dehalo",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"},next:{title:"Aviator",permalink:"/docs/utilities/Aviator"}},c={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"dehalo",children:"Dehalo"}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(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(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/915a111c.8e3ad7f3.js b/assets/js/915a111c.8e3ad7f3.js new file mode 100644 index 000000000..65a227dc9 --- /dev/null +++ b/assets/js/915a111c.8e3ad7f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5889],{2622:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(4848),o=n(8453);const r={title:"Dehalo",sidebar_position:6},s="Dehalo",c={id:"filtering/dehalo",title:"Dehalo",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/dehalo.mdx",sourceDirName:"filtering",slug:"/filtering/dehalo",permalink:"/docs/filtering/dehalo",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/dehalo.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Dehalo",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Detelecine / Inverse Telecine",permalink:"/docs/filtering/detelecine"},next:{title:"Intro",permalink:"/docs/colorimetry/intro"}},a={},l=[];function d(e){const t={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"dehalo",children:"Dehalo"}),"\n",(0,i.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>c});var i=n(6540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/94782d2d.6eef689a.js b/assets/js/94782d2d.6eef689a.js new file mode 100644 index 000000000..bd091a238 --- /dev/null +++ b/assets/js/94782d2d.6eef689a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4597],{4039:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=n(4848),r=n(8453);const i={title:"Color Range",sidebar_position:3},a="Color Range",s={id:"colorimetry/range",title:"Color Range",description:"Range is a concept that describes the valid values for a pixel.",source:"@site/docs/colorimetry/range.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/range",permalink:"/docs/colorimetry/range",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/range.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Color Range",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Color Formats",permalink:"/docs/colorimetry/format"},next:{title:"Color Primaries",permalink:"/docs/colorimetry/primaries"}},l={},c=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"color-range",children:"Color Range"}),"\n",(0,o.jsx)(t.p,{children:"Range is a concept that describes the valid values for a pixel.\nTypically, RGB will use full range and YUV will use limited range."}),"\n",(0,o.jsx)(t.p,{children:"What does this mean?"}),"\n",(0,o.jsx)(t.p,{children:"For 8-bit video, full range indicates that all values between 0-255\nmay be used to represent a color value. On the other hand, limited range\nindicates that only values between 16-235, or 16-240 for chroma,\nare valid, and any values outside that range will be clamped to fit in\nthat range. These expand to equivalent ranges for high bit depth videos."}),"\n",(0,o.jsx)(t.p,{children:"Why is limited range a thing that exists? Essentially, it's due to\nhistorical reasons, but it's a convention that we are stuck with today.\nEven though full range may provide slightly better color accuracy,\nit is far less meaningful for high bit depth content, and even\nHDR blu-rays use limited color range. Therefore, it is recommended to\nfollow existing conventions."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ac6a717f.b3ed906d.js b/assets/js/ac6a717f.e9d17e1f.js similarity index 66% rename from assets/js/ac6a717f.b3ed906d.js rename to assets/js/ac6a717f.e9d17e1f.js index eaa16dac7..4f0ae14d6 100644 --- a/assets/js/ac6a717f.b3ed906d.js +++ b/assets/js/ac6a717f.e9d17e1f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7295],{5069:e=>{e.exports=JSON.parse('{"tag":{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7295],{5069:e=>{e.exports=JSON.parse('{"tag":{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/b261517a.e1c706d6.js b/assets/js/b261517a.e1c706d6.js new file mode 100644 index 000000000..a7757feae --- /dev/null +++ b/assets/js/b261517a.e1c706d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1454],{1165:(e,t,s)=>{s.d(t,{Ck:()=>p,kS:()=>u});var i=s(4848),o=s(5293),r=s(6540),a=s(3517),n=s(943),c=s(1412),l=s(9522),d=s(1303),m=s(8633),h=s(363);const p=({imageData:e})=>{const t=({currentSlide:e,direction:t,slideCount:s,...o})=>"left"===t?(0,i.jsx)(m.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,left:10}}):(0,i.jsx)(h.A,{...o,style:{color:"#fff",fontSize:24,width:24,height:24,zIndex:1,right:10}});return(0,i.jsx)(a.A,{arrows:!0,prevArrow:(0,i.jsx)(t,{direction:"left"}),nextArrow:(0,i.jsx)(t,{direction:"right"}),children:e.map((e=>(0,i.jsx)(n.A,{src:e.src},e.src)))})},u=({tabMap:e})=>{const[t,s]=(0,r.useState)(Object.keys(e)[0]),{colorMode:a,setColorMode:n}=(0,o.G)();return(0,i.jsx)(c.Ay,{theme:{algorithm:"dark"===a?l.A.darkAlgorithm:l.A.defaultAlgorithm},children:(0,i.jsx)(d.A,{tabList:Object.entries(e).map((([e,t])=>({key:e,label:t.label}))),activeTabKey:t,onTabChange:e=>{s(e)},children:e[t].component})})}},3012:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var i=s(4848),o=s(8453);s(1165);const r={title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},a="Introduction",n={permalink:"/blog/svt-av1-second-deep-dive",source:"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",date:"2024-05-19T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"compression",permalink:"/blog/tags/compression"},{label:"benchmarks",permalink:"/blog/tags/benchmarks"}],readingTime:38.77,hasTruncateMarker:!0,authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],frontMatter:{title:"Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive",description:"SVT-AV1 2.1.0 just released, how does it compare to the previous version?",slug:"svt-av1-second-deep-dive",authors:[{name:"Trix",title:"Encoder",url:"https://github.com/trixoniisama/",image_url:"https://avatars.githubusercontent.com/u/93526043",imageURL:"https://avatars.githubusercontent.com/u/93526043"}],tags:["video","compression","benchmarks"],image:"/img/svt-2.1.0-testing-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"}},c={authorsImageUrls:[void 0]},l=[];function d(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,i.jsx)(t.p,{children:"SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips."})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.4b66c6e6.js b/assets/js/b4030b4d.4b66c6e6.js new file mode 100644 index 000000000..8219c0706 --- /dev/null +++ b/assets/js/b4030b4d.4b66c6e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{4557:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>u,toc:()=>d});var a=i(4848),o=i(8453),n=i(1470),s=i(9365);const r={title:"Aviator",sidebar_position:1},l="Aviator",u={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Matrix Coefficients",permalink:"/docs/colorimetry/matrix"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"aviator",children:"Aviator"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,a.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,a.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,a.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,a.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.A,{children:[(0,a.jsxs)(s.A,{value:"unixlike",label:"Linux",children:[(0,a.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,a.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,a.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,a.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,a.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,a.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,a.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,a.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,a.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,a.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,a.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,a.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,a.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,a.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,a.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,a.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,a.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,a.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,a.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,a.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,a.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,a.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,a.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,a.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,a.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,a.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,a.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,a.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,a.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,a.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,a.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,a.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,a.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,a.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,a.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,a.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>s});i(6540);var a=i(4164);const o={tabItem:"tabItem_Ymn6"};var n=i(4848);function s(e){let{children:t,hidden:i,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,a.A)(o.tabItem,s),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>A});var a=i(6540),o=i(4164),n=i(3104),s=i(6347),r=i(205),l=i(7485),u=i(1682),c=i(9466);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,a.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:i,attributes:a,default:o}}=e;return{value:t,label:i,attributes:a,default:o}}))}(i);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The 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 i??null}({queryString:t,groupId:i});return[(0,l.aZ)(n),(0,a.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:o}=e,n=h(e),[s,l]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=i.find((e=>e.default))??i[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:n}))),[u,d]=m({queryString:i,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,c.Dv)(i);return[o,(0,a.useCallback)((e=>{i&&n.set(e)}),[i,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),v(e)}),[d,v,n]),tabValues:n}}var v=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function y(e){let{className:t,block:i,selectedValue:a,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),c=e=>{const t=e.currentTarget,i=l.indexOf(t),o=r[i].value;o!==a&&(u(t),s(o))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":i},t),children:r.map((e=>{let{value:t,label:i,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:d,onClick:c,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":a===t}),children:i??t},t)}))})}function x(e){let{lazy:t,children:i,selectedValue:o}=e;const n=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=n.find((e=>e.props.value===o));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==o})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(y,{...t,...e}),(0,g.jsx)(x,{...t,...e})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:d(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var a=i(6540);const o={},n=a.createContext(o);function s(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.55b3e3ac.js b/assets/js/b4030b4d.55b3e3ac.js deleted file mode 100644 index ee8dcf05e..000000000 --- a/assets/js/b4030b4d.55b3e3ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{4557:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>u,toc:()=>c});var a=i(4848),o=i(8453),n=i(1470),s=i(9365);const r={title:"Aviator",sidebar_position:1},l="Aviator",u={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},d={},c=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"aviator",children:"Aviator"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,a.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,a.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,a.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,a.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.A,{children:[(0,a.jsxs)(s.A,{value:"unixlike",label:"Linux",children:[(0,a.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,a.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,a.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,a.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,a.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,a.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,a.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,a.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,a.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,a.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,a.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,a.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,a.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,a.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,a.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,a.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,a.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,a.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,a.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,a.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,a.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,a.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,a.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,a.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,a.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,a.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,a.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,a.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,a.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,a.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,a.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,a.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,a.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,a.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,a.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,a.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>s});i(6540);var a=i(4164);const o={tabItem:"tabItem_Ymn6"};var n=i(4848);function s(e){let{children:t,hidden:i,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,a.A)(o.tabItem,s),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>A});var a=i(6540),o=i(4164),n=i(3104),s=i(6347),r=i(205),l=i(7485),u=i(1682),d=i(9466);function c(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,a.useMemo)((()=>{const e=t??function(e){return c(e).map((e=>{let{props:{value:t,label:i,attributes:a,default:o}}=e;return{value:t,label:i,attributes:a,default:o}}))}(i);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The 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 i??null}({queryString:t,groupId:i});return[(0,l.aZ)(n),(0,a.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:o}=e,n=h(e),[s,l]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=i.find((e=>e.default))??i[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:n}))),[u,c]=m({queryString:i,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,d.Dv)(i);return[o,(0,a.useCallback)((e=>{i&&n.set(e)}),[i,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),v(e)}),[c,v,n]),tabValues:n}}var v=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function y(e){let{className:t,block:i,selectedValue:a,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),o=r[i].value;o!==a&&(u(t),s(o))},c=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":i},t),children:r.map((e=>{let{value:t,label:i,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:c,onClick:d,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":a===t}),children:i??t},t)}))})}function x(e){let{lazy:t,children:i,selectedValue:o}=e;const n=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=n.find((e=>e.props.value===o));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==o})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(y,{...t,...e}),(0,g.jsx)(x,{...t,...e})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:c(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var a=i(6540);const o={},n=a.createContext(o);function s(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8af02bf.e7886f70.js b/assets/js/b8af02bf.34f376f2.js similarity index 97% rename from assets/js/b8af02bf.e7886f70.js rename to assets/js/b8af02bf.34f376f2.js index 9819e24f2..6acd3f15f 100644 --- a/assets/js/b8af02bf.e7886f70.js +++ b/assets/js/b8af02bf.34f376f2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{5967:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const s={title:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var o=t(6540);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{8348:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const s={title:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var o=t(6540);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d96727fd.2dea97a9.js b/assets/js/d96727fd.2dea97a9.js new file mode 100644 index 000000000..82908a999 --- /dev/null +++ b/assets/js/d96727fd.2dea97a9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1500],{2301:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>o});var t=i(4848),s=i(8453);const a={title:"Matrix Coefficients",sidebar_position:6},r="Matrix Coefficients",l={id:"colorimetry/matrix",title:"Matrix Coefficients",description:"Matrix coefficients represent the multiplication matrix that is used when",source:"@site/docs/colorimetry/matrix.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/matrix",permalink:"/docs/colorimetry/matrix",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/matrix.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Matrix Coefficients",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Transfer Characteristics",permalink:"/docs/colorimetry/transfer"},next:{title:"Aviator",permalink:"/docs/utilities/Aviator"}},c={},o=[{value:"0: Identity",id:"0-identity",level:3},{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: YCgCo",id:"8-ycgco",level:3},{value:"9: BT.2020 Non-Constant Luminance",id:"9-bt2020-non-constant-luminance",level:3},{value:"10: BT.2020 Constant Luminance",id:"10-bt2020-constant-luminance",level:3},{value:"11: SMPTE 2085",id:"11-smpte-2085",level:3},{value:"12: Chromaticity-Derived Non-Constant Luminance",id:"12-chromaticity-derived-non-constant-luminance",level:3},{value:"13: Chromaticity-Derived Constant Luminance",id:"13-chromaticity-derived-constant-luminance",level:3},{value:"14: ICtCp",id:"14-ictcp",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"matrix-coefficients",children:"Matrix Coefficients"}),"\n",(0,t.jsx)(n.p,{children:"Matrix coefficients represent the multiplication matrix that is used when\nconverting from YUV to RGB. As with primaries, the integer values are defined\nwithin universal specifications, and as such they will be the same across all\nencoding and playback tools."}),"\n",(0,t.jsx)(n.p,{children:"The following values are available:"}),"\n",(0,t.jsx)(n.h3,{id:"0-identity",children:"0: Identity"}),"\n",(0,t.jsx)(n.p,{children:"Specifies that the identity matrix should be used, i.e. this data is already in an RGB-compatible colorspace."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"GBR (often referred to as RGB)"}),"\n",(0,t.jsx)(n.li,{children:"YZX (often referred to as XYZ)"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-1 sRGB"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE ST 428-1 (2019)"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,t.jsx)(n.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut system and extended colour\ngamut system (historical)"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC709"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,t.jsx)(n.p,{children:"This value indicates that no color matrix is set for the video, and the player must decide which value to use."}),"\n",(0,t.jsx)(n.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'if width >= 1280 || height > 576 {\n "BT.709"\n} else {\n "SMPTE 170M"\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,t.jsx)(n.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,t.jsx)(n.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,t.jsx)(n.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-1 sYCC"}),"\n",(0,t.jsx)(n.li,{children:"IEC 61966-2-4 xvYCC601"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its matrix coefficients are equivalent to BT.470BG."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,t.jsx)(n.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,t.jsx)(n.h3,{id:"8-ycgco",children:"8: YCgCo"}),"\n",(0,t.jsx)(n.p,{children:"The YCoCg color model, also known as the YCgCo color model,\nis the color space formed from a simple transformation of\nan associated RGB color space into a luma value and\ntwo chroma values called chrominance green and chrominance orange."}),"\n",(0,t.jsx)(n.h3,{id:"9-bt2020-non-constant-luminance",children:"9: BT.2020 Non-Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics. If you do not know if you want non-constant or constant luminance, you probably want non-constant."}),"\n",(0,t.jsx)(n.p,{children:"This matrix coefficient setting is used in the following standards:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.2020-2 (non-constant luminance)"}),"\n",(0,t.jsx)(n.li,{children:"Rec. ITU-R BT.2100-2 Y\u2032CbCr"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"10-bt2020-constant-luminance",children:"10: BT.2020 Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"This is a variant of BT.2020 with constant luminance values, represented using the YcCbcCrc colorspace. You probably want the non-constant luminance variant instead, unless you know you want this one."}),"\n",(0,t.jsx)(n.h3,{id:"11-smpte-2085",children:"11: SMPTE 2085"}),"\n",(0,t.jsx)(n.p,{children:"SMPTE 2085 is a standard used with HDR signals in the XYZ colorspace. I've never actually seen it used in the wild."}),"\n",(0,t.jsx)(n.h3,{id:"12-chromaticity-derived-non-constant-luminance",children:"12: Chromaticity-Derived Non-Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,t.jsx)(n.h3,{id:"13-chromaticity-derived-constant-luminance",children:"13: Chromaticity-Derived Constant Luminance"}),"\n",(0,t.jsx)(n.p,{children:"I'm not really sure when you would use this."}),"\n",(0,t.jsx)(n.h3,{id:"14-ictcp",children:"14: ICtCp"}),"\n",(0,t.jsx)(n.p,{children:"ICtCp is an alternative colorspace developed for use with HDR and wide gamut video, by Dolby because they love doing extra stuff like this. I've never actually seen it used in the wild."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(6540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);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(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1a437f7.a1a369c7.js b/assets/js/e1a437f7.a2870dea.js similarity index 97% rename from assets/js/e1a437f7.a1a369c7.js rename to assets/js/e1a437f7.a2870dea.js index 6a86e3a16..94923f4b3 100644 --- a/assets/js/e1a437f7.a1a369c7.js +++ b/assets/js/e1a437f7.a2870dea.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9381],{8690:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=i(4848),o=i(8453);const s={title:"bzip2",sidebar_position:3},a="bzip2",r={id:"data/bzip2",title:"bzip2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/bzip2.mdx",sourceDirName:"data",slug:"/data/bzip2",permalink:"/docs/data/bzip2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"bzip2",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"gzip",permalink:"/docs/data/gzip"},next:{title:"7z",permalink:"/docs/data/7z"}},c={},d=[];function l(t){const e={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"bzip2",children:"bzip2"}),"\n",(0,n.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(e.p,{children:["bzip2 is a open source file compression format and utility. It's efficency is slightly better than ",(0,n.jsx)(e.a,{href:"/docs/data/zip",children:"zip"}),", but worse than lzma based formats like ",(0,n.jsx)(e.a,{href:"/docs/data/xz",children:"xz"})," and ",(0,n.jsx)(e.a,{href:"/docs/data/7z",children:"7z"}),". bzip2 cannot be used to compress mutliple files at once, you should collate files together into a ",(0,n.jsx)(e.a,{href:"/docs/data/tar",children:"tarball"})," to compress mutliple files using bzip2."]})]})}function p(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(l,{...t})}):l(t)}},8453:(t,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(t){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),n.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9381],{6309:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var n=i(4848),o=i(8453);const s={title:"bzip2",sidebar_position:3},a="bzip2",r={id:"data/bzip2",title:"bzip2",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/bzip2.mdx",sourceDirName:"data",slug:"/data/bzip2",permalink:"/docs/data/bzip2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/bzip2.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"bzip2",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"gzip",permalink:"/docs/data/gzip"},next:{title:"7z",permalink:"/docs/data/7z"}},c={},d=[];function l(t){const e={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"bzip2",children:"bzip2"}),"\n",(0,n.jsx)(e.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(e.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(e.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(e.p,{children:["bzip2 is a open source file compression format and utility. It's efficency is slightly better than ",(0,n.jsx)(e.a,{href:"/docs/data/zip",children:"zip"}),", but worse than lzma based formats like ",(0,n.jsx)(e.a,{href:"/docs/data/xz",children:"xz"})," and ",(0,n.jsx)(e.a,{href:"/docs/data/7z",children:"7z"}),". bzip2 cannot be used to compress mutliple files at once, you should collate files together into a ",(0,n.jsx)(e.a,{href:"/docs/data/tar",children:"tarball"})," to compress mutliple files using bzip2."]})]})}function p(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(l,{...t})}):l(t)}},8453:(t,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var n=i(6540);const o={},s=n.createContext(o);function a(t){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),n.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/edaea366.e58187a3.js b/assets/js/edaea366.e58187a3.js new file mode 100644 index 000000000..27275f917 --- /dev/null +++ b/assets/js/edaea366.e58187a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7978],{1799:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=n(4848),t=n(8453);const r={title:"Transfer Characteristics",sidebar_position:5},a="Transfer Characteristics",l={id:"colorimetry/transfer",title:"Transfer Characteristics",description:"Transfer characteristics, also known as transfer functions, represent the",source:"@site/docs/colorimetry/transfer.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/transfer",permalink:"/docs/colorimetry/transfer",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/transfer.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Transfer Characteristics",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Color Primaries",permalink:"/docs/colorimetry/primaries"},next:{title:"Matrix Coefficients",permalink:"/docs/colorimetry/matrix"}},o={},d=[{value:"1: BT.1886",id:"1-bt1886",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Linear",id:"8-linear",level:3},{value:"9: Logarithmic 100",id:"9-logarithmic-100",level:3},{value:"10: Logarithmic 316",id:"10-logarithmic-316",level:3},{value:"11: XVYCC",id:"11-xvycc",level:3},{value:"12: BT.1361E",id:"12-bt1361e",level:3},{value:"13: sRGB",id:"13-srgb",level:3},{value:"14: BT.2020 10-bit",id:"14-bt2020-10-bit",level:3},{value:"15: BT.2020 12-bit",id:"15-bt2020-12-bit",level:3},{value:"16: PQ aka SMPTE 2084",id:"16-pq-aka-smpte-2084",level:3},{value:"17: SMPTE 428",id:"17-smpte-428",level:3},{value:"18: HLG aka Hybrid Log-Gamma",id:"18-hlg-aka-hybrid-log-gamma",level:3}];function c(e){const i={h1:"h1",h3:"h3",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"transfer-characteristics",children:"Transfer Characteristics"}),"\n",(0,s.jsx)(i.p,{children:"Transfer characteristics, also known as transfer functions, represent the\ngamma function of a video--that is, how to convert from a gamma-compressed\nvideo to one that is in linear light. These are sometimes also called EOTF\nand OETF functions."}),"\n",(0,s.jsx)(i.p,{children:"As with primaries, the integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,s.jsx)(i.p,{children:"The following values are available:"}),"\n",(0,s.jsx)(i.h3,{id:"1-bt1886",children:"1: BT.1886"}),"\n",(0,s.jsx)(i.p,{children:"BT.1886 is the standard used for most modern, SDR video, and is a safe default assumption."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional\ncolour gamut system (historical)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that no transfer function is set for the video, and the player must decide which value to use."}),"\n",(0,s.jsx)(i.p,{children:"mpv will always assume BT.1886 in this case."}),"\n",(0,s.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,s.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States. This transfer represents a power function with a gamma of 2.2."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M\n(historical)"}),"\n",(0,s.jsx)(i.li,{children:"United States National Television\nSystem Committee 1953\nRecommendation for transmission\nstandards for color television"}),"\n",(0,s.jsx)(i.li,{children:"United States Federal Communications\nCommission (2003) Title 47 Code of\nFederal Regulations 73.682 (a) (20)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and\n625 SECAM"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,s.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs. This transfer represents a power function with a gamma of 2.8."}),"\n",(0,s.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 170M is a stanrard that was used for NTSC television systems and DVDs. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525 or 625"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625\n(historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,s.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998)."}),"\n",(0,s.jsx)(i.h3,{id:"8-linear",children:"8: Linear"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that the content is already in linear light."}),"\n",(0,s.jsx)(i.h3,{id:"9-logarithmic-100",children:"9: Logarithmic 100"}),"\n",(0,s.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a 100:1 range."}),"\n",(0,s.jsx)(i.h3,{id:"10-logarithmic-316",children:"10: Logarithmic 316"}),"\n",(0,s.jsx)(i.p,{children:"Indicates a logarithmic transfer function with a (100 * sqrt(10)):1 range."}),"\n",(0,s.jsx)(i.h3,{id:"11-xvycc",children:"11: XVYCC"}),"\n",(0,s.jsx)(i.p,{children:"Used in standard IEC 61966-2-4. I have no idea what this actually is."}),"\n",(0,s.jsx)(i.h3,{id:"12-bt1361e",children:"12: BT.1361E"}),"\n",(0,s.jsx)(i.p,{children:'This was intended to be a standard for "future" television systems, but it never really came into use.'}),"\n",(0,s.jsx)(i.h3,{id:"13-srgb",children:"13: sRGB"}),"\n",(0,s.jsx)(i.p,{children:"Represents the sRGB colorspace."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sRGB (with\nMatrixCoefficients equal to 0)"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sYCC (with\nMatrixCoefficients equal to 5)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"14-bt2020-10-bit",children:"14: BT.2020 10-bit"}),"\n",(0,s.jsx)(i.p,{children:"Typically used with ultra-high-definition 10-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.h3,{id:"15-bt2020-12-bit",children:"15: BT.2020 12-bit"}),"\n",(0,s.jsx)(i.p,{children:"Typically used with ultra-high-definition 12-bit SDR video. Its transfer function is equivalent to BT.1886."}),"\n",(0,s.jsx)(i.h3,{id:"16-pq-aka-smpte-2084",children:"16: PQ aka SMPTE 2084"}),"\n",(0,s.jsx)(i.p,{children:"PQ is the most widely used transfer function for HDR content. It allows for a wider range of luminance to be represented than conventional transfer functions."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"SMPTE ST 2084 (2014) for 10-, 12-,\n14- and 16-bit systems"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 perceptual\nquantization (PQ) system"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"17-smpte-428",children:"17: SMPTE 428"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,s.jsx)(i.h3,{id:"18-hlg-aka-hybrid-log-gamma",children:"18: HLG aka Hybrid Log-Gamma"}),"\n",(0,s.jsx)(i.p,{children:"HLG is an alternative transfer function for HDR content used by some televisions."}),"\n",(0,s.jsx)(i.p,{children:"This transfer function is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"ARIB STD-B67 (2015)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2 hybrid log-\ngamma (HLG) system"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>l});var s=n(6540);const t={},r=s.createContext(t);function a(e){const i=s.useContext(r);return s.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(t):e.components||t:a(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fda0af90.cb7232d3.js b/assets/js/fda0af90.cb7232d3.js new file mode 100644 index 000000000..302084625 --- /dev/null +++ b/assets/js/fda0af90.cb7232d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5376],{4426:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),t=n(8453);const r={title:"Color Primaries",sidebar_position:4},l="Color Primaries",a={id:"colorimetry/primaries",title:"Color Primaries",description:"This section details the first of three settings that are important",source:"@site/docs/colorimetry/primaries.mdx",sourceDirName:"colorimetry",slug:"/colorimetry/primaries",permalink:"/docs/colorimetry/primaries",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/colorimetry/primaries.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Color Primaries",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Color Range",permalink:"/docs/colorimetry/range"},next:{title:"Transfer Characteristics",permalink:"/docs/colorimetry/transfer"}},o={},d=[{value:"1: BT.709",id:"1-bt709",level:3},{value:"2: Unspecified",id:"2-unspecified",level:3},{value:"4: BT.470M",id:"4-bt470m",level:3},{value:"5: BT.470BG",id:"5-bt470bg",level:3},{value:"6: SMPTE 170M",id:"6-smpte-170m",level:3},{value:"7: SMPTE 240M",id:"7-smpte-240m",level:3},{value:"8: Film",id:"8-film",level:3},{value:"9: BT.2020",id:"9-bt2020",level:3},{value:"10: SMPTE 428",id:"10-smpte-428",level:3},{value:"11: DCI-P3",id:"11-dci-p3",level:3},{value:"12: Display-P3",id:"12-display-p3",level:3},{value:"22: EBU Tech 3213",id:"22-ebu-tech-3213",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"color-primaries",children:"Color Primaries"}),"\n",(0,s.jsx)(i.p,{children:"This section details the first of three settings that are important\nfor retaining accurate color when encoding videos, those settings\nbeing primaries, color matrix, and transfer characteristics."}),"\n",(0,s.jsxs)(i.p,{children:["Color primaries are used to indicate the correct coordinates for the\nred, blue, and green colors. There are historical reasons for\n",(0,s.jsx)(i.a,{href:"https://xkcd.com/927/",children:"why so many standards exist"}),", and this guide\nwill not go in depth into history lessons, but will explain what\nprimaries are available and when to use each one."]}),"\n",(0,s.jsxs)(i.p,{children:["Note that for primaries, matrices, and transfer, you can view the values\nthat are set on a video using a tool like ",(0,s.jsx)(i.a,{href:"https://mediaarea.net/en/MediaInfo",children:"MediaInfo"}),".\nIf there are no values set, the player will need to guess which values\nto use. A safe default assumption for most modern videos is BT.709,\nalthough this may vary depending on source and resolution for the video.\nIt is strongly recommended to set the correct values when encoding."]}),"\n",(0,s.jsx)(i.p,{children:"Each setting has at least one name and exactly one integer value\nrepresenting it--most encoder softwares will accept one or more of the names,\nbut some tooling such as Vapoursynth and MKVToolnix accepts the integer values\ninstead. The integer values are defined within universal specifications,\nand as such they will be the same across all encoding and playback tools."}),"\n",(0,s.jsx)(i.h3,{id:"1-bt709",children:"1: BT.709"}),"\n",(0,s.jsx)(i.p,{children:"BT.709 is the standard used for modern high-definition video, and is a safe default assumption."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.709-6"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1361-0 conventional colour gamut\nsystem and extended colour gamut system (historical)"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-1 sRGB or sYCC"}),"\n",(0,s.jsx)(i.li,{children:"IEC 61966-2-4"}),"\n",(0,s.jsx)(i.li,{children:"Society of Motion Picture and Television Engineers\n(SMPTE) RP 177 (1993) Annex B"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"2-unspecified",children:"2: Unspecified"}),"\n",(0,s.jsx)(i.p,{children:"This value indicates that no color primary is set for the video, and the player must decide which value to use."}),"\n",(0,s.jsx)(i.p,{children:"mpv will use the following heuristics in this case:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'if matrix == "BT.2020" {\n "BT.2020"\n} else if matrix == "BT.709" {\n "BT.709"\n} else if width >= 1280 || height > 576 {\n "BT.709"\n} else if height == 576 {\n "BT.470BG"\n} else if height == 480 || height == 488 {\n "SMPTE 170M"\n} else {\n "BT.709"\n}\n'})}),"\n",(0,s.jsx)(i.h3,{id:"4-bt470m",children:"4: BT.470M"}),"\n",(0,s.jsx)(i.p,{children:"BT.470M is a standard that was used in analog television systems in the United States."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System M (historical)"}),"\n",(0,s.jsx)(i.li,{children:"United States National Television System Committee\n1953 Recommendation for transmission standards for\ncolor television"}),"\n",(0,s.jsx)(i.li,{children:"United States Federal Communications Commission\n(2003) Title 47 Code of Federal Regulations 73.682 (a) (20)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"5-bt470bg",children:"5: BT.470BG"}),"\n",(0,s.jsx)(i.p,{children:"BT.470BG is a standard that was used for European (PAL) television systems and DVDs."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.470-6 System B, G (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 625"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-0 625 (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"6-smpte-170m",children:"6: SMPTE 170M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 170M is a standard that was used for NTSC television systems and DVDs."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.601-7 525"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1358-1 525 or 625 (historical)"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.1700-0 NTSC"}),"\n",(0,s.jsx)(i.li,{children:"SMPTE ST 170 (2004)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"7-smpte-240m",children:"7: SMPTE 240M"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 240M was an interim standard used during the early days of HDTV (1988-1998). Its primaries are equivalent to SMPTE 170M."}),"\n",(0,s.jsx)(i.h3,{id:"8-film",children:"8: Film"}),"\n",(0,s.jsx)(i.p,{children:"This represents generic film using Illuminant C."}),"\n",(0,s.jsx)(i.h3,{id:"9-bt2020",children:"9: BT.2020"}),"\n",(0,s.jsx)(i.p,{children:"BT.2020 is a standard used for ultra-high-definition video, i.e. 4K and higher. It may be used with or without HDR, as HDR is defined by the transfer characteristics."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2020-2"}),"\n",(0,s.jsx)(i.li,{children:"Rec. ITU-R BT.2100-2"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"10-smpte-428",children:"10: SMPTE 428"}),"\n",(0,s.jsx)(i.p,{children:"SMPTE 428 is used for D-Cinema Distribution Masters, aka DCDM."}),"\n",(0,s.jsx)(i.p,{children:"This color primary setting is used in the following standards:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"SMPTE ST 428-1 (2019)"}),"\n",(0,s.jsx)(i.li,{children:"(CIE 1931 XYZ as in ISO 11664-1)"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"11-dci-p3",children:"11: DCI-P3"}),"\n",(0,s.jsx)(i.p,{children:"DCI-P3 is a wide-gamut colorspace used alongside RGB. It is used internally by most HDR monitors on the market."}),"\n",(0,s.jsx)(i.h3,{id:"12-display-p3",children:"12: Display-P3"}),"\n",(0,s.jsx)(i.p,{children:"Display-P3 is a variant of DCI-P3 developed by Apple because they wanted to be different."}),"\n",(0,s.jsx)(i.h3,{id:"22-ebu-tech-3213",children:"22: EBU Tech 3213"}),"\n",(0,s.jsx)(i.p,{children:"Nobody really knows what this is."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>a});var s=n(6540);const t={},r=s.createContext(t);function l(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.5078de37.js b/assets/js/main.5078de37.js new file mode 100644 index 000000000..01da25fa7 --- /dev/null +++ b/assets/js/main.5078de37.js @@ -0,0 +1,2 @@ +/*! For license information please see main.5078de37.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8792],{5391:(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))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0092d9fd":[()=>n.e(9057).then(n.bind(n,7039)),"@site/docs/audio/FLAC.mdx",7039],"015d9d66":[()=>n.e(4598).then(n.bind(n,8861)),"@site/docs/metrics/PSNR.mdx",8861],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"03af419f":[()=>Promise.all([n.e(1869),n.e(9305)]).then(n.bind(n,5702)),"@site/docs/encoders/VVenC.mdx",5702],"03e95fdf":[()=>n.e(3485).then(n.bind(n,7476)),"@site/docs/video/VP8.mdx",7476],"059e36ab":[()=>n.e(6838).then(n.bind(n,722)),"@site/docs/video/utvideo.mdx",722],"0630e3af":[()=>n.e(2041).then(n.t.bind(n,9752,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-benchmarks-e1b.json",9752],"06ed4e86":[()=>n.e(8161).then(n.bind(n,511)),"@site/docs/audio/Dolby.mdx",511],"09a8bfdb":[()=>n.e(5579).then(n.bind(n,1689)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",1689],"09bc817a":[()=>n.e(1554).then(n.bind(n,2120)),"@site/docs/audio/Opus.mdx",2120],"0b185270":[()=>n.e(3482).then(n.bind(n,5754)),"@site/docs/FAQ.mdx",5754],"0c06159a":[()=>n.e(8258).then(n.bind(n,5420)),"@site/docs/data/tar.mdx",5420],"0e7f53a8":[()=>n.e(9954).then(n.bind(n,970)),"@site/docs/images/PNG.mdx",970],"112763a5":[()=>n.e(1779).then(n.bind(n,9503)),"@site/docs/terms-of-use.mdx",9503],"12b076f3":[()=>n.e(7222).then(n.bind(n,5340)),"@site/docs/data/zstd.mdx",5340],"12df3b9e":[()=>n.e(9993).then(n.bind(n,4154)),"@site/docs/images/QOI.mdx",4154],"138e0e15":[()=>n.e(4921).then(n.t.bind(n,1597,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",1597],17896441:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8401)]).then(n.bind(n,2447)),"@theme/DocItem",2447],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,1283)),"@theme/SearchPage",1283],"1b67d0f3":[()=>n.e(842).then(n.bind(n,6825)),"@site/docs/data/gzip.mdx",6825],"1ca2b1db":[()=>n.e(7855).then(n.bind(n,6054)),"@site/docs/encoders_hw/mediacodec.mdx",6054],"1ec3ce74":[()=>Promise.all([n.e(1869),n.e(2142)]).then(n.bind(n,4187)),"@site/docs/encoders/rav1e.mdx",4187],"1f227c78":[()=>n.e(2761).then(n.bind(n,6015)),"@site/docs/filtering/detelecine.mdx",6015],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(8498),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"1fabe0bd":[()=>n.e(5562).then(n.bind(n,8942)),"@site/docs/colorimetry/intro.mdx",8942],"20d769d8":[()=>n.e(3121).then(n.bind(n,7114)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx?truncated=true",7114],"229f7513":[()=>n.e(7146).then(n.bind(n,606)),"@site/docs/subtitles/webvtt.mdx",606],"25003e4f":[()=>n.e(2838).then(n.t.bind(n,4351,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-80c.json",4351],"28bd9d7a":[()=>n.e(888).then(n.bind(n,3560)),"@site/docs/utilities/FFMetrics.mdx",3560],"299beccc":[()=>n.e(5479).then(n.bind(n,1882)),"@site/docs/data/7z.mdx",1882],"2d25ac87":[()=>n.e(5949).then(n.bind(n,1449)),"@site/docs/utilities/autocompressor.mdx",1449],"318608aa":[()=>Promise.all([n.e(1869),n.e(6003)]).then(n.bind(n,1306)),"@site/docs/encoders/vpxenc.mdx",1306],32987299:[()=>n.e(7754).then(n.bind(n,6820)),"@site/docs/filtering/vapoursynth.mdx",6820],"345ef4f9":[()=>n.e(6509).then(n.bind(n,7410)),"@site/docs/utilities/MKVToolNix.mdx",7410],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"37c719d6":[()=>Promise.all([n.e(1599),n.e(1227)]).then(n.bind(n,9168)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",9168],"3d6cf458":[()=>n.e(2614).then(n.bind(n,7075)),"@site/docs/video/VC-1.mdx",7075],"41756ce8":[()=>n.e(9616).then(n.t.bind(n,5205,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-037.json",5205],"44e37655":[()=>Promise.all([n.e(1869),n.e(5958)]).then(n.bind(n,962)),"@site/docs/metrics/SSIMULACRA2.mdx",962],"45f4020c":[()=>n.e(4897).then(n.bind(n,1806)),"@site/docs/encoders_hw/videotoolbox.mdx",1806],"48b7ca01":[()=>Promise.all([n.e(1599),n.e(1347)]).then(n.bind(n,9350)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx?truncated=true",9350],"49b64d14":[()=>Promise.all([n.e(1869),n.e(5993)]).then(n.bind(n,7490)),"@site/docs/encoders/SVT-AV1.mdx",7490],"4c678320":[()=>n.e(9664).then(n.bind(n,2262)),"@site/src/pages/markdown-page.mdx",2262],"4d877b09":[()=>n.e(2150).then(n.bind(n,6780)),"@site/docs/encoders_hw/qsv.mdx",6780],"522a92e3":[()=>n.e(5220).then(n.bind(n,1542)),"@site/docs/encoders_hw/nvenc.mdx",1542],"53a3e6dc":[()=>n.e(6261).then(n.t.bind(n,922,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-c06.json",922],"54a9c2bb":[()=>n.e(561).then(n.bind(n,8490)),"@site/docs/utilities/YUView.mdx",8490],56786013:[()=>n.e(8741).then(n.bind(n,9449)),"@site/docs/images/JPEG.mdx",9449],"5b209502":[()=>n.e(4176).then(n.bind(n,4817)),"@site/docs/filtering/deinterlace.mdx",4817],"5c30ba71":[()=>n.e(3549).then(n.t.bind(n,9406,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-compression-c1f.json",9406],"5d1a7e8b":[()=>n.e(5936).then(n.bind(n,5826)),"@site/docs/video-players.mdx",5826],"5db6705b":[()=>n.e(1624).then(n.bind(n,5529)),"@site/docs/utilities/nmkoder.mdx",5529],"5e069031":[()=>n.e(5968).then(n.bind(n,6398)),"@site/docs/introduction/prologue.mdx",6398],"5e1194df":[()=>n.e(4822).then(n.bind(n,7633)),"@site/docs/data/zpaq.mdx",7633],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ec46d54":[()=>n.e(1481).then(n.bind(n,3844)),"@site/docs/video/ECM.mdx",3844],"5f74c797":[()=>Promise.all([n.e(1869),n.e(5745)]).then(n.bind(n,2316)),"@site/docs/utilities/av1an.mdx",2316],"60d0076e":[()=>n.e(7613).then(n.bind(n,1483)),"@site/docs/filtering/intro.mdx",1483],"632d0ef1":[()=>n.e(106).then(n.bind(n,9497)),"@site/docs/encoders/VTM.mdx",9497],"6549b2b5":[()=>n.e(4846).then(n.bind(n,2417)),"@site/blog/2023-07-21-site-optimization.mdx",2417],"6875c492":[()=>Promise.all([n.e(1869),n.e(8498),n.e(3242),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"6bf0f114":[()=>n.e(881).then(n.bind(n,6020)),"@site/docs/data/zip.mdx",6020],"6c179ac5":[()=>n.e(4072).then(n.bind(n,4603)),"@site/docs/video/Theora.mdx",4603],"6d85920a":[()=>n.e(7800).then(n.bind(n,624)),"@site/docs/introduction/terminology.mdx",624],70006292:[()=>n.e(9987).then(n.bind(n,7978)),"@site/docs/encoders/x266.mdx",7978],"70de1c07":[()=>Promise.all([n.e(1599),n.e(544)]).then(n.bind(n,850)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",850],"7385c97b":[()=>n.e(8415).then(n.bind(n,975)),"@site/docs/images/AVIF.mdx",975],"76096a15":[()=>n.e(8924).then(n.bind(n,9101)),"@site/docs/subtitles/SRT.mdx",9101],"7c110bd0":[()=>n.e(6877).then(n.t.bind(n,2614,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-b5f.json",2614],"7d09a242":[()=>Promise.all([n.e(1869),n.e(6692)]).then(n.bind(n,1991)),"@site/docs/encoders/aomenc.mdx",1991],"7eff0f1a":[()=>n.e(2515).then(n.bind(n,4802)),"@site/docs/video/AVC.mdx",4802],"7f76a12e":[()=>n.e(1502).then(n.bind(n,2225)),"@site/blog/2023-09-03-av1-for-dummies.mdx",2225],"7fa695a7":[()=>n.e(1363).then(n.bind(n,3041)),"@site/docs/images/GIF.mdx",3041],80447496:[()=>n.e(7715).then(n.bind(n,6477)),"@site/docs/video/VVC.mdx",6477],"80bfa96b":[()=>n.e(2901).then(n.bind(n,9553)),"@site/docs/resources.mdx",9553],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],81739261:[()=>n.e(4794).then(n.bind(n,8089)),"@site/docs/video/prores.mdx",8089],"83732ada":[()=>n.e(6840).then(n.bind(n,7860)),"@site/docs/video/HEVC.mdx",7860],"842a7beb":[()=>n.e(6866).then(n.bind(n,5227)),"@site/docs/utilities/rAV1ator.mdx",5227],"84e198a2":[()=>n.e(6711).then(n.bind(n,80)),"@site/docs/utilities/eac3to.mdx",80],"86ba2311":[()=>n.e(8141).then(n.bind(n,1577)),"@site/docs/video/VP9.mdx",1577],"8a894f7b":[()=>n.e(538).then(n.bind(n,9990)),"@site/docs/introduction/video-artifacts.mdx",9990],"8aacd032":[()=>n.e(2897).then(n.bind(n,9592)),"@site/docs/video/AV1.mdx",9592],"8bdabb45":[()=>n.e(7957).then(n.bind(n,6476)),"@site/docs/encoders/AVM.mdx",6476],"8eb2df80":[()=>Promise.all([n.e(1869),n.e(7796)]).then(n.bind(n,4582)),"@site/docs/utilities/rav1ator-cli.mdx",4582],"8f6f5e4c":[()=>n.e(8760).then(n.bind(n,9483)),"@site/docs/colorimetry/format.mdx",9483],"9060e84a":[()=>n.e(8320).then(n.bind(n,1705)),"@site/docs/encoders/HM.mdx",1705],"90aedb84":[()=>n.e(1691).then(n.bind(n,8909)),"@site/docs/introduction/psychovisual.mdx",8909],"915a111c":[()=>n.e(5889).then(n.bind(n,2622)),"@site/docs/filtering/dehalo.mdx",2622],"94782d2d":[()=>n.e(4597).then(n.bind(n,4039)),"@site/docs/colorimetry/range.mdx",4039],"998d107e":[()=>n.e(274).then(n.bind(n,1083)),"@site/docs/video/FFV1.mdx",1083],"99c26446":[()=>n.e(8026).then(n.bind(n,698)),"@site/docs/metrics/butteraugli.mdx",698],"9ba56b79":[()=>n.e(1288).then(n.bind(n,3578)),"@site/docs/encoders_hw/amf.mdx",3578],"9c171e5c":[()=>n.e(8773).then(n.bind(n,6854)),"@site/docs/metrics/SSIM.mdx",6854],"9cae5962":[()=>Promise.all([n.e(1869),n.e(71)]).then(n.bind(n,149)),"@site/docs/images/JXL.mdx",149],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9efd8a4a":[()=>n.e(5415).then(n.bind(n,3885)),"@site/docs/images/WebP.mdx",3885],"9f640ee8":[()=>n.e(6810).then(n.bind(n,5811)),"@site/docs/encoders/Aurora1.mdx",5811],"9f709603":[()=>n.e(5341).then(n.bind(n,2925)),"@site/docs/filtering/deband.mdx",2925],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8498),n.e(3242),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],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,4532)),"@theme/DocVersionRoot",4532],a8f610c9:[()=>n.e(8599).then(n.bind(n,753)),"@site/docs/data/brotli.mdx",753],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],aba90f67:[()=>n.e(1387).then(n.t.bind(n,2074,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-ee6.json",2074],ac6a717f:[()=>n.e(7295).then(n.t.bind(n,5069,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-video-835.json",5069],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],afe5e22f:[()=>n.e(8117).then(n.bind(n,9765)),"@site/docs/encoders/x265.mdx",9765],b0535000:[()=>n.e(7238).then(n.bind(n,851)),"@site/blog/2023-07-21-site-optimization.mdx?truncated=true",851],b261517a:[()=>Promise.all([n.e(1599),n.e(1454)]).then(n.bind(n,3012)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx?truncated=true",3012],b4030b4d:[()=>Promise.all([n.e(1869),n.e(3408)]).then(n.bind(n,4557)),"@site/docs/utilities/Aviator.mdx",4557],b4bbde8e:[()=>n.e(7989).then(n.bind(n,7128)),"@site/docs/audio/AAC.mdx",7128],b59b8cf7:[()=>n.e(1271).then(n.bind(n,7592)),"@site/docs/audio/Vorbis.mdx",7592],b8af02bf:[()=>n.e(3222).then(n.bind(n,8348)),"@site/docs/images/JPEG2000.mdx",8348],bc32b9c5:[()=>n.e(786).then(n.bind(n,1839)),"@site/docs/metrics/XPSNR.mdx",1839],bd173b27:[()=>n.e(1651).then(n.bind(n,8647)),"@site/docs/data/xz.mdx",8647],be236901:[()=>n.e(6795).then(n.bind(n,5349)),"@site/docs/contribution-guide.mdx",5349],bf9d09b6:[()=>Promise.all([n.e(1869),n.e(8270)]).then(n.bind(n,9094)),"@site/docs/encoders/SVT-HEVC.mdx",9094],c224274c:[()=>n.e(3356).then(n.bind(n,4372)),"@site/docs/video/AVS3.mdx",4372],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,1459)),"@site/src/pages/index.js",1459],c7deb2e0:[()=>n.e(9551).then(n.bind(n,7868)),"@site/docs/audio/WavPack.mdx",7868],c92fe796:[()=>n.e(3034).then(n.bind(n,6264)),"@site/docs/utilities/ffmpeg.mdx",6264],c943a24a:[()=>n.e(5512).then(n.bind(n,4421)),"@site/docs/introduction/high-dynamic-range.mdx",4421],ccc49370:[()=>Promise.all([n.e(1869),n.e(8498),n.e(3242),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cce09ffa:[()=>n.e(5556).then(n.bind(n,1939)),"@site/blog/2023-09-03-av1-for-dummies.mdx?truncated=true",1939],cd6cf5b7:[()=>n.e(5365).then(n.bind(n,4203)),"@site/docs/encoders/SVT-VP9.mdx",4203],ce98a713:[()=>n.e(6168).then(n.bind(n,8448)),"@site/docs/filtering/denoise.mdx",8448],cf7588c6:[()=>n.e(5971).then(n.bind(n,9520)),"@site/docs/encoders/x264.mdx",9520],d1becb09:[()=>n.e(8843).then(n.bind(n,7519)),"@site/docs/privacy-policy.mdx",7519],d5ab79da:[()=>n.e(8382).then(n.bind(n,9419)),"@site/docs/audio/MP3.mdx",9419],d5f89569:[()=>n.e(1401).then(n.bind(n,2348)),"@site/docs/encoders/Kvazaar.mdx",2348],d6535278:[()=>Promise.all([n.e(1869),n.e(6977)]).then(n.bind(n,3096)),"@site/docs/metrics/VMAF.mdx",3096],d96727fd:[()=>n.e(1500).then(n.bind(n,2301)),"@site/docs/colorimetry/matrix.mdx",2301],ddce1156:[()=>n.e(1408).then(n.bind(n,6019)),"@site/docs/utilities/mp4box.mdx",6019],e157395a:[()=>n.e(7967).then(n.bind(n,2238)),"@site/docs/images/HEIC.mdx",2238],e1a437f7:[()=>n.e(9381).then(n.bind(n,6309)),"@site/docs/data/bzip2.mdx",6309],e3b00369:[()=>n.e(921).then(n.bind(n,237)),"@site/docs/utilities/av1an-command-gen.mdx",237],e641ee58:[()=>n.e(5738).then(n.bind(n,3528)),"@site/docs/audio/Speex.mdx",3528],ea743fb4:[()=>n.e(9417).then(n.t.bind(n,4943,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-image-bfd.json",4943],edaea366:[()=>n.e(7978).then(n.bind(n,1799)),"@site/docs/colorimetry/transfer.mdx",1799],ee513c31:[()=>Promise.all([n.e(1869),n.e(1137)]).then(n.bind(n,2154)),"@site/docs/utilities/dovi_tool.mdx",2154],ee8c27e3:[()=>n.e(9819).then(n.bind(n,7346)),"@site/docs/encoders/uvg266.mdx",7346],f4fea690:[()=>n.e(4924).then(n.bind(n,6387)),"@site/docs/encoders/JM.mdx",6387],f9208490:[()=>Promise.all([n.e(1869),n.e(3229)]).then(n.bind(n,1865)),"@site/docs/utilities/hdr10plus_tool.mdx",1865],fda0af90:[()=>n.e(5376).then(n.bind(n,4426)),"@site/docs/colorimetry/primaries.mdx",4426],fe210aea:[()=>n.e(96).then(n.t.bind(n,7748,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-web-0e7.json",7748]};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={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,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 p=[{path:"/blog",component:d("/blog","e7d"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","245"),exact:!0},{path:"/blog/av1-encoding-for-dummies",component:d("/blog/av1-encoding-for-dummies","7e6"),exact:!0},{path:"/blog/embedding-the-un-embeddable",component:d("/blog/embedding-the-un-embeddable","ddb"),exact:!0},{path:"/blog/site-optimization",component:d("/blog/site-optimization","79f"),exact:!0},{path:"/blog/svt-av1-deep-dive",component:d("/blog/svt-av1-deep-dive","32d"),exact:!0},{path:"/blog/svt-av1-second-deep-dive",component:d("/blog/svt-av1-second-deep-dive","ca6"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","4c4"),exact:!0},{path:"/blog/tags/benchmarks",component:d("/blog/tags/benchmarks","1d4"),exact:!0},{path:"/blog/tags/compression",component:d("/blog/tags/compression","ba9"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","50a"),exact:!0},{path:"/blog/tags/image",component:d("/blog/tags/image","fb2"),exact:!0},{path:"/blog/tags/video",component:d("/blog/tags/video","915"),exact:!0},{path:"/blog/tags/web",component:d("/blog/tags/web","0f7"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","53a"),exact:!0},{path:"/search",component:d("/search","822"),exact:!0},{path:"/docs",component:d("/docs","a0d"),routes:[{path:"/docs",component:d("/docs","24b"),routes:[{path:"/docs",component:d("/docs","79c"),routes:[{path:"/docs/audio/AAC",component:d("/docs/audio/AAC","cc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Dolby",component:d("/docs/audio/Dolby","be7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/FLAC",component:d("/docs/audio/FLAC","68a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/MP3",component:d("/docs/audio/MP3","8b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Opus",component:d("/docs/audio/Opus","ede"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Speex",component:d("/docs/audio/Speex","efd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Vorbis",component:d("/docs/audio/Vorbis","e65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/WavPack",component:d("/docs/audio/WavPack","faf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/format",component:d("/docs/colorimetry/format","f03"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/intro",component:d("/docs/colorimetry/intro","dc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/matrix",component:d("/docs/colorimetry/matrix","56d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/primaries",component:d("/docs/colorimetry/primaries","0ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/range",component:d("/docs/colorimetry/range","be1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/transfer",component:d("/docs/colorimetry/transfer","0ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/contribution-guide",component:d("/docs/contribution-guide","a83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/7z",component:d("/docs/data/7z","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/brotli",component:d("/docs/data/brotli","f1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/bzip2",component:d("/docs/data/bzip2","aea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/gzip",component:d("/docs/data/gzip","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/tar",component:d("/docs/data/tar","548"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/xz",component:d("/docs/data/xz","a88"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zip",component:d("/docs/data/zip","2e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zpaq",component:d("/docs/data/zpaq","407"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zstd",component:d("/docs/data/zstd","78a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/amf",component:d("/docs/encoders_hw/amf","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/mediacodec",component:d("/docs/encoders_hw/mediacodec","e64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/nvenc",component:d("/docs/encoders_hw/nvenc","851"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/qsv",component:d("/docs/encoders_hw/qsv","ce1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/videotoolbox",component:d("/docs/encoders_hw/videotoolbox","426"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aomenc",component:d("/docs/encoders/aomenc","3c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Aurora1",component:d("/docs/encoders/Aurora1","96b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/AVM",component:d("/docs/encoders/AVM","1b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/HM",component:d("/docs/encoders/HM","09e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/JM",component:d("/docs/encoders/JM","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Kvazaar",component:d("/docs/encoders/Kvazaar","723"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/rav1e",component:d("/docs/encoders/rav1e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1",component:d("/docs/encoders/SVT-AV1","c47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-HEVC",component:d("/docs/encoders/SVT-HEVC","d5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-VP9",component:d("/docs/encoders/SVT-VP9","952"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uvg266",component:d("/docs/encoders/uvg266","d2d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/vpxenc",component:d("/docs/encoders/vpxenc","9fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VTM",component:d("/docs/encoders/VTM","e57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VVenC",component:d("/docs/encoders/VVenC","469"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x264",component:d("/docs/encoders/x264","26c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x265",component:d("/docs/encoders/x265","fb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x266",component:d("/docs/encoders/x266","74f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/FAQ",component:d("/docs/FAQ","5ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deband",component:d("/docs/filtering/deband","2ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/dehalo",component:d("/docs/filtering/dehalo","c4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deinterlace",component:d("/docs/filtering/deinterlace","62f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/denoise",component:d("/docs/filtering/denoise","129"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/detelecine",component:d("/docs/filtering/detelecine","ee9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/intro",component:d("/docs/filtering/intro","ee2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/vapoursynth",component:d("/docs/filtering/vapoursynth","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/AVIF",component:d("/docs/images/AVIF","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/GIF",component:d("/docs/images/GIF","677"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/HEIC",component:d("/docs/images/HEIC","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG",component:d("/docs/images/JPEG","7f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG2000",component:d("/docs/images/JPEG2000","3f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JXL",component:d("/docs/images/JXL","abb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/PNG",component:d("/docs/images/PNG","9b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/QOI",component:d("/docs/images/QOI","c2e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/WebP",component:d("/docs/images/WebP","b27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/high-dynamic-range",component:d("/docs/introduction/high-dynamic-range","7e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/prologue",component:d("/docs/introduction/prologue","b4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/psychovisual",component:d("/docs/introduction/psychovisual","539"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/terminology",component:d("/docs/introduction/terminology","041"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/video-artifacts",component:d("/docs/introduction/video-artifacts","0af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/butteraugli",component:d("/docs/metrics/butteraugli","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/PSNR",component:d("/docs/metrics/PSNR","1e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIM",component:d("/docs/metrics/SSIM","1ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIMULACRA2",component:d("/docs/metrics/SSIMULACRA2","a14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/VMAF",component:d("/docs/metrics/VMAF","62e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/XPSNR",component:d("/docs/metrics/XPSNR","646"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/privacy-policy",component:d("/docs/privacy-policy","923"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/resources",component:d("/docs/resources","0e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SRT",component:d("/docs/subtitles/SRT","af2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/webvtt",component:d("/docs/subtitles/webvtt","d8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/terms-of-use",component:d("/docs/terms-of-use","70c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/autocompressor",component:d("/docs/utilities/autocompressor","43c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an",component:d("/docs/utilities/av1an","53c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an-command-gen",component:d("/docs/utilities/av1an-command-gen","f4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Aviator",component:d("/docs/utilities/Aviator","b18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/dovi_tool",component:d("/docs/utilities/dovi_tool","6fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/eac3to",component:d("/docs/utilities/eac3to","fde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/FFMetrics",component:d("/docs/utilities/FFMetrics","bb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/ffmpeg",component:d("/docs/utilities/ffmpeg","07b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/hdr10plus_tool",component:d("/docs/utilities/hdr10plus_tool","d8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/MKVToolNix",component:d("/docs/utilities/MKVToolNix","2d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/mp4box",component:d("/docs/utilities/mp4box","d04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/nmkoder",component:d("/docs/utilities/nmkoder","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rAV1ator",component:d("/docs/utilities/rAV1ator","88b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rav1ator-cli",component:d("/docs/utilities/rav1ator-cli","930"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/YUView",component:d("/docs/utilities/YUView","017"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video-players",component:d("/docs/video-players","870"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AV1",component:d("/docs/video/AV1","28f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVC",component:d("/docs/video/AVC","e47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVS3",component:d("/docs/video/AVS3","42e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/ECM",component:d("/docs/video/ECM","568"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/FFV1",component:d("/docs/video/FFV1","ec1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/HEVC",component:d("/docs/video/HEVC","df9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/prores",component:d("/docs/video/prores","770"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/Theora",component:d("/docs/video/Theora","4cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/utvideo",component:d("/docs/video/utvideo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VC-1",component:d("/docs/video/VC-1","d82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP8",component:d("/docs/video/VP8","88c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP9",component:d("/docs/video/VP9","dc7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VVC",component:d("/docs/video/VVC","1f7"),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(4625),i=n(545),s=n(8193);const l=[n(119),n(6134),n(6294),n(1043),n(8015)];var c=n(8328),u=n(6347),d=n(2831),p=n(4848);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5260),m=n(4586),g=n(6025),b=n(6342),y=n(1213),v=n(2131),x=n(4090),w=n(2967),k=n(440),S=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.A)(),r=(0,v.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 E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.A)(),{pathname:r}=(0,u.zy)();return e+(0,k.applyTrailingSlash)((0,g.A)(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 C(){const{i18n:{currentLocale:e}}=(0,m.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:x.w})]}),n&&(0,p.jsx)(y.be,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.A,{tag:w.Cy,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const A=new Map;var T=n(6125),P=n(6988),L=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.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}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class j extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?N("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=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(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)(O,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.qh,{location:t,render:()=>e})})}}const I=j,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function D(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 = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,u.zy)());return(0,p.jsx)(I,{location:e,children:W})}function q(){return(0,p.jsx)(U.A,{children:(0,p.jsx)(P.l,{children:(0,p.jsxs)(T.x,{children:[(0,p.jsxs)(f,{children:[(0,p.jsx)(V,{}),(0,p.jsx)(C,{}),(0,p.jsx)($,{}),(0,p.jsx)(G,{})]}),(0,p.jsx)(Q,{})]})})})}var Y=n(4054);const K=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 Z=n(6921);const X=new Set,J=new Set,ee=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,te={prefetch:e=>{if(!(e=>!ee()&&!J.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!ee()&&!J.has(e))(e)&&(J.add(e),R(e))},ne=Object.freeze(te),re=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=ne;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.vd,{children:(0,p.jsx)(a.Kd,{children:(0,p.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{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}};R(window.location.pathname).then((()=>{(0,r.startTransition)(s)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduction/prologue","docs":[{"id":"audio/AAC","path":"/docs/audio/AAC","sidebar":"tutorialSidebar"},{"id":"audio/Dolby","path":"/docs/audio/Dolby","sidebar":"tutorialSidebar"},{"id":"audio/FLAC","path":"/docs/audio/FLAC","sidebar":"tutorialSidebar"},{"id":"audio/MP3","path":"/docs/audio/MP3","sidebar":"tutorialSidebar"},{"id":"audio/Opus","path":"/docs/audio/Opus","sidebar":"tutorialSidebar"},{"id":"audio/Speex","path":"/docs/audio/Speex","sidebar":"tutorialSidebar"},{"id":"audio/Vorbis","path":"/docs/audio/Vorbis","sidebar":"tutorialSidebar"},{"id":"audio/WavPack","path":"/docs/audio/WavPack","sidebar":"tutorialSidebar"},{"id":"colorimetry/format","path":"/docs/colorimetry/format","sidebar":"tutorialSidebar"},{"id":"colorimetry/intro","path":"/docs/colorimetry/intro","sidebar":"tutorialSidebar"},{"id":"colorimetry/matrix","path":"/docs/colorimetry/matrix","sidebar":"tutorialSidebar"},{"id":"colorimetry/primaries","path":"/docs/colorimetry/primaries","sidebar":"tutorialSidebar"},{"id":"colorimetry/range","path":"/docs/colorimetry/range","sidebar":"tutorialSidebar"},{"id":"colorimetry/transfer","path":"/docs/colorimetry/transfer","sidebar":"tutorialSidebar"},{"id":"contribution-guide","path":"/docs/contribution-guide","sidebar":"tutorialSidebar"},{"id":"data/7z","path":"/docs/data/7z","sidebar":"tutorialSidebar"},{"id":"data/brotli","path":"/docs/data/brotli","sidebar":"tutorialSidebar"},{"id":"data/bzip2","path":"/docs/data/bzip2","sidebar":"tutorialSidebar"},{"id":"data/gzip","path":"/docs/data/gzip","sidebar":"tutorialSidebar"},{"id":"data/tar","path":"/docs/data/tar","sidebar":"tutorialSidebar"},{"id":"data/xz","path":"/docs/data/xz","sidebar":"tutorialSidebar"},{"id":"data/zip","path":"/docs/data/zip","sidebar":"tutorialSidebar"},{"id":"data/zpaq","path":"/docs/data/zpaq","sidebar":"tutorialSidebar"},{"id":"data/zstd","path":"/docs/data/zstd","sidebar":"tutorialSidebar"},{"id":"encoders_hw/amf","path":"/docs/encoders_hw/amf","sidebar":"tutorialSidebar"},{"id":"encoders_hw/mediacodec","path":"/docs/encoders_hw/mediacodec","sidebar":"tutorialSidebar"},{"id":"encoders_hw/nvenc","path":"/docs/encoders_hw/nvenc","sidebar":"tutorialSidebar"},{"id":"encoders_hw/qsv","path":"/docs/encoders_hw/qsv","sidebar":"tutorialSidebar"},{"id":"encoders_hw/videotoolbox","path":"/docs/encoders_hw/videotoolbox","sidebar":"tutorialSidebar"},{"id":"encoders/aomenc","path":"/docs/encoders/aomenc","sidebar":"tutorialSidebar"},{"id":"encoders/Aurora1","path":"/docs/encoders/Aurora1","sidebar":"tutorialSidebar"},{"id":"encoders/AVM","path":"/docs/encoders/AVM","sidebar":"tutorialSidebar"},{"id":"encoders/HM","path":"/docs/encoders/HM","sidebar":"tutorialSidebar"},{"id":"encoders/JM","path":"/docs/encoders/JM","sidebar":"tutorialSidebar"},{"id":"encoders/Kvazaar","path":"/docs/encoders/Kvazaar","sidebar":"tutorialSidebar"},{"id":"encoders/rav1e","path":"/docs/encoders/rav1e","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1","path":"/docs/encoders/SVT-AV1","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-HEVC","path":"/docs/encoders/SVT-HEVC","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-VP9","path":"/docs/encoders/SVT-VP9","sidebar":"tutorialSidebar"},{"id":"encoders/uvg266","path":"/docs/encoders/uvg266","sidebar":"tutorialSidebar"},{"id":"encoders/vpxenc","path":"/docs/encoders/vpxenc","sidebar":"tutorialSidebar"},{"id":"encoders/VTM","path":"/docs/encoders/VTM","sidebar":"tutorialSidebar"},{"id":"encoders/VVenC","path":"/docs/encoders/VVenC","sidebar":"tutorialSidebar"},{"id":"encoders/x264","path":"/docs/encoders/x264","sidebar":"tutorialSidebar"},{"id":"encoders/x265","path":"/docs/encoders/x265","sidebar":"tutorialSidebar"},{"id":"encoders/x266","path":"/docs/encoders/x266","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/docs/FAQ","sidebar":"tutorialSidebar"},{"id":"filtering/deband","path":"/docs/filtering/deband","sidebar":"tutorialSidebar"},{"id":"filtering/dehalo","path":"/docs/filtering/dehalo","sidebar":"tutorialSidebar"},{"id":"filtering/deinterlace","path":"/docs/filtering/deinterlace","sidebar":"tutorialSidebar"},{"id":"filtering/denoise","path":"/docs/filtering/denoise","sidebar":"tutorialSidebar"},{"id":"filtering/detelecine","path":"/docs/filtering/detelecine","sidebar":"tutorialSidebar"},{"id":"filtering/intro","path":"/docs/filtering/intro","sidebar":"tutorialSidebar"},{"id":"filtering/vapoursynth","path":"/docs/filtering/vapoursynth","sidebar":"tutorialSidebar"},{"id":"images/AVIF","path":"/docs/images/AVIF","sidebar":"tutorialSidebar"},{"id":"images/GIF","path":"/docs/images/GIF","sidebar":"tutorialSidebar"},{"id":"images/HEIC","path":"/docs/images/HEIC","sidebar":"tutorialSidebar"},{"id":"images/JPEG","path":"/docs/images/JPEG","sidebar":"tutorialSidebar"},{"id":"images/JPEG2000","path":"/docs/images/JPEG2000","sidebar":"tutorialSidebar"},{"id":"images/JXL","path":"/docs/images/JXL","sidebar":"tutorialSidebar"},{"id":"images/PNG","path":"/docs/images/PNG","sidebar":"tutorialSidebar"},{"id":"images/QOI","path":"/docs/images/QOI","sidebar":"tutorialSidebar"},{"id":"images/WebP","path":"/docs/images/WebP","sidebar":"tutorialSidebar"},{"id":"introduction/high-dynamic-range","path":"/docs/introduction/high-dynamic-range","sidebar":"tutorialSidebar"},{"id":"introduction/prologue","path":"/docs/introduction/prologue","sidebar":"tutorialSidebar"},{"id":"introduction/psychovisual","path":"/docs/introduction/psychovisual","sidebar":"tutorialSidebar"},{"id":"introduction/terminology","path":"/docs/introduction/terminology","sidebar":"tutorialSidebar"},{"id":"introduction/video-artifacts","path":"/docs/introduction/video-artifacts","sidebar":"tutorialSidebar"},{"id":"metrics/butteraugli","path":"/docs/metrics/butteraugli","sidebar":"tutorialSidebar"},{"id":"metrics/PSNR","path":"/docs/metrics/PSNR","sidebar":"tutorialSidebar"},{"id":"metrics/SSIM","path":"/docs/metrics/SSIM","sidebar":"tutorialSidebar"},{"id":"metrics/SSIMULACRA2","path":"/docs/metrics/SSIMULACRA2","sidebar":"tutorialSidebar"},{"id":"metrics/VMAF","path":"/docs/metrics/VMAF","sidebar":"tutorialSidebar"},{"id":"metrics/XPSNR","path":"/docs/metrics/XPSNR","sidebar":"tutorialSidebar"},{"id":"privacy-policy","path":"/docs/privacy-policy","sidebar":"tutorialSidebar"},{"id":"resources","path":"/docs/resources","sidebar":"tutorialSidebar"},{"id":"subtitles/SRT","path":"/docs/subtitles/SRT","sidebar":"tutorialSidebar"},{"id":"subtitles/webvtt","path":"/docs/subtitles/webvtt","sidebar":"tutorialSidebar"},{"id":"terms-of-use","path":"/docs/terms-of-use","sidebar":"tutorialSidebar"},{"id":"utilities/autocompressor","path":"/docs/utilities/autocompressor","sidebar":"tutorialSidebar"},{"id":"utilities/av1an","path":"/docs/utilities/av1an","sidebar":"tutorialSidebar"},{"id":"utilities/av1an-command-gen","path":"/docs/utilities/av1an-command-gen","sidebar":"tutorialSidebar"},{"id":"utilities/Aviator","path":"/docs/utilities/Aviator","sidebar":"tutorialSidebar"},{"id":"utilities/dovi_tool","path":"/docs/utilities/dovi_tool","sidebar":"tutorialSidebar"},{"id":"utilities/eac3to","path":"/docs/utilities/eac3to","sidebar":"tutorialSidebar"},{"id":"utilities/FFMetrics","path":"/docs/utilities/FFMetrics","sidebar":"tutorialSidebar"},{"id":"utilities/ffmpeg","path":"/docs/utilities/ffmpeg","sidebar":"tutorialSidebar"},{"id":"utilities/hdr10plus_tool","path":"/docs/utilities/hdr10plus_tool","sidebar":"tutorialSidebar"},{"id":"utilities/MKVToolNix","path":"/docs/utilities/MKVToolNix","sidebar":"tutorialSidebar"},{"id":"utilities/mp4box","path":"/docs/utilities/mp4box","sidebar":"tutorialSidebar"},{"id":"utilities/nmkoder","path":"/docs/utilities/nmkoder","sidebar":"tutorialSidebar"},{"id":"utilities/rAV1ator","path":"/docs/utilities/rAV1ator","sidebar":"tutorialSidebar"},{"id":"utilities/rav1ator-cli","path":"/docs/utilities/rav1ator-cli","sidebar":"tutorialSidebar"},{"id":"utilities/YUView","path":"/docs/utilities/YUView","sidebar":"tutorialSidebar"},{"id":"video-players","path":"/docs/video-players","sidebar":"tutorialSidebar"},{"id":"video/AV1","path":"/docs/video/AV1","sidebar":"tutorialSidebar"},{"id":"video/AVC","path":"/docs/video/AVC","sidebar":"tutorialSidebar"},{"id":"video/AVS3","path":"/docs/video/AVS3","sidebar":"tutorialSidebar"},{"id":"video/ECM","path":"/docs/video/ECM","sidebar":"tutorialSidebar"},{"id":"video/FFV1","path":"/docs/video/FFV1","sidebar":"tutorialSidebar"},{"id":"video/HEVC","path":"/docs/video/HEVC","sidebar":"tutorialSidebar"},{"id":"video/prores","path":"/docs/video/prores","sidebar":"tutorialSidebar"},{"id":"video/Theora","path":"/docs/video/Theora","sidebar":"tutorialSidebar"},{"id":"video/utvideo","path":"/docs/video/utvideo","sidebar":"tutorialSidebar"},{"id":"video/VC-1","path":"/docs/video/VC-1","sidebar":"tutorialSidebar"},{"id":"video/VP8","path":"/docs/video/VP8","sidebar":"tutorialSidebar"},{"id":"video/VP9","path":"/docs/video/VP9","sidebar":"tutorialSidebar"},{"id":"video/VVC","path":"/docs/video/VVC","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/introduction/prologue","label":"introduction/prologue"}}}}],"breadcrumbs":true}}}'),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.3.2","siteVersion":"0.1.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.3.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.3.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.3.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.3.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.3.2"},"docusaurus-plugin-image-zoom":{"type":"package","name":"plugin-image-zoom","version":"1.2.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(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:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(5476),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.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{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 h=e=>(0,c.jsx)(f,{...e});class m 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??h)(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:()=>f});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 p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:x}}=(0,i.A)(),{withBaseUrl:w}=(0,u.h)(),k=(0,c.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.A)(_),C=_?.replace("pathname://","");let A=void 0!==C?(T=C,b&&(e=>e.startsWith("/"))(T)?w(T):T):void 0;var T;A&&E&&(A=(0,a.applyTrailingSlash)(A,{trailingSlash:v,baseUrl:x}));const P=(0,r.useRef)(!1),L=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,O=(0,r.useRef)(),R=()=>{P.current||null==A||(window.docusaurus.preload(A),P.current=!0)};(0,r.useEffect)((()=>(!N&&E&&null!=A&&window.docusaurus.prefetch(A),()=>{N&&O.current&&O.current.disconnect()})),[O,A,N,E]);const j=A?.startsWith("#")??!1,I=!y.target||"_self"===y.target,F=!A||!E||!I||j;return g||!j&&F||k.collectLink(A),y.id&&k.collectAnchor(y.id),F?(0,d.jsx)("a",{ref:S,href:A,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(L,{...y,onMouseEnter:R,onTouchStart:R,innerRef:e=>{S.current=e,N&&e&&E&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),O.current.observe(e))},to:A,...n&&{isActive:m,activeClassName:h}})}const f=r.forwardRef(p)},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 children",t),new Error("The Docusaurus 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,{A:()=>s,h:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.z)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}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},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},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})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>p,Gy:()=>u,HW:()=>g,ht:()=>d,r7:()=>h,jh:()=>f});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){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(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 c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=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=u(),{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 f(e){return d(e).versions}function h(e){const t=d(e);return s(t)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return l(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(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";n.r(t);var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(875)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),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:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(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",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,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"})})}},5476:(e,t,n)=>{"use strict";n.d(t,{A:()=>It});var r=n(6540),o=n(4164),a=n(7489),i=n(1213),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){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&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(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 m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var x=n(6342),w=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 S={closeButton:"closeButton_CVFx"};function _(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",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.Mj)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var P=n(2069),L=n(3104);var N=n(9532),O=n(5600);const R=r.createContext(null);function j(e){let{children:t}=e;const n=function(){const e=(0,P.M)(),t=(0,O.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,N.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 I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(R);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,O.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=F();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 z=n(5293),D=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 $(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 V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function U(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,D.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)(V.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",V.toggleButton,!i&&V.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(V.toggleIcon,V.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(V.toggleIcon,V.darkToggleIcon)})]})})}const H=r.memo(U),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,z.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var G=n(3465);function q(){return(0,u.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,P.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 K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var 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,X.A)(r),p=(0,X.A)(t),f=(0,X.A)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}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:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(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)(Ge,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(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:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ge,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(2131);function me(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 be=n(1088),ye=n(5391),ve=n(5597),xe=n(4070),we=n(5891),ke=n(2384),Se=n(4471),_e=n(7674),Ee=n(6841),Ce=n(3810);const Ae='',Te='',Pe='',Le='',Ne='',Oe='',Re='',je={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ie(e){let{document:t,type:n,page:r,metadata:o,tokens:a,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,c=1===n,u=[];i?u.push(Oe):s&&u.push(Re);const d=u.map((e=>`${e}`)),p=`${l?Ae:c?Te:Pe}`,f=[`${(0,Ce.C)(t.t,(0,_e.g)(o,"t"),a)}`];if(!i&&!s&&be.tb){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Se.$)(e??[])}`)}else l||f.push(`${(0,Ee.Z)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),a)}`);const h=`${Le}`;return[...d,p,``,...f,"",h].join("")}function Fe(){return`${Ne}${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(2849),ze=n(3385);async function De(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Be="_highlight";const $e=function(e){let{handleSearchBarToggle:t}=e;const n=(0,D.A)(),{siteConfig:{baseUrl:o},i18n:{currentLocale:a}}=(0,le.A)(),i=(0,xe.vT)();let c=o;try{const{preferredVersion:e}=(0,ve.g1)(i?.pluginId??be.UB);e&&!e.isLast&&(c=e.path+"/")}catch(M){if(be.I$&&!(M instanceof N.dV))throw M}const d=(0,s.W6)(),p=(0,s.zy)(),f=(0,r.useRef)(null),h=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[g,b]=(0,r.useState)(!1),[y,v]=(0,r.useState)(!1),[x,w]=(0,r.useState)(""),k=(0,r.useRef)(null),S=(0,r.useRef)(""),[_,E]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Hg))return;let e="";if(p.pathname.startsWith(c)){const t=p.pathname.substring(c.length);let n;for(const e of be.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}S.current!==e&&(h.current.delete(e),S.current=e),E(e)}),[p.pathname,c]);const C=!!be.O6&&Array.isArray(be.Hg)&&""===_,A=(0,r.useCallback)((async()=>{if(C||h.current.get(_))return;h.current.set(_,"loading"),k.current?.autocomplete.destroy(),b(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,we.Z)(c,_),De()]);if(k.current=n(f.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.A)(je.searchBar,{[je.searchBarLeft]:"left"===be.ZG}),noPrefix:!0,dropdownMenu:je.dropdownMenu,input:je.input,hint:je.hint,suggestions:je.suggestions,suggestion:je.suggestion,cursor:je.cursor,dataset:je.dataset,empty:je.empty}},[{source:(0,ke.m)(e,t,be.AT),templates:{suggestion:Ie,empty:Fe,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!_||!be.dz))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),i=new URLSearchParams;let s;if(i.set("q",t),_){const e=_&&Array.isArray(be.Hg)?be.Hg.find((e=>"string"==typeof e?e===_:e.path===_)):_,t=e?(0,ze.p)(e,a).label:_;s=be.dz&&n?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!_||!Array.isArray(be.Hg)||be.dz&&n||i.set("ctx",_),c!==o){if(!c.startsWith(o))throw new Error(`Version url '${c}' does not start with base url '${o}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);i.set("version",c.substring(o.length))}const u=`${o}search?${i.toString()}`;return r.href=u,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),d.push(u))})),r})({query:t,isEmpty:n}),i=document.createElement("div");return i.className=je.hitFooter,i.appendChild(r),i}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:o}=t;f.current?.blur();let a=n;if(be.CU&&o.length>0){const e=new URLSearchParams;for(const t of o)e.append(Be,t);a+=`?${e.toString()}`}r&&(a+=r),d.push(a)})).on("autocomplete:closed",(()=>{f.current?.blur()})),h.current.set(_,"done"),b(!1),m.current){const e=f.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[C,_,c,o,d]);(0,r.useEffect)((()=>{if(!be.CU)return;const e=n?new URLSearchParams(p.search).getAll(Be):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.CU(t);n.unmark(),0!==e.length&&n.mark(e),w(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[n,p.search,p.pathname]);const[T,P]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{m.current=!0,A(),P(!0),t?.(!0)}),[t,A]),O=(0,r.useCallback)((()=>{P(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{A()}),[A]),j=(0,r.useCallback)((e=>{w(e.target.value),e.target.value&&v(!0)}),[]),I=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.WW)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),f.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,L]);const F=(0,r.useCallback)((()=>{const e=new URLSearchParams(p.search);e.delete(Be);const t=e.toString(),n=p.pathname+(""!=t?`?${t}`:"")+p.hash;n!=p.pathname+p.search+p.hash&&d.push(n),w(""),k.current?.autocomplete.setVal("")}),[p.pathname,p.search,p.hash,d]);return(0,u.jsxs)("div",{className:(0,ye.A)("navbar__search",je.searchBarContainer,{[je.searchIndexLoading]:g&&y,[je.focused]:T}),hidden:C,children:[(0,u.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:L,onBlur:O,onChange:j,ref:f,value:x}),(0,u.jsx)(Me.A,{className:je.searchBarLoadingRing}),be.WW&&be.pk&&(""!==x?(0,u.jsx)("button",{className:je.searchClearButton,onClick:F,children:"\u2715"}):n&&(0,u.jsxs)("div",{className:je.searchHintContainer,children:[(0,u.jsx)("kbd",{className:je.searchHint,children:I?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:je.searchHint,children:"K"})]}))]})},Ve={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ue(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Ve.navbarSearchContainer),children:t})}var He=n(4142);const Qe=e=>e.docs.find((t=>t.id===e.mainDocId));const We={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)(),p=(0,he.o)(),{search:f,hash:h}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${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)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ue,{className:n,children:(0,u.jsx)($e,{})})},dropdown:fe,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,xe.zK)(r),i=(0,He.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,xe.zK)(r),i=(0,He.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,He.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)(),p=(0,xe.zK)(n),f=(0,xe.jh)(n),{savePreferredVersionName:h}=(0,ve.g1)(n),m=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Qe(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...a],g=(0,He.Vd)(n)[0],b=t&&m.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,y=t&&m.length>1?void 0:Qe(g).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function Ge(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=We[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function qe(){const e=(0,P.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ge,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ye(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 Ke(){const e=0===(0,x.p)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ye,{onClick:()=>t.hide()}),t.content]})}function Ze(){const e=(0,P.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)(K,{}),primaryMenu:(0,u.jsx)(qe,{}),secondaryMenu:(0,u.jsx)(Ke,{})}):null}const Xe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Je(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function et(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,P.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,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{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&&[Xe.navbarHideable,!d&&Xe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Je,{onClick:i.toggle}),(0,u.jsx)(Ze,{})]})}var tt=n(440);const nt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function rt(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 ot(e){let{error:t}=e;const n=(0,tt.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:nt.errorBoundaryError,children:n})}class at extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const it="right";function st(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 lt(){const{toggle:e,shown:t}=(0,P.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)(st,{})})}const ct={colorModeToggle:"colorModeToggle_DEke"};function ut(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(at,{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)(Ge,{...e})},t)))})}function dt(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 pt(){const e=(0,P.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??it)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(dt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(lt,{}),(0,u.jsx)(q,{}),(0,u.jsx)(ut,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ut,{items:r}),(0,u.jsx)(W,{className:ct.colorModeToggle}),!o&&(0,u.jsx)(Ue,{children:(0,u.jsx)($e,{})})]})})}function ft(){return(0,u.jsx)(et,{children:(0,u.jsx)(pt,{})})}function ht(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.A)(n),l=(0,X.A)(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,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function mt(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)(ht,{item:t})},t.href??t.to)}function gt(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)(mt,{item:e},t)))})]})}function bt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(gt,{column:e},t)))})}function yt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function vt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(ht,{item:t})}function xt(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)(vt,{item:e}),t.length!==n+1&&(0,u.jsx)(yt,{})]},n)))})})}function wt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(bt,{columns:t}):(0,u.jsx)(xt,{links:t})}var kt=n(1122);const St={footerLogoLink:"footerLogoLink_BH7S"};function _t(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(kt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function Et(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:St.footerLogoLink,target:t.target,children:(0,u.jsx)(_t,{logo:t})}):(0,u.jsx)(_t,{logo:t})}function Ct(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function At(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 Tt(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(At,{style:o,links:n&&n.length>0&&(0,u.jsx)(wt,{links:n}),logo:r&&(0,u.jsx)(Et,{logo:r}),copyright:t&&(0,u.jsx)(Ct,{copyright:t})})}const Pt=r.memo(Tt),Lt=(0,N.fM)([z.a,w.oq,L.Tv,ve.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(O.y_,{children:(0,u.jsx)(P.e,{children:(0,u.jsx)(j,{children:t})})})}]);function Nt(e){let{children:t}=e;return(0,u.jsx)(Lt,{children:t})}var Ot=n(1107);function Rt(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)(Ot.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)(rt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(ot,{error:t})})]})})})}const jt={mainWrapper:"mainWrapper_z2l0"};function It(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(Nt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(ft,{}),(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)(Rt,{...e}),children:t})}),!n&&(0,u.jsx)(Pt,{})]})}},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.A)(t.src),dark:(0,o.A)(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,...p}=e,f=(0,o.A)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,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(4164),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:()=>b,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 p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(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 p(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 h(e){if(!o.A.canUseDOM)return e?u:d}function m(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 f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(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)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>m,oq:()=>h});var r=n(6540),o=n(2303),a=n(9466),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(),p=e=>c.set(String(e)),f=r.createContext(null);function h(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)((()=>{p(!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&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(9466),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(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)(h(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&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(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===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){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}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,g1:()=>v});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(4142),l=n(9532),c=n(9466),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=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=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.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){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return(0,u.jsx)(h.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(h);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function v(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])}}},6588:(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}},2252:(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}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});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 p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){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)}}),[])}},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",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",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})},4142:(e,t,n)=>{"use strict";n.d(t,{B5:()=>_,C5:()=>p,Nr:()=>f,OF:()=>x,QB:()=>S,Vd:()=>w,Y:()=>y,fW:()=>k,w8:()=>g});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(5597),l=n(2252),c=n(6588),u=n(1682),d=n(9169);const p=!!i.Gy;function f(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=f(t);if(e)return e}}(e):void 0:e.href}const h=(e,t)=>void 0!==e&&(0,d.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(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,d.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,u.s)([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(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 S(e,t){const n=w(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,u.s)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.v)(i),sidebarName:c,sidebarItems:u}}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>l});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)))}},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,{X:()=>r,s:()=>o})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),o=n(4164),a=n(5260),i=n(6803),s=n(6025),l=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.h)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.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+\.)?(?\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)})}}},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:()=>f,Tv:()=>u,a_:()=>h,gk:()=>m});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 p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();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 h(){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 m(){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&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>o});n(4586);const r="default";function o(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{Dv:()=>u,Wf:()=>c});var r=n(6540);const o="localStorage";function a(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 i(e){if(void 0===e&&(e=o),"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,s||(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),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){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}}(e);const n=i(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?l:c(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.applyTrailingSlash)(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}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}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,n?o(l):a(l));var l;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return o.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return o.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return o.removeTrailingSlash}});var a=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return a.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return a.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return a.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return a.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e: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}},2849:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var r=n(5391);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var a=n(4848);function i(e){let{className:t}=e;return(0,a.jsxs)("div",{className:(0,r.A)(o.loadingRing,t),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(8291),o=n.n(r),a=n(1088);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${a.IH.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},2384:(e,t,n)=>{"use strict";n.d(t,{m:()=>l});var r=n(8291),o=n.n(r);var a=n(1088);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,a.BH);if(0===l.length)return void s([]);const c=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const a=r[0];if(/\p{Unified_Ideograph}/u.test(a)){const n=function(e,t){const n=[];return function e(r,o){let a=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:o.missed,term:o.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>a;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){a=t;const s={missed:o.missed,term:o.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(a,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:a});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const i of a.BH)if("en"===i)a.sx||r.unshift(o().stopWordFilter);else{const e=o()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const o of s)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)l.push(o.slice(0,e).concat(o.slice(e+1)));return i(n).concat(i(l))}(l,t),u=[];e:for(const{term:t,tokens:o}of c)for(const{documents:r,index:a,type:i}of e)if(u.push(...a.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!u.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-u.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),u.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,o=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===o&&(o=n.index),r===o?0===t.type?-1:0===n.type?1:t.index-n.index:r-o}))}(u),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},3103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},7674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{g:()=>r})},6841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(3103);function o(e,t,n){const a=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&a.push(o(e.substr(0,n),t)),a.push(`${(0,r.Z)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):a.join("")}},3810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(3103),o=n(6841);const a=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(a);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var s=n(1088);function l(e,t,n,a){void 0===a&&(a=s.rG);const{chunkIndex:l,chunks:c}=function(e,t,n){const a=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}-1===c&&(c=a.length),l=u+d,a.push({html:(0,o.Z)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}return{chunkIndex:c,chunks:a}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let h=d.textLength,m=0,g=0,b=!1,y=!1;for(;h0){const e=u.pop();h+e.textLength<=a?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=a?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},3385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},1088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>a,UB:()=>f,tb:()=>c,O6:()=>g,I$:()=>h,BH:()=>r,sx:()=>o,ZG:()=>p,WW:()=>u,pk:()=>d,Hg:()=>m,IH:()=>i,rG:()=>l,AT:()=>s,dz:()=>b});n(8291);const r=["en"],o=!1,a=null,i="search-index{dir}.json",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,h=!0,m=null,g=!1,b=!1},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});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=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(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 d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(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 f(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 h(){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;rt?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=f(e,t,m(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"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,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g{"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}}},8291:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,h,m,g,b,y,v,x,w,k,S,_,E,C,A,T,P,L,N,O,R,j,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new I.Token(n.slice(i,a),l))}i=a+1}}return o},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new I.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new I.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new I.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new I.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(o.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=o)}()},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:'
'};function o(e,t,n){return en?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))&&f(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&&f(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:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(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)},8015:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(4784),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},a=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(b.container)if(b.container instanceof Object)t=(e=o({},e,b.container)).width-e.left-e.right-2*b.margin,n=e.height-e.top-e.bottom-2*b.margin;else{var r=(i(b.container)?b.container:document.querySelector(b.container)).getBoundingClientRect(),a=r.width,l=r.height,c=r.left,u=r.top;e=o({},e,{width:a,height:l,left:c,top:u})}t=t||e.width-2*b.margin,n=n||e.height-2*b.margin;var d=y.zoomedHd||y.original,p=s(d)?t:d.naturalWidth||t,f=s(d)?n:d.naturalHeight||n,h=d.getBoundingClientRect(),m=h.top,g=h.left,v=h.width,x=h.height,w=Math.min(Math.max(v,p),t)/v,k=Math.min(Math.max(x,f),n)/x,S=Math.min(w,k),_="scale("+S+") translate3d("+((t-v)/2-g+b.margin+e.left)/S+"px, "+((n-x)/2-m+b.margin+e.top)/S+"px, 0)";y.zoomed.style.transform=_,y.zoomedHd&&(y.zoomedHd.style.transform=_)};return new r((function(n){if(e&&-1===f.indexOf(e))n(x);else{if(y.zoomed)n(x);else{if(e)y.original=e;else{if(!(f.length>0))return void n(x);var r=f;y.original=r[0]}if(y.original.dispatchEvent(c("medium-zoom:open",{detail:{zoom:x}})),g=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,m=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),s=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+s+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(y.original),document.body.appendChild(v),b.template){var o=i(b.template)?b.template:document.querySelector(b.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){m=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(c("medium-zoom:opened",{detail:{zoom:x}})),n(x)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var a=setInterval((function(){y.zoomedHd.complete&&(clearInterval(a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var s=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}}))},d=function(){return new r((function(e){if(!m&&y.original){m=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(c("medium-zoom:close",{detail:{zoom:x}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(v),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),m=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(c("medium-zoom:closed",{detail:{zoom:x}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(x)}))}else e(x)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():u({target:e})},f=[],h=[],m=!1,g=0,b=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?b=t:(t||"string"==typeof t)&&a(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((b=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},b)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!m&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(g-e)>b.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var x={open:u,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},b.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return b=o({},b,t),f.forEach((function(e){e.dispatchEvent(c("medium-zoom:update",{detail:{zoom:x}}))})),x},clone:function(){return e(o({},b,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:a,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(c("medium-zoom:detach",{detail:{zoom:x}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),x},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),h.push({type:"medium-zoom:"+e,listener:t,options:n}),x},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),h=h.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),x},getOptions:function(){return b},getImages:function(){return f},getZoomedImage:function(){return y.original}};return x},{themeConfig:d}=r.default,p=function(){if("undefined"==typeof window)return null;const{zoomSelector:e=".markdown img"}=d,{imageZoom:{selector:t=e,options:n}={}}=d;return setTimeout((()=>{u(t,n)}),1e3),{onRouteUpdate({location:e,previousLocation:r}){e&&e.hash&&e.hash.length||r&&e.pathname!==r.pathname&&setTimeout((()=>{u(t,n)}),1e3)}}}()},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},6976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2514:()=>{Prism.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"}},Prism.languages.webmanifest=Prism.languages.json},5294:()=>{!function(e){var t=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:t,alias:"regex"}};e.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:t,alias:"selector"},punctuation:/[[\]{}&]/},e.languages.tex=e.languages.latex,e.languages.context=e.languages.latex}(Prism)},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=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],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},875:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-diff":7839,"./prism-java":6976,"./prism-json":2514,"./prism-latex":5294};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=875},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(194);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

+

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

The resources available will range from graphs to image comparisons (WIP). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.

Embedding the Un-Embeddable

· 9 min read
Simulping
Maintainer / Encoder

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario

diff --git a/blog/archive.html b/blog/archive.html index 621d0e1b9..44a570858 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -13,11 +13,11 @@ - - - + + + - + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml index 3f350c01f..5e07e77df 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -2,11 +2,326 @@ https://wiki.x266.mov/blog Codec Wiki Blog - 2023-12-30T00:00:00.000Z + 2024-05-19T00:00:00.000Z https://github.com/jpmonette/feed Codec Wiki Blog https://wiki.x266.mov/img/favicon.svg + + <![CDATA[Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive]]> + https://wiki.x266.mov/blog/svt-av1-second-deep-dive + + 2024-05-19T00:00:00.000Z + + SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.

+

Feedback

+

I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.

+

I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!

+

Methodology

+

The resources available will range from graphs to image comparisons (WIP, for real this time). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.

+

The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with x264 --qp 0 for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp directly, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the Zig implementation, XPSNR scores on the other hand are calculated using a ffmpeg filter, and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the Metric / BPP graphs may represent the closest we have to real efficiency.

+

The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.

+

SvtAv1EncApp was compiled directly from the v2.0.0 and v2.1.0 source code using the provided Build/linux/build.sh script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.

+

This testing was conducted within the AV1 Weeb Edition Discord server, which is focused on encoding animated content in AV1.

+

Samples

+

The samples are as follows:

+
    +
  • 11s Blame! clip which sports 3DCG action with lots of grain, effects and high-contrast elements.
  • +
  • 13s Blue Lock clip which sports rapid camera movements, complex geometry and high-contrast elements.
  • +
  • 5s Spy x Family first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.
  • +
  • 12s Jigokuraku (Hell's Paradise) flashback clip with huge static grain in a very dark scenery and some action.
  • +
  • 5s The Garden of Sinners clean but fast-paced 3DCG scene with explosions.
  • +
+

The resolution of every clip is 1080p, except for the first one which is 1920x804.

+
+

All clips have been encoded in a wide quality range, from --crf 6 to --crf 46, by increments of 4.

+
+

Without further ado, let's start with the first comparisons!

+

Presets comparisons (-1 -> 13 12)

+

In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest --preset -1 to the fastest --preset 12.

+
+

Yes, you heard that right. Preset 7 and 13 are no more in v2.1.0. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map preset 7 to preset 6 and preset 13 to preset 12 due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.

+
+

--preset X is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:

+
    +
  • --tune 1: tune PSNR
  • +
  • --aq-mode 2: variance deltaq
  • +
  • --enable-qm 0: quantisation matrices disabled
  • +
  • --irefresh-type 2: closed GOP
  • +
  • --enable-tf 1: temporal filtering enabled
  • +
+

And more, like CDEF and restoration enabled, overlays and film-grain disabled...

+

Efficiency

+
    +
  • First of all, here are the full efficiency graphs:
  • +
+
+

This is all very cool, but visually bloated.

+
    +
  • Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):
  • +
+
+
    +
  • Same, but now focusing on the "low quality" range (CRF26 -> 46):
  • +
+
+
    +
  • If we now focus on presets 4 and below, where it's more difficult to discern the differences between presets, we get this at "high quality":
  • +
+
+
    +
  • And the following at "low quality":
  • +
+
+

Speed

+
    +
  • Let's now see speed comparisons between all presets:
  • +
+
+

Once is not custom, preset -1 is so abysmally slow it makes the graph unusable.

+
    +
  • Same, but without the placebo preset -1:
  • +
+
+
    +
  • Lastly, here is what it looks like with a logarithmic scale:
  • +
+
+

Interpretation

+

As for interpreting the results, it would seem like preset 2 and preset 4 remain all-around very balanced presets, with preset 3 being in a nice in-between spot, an improvement over v2.0.0's preset 3 in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.

+

The quality gap between preset 2 and preset 1 is usually pretty narrow, however the speed penalty from going to preset 1 is ~2x, when the penalty of going from preset 3 to preset 2 is closer to ~1.5x. As such, preset 1 enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on preset 0 and preset -1. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.

+

When we start talking about faster presets though, things are pretty different from previous versions: presets 5 to 9 behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of preset 4, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, presets 5 through 9 will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.

+

Presets 10 to 12 are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.

+

TLDR

+

The same conclusions as the previous blog post can be made: +clear quality gains can be observed as we decrease presets, until preset 2, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.

+

In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.

+

SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:

+

Two months ago, I conducted a similar test to this one to compare the presets evolution between versions 1.8.0 and 2.0.0. The results were pretty unsatisfying: I noticed that presets -1 to 8 in v2.0.0 performed like the old presets 0 to 9 did in v1.8.0. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions.

+

So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!

+

preset -1: v2.0.0 vs v2.1.0

+
    +
  • Let's start off with a battle of the placebos, with the efficiency at "high quality":
  • +
+
+
    +
  • And the efficiency at "low quality":
  • +
+
+

Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?

+
    +
  • Now, let's compare their respective speeds:
  • +
+
+

Let's be grateful it became ever so slightly faster, I guess.

+

preset 0: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Overall, efficiency wise, this new preset 0 places itself in-between old preset -1 and 0

+
    +
  • Speed graphs:
  • +
+
+

Interestingly enough, its speed is much closer to the old preset 0 than to the old preset -1. This means preset 0 was genuinely improved over v2.0.0!

+

preset 1: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

In efficiency, this new preset 1 is often equal to old preset 0, else in-between old preset 0 and 1.

+
    +
  • Speed graphs:
  • +
+
+

We observe that the new preset is a bit closer to old preset 1 speeds than it is to old preset 0 speeds. Good news!

+

preset 2: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Oh well, that's awkward.

+
    +
  • Speed graphs:
  • +
+
+

Speed was left untouched too, meaning preset 2 is unchanged in v2.1.0.

+

preset 3: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 3's efficiency is the same as the old one.

+
    +
  • Speed graphs:
  • +
+
+

However, the preset got slightly faster, so this is a speedup!

+

preset 4: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

We can observe that preset 4 got slightly to moderately worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!

+

preset 5: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 5 seems to have gotten ever so slightly worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Yet it became slightly faster, this is overall a good trade-off.

+

preset 6: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 6 has a huge responsibility: being able to compensate in the absence of its preset 7 sibling. It seems to performs in-between old preset 6 and 7, usually closer to old 7.

+
    +
  • Speed graphs:
  • +
+
+

Preset 6 is now ever so slightly slower to old 7, this is an interesting trade-off, overall a win over old 7.

+

preset 7: v2.0.0 vs v2.1.0

+

Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: Svt[warn]: Preset M6 is mapped to M7.

+

always_has_been

+

preset 8: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

In efficiency, this new preset 8 is sometimes equal or slightly worse to the old 8, and sometimes equal or slightly worse than old 7...

+
    +
  • Speed graphs:
  • +
+
+

Overall, the speed is pretty much unchanged from old 8. It looks like a slight regression, that's pretty disappointing.

+

preset 9: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 9 is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.

+
    +
  • Speed graphs:
  • +
+
+

Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.

+

preset 10: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 10 is slightly to moderately worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!

+

preset 11: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 11's efficiency is untouched.

+
    +
  • Speed graphs:
  • +
+
+

Preset 11's speed is unchanged as well.

+

preset 12: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Just as preset 6, preset 12 is now mapped to 13, and unsurprisingly, its efficiency is equal to old 13.

+
    +
  • Speed graphs:
  • +
+
+

The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.

+

TLDR

+

From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off. +Some presets, like -1, 0, 1 and 3, received the most significant improvements, followed by 4, 5 and 6 with overall beneficial new trade-offs. Preset 12 got slightly faster too. On the other hand, presets 8 and 10 seemed to have regressed slightly, and presets 2 and 9 are perfectly unchanged from v2.0.0.

+

Conclusion

+

SVT-AV1 2.1.0 introduced some welcomed improvements. Presets 2 through 4 remain the king of optimal AV1 encoding, while presets 5 through 9 stand as good options for the people that find 2-4 to be too slow for their liking.

+

Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!

+

By the way, did you know that the SVT-AV1-PSY project was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!

+

Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.

+

Future

+

My plans for the future regarding the blog post include:

+
    +
  • polishing this blog post and aggrementing it of image comparisons.
  • +
  • a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.
  • +
  • an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.
  • +
+

Thanks for reading!

+]]>
+ + Trix + https://github.com/trixoniisama/ + + + + +
<![CDATA[Encoding Animation with SVT-AV1: A Deep Dive]]> https://wiki.x266.mov/blog/svt-av1-deep-dive @@ -58,24 +373,24 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...

First of all, here are the efficiency graphs:

- +

This could be too much information.

  • Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):
- +
  • Same again but without presets 9 to 13 for better clarity:
- +
  • Now for the "low quality" range (CRF28 -> 43):
- +
  • Same but without presets 9 to 13 for better clarity:
- +
  • Let's now see speed comparisons between all presets:
@@ -85,15 +400,15 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
  • Here is what it looks like with a logarithmic scale:
- +
  • Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)
- +
  • Here are speeds graphs for preset 1 to 6 with a linear scale:
- +

One interpretation we can have is that presets 2 to 4 have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but preset 2 is 2x slower than preset 4. The quality gap between preset 2 and preset 1 is even narrower but the speed penalty is also ~2x.

That makes it hard to recommend preset 1, while preset 3 is in a strange middle ground between 2 and 4 where it makes little sense to choose it over those two: it's better to choose preset 2 for the higher efficiency at 1.5x slower speeds, or preset 4 for the 1.33 to 1.5x higher speeds. At least the option exists.

A similar observation can be made between preset 5 and 6. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that preset 5 becomes rather obsolete most of the time.

@@ -113,19 +428,19 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
  • Let's compare the efficiency of every tunes:
- +
  • Now let's focus on the "high quality" range (CRF8 -> 23):
- +
  • And the "low quality" range (CRF28 -> 43):
- +
  • And here is the speed difference:
- +
  • Graphs comparing the tunes individually between each others will be made available soon.
  • The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.
  • @@ -142,11 +457,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    tiles here are both slightly harmful and slower.

    @@ -154,11 +469,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Except for the Jigokuraku clip, aq-mode 0 is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.

    @@ -166,11 +481,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    aq-mode 1 fares closer to aq-mode 2 than aq-mode 0 did, both in quality and speed, but is still overall inferior according to SSIMU2

    @@ -178,11 +493,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF can be beneficial for the line-art.

    @@ -190,11 +505,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Dynamic GoP control yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's "safe" to keep the setting disabled at all times or not.

    @@ -202,11 +517,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Deblocking loop filter can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.

    @@ -214,11 +529,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    fast-decode 1 is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.

    @@ -226,11 +541,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Finally something interesting to analyse!

    @@ -244,29 +559,29 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    --lookahead 60 vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    --lookahead 120 (max) vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    lookahead seems to behave strangely when set...

    @@ -282,11 +597,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    overlays do not seem to either improve efficiency or performance.

    @@ -294,11 +609,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Enabling quantization matrices alone increase efficiency at "high quality" with no real speed impact.

    @@ -306,11 +621,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Setting qm-min to 0 on top of enabling quantization matrices can be beneficial in some clips at no added compute time.

    @@ -319,11 +634,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the loop restoration filter isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.

    @@ -333,11 +648,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Interestingly enough, screen content tools seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.

    @@ -345,11 +660,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Disabled temporal filtering can sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.

    diff --git a/blog/av1-encoding-for-dummies.html b/blog/av1-encoding-for-dummies.html index e0427220f..4751b8d26 100644 --- a/blog/av1-encoding-for-dummies.html +++ b/blog/av1-encoding-for-dummies.html @@ -13,12 +13,12 @@ - - - + + + -

    AV1 Encoding for Dummies

    · 16 min read
    Simulping
    Maintainer / Encoder
    Gianni Rosato
    Maintainer

    This guide will show you how to encode in AV1 the right and optimal way. Yes, you using standalone libaom, libsvtav1, and librav1e from FFmpeg or even piping yuv4mpeg into mainline aomenc are all unoptimal.

    +

    AV1 Encoding for Dummies

    · 16 min read
    Simulping
    Maintainer / Encoder
    Gianni Rosato
    Maintainer

    This guide will show you how to encode in AV1 the right and optimal way. Yes, you using standalone libaom, libsvtav1, and librav1e from FFmpeg or even piping yuv4mpeg into mainline aomenc are all unoptimal.

    Compare

    In this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for SVT-AV1, unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is RAM consumption, encoding 2160p (4K) with aomenc with 4 workers could take upwards of 16GB of RAM! So do keep this in mind.

    Installing the Tools

    diff --git a/blog/embedding-the-un-embeddable.html b/blog/embedding-the-un-embeddable.html index 5ab0f008a..a16c8467c 100644 --- a/blog/embedding-the-un-embeddable.html +++ b/blog/embedding-the-un-embeddable.html @@ -13,12 +13,12 @@ - - - + + + -

    Embedding the Un-Embeddable

    · 9 min read
    Simulping
    Maintainer / Encoder

    Feature image +

    Embedding the Un-Embeddable

    · 9 min read
    Simulping
    Maintainer / Encoder

    Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

    A Scenario

    While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.

    diff --git a/blog/rss.xml b/blog/rss.xml index 6f273966a..2e5068075 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -4,10 +4,321 @@ Codec Wiki Blog https://wiki.x266.mov/blog Codec Wiki Blog - Sat, 30 Dec 2023 00:00:00 GMT + Sun, 19 May 2024 00:00:00 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed en + + <![CDATA[Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive]]> + https://wiki.x266.mov/blog/svt-av1-second-deep-dive + https://wiki.x266.mov/blog/svt-av1-second-deep-dive + Sun, 19 May 2024 00:00:00 GMT + + SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.

    +

    Feedback

    +

    I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.

    +

    I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!

    +

    Methodology

    +

    The resources available will range from graphs to image comparisons (WIP, for real this time). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.

    +

    The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with x264 --qp 0 for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp directly, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the Zig implementation, XPSNR scores on the other hand are calculated using a ffmpeg filter, and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the Metric / BPP graphs may represent the closest we have to real efficiency.

    +

    The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.

    +

    SvtAv1EncApp was compiled directly from the v2.0.0 and v2.1.0 source code using the provided Build/linux/build.sh script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.

    +

    This testing was conducted within the AV1 Weeb Edition Discord server, which is focused on encoding animated content in AV1.

    +

    Samples

    +

    The samples are as follows:

    +
      +
    • 11s Blame! clip which sports 3DCG action with lots of grain, effects and high-contrast elements.
    • +
    • 13s Blue Lock clip which sports rapid camera movements, complex geometry and high-contrast elements.
    • +
    • 5s Spy x Family first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.
    • +
    • 12s Jigokuraku (Hell's Paradise) flashback clip with huge static grain in a very dark scenery and some action.
    • +
    • 5s The Garden of Sinners clean but fast-paced 3DCG scene with explosions.
    • +
    +

    The resolution of every clip is 1080p, except for the first one which is 1920x804.

    +
    +

    All clips have been encoded in a wide quality range, from --crf 6 to --crf 46, by increments of 4.

    +
    +

    Without further ado, let's start with the first comparisons!

    +

    Presets comparisons (-1 -> 13 12)

    +

    In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest --preset -1 to the fastest --preset 12.

    +
    +

    Yes, you heard that right. Preset 7 and 13 are no more in v2.1.0. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map preset 7 to preset 6 and preset 13 to preset 12 due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.

    +
    +

    --preset X is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:

    +
      +
    • --tune 1: tune PSNR
    • +
    • --aq-mode 2: variance deltaq
    • +
    • --enable-qm 0: quantisation matrices disabled
    • +
    • --irefresh-type 2: closed GOP
    • +
    • --enable-tf 1: temporal filtering enabled
    • +
    +

    And more, like CDEF and restoration enabled, overlays and film-grain disabled...

    +

    Efficiency

    +
      +
    • First of all, here are the full efficiency graphs:
    • +
    +
    +

    This is all very cool, but visually bloated.

    +
      +
    • Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):
    • +
    +
    +
      +
    • Same, but now focusing on the "low quality" range (CRF26 -> 46):
    • +
    +
    +
      +
    • If we now focus on presets 4 and below, where it's more difficult to discern the differences between presets, we get this at "high quality":
    • +
    +
    +
      +
    • And the following at "low quality":
    • +
    +
    +

    Speed

    +
      +
    • Let's now see speed comparisons between all presets:
    • +
    +
    +

    Once is not custom, preset -1 is so abysmally slow it makes the graph unusable.

    +
      +
    • Same, but without the placebo preset -1:
    • +
    +
    +
      +
    • Lastly, here is what it looks like with a logarithmic scale:
    • +
    +
    +

    Interpretation

    +

    As for interpreting the results, it would seem like preset 2 and preset 4 remain all-around very balanced presets, with preset 3 being in a nice in-between spot, an improvement over v2.0.0's preset 3 in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.

    +

    The quality gap between preset 2 and preset 1 is usually pretty narrow, however the speed penalty from going to preset 1 is ~2x, when the penalty of going from preset 3 to preset 2 is closer to ~1.5x. As such, preset 1 enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on preset 0 and preset -1. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.

    +

    When we start talking about faster presets though, things are pretty different from previous versions: presets 5 to 9 behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of preset 4, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, presets 5 through 9 will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.

    +

    Presets 10 to 12 are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.

    +

    TLDR

    +

    The same conclusions as the previous blog post can be made: +clear quality gains can be observed as we decrease presets, until preset 2, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.

    +

    In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.

    +

    SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:

    +

    Two months ago, I conducted a similar test to this one to compare the presets evolution between versions 1.8.0 and 2.0.0. The results were pretty unsatisfying: I noticed that presets -1 to 8 in v2.0.0 performed like the old presets 0 to 9 did in v1.8.0. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions.

    +

    So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!

    +

    preset -1: v2.0.0 vs v2.1.0

    +
      +
    • Let's start off with a battle of the placebos, with the efficiency at "high quality":
    • +
    +
    +
      +
    • And the efficiency at "low quality":
    • +
    +
    +

    Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?

    +
      +
    • Now, let's compare their respective speeds:
    • +
    +
    +

    Let's be grateful it became ever so slightly faster, I guess.

    +

    preset 0: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Overall, efficiency wise, this new preset 0 places itself in-between old preset -1 and 0

    +
      +
    • Speed graphs:
    • +
    +
    +

    Interestingly enough, its speed is much closer to the old preset 0 than to the old preset -1. This means preset 0 was genuinely improved over v2.0.0!

    +

    preset 1: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    In efficiency, this new preset 1 is often equal to old preset 0, else in-between old preset 0 and 1.

    +
      +
    • Speed graphs:
    • +
    +
    +

    We observe that the new preset is a bit closer to old preset 1 speeds than it is to old preset 0 speeds. Good news!

    +

    preset 2: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Oh well, that's awkward.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Speed was left untouched too, meaning preset 2 is unchanged in v2.1.0.

    +

    preset 3: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    The new preset 3's efficiency is the same as the old one.

    +
      +
    • Speed graphs:
    • +
    +
    +

    However, the preset got slightly faster, so this is a speedup!

    +

    preset 4: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    We can observe that preset 4 got slightly to moderately worse efficiency wise.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!

    +

    preset 5: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Preset 5 seems to have gotten ever so slightly worse efficiency wise.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Yet it became slightly faster, this is overall a good trade-off.

    +

    preset 6: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    The new preset 6 has a huge responsibility: being able to compensate in the absence of its preset 7 sibling. It seems to performs in-between old preset 6 and 7, usually closer to old 7.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Preset 6 is now ever so slightly slower to old 7, this is an interesting trade-off, overall a win over old 7.

    +

    preset 7: v2.0.0 vs v2.1.0

    +

    Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: Svt[warn]: Preset M6 is mapped to M7.

    +

    always_has_been

    +

    preset 8: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    In efficiency, this new preset 8 is sometimes equal or slightly worse to the old 8, and sometimes equal or slightly worse than old 7...

    +
      +
    • Speed graphs:
    • +
    +
    +

    Overall, the speed is pretty much unchanged from old 8. It looks like a slight regression, that's pretty disappointing.

    +

    preset 9: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    The new preset 9 is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.

    +

    preset 10: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Preset 10 is slightly to moderately worse efficiency wise.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!

    +

    preset 11: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Preset 11's efficiency is untouched.

    +
      +
    • Speed graphs:
    • +
    +
    +

    Preset 11's speed is unchanged as well.

    +

    preset 12: v2.0.0 vs v2.1.0

    +
      +
    • Efficiency graphs, high quality:
    • +
    +
    +
      +
    • Efficiency graphs, low quality:
    • +
    +
    +

    Just as preset 6, preset 12 is now mapped to 13, and unsurprisingly, its efficiency is equal to old 13.

    +
      +
    • Speed graphs:
    • +
    +
    +

    The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.

    +

    TLDR

    +

    From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off. +Some presets, like -1, 0, 1 and 3, received the most significant improvements, followed by 4, 5 and 6 with overall beneficial new trade-offs. Preset 12 got slightly faster too. On the other hand, presets 8 and 10 seemed to have regressed slightly, and presets 2 and 9 are perfectly unchanged from v2.0.0.

    +

    Conclusion

    +

    SVT-AV1 2.1.0 introduced some welcomed improvements. Presets 2 through 4 remain the king of optimal AV1 encoding, while presets 5 through 9 stand as good options for the people that find 2-4 to be too slow for their liking.

    +

    Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!

    +

    By the way, did you know that the SVT-AV1-PSY project was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!

    +

    Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.

    +

    Future

    +

    My plans for the future regarding the blog post include:

    +
      +
    • polishing this blog post and aggrementing it of image comparisons.
    • +
    • a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.
    • +
    • an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.
    • +
    +

    Thanks for reading!

    +]]>
    + video + compression + benchmarks +
    <![CDATA[Encoding Animation with SVT-AV1: A Deep Dive]]> https://wiki.x266.mov/blog/svt-av1-deep-dive @@ -59,24 +370,24 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...

    First of all, here are the efficiency graphs:

- +

This could be too much information.

  • Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):
- +
  • Same again but without presets 9 to 13 for better clarity:
- +
  • Now for the "low quality" range (CRF28 -> 43):
- +
  • Same but without presets 9 to 13 for better clarity:
- +
  • Let's now see speed comparisons between all presets:
@@ -86,15 +397,15 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
  • Here is what it looks like with a logarithmic scale:
- +
  • Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)
- +
  • Here are speeds graphs for preset 1 to 6 with a linear scale:
- +

One interpretation we can have is that presets 2 to 4 have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but preset 2 is 2x slower than preset 4. The quality gap between preset 2 and preset 1 is even narrower but the speed penalty is also ~2x.

That makes it hard to recommend preset 1, while preset 3 is in a strange middle ground between 2 and 4 where it makes little sense to choose it over those two: it's better to choose preset 2 for the higher efficiency at 1.5x slower speeds, or preset 4 for the 1.33 to 1.5x higher speeds. At least the option exists.

A similar observation can be made between preset 5 and 6. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that preset 5 becomes rather obsolete most of the time.

@@ -114,19 +425,19 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
  • Let's compare the efficiency of every tunes:
- +
  • Now let's focus on the "high quality" range (CRF8 -> 23):
- +
  • And the "low quality" range (CRF28 -> 43):
- +
  • And here is the speed difference:
- +
  • Graphs comparing the tunes individually between each others will be made available soon.
  • The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.
  • @@ -143,11 +454,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    tiles here are both slightly harmful and slower.

    @@ -155,11 +466,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Except for the Jigokuraku clip, aq-mode 0 is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.

    @@ -167,11 +478,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    aq-mode 1 fares closer to aq-mode 2 than aq-mode 0 did, both in quality and speed, but is still overall inferior according to SSIMU2

    @@ -179,11 +490,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF can be beneficial for the line-art.

    @@ -191,11 +502,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Dynamic GoP control yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's "safe" to keep the setting disabled at all times or not.

    @@ -203,11 +514,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Deblocking loop filter can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.

    @@ -215,11 +526,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    fast-decode 1 is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.

    @@ -227,11 +538,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Finally something interesting to analyse!

    @@ -245,29 +556,29 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    --lookahead 60 vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    --lookahead 120 (max) vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    lookahead seems to behave strangely when set...

    @@ -283,11 +594,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    overlays do not seem to either improve efficiency or performance.

    @@ -295,11 +606,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Enabling quantization matrices alone increase efficiency at "high quality" with no real speed impact.

    @@ -307,11 +618,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Setting qm-min to 0 on top of enabling quantization matrices can be beneficial in some clips at no added compute time.

    @@ -320,11 +631,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the loop restoration filter isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.

    @@ -334,11 +645,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Interestingly enough, screen content tools seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.

    @@ -346,11 +657,11 @@ And more, like CDEF and restoration enabled, overlays and film-grain disabled...
    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    Disabled temporal filtering can sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.

    diff --git a/blog/site-optimization.html b/blog/site-optimization.html index 1ad46a29e..da818bd16 100644 --- a/blog/site-optimization.html +++ b/blog/site-optimization.html @@ -13,12 +13,12 @@ - - - + + + -

    Reducing Image Load Online

    · 10 min read
    Gianni Rosato
    Maintainer

    A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

    +

    Reducing Image Load Online

    · 10 min read
    Gianni Rosato
    Maintainer

    A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

    caution

    These instructions are for photographic images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.

    danger

    Many images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:

    • Thorium | Linux, macOS, Windows, Android
    • diff --git a/blog/svt-av1-deep-dive.html b/blog/svt-av1-deep-dive.html index f30fa02e9..940f60930 100644 --- a/blog/svt-av1-deep-dive.html +++ b/blog/svt-av1-deep-dive.html @@ -13,12 +13,12 @@ - - - + + + -

      Encoding Animation with SVT-AV1: A Deep Dive

      · 23 min read
      Trix
      Encoder

      This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

      +

      Encoding Animation with SVT-AV1: A Deep Dive

      · 23 min read
      Trix
      Encoder

      This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

      The resources available will range from graphs to image comparisons (WIP). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.

      The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with x264 --qp 0 for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp directly, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the Zig implementation and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the Metric / BPP graphs may represent the closest we have to real efficiency.

      The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.

      @@ -63,24 +63,24 @@

      First of all, here are the efficiency graphs:

    - +

    This could be too much information.

    • Now the same graphs but focusing on the "high quality" range (CRF8 -> 23):
    - +
    • Same again but without presets 9 to 13 for better clarity:
    - +
    • Now for the "low quality" range (CRF28 -> 43):
    - +
    • Same but without presets 9 to 13 for better clarity:
    - +
    • Let's now see speed comparisons between all presets:
    @@ -90,15 +90,15 @@

    • Here is what it looks like with a logarithmic scale:
    - +
    • Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)
    - +
    • Here are speeds graphs for preset 1 to 6 with a linear scale:
    - +

    One interpretation we can have is that presets 2 to 4 have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but preset 2 is 2x slower than preset 4. The quality gap between preset 2 and preset 1 is even narrower but the speed penalty is also ~2x.

    That makes it hard to recommend preset 1, while preset 3 is in a strange middle ground between 2 and 4 where it makes little sense to choose it over those two: it's better to choose preset 2 for the higher efficiency at 1.5x slower speeds, or preset 4 for the 1.33 to 1.5x higher speeds. At least the option exists.

    A similar observation can be made between preset 5 and 6. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that preset 5 becomes rather obsolete most of the time.

    @@ -118,19 +118,19 @@

    Tunes comp
    • Let's compare the efficiency of every tunes:
    - +
    • Now let's focus on the "high quality" range (CRF8 -> 23):
    - +
    • And the "low quality" range (CRF28 -> 43):
    - +
    • And here is the speed difference:
    - +
    • Graphs comparing the tunes individually between each others will be made available soon.
    • The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.
    • @@ -147,11 +147,11 @@

      Preview

    +
    • Speed graphs:
    - +

    tiles here are both slightly harmful and slower.

    @@ -159,11 +159,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Except for the Jigokuraku clip, aq-mode 0 is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.

    @@ -171,11 +171,11 @@

    Preview

    +
    • Speed graphs:
    - +

    aq-mode 1 fares closer to aq-mode 2 than aq-mode 0 did, both in quality and speed, but is still overall inferior according to SSIMU2

    @@ -183,11 +183,11 @@

    Preview

    +
    • Speed graphs:
    - +

    According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF can be beneficial for the line-art.

    @@ -195,11 +195,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Dynamic GoP control yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's "safe" to keep the setting disabled at all times or not.

    @@ -207,11 +207,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Deblocking loop filter can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.

    @@ -219,11 +219,11 @@

    Preview

    +
    • Speed graphs:
    - +

    fast-decode 1 is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.

    @@ -231,11 +231,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Finally something interesting to analyse!

    @@ -249,29 +249,29 @@

    Preview

    +
    • Speed graphs:
    - +

    --lookahead 60 vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    --lookahead 120 (max) vs default --lookahead -1 (auto)

    • Efficiency graphs:
    - +
    • Speed graphs:
    - +

    lookahead seems to behave strangely when set...

    @@ -287,11 +287,11 @@

    Preview

    +
    • Speed graphs:
    - +

    overlays do not seem to either improve efficiency or performance.

    @@ -299,11 +299,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Enabling quantization matrices alone increase efficiency at "high quality" with no real speed impact.

    @@ -311,11 +311,11 @@

    Preview

    +
    • Speed graphs:
    - +

    Setting qm-min to 0 on top of enabling quantization matrices can be beneficial in some clips at no added compute time.

    @@ -324,11 +324,11 @@

    Preview

+
  • Speed graphs:
- +

Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the loop restoration filter isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.

@@ -338,11 +338,11 @@

Preview

+
  • Speed graphs:
- +

Interestingly enough, screen content tools seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.

@@ -350,11 +350,11 @@

Preview

+
  • Speed graphs:
- +

Disabled temporal filtering can sometimes improve efficiency slightly at "high quality", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.

@@ -390,6 +390,6 @@

ConclusionThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.

The default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.

Further testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!

-

\ No newline at end of file diff --git a/blog/svt-av1-second-deep-dive.html b/blog/svt-av1-second-deep-dive.html new file mode 100644 index 000000000..9ac30a095 --- /dev/null +++ b/blog/svt-av1-second-deep-dive.html @@ -0,0 +1,323 @@ + + + + + +Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive | Codec Wiki + + + + + + + + + + + + + + +

Observing SVT-AV1 v2.1.0's improvements: A New Deep Dive

· 39 min read
Trix
Encoder

SVT-AV1, the most scalable AV1 encoder, has received a new update and one may wonder if the old presets recommendation still holds today. We will delve into that in this blog post, based on a series of speed and visual quality benchmarks with SSIMULACRA2 and XPSNR of SVT-AV1 2.1.0 on a corpus of varied animated clips.

+

Feedback

+

I unfortunately never got to update the previous blog post with the image comparisons, and some people expressed concerns that this testing may not be representative of live action content. For the former, I will have to ask for your patience again, because this blog post won't initially contain image comparisons either, but this time they are being actively worked on, along with a magnificent comparisons component and this page will get updated once that is done. As for the latter, please be reassured that this testing in its entirety is perfectly representative of any modern content people typically encode: the diversity of japanese animation is rich and the content specifically chosen for this benchmark is relatively complex. From 3DCG to extremely noisy clips, we are far from the easy-to-compress static scenes of some slice-of-life show.

+

I have also decided to complement this benchmark of another psychovisually-driven metric (XPSNR) so that double-checking is made easier. Thus, each graph possesses a SSIMULACRA2 version and a XPSNR version. Don't hesitate to switch between one another!

+

Methodology

+

The resources available will range from graphs to image comparisons (WIP, for real this time). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the files encoded during the tests that enable you to check quality for yourself, adding another layer of subjective interpretation to these comparisons.

+

The testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with x264 --qp 0 for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp directly, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the Zig implementation, XPSNR scores on the other hand are calculated using a ffmpeg filter, and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and metrics scores. Bits per pixel scores (BPP) are calculated so that the Metric / BPP graphs may represent the closest we have to real efficiency.

+

The clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.

+

SvtAv1EncApp was compiled directly from the v2.0.0 and v2.1.0 source code using the provided Build/linux/build.sh script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i3 12100 with 16GB of 3200MHz CL14 DDR4 RAM in Arch Linux with kernel 6.7.7 and the performance governor enabled. All encodes have been made in the same session without rebooting.

+

This testing was conducted within the AV1 Weeb Edition Discord server, which is focused on encoding animated content in AV1.

+

Samples

+

The samples are as follows:

+
    +
  • 11s Blame! clip which sports 3DCG action with lots of grain, effects and high-contrast elements.
  • +
  • 13s Blue Lock clip which sports rapid camera movements, complex geometry and high-contrast elements.
  • +
  • 5s Spy x Family first ending sequence with an extremely high amount of dynamic noise. New most complex source of this set.
  • +
  • 12s Jigokuraku (Hell's Paradise) flashback clip with huge static grain in a very dark scenery and some action.
  • +
  • 5s The Garden of Sinners clean but fast-paced 3DCG scene with explosions.
  • +
+

The resolution of every clip is 1080p, except for the first one which is 1920x804.

+
+

All clips have been encoded in a wide quality range, from --crf 6 to --crf 46, by increments of 4.

+
+

Without further ado, let's start with the first comparisons!

+

Presets comparisons (-1 -> 13 12)

+

In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest --preset -1 to the fastest --preset 12.

+
+

Yes, you heard that right. Preset 7 and 13 are no more in v2.1.0. This new update, like the previous one, mostly consisted of optimizing the presets trade-offs. The devs have made the choice to map preset 7 to preset 6 and preset 13 to preset 12 due to the lack of spacing between the new presets. We will discuss the implications of this further ahead.

+
+

--preset X is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are:

+
    +
  • --tune 1: tune PSNR
  • +
  • --aq-mode 2: variance deltaq
  • +
  • --enable-qm 0: quantisation matrices disabled
  • +
  • --irefresh-type 2: closed GOP
  • +
  • --enable-tf 1: temporal filtering enabled
  • +
+

And more, like CDEF and restoration enabled, overlays and film-grain disabled...

+

Efficiency

+
    +
  • First of all, here are the full efficiency graphs:
  • +
+
+

This is all very cool, but visually bloated.

+
    +
  • Now the same graphs but focusing on the "high quality" range (CRF6 -> 22):
  • +
+
+
    +
  • Same, but now focusing on the "low quality" range (CRF26 -> 46):
  • +
+
+
    +
  • If we now focus on presets 4 and below, where it's more difficult to discern the differences between presets, we get this at "high quality":
  • +
+
+
    +
  • And the following at "low quality":
  • +
+
+

Speed

+
    +
  • Let's now see speed comparisons between all presets:
  • +
+
+

Once is not custom, preset -1 is so abysmally slow it makes the graph unusable.

+
    +
  • Same, but without the placebo preset -1:
  • +
+
+
    +
  • Lastly, here is what it looks like with a logarithmic scale:
  • +
+
+

Interpretation

+

As for interpreting the results, it would seem like preset 2 and preset 4 remain all-around very balanced presets, with preset 3 being in a nice in-between spot, an improvement over v2.0.0's preset 3 in a way. We will better understand the reasons for this when we'll compare the new version to the last, a bit after.

+

The quality gap between preset 2 and preset 1 is usually pretty narrow, however the speed penalty from going to preset 1 is ~2x, when the penalty of going from preset 3 to preset 2 is closer to ~1.5x. As such, preset 1 enters placebo territory, and considering the very little benefits of going any lower than it, compared to the huge performance loss of even lower presets, I advise you not to waste encoding resources on preset 0 and preset -1. This applies especially at medium to high quality, however at extremely low quality like the CRF40 range, we can still see some small gains from these placebo presets.

+

When we start talking about faster presets though, things are pretty different from previous versions: presets 5 to 9 behave similarly on the graphs and seem to stand apart from their slower counterparts by just a bit. If you can bear the speed of preset 4, you should definitely be going for it, however if fast encoding is a necessity, for example in the case of realtime transcoding or streaming, presets 5 through 9 will serve you right with great efficiency/speed trade-offs between one another. No preset in that range particularly stands out from the others, so simply pick one depending on your performance needs.

+

Presets 10 to 12 are pretty inefficient, and to be avoided if possible. They can still be of use in a convex-hull scenario, but in the case of realtime transcoding, you may be better off with a hardware encoder like the ones found in RTX 4000 or Arc GPUs, especially since SVT-AV1's target bitrate mode is even less efficient than CRF mode.

+

TLDR

+

The same conclusions as the previous blog post can be made: +clear quality gains can be observed as we decrease presets, until preset 2, however the effectiveness of dropping presets is noticeably less and less important as quality is increased.

+

In the next part, we will evaluate the differences in efficiency and speed of every presets when updating from SVT-AV1 2.0.0 to 2.1.0, which should enable an increase of nuance from the previous results alone.

+

SVT-AV1 v2.0.0 vs v2.1.0 presets comparisons:

+

Two months ago, I conducted a similar test to this one to compare the presets evolution between versions 1.8.0 and 2.0.0. The results were pretty unsatisfying: I noticed that presets -1 to 8 in v2.0.0 performed like the old presets 0 to 9 did in v1.8.0. We basically saw an efficiency regression at a given preset, and speedups did not follow suit as well as we would have anticipated. All in all, it wasn't all that bad, it suffice to say you could simply drop a preset from before and you were good to go again. What was more concerning however is that the release note claimed important speedups that did not impact efficiency and my testing proved otherwise. My theory is that due to the dev team testing methodology, which consist of mostly pretty low resolution clips and non-psychovisual metrics like PSNR, SSIM or bad psychovisual metrics like VMAF, it's very well possible they were tricked into thinking they introduced improvements as they tweaked the presets when in reality the metrics simply didn't notice the quality degradation. Such issue is an additional reason why the industry should adopt more competent metrics, ones that better correlate with the human vision, to improve encoders in more impactful ways and better avoid pointless regressions.

+

So the question for today's testing is: have the SVT-AV1 devs redeemed themselves and actually improved the presets trade-offs this time around? Let's find out!

+

preset -1: v2.0.0 vs v2.1.0

+
    +
  • Let's start off with a battle of the placebos, with the efficiency at "high quality":
  • +
+
+
    +
  • And the efficiency at "low quality":
  • +
+
+

Yes, this is a bit underwhelming, but you can't just improve the best an encoder has to offer with just tweaking right?

+
    +
  • Now, let's compare their respective speeds:
  • +
+
+

Let's be grateful it became ever so slightly faster, I guess.

+

preset 0: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Overall, efficiency wise, this new preset 0 places itself in-between old preset -1 and 0

+
    +
  • Speed graphs:
  • +
+
+

Interestingly enough, its speed is much closer to the old preset 0 than to the old preset -1. This means preset 0 was genuinely improved over v2.0.0!

+

preset 1: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

In efficiency, this new preset 1 is often equal to old preset 0, else in-between old preset 0 and 1.

+
    +
  • Speed graphs:
  • +
+
+

We observe that the new preset is a bit closer to old preset 1 speeds than it is to old preset 0 speeds. Good news!

+

preset 2: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Oh well, that's awkward.

+
    +
  • Speed graphs:
  • +
+
+

Speed was left untouched too, meaning preset 2 is unchanged in v2.1.0.

+

preset 3: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 3's efficiency is the same as the old one.

+
    +
  • Speed graphs:
  • +
+
+

However, the preset got slightly faster, so this is a speedup!

+

preset 4: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

We can observe that preset 4 got slightly to moderately worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Fortunately, the consequence of that slight efficiency decrease is a big performance improvement!

+

preset 5: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 5 seems to have gotten ever so slightly worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Yet it became slightly faster, this is overall a good trade-off.

+

preset 6: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 6 has a huge responsibility: being able to compensate in the absence of its preset 7 sibling. It seems to performs in-between old preset 6 and 7, usually closer to old 7.

+
    +
  • Speed graphs:
  • +
+
+

Preset 6 is now ever so slightly slower to old 7, this is an interesting trade-off, overall a win over old 7.

+

preset 7: v2.0.0 vs v2.1.0

+

Again, there is no preset 7. Actually, it's preset 6 that disappeared but I'm not remaking the graphs just for fun. If you select preset 6, you will be granted the following message: Svt[warn]: Preset M6 is mapped to M7.

+

always_has_been

+

preset 8: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

In efficiency, this new preset 8 is sometimes equal or slightly worse to the old 8, and sometimes equal or slightly worse than old 7...

+
    +
  • Speed graphs:
  • +
+
+

Overall, the speed is pretty much unchanged from old 8. It looks like a slight regression, that's pretty disappointing.

+

preset 9: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

The new preset 9 is the same as ever, ever so slightly better in some scenario but nothing groundbreaking.

+
    +
  • Speed graphs:
  • +
+
+

Its speed remains the same, sometimes ever so slightly slower. Basically the preset is pretty much unchanged, which may as well be a relief, as the last usable preset of the encoder.

+

preset 10: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 10 is slightly to moderately worse efficiency wise.

+
    +
  • Speed graphs:
  • +
+
+

Its speed is mostly the same, sometimes ever so slightly faster. It's a wash, avoid this preset at all costs!

+

preset 11: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Preset 11's efficiency is untouched.

+
    +
  • Speed graphs:
  • +
+
+

Preset 11's speed is unchanged as well.

+

preset 12: v2.0.0 vs v2.1.0

+
    +
  • Efficiency graphs, high quality:
  • +
+
+
    +
  • Efficiency graphs, low quality:
  • +
+
+

Just as preset 6, preset 12 is now mapped to 13, and unsurprisingly, its efficiency is equal to old 13.

+
    +
  • Speed graphs:
  • +
+
+

The speeds seem to be in-between old 12 and 13, so potentially a slight speedup. Still, nothing to get excited at.

+

TLDR

+

From these extensive comparisons, it appears that some presets have received genuine improvements in their respective efficiency/speed trade-off. +Some presets, like -1, 0, 1 and 3, received the most significant improvements, followed by 4, 5 and 6 with overall beneficial new trade-offs. Preset 12 got slightly faster too. On the other hand, presets 8 and 10 seemed to have regressed slightly, and presets 2 and 9 are perfectly unchanged from v2.0.0.

+

Conclusion

+

SVT-AV1 2.1.0 introduced some welcomed improvements. Presets 2 through 4 remain the king of optimal AV1 encoding, while presets 5 through 9 stand as good options for the people that find 2-4 to be too slow for their liking.

+

Let's be honest a second, not much as changed in SVT-AV1 since the first blog post. There was no need to redo all the parameter testing for the simple reason that their behavior remained the same, as did the conclusions drawn from them. I hope this article wasn't disappointing in a sense... Still, be reassured, this was just an appetizer, there will be more in the near future!

+

By the way, did you know that the SVT-AV1-PSY project was initiated a few months ago? Its defaults were tailored according to the testing done in the last blog post, allowing a free efficiency boost for anyone not keen to tweak their encoders. Furthermore, SVT-AV1-PSY introduced a sharpness parameter to control distortion, a quarter-step quantizer for more CRF precision, a new subjective SSIM tune, Dolby Vision support, frame luma bias, and some other knobs to improve the appeal and consistency of your encodes. It is actively maintained by a group of talented people, including the main dev of the aom-av1-lavish fork of aomenc. Some of the changes are being backported to mainline SVT-AV1 due to the increased interest of the mainline devs. Please check it out!

+

Hopefully, this comprehensive second deep dive should give you a helpful new starting point for choosing settings when encoding with the latest SVT-AV1(-PSY) 2.1.0.

+

Future

+

My plans for the future regarding the blog post include:

+
    +
  • polishing this blog post and aggrementing it of image comparisons.
  • +
  • a follow-up article in the relatively near future about giving you encoding tips and explaining common AV1 encoding knowlegde, for instance showcasing why film grain synthesis is a game-changer or why chunked encoding can prove beneficial to your encoding pipeline.
  • +
  • an article focused on observing the evolution of SVT-AV1 since the beginning of its development, as well as comparisons with current aomenc, rav1e and SVT-AV1-PSY, including a quick look at the current state of AVM (development ground for AV2) in comparison to VVC's state.
  • +
+

Thanks for reading!

+
+ + \ No newline at end of file diff --git a/blog/tags.html b/blog/tags.html index 258ad418f..97e2ffe84 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -13,11 +13,11 @@ - - - + + + - + \ No newline at end of file diff --git a/blog/tags/benchmarks.html b/blog/tags/benchmarks.html index 1897be36b..20000668f 100644 --- a/blog/tags/benchmarks.html +++ b/blog/tags/benchmarks.html @@ -3,7 +3,7 @@ -One post tagged with "benchmarks" | Codec Wiki +2 posts tagged with "benchmarks" | Codec Wiki @@ -13,12 +13,12 @@ - - - + + + -

One post tagged with "benchmarks"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

+

2 posts tagged with "benchmarks"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

The resources available will range from graphs to image comparisons (WIP). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.

\ No newline at end of file diff --git a/blog/tags/compression.html b/blog/tags/compression.html index dda8cfa35..fccbbb319 100644 --- a/blog/tags/compression.html +++ b/blog/tags/compression.html @@ -3,7 +3,7 @@ -3 posts tagged with "compression" | Codec Wiki +4 posts tagged with "compression" | Codec Wiki @@ -13,12 +13,12 @@ - - - + + + -

3 posts tagged with "compression"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

+

4 posts tagged with "compression"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

The resources available will range from graphs to image comparisons (WIP). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.

Reducing Image Load Online

· 10 min read
Gianni Rosato
Maintainer

A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

\ No newline at end of file diff --git a/blog/tags/discord.html b/blog/tags/discord.html index 3f177cdd1..d14b6716f 100644 --- a/blog/tags/discord.html +++ b/blog/tags/discord.html @@ -13,12 +13,12 @@ - - - + + + -

One post tagged with "discord"

View All Tags

Embedding the Un-Embeddable

· 9 min read
Simulping
Maintainer / Encoder

Feature image +

One post tagged with "discord"

View All Tags

Embedding the Un-Embeddable

· 9 min read
Simulping
Maintainer / Encoder

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario

While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.

diff --git a/blog/tags/image.html b/blog/tags/image.html index 9364ba5d6..b66a99e13 100644 --- a/blog/tags/image.html +++ b/blog/tags/image.html @@ -13,11 +13,11 @@ - - - + + + -

One post tagged with "image"

View All Tags

Reducing Image Load Online

· 10 min read
Gianni Rosato
Maintainer

A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

+

One post tagged with "image"

View All Tags

Reducing Image Load Online

· 10 min read
Gianni Rosato
Maintainer

A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

\ No newline at end of file diff --git a/blog/tags/video.html b/blog/tags/video.html index 2095fbf52..c5862e719 100644 --- a/blog/tags/video.html +++ b/blog/tags/video.html @@ -3,7 +3,7 @@ -3 posts tagged with "video" | Codec Wiki +4 posts tagged with "video" | Codec Wiki @@ -13,12 +13,12 @@ - - - + + + -

3 posts tagged with "video"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

+

4 posts tagged with "video"

View All Tags

Encoding Animation with SVT-AV1: A Deep Dive

· 23 min read
Trix
Encoder

This blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.

The resources available will range from graphs to image comparisons (WIP). The former has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the latter are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.

Embedding the Un-Embeddable

· 9 min read
Simulping
Maintainer / Encoder

Feature image A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"

A Scenario

diff --git a/blog/tags/web.html b/blog/tags/web.html index c8398f7b6..b0dc6c35b 100644 --- a/blog/tags/web.html +++ b/blog/tags/web.html @@ -13,11 +13,11 @@ - - - + + + -

One post tagged with "web"

View All Tags

Reducing Image Load Online

· 10 min read
Gianni Rosato
Maintainer

A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

+

One post tagged with "web"

View All Tags

Reducing Image Load Online

· 10 min read
Gianni Rosato
Maintainer

A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.

\ No newline at end of file diff --git a/docs/FAQ.html b/docs/FAQ.html index 6dcc1866c..a7b7f67d3 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -13,12 +13,12 @@ - - - + + + -

FAQ

+

FAQ

Why are you doing this?

Multimedia encoding & the digital compression space is an incredible field that many tech enthusiasts, professionals, & laymen have no easy entry point to. Wikipedia has a vast amount of information on many of the individual topics covered here but doesn't offer a cohesive way to engage with the entire sphere of knowledge as a whole. While this site started as a lighthearted guide (you'll see the remnants of this strewn about the various wiki entries), it has quickly become an endeavor to unite digital compression aficionados to make the knowledge more accessible for all.

But alternatives exist. Why not contribute there?

diff --git a/docs/audio/AAC.html b/docs/audio/AAC.html index 26df8baee..c918d036f 100644 --- a/docs/audio/AAC.html +++ b/docs/audio/AAC.html @@ -13,12 +13,12 @@ - - - + + + -

AAC

+

AAC

AAC, or Advanced Audio Coding, is an umbrella for a number of different codecs. When people refer to AAC, they are often referring to the commonly used AAC-LC profile developed as part of the original AAC standard in 1997 (although there is a distinction between this version of AAC-LC, called MPEG-2 AAC, & MPEG-4 AAC which is newer). However, there are a number of other variants that have been created over time. These include:

@0j>reK%HXe3!y=FnUzXjna=u*z&3D!bXA(m!wOITe;{AD(_iw)}{3Y zvaj7wOK{XaEG>s}gy}}JM-v)a8{5zVVCz9`KHMwCPl|WehHiTT0+)_=ke;9tNKF<1 zB4U7u@p-bdEZLSiW*7pY$CZk7%T}B&R7busf54z-xg%Sd0y%n@!aO+^i-||4WL`DT zv9nay1)F@3MT|t6#Lj87eOE&aksax%4d#}H{PgH?ZrC!lf~Mq0HeO$v4{x5lsYy>^ zKKe?3^DL?X+4yDYpirmJfX--WyN{q`BO40?2?&v5O7wYf>UdU7p7EXjPki|?r~KVD zN)3Ca4<%$bD!UgjkZd}zJ#9z~zB)0|+E}uL?G4oXdN)#$r)0F$k+?h8*gmOI*I}gm zIj)=&XtOj($yy6e{Md|O!8+QuaXcL0<*Yc26@|T_x@~lHV8RcP(h0f-t8gMqjr-GT z2}NpZW<)bY0~)S_{907+<{Ln|1L6+pfl3cRs)>SWXC%1GWGkhvu`$HFt9ry zK#fRZ8i$cwz>W#!N#8Ie?Czn52$FIS49hSr(G?IE71f??{TY>_pdvOwpi7Z9!=*1Y z>A2|mZy&$e2!}I)T&<`~8DPq^r?-tG}z;(V&ys0q^#iZ+qPy z-c4p)k+JIeiY{b_(&Uvn5@xH+04PjIG>P?7?($5hEG?7z-#;FrAh-aIMG6Taq96cy zG)RkwuT&O=;HSsOvU4&HIO2;9V~|3TCgpX(uX(+Af17cW#Y}eid9-d+2+XvUYrk9F zskUwzR>x2#&Zo`05ig8e9>bDxDxNC(Z`Sg>_f-qqQmoewr9!tp`p`6iaXK7VPT&%< zFMoK!_f1S{VG-3!b@^$G<5}E@gra`?aH}>Oz2bmqL=6h&;y;^HH%F=d zJf(9si3c2-5ZtUG*5R^OUWz4!H>SvH6YoEGHtu^jkb(C#N)f-#KFOPGmCYEzAL4Ip z{C-pQ*2_CSkE%SJn=XeurV(VHHy4Er{@_k&)jZ|}r0r38k$xk);g&!p*e}_d>^%}* zTtJK3EMjXZd-_iv8cyp!f27r6j*|c)*@V|@7JcOhth%rfyUcP-2t)h+pTiH|@A`ET zXzcFmU6V01wQg^_I70=18mog|v>D=arFT2~n#MuggCi6St8Tb6JU&Vg_L% ztdfPFD;~w1JJhZj6y1WLk;zW(*?0Xb@NH(qmdpP5PdryXz`6nfg+KNV06th``kqvjKw#Ms z{_p2gY0AjU)K_~4fKkAelth&-jjI4?>6&zooF1$=QxnyX9JEXu{802=x!jo*ilxO= zVKALvF=Jz{%df9@}p$e<6}FD#QTBOeZG5*X{i5#zJ92BD8Hw6TkIZI zB3HnJi8VZGSEHJUEt?)9C8`ez?Fq5IKe*pRvpD|uQ?VFLovGM~+HH_!zPf40eEE}o z6nI#ttX{}@7GdELZ3Nu=IreTs&7ff^1qS%aPh#ZoI`&?Y}5OrXPKnsopn_<;c2<6ty9#eU3u0$lt zCIz1s!@Ijh!RAEsW3>8GXkCVu9}dw+mb^XAd1SMME#e*LW24^=@bcaKIH{`ms=@Ld z9gZ056Sx-pd9?Dxd(|_a9R(P=kjiIdxxW{{%`8TDti-!Tq%rZ1(!#BgLdZ-ugw?z( zU^~17HvKbx2P5=e`mue{(Obmz=TD+9De8c!%>1HbM>qomy?r?m%v30oCDG6z4P(2+ zXur{>)d0<>W`2cALm&2?FT;^F?`D|>*y6#7^vD#M6BM#<;cG;AN0%&OkeA4hjMMhh zn3>J8nDL`hp5Bie_qDzPQt0x`T$uUcX!CZo$@uHN7ssw>@-q+W>E12b`!t!7=7StN zO}r6mDrpo}h#($YOm1XE@ATL~tT=HdJ8;O1cg--ZY_iZu2qK{lyX+y#So1zWE5fMxg$%?raVyrHv8Y$H_+M+}trcuz$gzPL0+Rdw<4$vA& zD?kLKrB$lDO`|(qah7@X3khv;jwWTm17Ba9boydJ{E_fcfI_)7LEuF3tDXcZ?C!38 zSOrCwO@4k~tlCoX0n=P$Nc&&3g(SnL_*KdwLumzTsApn~v||T6q1H)o(q~~wz{uZV zXf?#jldR=gC#585N~{?AP!@3|br|%JG;+hbNuvpf&VQCH$*Zh#83Lg&G=T_J3hRb$ z5LAlB7)8(M*3TKAY%Tdn8h*lUxMn<<>T`YGV387U%5P=<3 zF`R`QSk$Z|nu~STb&Q#vA4ud37+5YCocWZdvdgV8Op|46o)xBpus z9bB7br-<6z4AH*>r4G5KA+C{PAudjfK})k~hzkICcC@~!kWiGy*zJv;PnCfmod3)9 zH{-c`enqL=9lD`FS?cZ}Ig0CYGzF|u0|Ms81!Z%x%@a7da=HrxF(Qs)yuvh>OAQAg z=Q^&PNJyhDmEY-Rdx_$zWJ_GbVrJ&SmmGfLwKCxr5ly4!)nGNjfsT-uc0~23pDx~O zSKLJ=&?UN9FE@LBT7M&6#CYg)8s2`(z7{6Rb42JL^BkE9sZt7Uy%`k+qXPUINm_zv z_!scpMJFj=S>A$apUR+hWy#ynjg;}*BqR`N)E2}NQ+=twW4s@Uww<*y-r^VQzp=-- z@y_`q;7C$}UJR4uov){zw8G5f)I&om$kk|ZXq(^;N(50wyp@pn!uP~QZHmuRm9|e{ zl9mSTgqwK}IdHBtH|y0(r3zQ7IQ)7ani$c!FJ~A=4izZgJ;C5lC^bh;-4%I(f-x#K8>4|yTYncw%MGL0raQ$_SI6f<7&r zS`%f?=chGrNw)w?0us{zP(@@1!C2etwPpADkG2R?+@hRx;pN8+(aZo=rxB2)gwt_l zW~{=}q(Tu78JFE?;b&5zXd%5k!OEehe~SAw!yzD`F*$p{SpJ*y6UWBn^{yeJ#hr)4 zlcKor3IcWPFhrq+j)9l4L7^-<+PHAg?D@vf0*Ntsj6Vw9eq)E%rj*G*4*1)qst9r&=xwsVN!jjp|tM0=Ay^Ad)O{Q{J1LImN`2l~Z9PA%xBuE;11 z2N)G2+~lGfNneE~%^4Nvh^?$Z+S~&ZEwc8=d`#-m{Om)ehY2xGmwNx?Zhun|8+OGc zmRUR9^6=_i2!|o=aDr9~piB>|Tk}?4v_EszGSs1T1#-afTs>Vuc(}9M9LA+LQ6Eyu zUQgnvvj~Nk?z7!>mJSP-V>2)M!kBq4R4(rp%<|n>LMic#nZ_I){q#@$|$} zR<827-$B0&r$__ARUjB?Ob`m%?U$HntqJEaz(%K*M5UUsS+lv_VN_ct_E8r{Wc7phK6bKko=I4v!}wUs>&I);X_CQy?`Sc-oHzL4Db3Q zBhjb?N_>bb#akK#7=Y#wz?!Khe>kTzh*}d1r4ozGVv5G@sxlxG`Jskmp#E^Jun~NK z=FPI+^?;+`#1dhERvLs`1(}fb=|~ievMgGs434=LXQNl&r_p47zt2nT#>ak2Zusis zFJeGO9HapW0CQhnpF+-p3(=fVfZ4ee`lDf$bOD~rLGvZSIe{HGw&$KS5?9j4 zLVmyccII`(zTgDlS(bU=;bFmgtA6pm@Px=k}q0qd;aiDoMy^i$RIL9?v|g> zJyAQ*O_WgX;Wg-Kos>Vfv2Ws2G`N3kfA-*r%WrAf=6@8OgtW4jnUn?wJ3V5FSA&i`9FSZB^GL&4YyIB}SDa)7mfCLJP}ufC**q<;6K9=tFX-Rj?`uEP*v6fY0@n5gz3AIN%4vP+&^eHvVPJ6t z;}XyC2a~c6Zh4GQ#q3sv2|ll^6iI^G(G{+&7DPvaN5|kfMTV2W#&w7UUZ1dFZqsEN zB}JV>%ex;kWu{`lkvSn_j67Y=(Ckn*_g}4l5(`axTT;u$Ewe&75KQcWx=y)Dkm z>Pr}wWYvq@>S{UR3+c6yKr(5RxIsp0o6Nx4i><8zKYua2D^^20c>xIw!?DT``$BF{pFN8T38sf>gIm&T3*LCK}MjG!@H$@iMj788UL2WuRJmucj{ z7B9k~jue1p#DHBX+KSNR0`TgAJsPyc3(X)UPIR>>cQmNjwaSPAAc*VYlR2@h#4-?2 z#(6J-FROXMvmYb>`kLm&9k;h?YqBUh#gw3U;{Zd$oBcc0^QNg0xaQNXh-bgfg?BXB z3=}`)QVxH5m=>?C^YqGst6p|f z83#elwA8)WS*dVJil6X3XkH?rd*9U=HlQ}!`t9)_=EE;2)qBzV>Mb7O80=M|ZTh%sYc z-~&#$>SBvISd`s)>f1Mdmh-^ciNz7qkUu_B+iQAeozIw_wbknmiHlF<#-*UNDe`OZ z2gRjvGDqg1guuSPs=vR@Zf&+PL7A99km9ljh;bwqu1-nwMqj_CZ8Lw1?jX7;eT5QGCYJ{sA$byf900g%f4Jx;z||!pH;k`!{%(A~SHW~h7`cyP z_oB)IBGMLmA7l!{BoZ(%%#8L7n(v)kCz2c{(9{v?Ey0|03r|=BzsJdEx3%J_X;P#K|N@d`(T?n+zQ_WING@_koRz2UPHnXQn&1Tqs9MZX=5 zP=8f%-iV>IxsnInYrScIBYyun4`MX+-_Q#9bs04>?$pzIxl&AS>!{W=k`+R(S}wiY=w-&aYnB|SwXCfz4QM0Pq%!004d91ir&Bx=3mk!r^5X*)67xrRZ+RX`4=c|JFn+-cNSvRlwhCN%1ZsD4Zyf z!bMTmIT2|xc#Xwl2YxM4Z#-uf^wuPw{}fQUNAh5UGoa(tm+Y2w44b<}f(EQ@b^)qq-sitWixIR&SpoTNd>c8dYKN0U&5BEwx5V z@9&BHH%on)dobY&C=!+cR%uVa&w?)>X8kxJ9_3v8C{)V1pzt}!!;+jRmnJ2WULCdlHTqiv}fTLTAzVgtAU28VmAr?Psn-lms`=+ZeXB zcl7~qLP7w*!2u`iJ;f`yNqSIQbm60@=`$$fc!z!N1?K@De4Pcv1c79|I5eO%v|~r> zqk;#jp3X|*kzBpgJN4qH-iiMSbgf z(fva6i`S=+q*s^04K9@>2DuYv7Sms3WtRA}Jd*nTlWST64Xn1M1f#!BL3(VQlsaMEXcz=w(4=cn;v5cDd7F33tYN0e}2eLDRf0%B(`ZzeqD-$&W0rUW5G8#|Z zwy0}kP+S^`jAY}*7G)84`p=U7noP5gb3gk+VX2v&s=OQP>cd6G$rc&KN1Lp5E`2CH znrbXd7e#uQpYkK!e;^z=B(gX2_rdSkh=RVO2jNpxp2gw!WBX|T#)3qMg)49)Lii;b8EwU+*!QQuCrP>ch z3R%uwCcg%tqAH`z7e%VjBd6=ObjffP{H-^X(M^JT4L_LgeT9w!!?v`KgVruC)j2$#eYs3~9ch zT#`~2n(kWZh>V?gW_kbDZuzFLn0t`n%66^!ZEx>dkzAvl-}^~$S%gWGmZJGHx#Hn+1N~c5=^JAfxUsbHDJ%3Q;&_3dVzBwAC!EYS`D!RQI ze6<=OV;9WeD?E+v?lLWDrgSKaA8YB5RD=uVEZ7fqA707i?I9VZnHeo<@b^As9N`eaJt z_&T^HRp?pmK9B3&Yq{HxBHoh-sC8`Xz1VieNI=9^+XT_WIAhp_7c!Z!$_rPDt}gdc zMpkdF;M&jL?4DS~q2_~~0j_8liLqt0J$2$)kiYm44TTb*hW`B{yRKE3fHHYy`S0_^ z3$K4wt=}s13I87IWO8AN8~^kI%|q=W6TP2XjV?X*swzx+ZPo9y#qudfvL-O4+M^>L z$4l)QRruF>T(HlqpV{LlYqd3pYxbqOo~3Jg7ObRpdd%=Z9rOTbHaHs$MPBHV=>d3i zAq*b-_3}*w@0(FXs_qat5|0*K2#Zbl^pvO9O(%CwGF>G)9riR?Fy_0SaK3>=m4;8f zh#gvx0}DWIs8EC8u!RZi273oBoQHfiUR8)Bq-(o%UO6FInF9{~-MU(VEz5paK$)~x zVI8sGBI3SeYte$cKN-Q^miGKMEt)P0a7o9R7_?bubh(d!xdly%9yRDOmz5#we*XB> znr6u?Dd;M~su?Yc!^Zf)*;Hz(3GGht&ug#=Az;$2emna8KyhA7D+3_IkA=H;D%E_W z*`N3(fCjhuO%KBcod9gy2c?IM3U+rdx2{F4$0Y?6? z2rz3NIeWT7U%QOeRl`%VAm&rgz50bV^*mh~C5jLfk8y(;a=JWQG*(wrpc76~&{1eB zF2;gT6WP{Fre!eA?`$>}oAT6>JltEPi1c9nCvavQ+*840?_v9`De1q!wNKU^wsq{R zPZ%5hFP!Y1T1%9Bhcvf#ucMz>&%4$4EEue{+p`@>eA>ABj2hNEwc6=mF}Ha7{C;;g zL9k{V-nsw?mgylZ;`9Y3rR`C}3)-44+hc+#>Eo#T3}^x=<)Xh11q3 zM3&h}rV`B=62^>pfX5`Kk~9^|Q%-Q|R}Cr6t}AD?SnH+o6mXjE((Lrmp@=*z zqod1aAQ1CSi0w=sP)xZvZWK_mR2jW_&G_?Oku`$Py4_9-07k%zWTdSw1_ycdB|{G1 z1?b8woGoU$n6tPBzOAvkAmE?367Rf4+OO<-zM*N&t>ULcxvdn!INj z*#?4D9h=2FTOA|I%$TAC!NiEEhfN`~WEG?KA)5U1P@fPwHCH0iUy>K%mXKf8v!D{+Bm9TsCY?i4FU!@M^P7es7_s;=w0r~mB# z^$arUG2#d5e+uV56?()pAVkh>`GRqwawluHN4QfbqtwlVnpKg})9QI;plN?QdY`N+ zO_T)B(Ce=0_EU*E$i^l3tgWZh*w@wBiN>hO0X|NW^|Wi$j@9t1alX)b^&2-U=SJDY z)FOswA%25vvX!yp`7UVg$^%&a$i#Pky0O+{uMLY~ffii!xXg{d70cW&zkf@L4R&N& z$`owq=s5Mlr@p6bdj&&#H>M1v=93qa*GIW@A^KReM0M5a5AJYdai6}8^VawnpH0*#7Ve{{rup8q)x4gKxIi^ThQ z+ah>t(DEEy;)S_zD-ggpT$A#&m=&WZ06A!F4U3OcZ8$gE`SzuA$NZ66>m5g1)sXU| zwSefgEvl?;^3>$E%~fcK10rLAo&r%u476se?g@%r3J-SOG>GPE(t#lsb0m@vra4MT^rb)H-yh&I(D&-Bl zc)AXb$gaXOY2${{cY6Qc|Lgd7EdUNgBH>YhA`%(Wu5Kxa2gq;1*pQJlBzmbE7Bojj z?*r392!)mjQOxm~`tpxXl~v?bqW3;Kh;o;zC~4$m>RZ8N-cjFdN#jyVQmUvqKK_C6 zJ{@iGHWyjd6G)(FI*r_$Gl5a9XM;S+hFTa*ia0A05^e={J71-EJK^u|Sx$h ztn}E=7#0gnwGbMn`;ir_gMqJjNbf6w)$fwM@e>AM<2W&UNFOkQ<#hq!J-adiC_0ig z4h~|y-f+i~E03UV4dlEr|8?5=?{xO}>X$c<^ZuIKDHascXt5>rMpX+_kBohlERt&O zVob>*jpP7)a#btBJ^VE`KevWTny;=p3hkP=J3o{$iQGE#@_(e>1!<&ST&7X}F!%8) zZ_p2XjDFA14x{A|{;zls^A*&<$@H|Tt9v1$Fg!2HYC z$#$m@8#(I}(vio54@U}mOTXFNJ3Y1P3Ro3;aJN5A|4xx*|JL?7%m+y_UYSo!u*er%-K7JW>mD$fl;Tmi6aAps`kkAaD(0?`#W;)`sQ!% zyT8c+;N<<%CWWY^O{~w13iG$5kih~|z6E9{3NHGX6dL!+QZV&*f#{v^_}?e%W^ z-g1ypvRQ!!KM&G{T0ZVwErzZI(Q|U8)ej)^D z27pk^h@46p0z`os3g8w_NC*S6`>cko1}x39!K0eDxspicvI&j@eo~Fg$C$y3=|0bn zTeV~0KrPNat&J2A^;+Xb7jY>?qp!5Vs}oa!PX5Fk<=F}6qOCyNz2O1i%h3MBoJH6K zK!(W*C5UG*TOm8ousc2QU_8mv;7}S&j0#Fo21!;-bLzEfzcm)!- zbYQ@>05XB6fmuSptBWqPpK8FOP5S*yHcxhb_uYK_YpD5;K|OHpv39&!fo&;lD%JhK z>R+_|rE5^*gK>#J>^8uNHP)y5=D!^OUyIk(qtXv+usdsAt>XT(kE(_5MsUs5SW-&B zcbcj>c{IoinSUXAHQSB2(RTi3Bgy?HptS|x8`7lo$gvj zi>XcmX@yw`Tx$=|J{_5Ahx)34CnwQ=58 zui4#i%qx~+LPc(u(Ix;!VUv-IF@l}8Gu8Btg_Eyl&i>xI_aXX>S>7%+B{xMt*p~(x z$45T(IjPkLfrQ1codjNw4Tc`7SGC~B2r%QE(Nmqe|at=Y?C92hZz zdYYQ}3!3}&w0+(L(;>N}1rzQkn9H^7=VxYW$7g~-Xq3J+cQ)UXxqC@Zq@PSpFMFI- zArfgwX$ySkl=+()nFN^0i1@-}gbS)?=w3f)5nY@EvNUqa71A@~_l!d_K!Cx;v93@! zOcNpDlt+(o^8Q`_B%}SY!}pIa6fV3*32dn}va=jV`A-|nV)Y7XqBwB+6^f2QS*Eiy znVpV$G|(23wNZ@;f{Xa9QZx<;FYdappj0QyMpf=I(%PSCZOEg+sbP>$2T~#8uGcQq?n4HN08K23&xDyUg-^t^C zj0ST+5XgLUElxg)+gI!ZCyHczIQ6p@xokS5k{x6XxK)mXCeZ(A_P%n9R4+BWH}+5_ zA8i=o#*F5&WQUnS0gszlELaHPB|*LbltqD%Ner%M-ygDn|KszvvcaH{LTmR}x9pmk zhvf$Q&(>qMHDAy7Qj)46{z1KHxRPFs{Pl2{>QE=g&bQDzT~xm2I|6lBsq=PIlY172Nx6JsJG444H*UGEJh*GOZ1#OtQ{>9P)VhUfvVL{F0cn zRvdMiB3$BKt^2drL1}UC)t=1$TRVK^^n|3moH~XFL`9{+{drm6em}Hk$z}l z6*z{P3q^7KrlQf(!xaauPchQAkHujLnQkEOM z_xGgp=95jD9g9;3B)3E!y(flEEN&ikuerfiO!5_!+;mSl*8h#K}BxdB92d&}KYsm?10vx2#x#6v59(|AzY2iBr<+Y}`D=q%eXH<7 zofLqF(@s^u)j@6+3kL8B#J`?sN7TDt8(E*b;^$VWqY?@TCeJ^fg)hpk2!TYO3bBYn z#u0od2vjuzo^FeTn<=TFG2t2_9ZozvNvdRudbwQV+8e&)D0`F|r((!>_@@z7PMcx^ zy9Wlx(!I24|wox{;9g|C>8%)NWj-s)m^*ycKEj;g#2~>pwqa zvUfI;C7-{4DHii3CI7LRE?dsDZDhT(DA!#oe@(|2YD83ip6N)X>8t3wp@(0*lHmzWbzXh5ZoHp$ z)C^u0*sMS6+2VOT+vnukgaQ&jlE|J3PV^hU+?-glYVM`9@_H3iT$18`<~KlXRWb!{ z&#QSY$E-(TXXVATgT=n7_;Kg&O(kAelWx5QHBQXaXaGL0527zj{S#GIVpJ>5+yWH0 z74A9EKoZ!8CmhJ+NyaH&+3tr*ow>~Ly3FKnY5LnSV)(%s$!`|lEMVR#U%9gLbXyjB zGAFlS2!O{ds~#tGqVwJrXJ|Dg7J#bZ7U*NED~WSOh-Na=X=oHdSWoT;L#7_HJH25N zZk;NnDkf0n8phL+`AH|6?>|1gx;7kCf=LLzLl;-m0WF)hjcN)t#y%)ue=JfxW`%#0 zjUNt!^7B&jNP2Y(3qs6bvtMg$MZ)r*wEk%yw2Y*_aoSnoxTWWlPA&IS8qOt0Un5GJ zuVG&W*AR>3gi`Y*DnX&B0l43t=b4f$0?Nvmd~-m){%R@cNw5N~LUJ^YRap%R9nlkI zg2SmZ5`c7DOv1W5427uXfI|rzoLSnj%I57VwqWQ1kQ(#Zt7}QUj0!$Mg-BzH>n(8D z;*0K|ZeAxjZQJCDRvGP@-NQgXUv)n_x!pb@GT`jC0ZstLxP7`beRfg4tl&X8+n4od z>)yfhZ&{CJO)2TKC_-XM6};&>Ob~EKazevceZiAyYpF1^=v-dyvtyag$D+OoZU4ryp@`wT^j$h z^xpj5!!MmLuXiF=FKlec^A!eHm)P>W6eRNwD;))#0)(ij?WHJ=08TXxx>pB20CDgh z%T~`te8K>=KlbDFZ{YfF;MSi}G8&q~C0XRAE?muc9{(8plud6hja5RjvJ>6zr5CRA zp^?gi$wuBpZI*ij0}yxn7NCj|z541uC%6&k{YW8t2qxA@>gB6%5jsK+Pu3P^ zT-FGBqlUFZ16?$$;o<;w#8NbUOtq*5S`IMhU zWt9~~N=h>3n%sG`AtB5ySgf|cN+S%yxgw$icEY}vwb9g{3;8pxF#v}Xq_ROWW8 zj1mI^RAO8k3GlUX(N?F~*Wc~E+gC45rk|I@R7UX`RN^ziZ_h(Cf+Ax_5u8!D=vX@< zl!7>bfnx)n1?eE$NF2i`8fIzuTqmf(@5!TO=mRwow;E}>NHbd$B^6fi4mALoz^DV5 z@C~O-fRFnrD5=beE+8PlVH4sU8*kM@ZtO}*8s2c=l!pb1A<8kgl6z` zXwKF~29z2cADMPw?7_52QeWBf@6(0pGr4%(f`GPXg(11mR;ZTcPqzba{$f6pyJKx$ z?GLk1E#@UwZP67@tk@Se3maaSUrVn&ELMKTZroh=u-|!6_%YSOM8e|5c%-<8E;*r& zFRa?TsgKVdGJ)!S?n(fv@ZMa)t411jzqjeK8}`^FG_6s%a7dLDD+b{raX>6+h9!_ zOZV4SEyP@VrXD^9sRBTov4TqA-y4eBCX)au7}$vN3cEaJydsOw@Xdz8A%K!T9?S`j z1`^;ZSVGY(08fX)+&S{A(|bfywMo~S5yS>K3UVrBBmFpCs4&zS2BC-%824e5Eb;S0 zQv)}QvlO>BBw1O1zXxYJn*Ya3OO97Uqxm1)vnjgScE0^xJI^M3xn19|TU+SR&FAu{ zp}BE+F1+tK*h@Aid)}&+FV=dptl`(OaGJ5y=F;7p|BmlDuAFoKdN+C3{W@;I=49(w zNnv|qky)%tG>~fe(`IiT^A?I@cfi)P6Q0kOE7{GNe?~q(vNyx8sYfUOFxcz6CMApq z8Vux=aR5rvi6GQ=*<}hC0WrE6waOZlR~#rUf`osbqLJ`E8_v~ncOek4P;_<*Y(?fn znDn;`n?DW**I|}dy5%iLQHay zEG$sxM^#5hfg+-PmesHQOzxTg7y5zzg44uWIVM-aU7kv&++IT~j!)w*acf6!5h-fZ zMMoili@R?NR-2FGj(iYu(^h$0gg1zX+?JCD4N{82gJFz(OoofA5?eSb-yQ?t{Bf`Q zy;EIU+g7KDxsOFnJHKb_>Df_m9QhDH`(;3U8q9Clpjxgxv+72xKA9iDw`xnBf`U5; z#R76_R*>z}iC(r;$>j8C4fp@hK(!tj`p1#w4r$E_e?DhBXY3ZOiT&+IE-WZ=6Y}RM z+cAkXbxQLO-Cya7y?yCq=Lo;*oq(hA8RDM*Tswja2$qkCvyG*{M ze#k|cEQE0H%Gt#l5#FUc{#QSvsk=o**G)s&?190F@59nDRL@S$c0+pe@f zmmhJ=+MZj(YAy9Wg;zQA`OX6fvV7LphIJ(p^P%JK#<+Kr`8Xr4A-4#tXXf{#AQs@kS%$ARU-WmsynY&9yc=vCt{eVa@`V?HD}DHAPST2RhL9I| z0m3N3(PR}}zLrk)%4jsN7#hkNB);`of7<7p)Nb-Rk5h8G=y$c72rVhHwHy}fCyJlrf}tpt}-y$wY#p1s{UXDFK?bL;EW zCDTOUYW2v>5OOl|no&L=C8dL!sY25q+M?Z#cIE0cXb~;k#<)~?t+Tu{*i;$s6B?vd z&(w=`F*GwH<5UDp?E)REWnTR}t$|5Y;6YJfUFfcCI9??|0XwhxH=yN6*$^DK&dp=qPWI}%=W5B&&beQE z>T71eNfk=Ya3V;W+JFsnT66IWG@D~+Xs_g`iqz?%)41jPpeSY1S>T;kr8 z>a!$X^Fglt?r44ny-(3*T}y|EO&8U@FCCcakaCplsAALUWa&xizt`Wc zZqwyl{qCTAQQz>g_I=@EJ`0okUq&2D^?gqd3v|gxR4tqYfwDg1Mj=s2G5_h%Am#dC3mN-83yV_HpjZa1 zFJ>rAmD0>uyNHkYl)!4de*04x%i0@Xlc&F2Km1xa#jCMINcZ*b%(pzh>--%vj!i~w z@-naU)*A-*=B>EU_E@#wRsORsoLO9VP}dri=Sf@W4|Zt+#O-u`q$~2!ZYI!(j+KNn ztFBJFd62|*7S<1mOq%XkZ$xZbwVU4bD0w3iE=i3pRds-$0#BbZ@u&3g@WM3W*_AU5)5$izyKH_s9#mHPA9i&Vn{a*3_>U(S;9oA zdCE`-ACJtCdPeuxZ3<=>2+27Gw0moaht#b#L+lnny`a|wgA$I=I7R3M-56sVL z>hzq>w~xI&DMoi@L7WPs@|Qal$f3=HsjGZ3>`U>MDQGU?n=67;L zluhluFWgzE&`mYc!<3;rY`IRxSg?8tBh1#U1pcmVoP7+ajI6bLuFhZGHzkE9v)@%x zP;tMWJ}F2dB7|z(aW@iB^H@o*Iez1-Xmpk6@qV%8B+#+(hN-RVmXKH$>sGULu8G%R zq>0EvEyK8mJPI45ty8M~W_3Sd$1W?o(fmcBxFC!8p5V^Ti|<{H&7N8h{(E>5>S2`n zanEe+@yTo9*9%l{fB(6bikYR-;@5r9RwlxZ{)*(LpjXDKh47287ZAbYGwBFGs5FAI zRviw7Br5SJLYv(zFm(lR?3e?h+Brjxl$Ffpao`u-#h+A9K#hm6_PC$taYLeb5j?;@ z;h?RInWV0ZKJy#fCCs|)`&8wwzp-HEF!1b^!m>7k@wQv>|7iY|{!9Dw@95J8D|Uy2 zDM3RYpcymc6nyl3cgy>7rb3;B*cVxIBRepUjcB<-4eM~Vi;72- zr_mZ5tC>|jA4(a2;~@YiayV9-Q4BV<_h(R8fGZ`Ho3a5g^F|gYlp@~)^UWj z0Yk&TLAI5UXMs-J-)JbDa}$cfgW|2S`O0(jiHlg!gK`Gm^HiEF*(bX(Y3uAY2; z5)DpiF86wy3NeDLeQX?e-Zfu>I2Ada&zi$%s_m zn(NDPT*609RWz=4j+J{vNbLL^7n6B0c=pmmo9jGwwms8pkkBZWUjxSl(R>w7K_s&) zgncsIyK27^ymfczkkWppkkX&N_y^|-G)zVZfBPZA44X&wPO*>v3SB;_LpK4#F zeEVni&s*V(HwN{}$~MS3zRlSlWj~u(C{hqbt&{<_2U>Wg{gWYZBrJU3+)u!i-tTtlB^Y+HKy-Xy2X+K>^TP zXybl$WWIMDmZhncnda$lt-dbmAE9bG|u$^W@{sU=m0ZzyREWxzTdPW6f(1bVkPP z)nEW5n|?}_1nzsR86*qB4?lmwGIXy}R?6tcyMU0~rW78|eFJRCWtW7k*Y^^4s$ZcE zFUb*2^k(i-^_+EdCUs##kvh^5FZPe1bgQ|yWV?!HC;Y=)Kojoqeg)umQaXS}4X262 zifgOYbZv!6d8+zpS~@q4s)IXKRvtVqjQG>VZq^&>(mSt4X)~G5>h11KO7{2rclVe5 z|JK6lf*iLsmipO9u6!DM4k+!Xh&PMWB{36Rsd`vF3%}QVv~3A8-$fhAEqLhwqBwFTCu+RF0D@xFqv?5{iz;He`B_); z$?N4M_FUq<8!`4$*Ppl+K90K&1&D|c&VKuqV%J_LdY=Aver`H0MR?(jO5IAoN8Pfj zNR^7Fn8l02wNrQq3_~_C!hu6R1yEQtCxwg4{AWVY*(rNXoFJp?k^=`&aUdr-Fdwt_ zl};Kyj0RhThSy$vsT!Y;cahYT4^}1le_Z<0lz$RipYK* z@xH_D+G?5*O(l$gmU+4wSEXB0NKi*Lac{-2{QfemN2oW;cdvj!@aZO7XY1n4$P8u8 zLJ1bQm$nAERjsL%=WA5kw<)YA9#FmHmeeD;`?-y@V8YeDUCioRPr98|lNEZH?+7)@Pq zDkft2=C}KgT`V$$k0-1+rpGrCpT38W$T>|vf9^QT&%&EI139lgp~qUPF?8jL zWshBnppYYZ{L$kH@7$7poeZ7<1?-I;ZX7uHnTwk!0?%RdB}z=!yuA{Q zbr2=^|95_LYvfL=2b_#UsnwRPOnXnJ6QY42E|^Bpu;lVQm^KAOWn0H1Zi{<~ClgB!?cvV|egkLD4ad|i9Y^&YOXdm$AFikC9Ag@zE!WN(hb^oXA(jPBo9DvvoMSWX35r9rMV_7J0?`%e%gfaqTqP zFJUE%49K-a#o-Q?uE}#HY=^Rs&$OjVCgJs5)K4R&JyRHaUqrn>D(L^XapzC7XFun~ z(P8=T&c{C1ablMl4=pB>ObcI*GEZSDQa|If?mZI3C$-F}D@ z(1Gi(7VZ_W{GB(ggNeSP)we*y4+f&woR&BdM+KWlO|4s-mM{^FX4Jj{#Z z@zkBr;TTDl%>rwmjf^!%G4lp9S<%-2=tU#JfC{!O-6+cIQ0_XKHx$ zbN|V!;kk=-VnrK3=!w>F5&)o_4JUXKj4$7SfQ0WMpm^f@pL;P27A0c$o6JiLOMXRF zmI1(Q*$_*1Ru8+>RL9wjAt}naS!`fIQsFNpEN3nG@){@GCw9Ls zdaB@eNS~(J@XnHF@OjOhv*qR`)~kXgwsP&BzQa$-mD)Eh?9$0xXfr>8x4#W(B}s7` z&tcGU7$`r|eAR5bMC7#f(fVF1T?%lJ)4=E2jhWo^hfC@4yEm?^pK`x?(+PrpnJtV!zYjuZUZ7$3E;`ed($s6C7J6#*68XMfr zgsuZ_!eg)WatX;y8lnQbX0$X1eJ+!Uhe+BIN%P~eQr^nxI74e)n?k^u~! z(U-_{z_(gzs-nL$zvTb>6Rp*KYpx+{(6pJ+{|aYZQ#3;8Sib+^JgNJ!#x$ z9ve#b^cp{J^LZAy`aYu3<#F~Qmx))e|J%ByjgtJO-tFt;)K;sWuhr4qCoANvdwr2Q zkOne3Mu&t{iZLHo2`l80iDF(6wj#)@u=T*BzeGlzfkTKcNIFnf0&tmDa(A-L^H6#N z-0T4ng3QE*_{nVNpPV~)f1WCqqxk@U0x+o?#cGR{)mmS1Z7FZi zqZ(B`XVEUiTheh-q!#4eLa!v2S82TEt{_@aaNp|Q%>!ap7%?n{1G4P(10#h~-KxK9 zGjMaKZG9ojT|z$<&#w{$nP$<+=#ZV)IZ=`1S08^}@eueFHjyrHPISZ4(ec{oh<9;v z0%+Yb@VI-72(6U}J!lwB6h9Jxw{CC@5nlxnb@iwd*Sueui-Hn{M;bbT(<~|<|BnvW ztEERN00s;O3a5|6-OQ+K3Z)*Yg9RfKto2K(B&|7ksn<98JImYOxaA1X4<|c&?*?ay zu(X?Ya*Fn;Fn2JUcq0WH;Fc@t3ZEl6zlr>C25Xgxe64mt-_rXyV$g1F_+n>DG}3h zs~tDV9*+_tedi+`BWY?@sR6QbKV)R!ZC6bTPx~K5XW`If*N5R}$ruAhk92gyXav;J zNOyyy8xaIijM0sB2}n0cH#!ksk~we59QWI8M?TWA70lQ^u1L&a)Sw&#g*{h6+#RtdBjtDaHh~R_n$DMz-?nP zBB>!!{3y@|5MUm!NgrOCviYlH;^{A&<|>X1q1}J9&eZ^6m0q6!ncIG zsCiEm`#KBq2Dl|D&A?qjE~Jhb6nwjOv#Q`TMVN5sXcDWGb20E*oQ~y#`#1ZN2^PUL zN=tic5Xgj54R$l!m{Nqob57AzK)C7-S7FREtBsjZ{DI5^E~(OybHr{!+NdpI8N!?WFIQ%OuZVPAy;{zWT`DckxocR;OqOf%@ zFai{_v;UWJs0%rb+UuWtw7M9?pHnpmYP^{u4<*ACt!D>?ZciIxXUrDcW7>@x9Bq_~ z*2Es-YG3Q%bI~BzRb5M}T=*^>rs-T7w=wr=>tW#W;W2-eW0uJ1i4@zGjR{@bW#r%Z zp7WmyTO&Rvhu2D&t&9n(IuW%husi0TDdxm%v}#r#pD3$qEk~?VZeDx(GsP~YYYb4Q zL!4b@(C(1V2<02+R)>D@!s^DzHQ=A}lIiw3BruvAD-q#rf&fr5>U1)w=IaJZpkgm4 zJOMQ8Ssgpw*zPdR#zUk7c?l&`^B$)PG4A3+FR5v-*k@HpcG2WKD|>e|rR|VepUvMC zy=ck`CBWxmMwbK&HU?MN-fMR7FLwn?6$d9XqyF4*>L4oz(o3(13Sn$Du;6S#G!Ruv z&LlJ348XwS-0(yx==&5swp`Z36V<5#jNQ0RmarBpLi^KroNmXSGl4cwnKdl{Pdpy8;cHfZG1v)0u>n`*>O)LT}!trnP%=IqI> zji4f&KflLe1~XiLX?Of0e-gt$1eGV=J!n(!Qow;30f7HU9gc&@Ljw&Z0ErqX>mUg%4K8T+r8HS_j!EdP4qFcv6svX^VF3fF$(9az962v| zF^KlYFI_Yiu0Q;BHP;yvDMT5W+Z3g?2hx4dot1*Bfj!93XU4En)d-ggGj>%c9_#;> z*P){J96U)=m70RRQ9O{+h=~(|NQ5qoH#dm!@*|4?2s9(F)ooZf()+bJBUzRVU_tai z4PFD0P=bj_H8IzcFw0L_lmVkbv$7D#!$BV>XL74MiTrv|WVbQTPL<$3$_fqc`d(&D zVDdsu`8&9Da+x)+p7?6|$h9}LB+>HZsY2MJVb2iIgu~No|u__M}%i>r4(5& z7t@G&UF&IsFrVbJ8vdfsTzxDg&8@@8v6H2nRgz{pVzxRMF31(;J%chZM;28tAyp4( z6kEhv`7|>#PeNZOq=OoXs=%OGs&$2)n(qn4&DVSSsu{xjS|GIH3UwUF7qgKMlCg%T zixrc=x_CHeo zjqGWsgtYI5SXPGwQ({9Za{K-lSu?NW>hJ?W6X#peNu$$A6?Qqsa!3*S=G-z`ZZI~c zxz~a*wuxV*I!Ham0t9%zy?4V(n_Hiek9V`#Tv;iqo`Ou9XN@L+q?1&gnRGD2U@6p~ z#rTNJ#$*7uqnL8LrgbKPQ_aQ0Ze0~xj4*jfY^Ym^9SzchQ+(K zY64B%Hq_jn3j)r-9J^`w7`G56-B69_2HG~xCFRoP=^fm)Z`w`r_|28EH_px$%^Ov% zimz!4DQ)r*q0+6;GS+5w%-b7JrMj<+@MfbHq6d%Hp^~VRPiylSj0zRciGk+$@kxxoZ#=Q@9HTWrp@@osp4+&BBqm6ICf~95Kxyay{4+6BFGDN6ZpT zTvY1^7kRKT$Ew28OW#ebI+F*ah0(=~JSqS2-{=cUDJ^Z+S|81wI@GDtyEB5qDJTn# zva;vIu=wm3_HGEw7!wz>VE8!`$%~yLTA- zao)N!{kQK$VqJq3ixSkdekQVCUE~KxNzhpjd&pSb{PlMm!5fTh`AKFyp|kvAuwJKp zFkd(o>OA}5^w{i@A9Vz31Phi1MwsjtX7XmEP(cnM?HW;4RMNmUFaf8`@ZARy>M9Lu zTRch-S_BSAT$=-Q8?csl0c7G}#Loc1DZ~eRdulb?eJF~u8!tpLI)xJhF`0#48?N3G zSo!!6`{#4OW?So9IjO*g;6JMWv zZd|Kr$iAa7z_6!CK;eCD-V1fR%z%CbV2A+tya^8lG{&)H=0vflM(J>bo7<9N@UIGz zEWjKI1CH+_P`9MPkf;+cnn}Cm0g>M)j8u`6i8-UP)8-mU>RF%`Ka~f9jwso`d$%(w ziCEoYG=k5G&^-a>&0imxP7HSAI8^xS(*N_;cZseJW;9WgHXMWIH`WN%Gn=`~0VqoU z*VeXNEhQ8F*_;ub^5YV^n?T*y=ce56rmOq#xdgp15MoB7MHTJ(XS{e+!=>-?9{+ny_+(mp325z;Z)Zx*MU__XE+>Ih zHeG_)yQ6ct$E&PHj_rPPScR>MgjY}nwg(UF`$=YgPxi0&Vy$fyNwg4`X7QnjqcvIU z$tm=ri2Jn|EXq8qb5}K&b^)=tM^8k=b_rl7S3IpHl*5|0J<&n{PaQm zI^f=0;rkL;D-Z-hpz=~zc0bEbfKfD67Kqv@o4$3;+S#N#sy63JUP#A9yk*35SGexavb9K}+2J2Ca6+>+*X@ zRLoynmOHgXrnJREKlMy{vUiODI2*TaFO^JVF7GN)yN2@TXR~jMK|CQmPym5Lq2$+S zs4;4#P9p_xLp+q}0W=Ke0+u`67;28jzI;D+`{nzile;Nt92|T*wPBkfqT@jeM|`rl z5bwl`$43RUF)}uq~0_ z_L~+HE_P(~Q5aX|tP`+6UCV<8=?`R+ZA-D_j9nU>-vQ++{RU6&SA7##AT>dWxrxAh zu^OIi@hZk*Id*3|uv}C$R7nx|I53eX;FH^E#*NE2!~ z!B;XTAbUOJ=CQ7WQ}YJT-F5$&{|w(}KA2#T>SVmXO6A__=d-5}2E93PG>S@kT;W;U zA#wHUmI-0BcS6L{+F&*A<^3a!ev`G|NaVrdmrcDW+w>gRLeBK`=ph=7zUel}yBmgs zO+GvRCL8hqS4f5Hunmb{?YlSvK(jd3I1dwp0bO^F^M8rlC|q#ee7TydnwXD#S>}8a z3$uae1?82|;q#(!ZR=a1?DzQ%8mhFlD|y8oVz}pdEPATmIMv+vaCW}u+k9L676TD- zaF3g4Tp>`$QCvBh%M$Rkf9lT2owmr-(u3!$Dpn^e+gGau(r+&IO~R5ZV(6n21d~93 zDJGVezS>hLl*Nbw%g6&ju~1hc8EOC`rqLm*iD@p9X=u9`6>1o>%W69? zrvF{^UsmPlbA1Vk1ouj{_D`z3#AtUIf{g$PHK^80pEnqilRW9}cOI}DK=78}it%(8 z_s6d*hcHe(cK_kmqtM8AuF-04eNXX3#79#!xgu*mYN1r@qj5u1u2t~V*NapW3yTTc zNL8by%f5syF8}X#Jf8LSe$W^WH!N>e$Q)WD8P13-j1j?$YZzJF^`TZyylFEQgUAge zzRxaV({e&$NU~l{gPKajaF3p13?Hzk1KjVR8O1)fPO@rd5TR3)hTdsv*pod}g5Vg4 zhLkm=xL6(G2#}gFUNs62EGc&08k=;x7JeIM_aWoP_pzBRABNJ(-M4+zL*=p@3{`i` zgY*5YfVkuo#i1fj>J& zirMr#Z~y*7txmK(b2{^s@1HRED8OtW&J(wswY0XD>$U!5OH2Kf z;?60vXEqeYka%PLqDR=Big&QZH5uAuK=toQvDFoVgRj`i?}z6@Kl29rJ5o)u$Kk}$ ziSGE%@aDccr*?xA?95Tr-PT5a2a6A0f)WlSEx{`b3uTc@p$|B&1W(-`rxc*S#x*8+ z`}?uVa7;ckm>X-f@5Z%C@!!2ig7K!cd+CAGlFd+D2#!~Uo$ckDA2njrVp%aFTxdEX zNc}v?iy#2J5oTf?!lFP#1c(j@2Q;M^$AB?IJ1S_L0Ch{!^Ukv%?!ZV4k-Wy@{zKG& zW%pLf8HhKbYEWQUSV%ul!<0@bC|SzX*l2`}AX8lEwt1bO2S;Yq`efO7LOrFwZ7L6) zJp^>u_QEVJ%k@ed*odS!Mj*m1oRE_DbB->={&Vu9*A@R!J}IPCEH3qUeRlc$%Pr?< z3LzP-Zzn<@m(Tv)QvTj0OL^}Wokr59;`L6Yj|J9x1ru>ZO9CkuUACX;XqOG`VsemR zd9CjnS=gw{78FjGkjV{F1>;P^u~LH|7!P2OeOx!8a_ z?N%i5zSiK<9g-8t0Sv%2f&&AHQgEO^zhkwI3SA7?HBg2*`3eNbEqQyr_;;ws5>C>h z0~31i#}})iKi+@hk^ge~U(F3W#*|x+$9~smvZv&wqg#u%rChb27LCTV9@Yw+c!X`L z-{x)I44=S+$tkn~&wIWr9hB`}tQG3@TCx1F=MMV*ckb_igX8K{goN_gfMdv< zQ%+z0ukU~D-li`1jz3IIZjgK2VByFWsd&8jsV5}ZRRO9xlvZsntaUdS=`Xk3)9w}; zDBsbbr5tjQiR+93^>ke(M!Wg2G8h#+P?>6RsiE2EHZ?)QAyZ(ru|<#!*W0X0k-BF8 zcbS?TA)|cM!;p1noa5EQa%e6!k+i+E%R8}z)UvvN($-qeN|B{Irw~>~yxhyN_`Ui0 zKiXSEH;xRTeAFt%!^o%0{U_?LJxWp-g(*#G+V-zL`cam=CRbkiPY9+Qe;Ey$Xl+#Od2R(YB% zalrj`DuvjlNzvc=Y5)EH$pmsSC?^an|6zJO{DkIw^hkmH)qux{tShvMjy&^}T;1hvnb5 z+gW%|E>~xLw1909y72o?O;8 z;O+lxT>1U+*1w!0ujuEW87lt>cD?656uWHD9k_bbEhTS+x z7ZYf-XXYBO-}{zQs1QgmH~wchSNTNp(Yej8`noP<(Lh?;bl=`z=O2r0tc=8~04DZh zH~;;lT9j^8ozA#~UYcwk^KP7TLc0+t&tS^Vlc{f>Hx{ zhr&#i(*QIaE(M`pqHu;poQDovIN2x@r`-mY!)=h2)I$KynsXh50r+OwYgbKdKC`Wd zs#vp*m^A_*06Q4xT`yC3B}Mt>3Qa2!*%)%-7L1}5W|ga=q)!#H0r5R$x7K={&1T+W zE5CR$z^4=i;wm9EyL~E(4tIQE#a2U^s1x3@l>I+&#YDhpoTLy%CN^oeO-9dlK_c@Sk0h8316PFTSbq?~0>Q zMC?tvnJ^BQGi}go0C0q-)#pZ)IhS+%q!*o8KyDy&Zj*Hr{&)>HO8Vwjn?@7|icueQ0TS3Wk?$d+uQ`n9cI%~8;Vq_( zR33o%aTJCaCjFiHc)+*ymeW<)JkJ=EFC==5akTu)OuU9+cE-?cYXmp}cI)eo_UoEq z4VCEIzmI~6E=vu4r%ErigGcl9ZW)x02Y;+Cv+qN(k=VWKPc0RagM&{;Si9-ioHs~~ zt0m8!iEV82a&)3!=AqCm1#t}yCtCwhXu7KkG_Yf5W&Pdsn)~f`e@w$rcuKz9Gig4l zHQG1<2YpT7F?-Lh!P&Vgx@!9h%q*9JxD=n51^hFV+iq~06@vA0j8mWV_;02 zEE_sPYBC;$tXB?RjXjBZI$+Z&ewn`$8z1qZO^Ua9i^mRvmPQZ}jk7;ef8ecPyPh?jtEdI)@7+WM<2ob%;*&oX6JZSR)SNE zXxa?dapy-S@v)=&;^}_L9VQr^9^xWENz@Q95^MM~_n*8tZD^T=WRbqE1an4|GMGiE z+asbnXLDAEgvJ!dr~RJjgEaliKbrzKS6&qy|7aG@?IauADq*>~|z=G2AmkB+;UZjFC_B6@~c9Eym8=hdOmdh0EsiH;cu$(~LJ{g}4 zulWvocg;ZAMcbb1?`S7yL7^e2PAXDA4GR?eI+X(O5BGonRUP0305Hh$dY2Y`VPN;Q z7yD7?38Dh})s$_%PTm|v33gnw_iyOmsN+YHFz9DcGa!o^*l7X~9&Z}xAc(#=H*6_@ zfW4&$T4m&djzLH0IH@~58hJEp#ZaJ<3c!ojclG~Lxbj>1kIY%wvDDR}d^OxBDQG13 zhEhbdBqx)IgoUutEr*ZY+Cd#5%I-mi%6{(-E*5Dj7ZZ{=-rH=7=G3uIP97r~U#^r~ z1Un=_fwC%!9= zh@+ChMn*;)sCauPe5mtg5Jp5yL6GaVARsV4Cub5&H-x4vCW0XM>|V4@MjY>*3<#C|3BTP_Pq#%+ z0sah-|0sC8l-X}SwFwPZ2`Kdhti4EsIj}fTmS(lvpIPnAdd*1QyzCC-C}#a6Gkf%& zA^DJ^*9xErCp+QdEzUM#cDCR-(>tVpMzB^ehByTUs#@rI?B0pc1h}FiE}wi+-r9NL zf+1p>_F;#LM9`m)O;43GX}KN?wf|VB>FHznQYbhnU8!UiV8Y7{!NcJ(2U=cK+Up*^ z$vlvF9mdxr%5P!u!%hHxgl6ctP)-CEcr79c)T9>KDMj@1Zw68A709zd zJ0paI<3R22I)jvBK5DYsBSvb4c{vjlTamMt6!9^Ntv4U$3X!)9AZGqeSkkq#XSm-L-B$G(cO44 zbdHfDy*Ot?hUc_j&rJ+Blh%l^M^W!p8iFM7S&j;_GDl%l1b0wcU%qyM{jmAvYUJ4^ zo}Bf%l6J|%mxz2a|8MC_^602eO;)l9$k*IqYOroqgWy93RxR(aY=tfrb^cTwy5}wQ zuVP8hNSvN(`PUOy7wBw~7CWI1zSsnON2qG^nR!Nm0Dx029t;3N!d>K;FnoLEg2VW~ zt$&ZqU+t5Hb{`%7^>==~cvFxv$u^EuW@AOyCx^3EHx#rSZ?ChQ;vijd6!8`;)2`cM zuvf=L@8IwxK_v|+aQE#MAq)8JPuHUh`V_q0(BtynpxsgDIIUQ++3C~e;H`D;Oq(JY z3gIN3^~aJ5;A2OmQzC}A`i$Ew8KD|wi}PyI_L^c!`Xy-~64;oCHl|bdk}Zxu z`uV;&nQ5U1(FsBE11BSSTdW-FpIjFV6b_X_*!|vm1_M}TXKvi1t?$lDZWiPyVQ!>& z;3_;bfpWk#>D1LDuI9&XqQ9Y5dEr5$d3r5rE=J%hPnXwgi{oS*rsn_#5blKC1_OG?A6@*8Tq1TCO?4&Fsnj}U*W+< z^52o~oezbSa1h8N{M7bdzqY&X&(yGHt4LrtS(?ha;buEfUtTeVCR3>bu}la>I?z$~ ze+{P?UB3ETRU)d8Y9TV9&LXvDzfnzpO8*)Myh@2(8{+0=E;qSsDDEkmLT=AQUp+v- zKB_lSfuApi7GV=L54BtZn*b=9n}f1-LMh=BjlRD0Ybg1?R#32V307SdpF#A_6__@y z`CEIdXPpj@(g2z(PXEBOAOHUOyS3=Yqx7T6dr^!C_Ru$@VjGMgl>RCnG@#$mP-5kn z{hMkiK5<&?Hnf17-lEAHsRqTjRoR}}`--);O`=sY{H?ea;XoLgR1 zY6n|S=?6{=A2&U;K*wtFGE!rcjIFB^&?9U-7}!7;^(Tw~Ajg^;Jt|L7)QSI!wv4~G$~EH)GpC8?Uy*luWHOVo3Rm~JLVen? zVEl?f%(I!*JwZIn@5*6mE*<8wOQ#1AQjQ3Rk5GL&d=b|1{r10N8d2ilWK6;iz~+A3 zU|Bqn3yLwLpi6}NN+gTcL=PiHDYL9a<s@@@C(){SUTvPLOJgWw*8j{HZ>j zakdvLH8*^bTmU#Z$sF+vQc$h`-d=uo+EvcS>2GY2!-T0FhDgoA(H#WSHZ?yxFpzZr zx5vwWFaDc;^_BMTYG>BI4)JV-nMUjl#730Qo*bFO8fqmfjeI>t5SDm>QIk^p^DLjq zIrMF-Z`QY-gK=PQbu}Fl;51HnUp^gj>L&y@K_LL>fp_QfYdTFVO~6^b z%s$yK-`vVN3+niRlaGTExj^Es$rtJD*N$BEkrL{0skyecjz@Pmef;z~d%OwPE85!| zKvX-p65*QPe`?>z6I<3+x{UZItbIjdvUEqx_56r*-rln=v@>1!IXniN7vO(r+@ zn0MCq!S(gs*3v^jiMlZqaP_PH?D$L`jj-K`5iw;FLIXUk4OBh$_@+ms67=>Sjz8?R z)nCMyD`&S~-n7;cVx*^{gJQ`a{p8cboUhH?esrML^kG7SbSa?@mBC@KbK;AY%_Uee z5&79gpzvZW2@9@I4RnGM3at+R)T~rGDG9#UN-X9fzyaIInL4+l0XDTor!RpA!Umh! z-tqn;Nlpp?QI}p!dpcF_#p_ISC<2V*C){z4ph|qo!Kew=z(xrwlo{G6kHNqYB_hd- z(pbep+U(O;x*wMb^+~E5`?n7ze_8c-GDl&JJ&BFFACLSWJu@;*Q0GVlyoV~Lj1giB z<^V4ga6_Vz34U>cj#WNZ)-qD~yi)KTvJnP`XD6)bibWZ+7M*PR+-`NL&tCFNP*|gu zWbX`1X>&D(<0LdtL~~zmJRl2EPqJNBamYuwggk!hvGq^#-&ebrKQ4>pc1)Xl=m68wqH-Q zIOKSMA9}pv1!V0_$c1N)w4?zd)4SycjS?`QhYgFlDOS2t;AdkDMvas`cA@AIHb0`} zJ77DGCmI_Y=bkP)4Gs-CO(0Mf^9g?PfpzKq0IdQ!SZ!o}L0o8VW zZ=!u#N=_gF!gHx3?*^>CtzO@=pBp zU0zrPRC9q_+LO(4Au2rnh^Pie40M@&%@suOkW-*{#os7L&A_rBlAAA&4s$Qqc#k%nzav2qey1Mf4M2Wb$rw zVYv`LcrWmzi4HNwUMjtTl=1Q`cutmP zMIC2Z`bAm$+&1ayrtDGzVAxR}aC?dyisTtDJ(F4~H=^l4xT2QZ_D}Q4-aSV%4v?`7QRbHgGT=O#mhTQ47fg$Q6$_8wk z9<=W_w6k5ap`Ztfaf|352U&W51{JvS@5pc`0&p>gF#-W~EC5iqJEz|)3>~|Hcv(@S zAr1lxEat0_tHJYH5VW=l5Irx1GpI_CPPf$76aAVOv+VcAPp&HVnWx!){+_9YRHK=E z&U<8OO(isOyjYQ?oOhmH(S6l>zeH8owfD`ZAcJBpXTW+ri^gwlsu>7(Lf<&?c9JX( zXPJe3nOGJ-?(e+Drhn#Q8?sJ75)cUEyvl}WE(@^YpE`w_H9eoEGFOi-ANar8eGurc z%^;`^cMsy01)SVu$~s5&C4;`sD}{D*0K5bviyb!VJ$)EXcEM)ad(<|FSz6vo%LauY zf-$OkLMqH)^U7&M$a1d7CVI*J!Khq}NGvl1!M1%qe!e(_uO+^Qjwgvp%&D%n!38Dx zlCfm_Ad#M8flgTXwFdsC!9o7+VAl2wCj@0p1WDmzq@H))>q&W-48#l-Q zhgkpTy0hy$fnY_e5F4_msgZ*Q%+CDC=aJH1)C)&@Lr2*8-z*La7uDBsY)?y|qqrCM zXKIa*uF}3dGvjSIy0q86^r;}U%;CjwG^d!MAD!WPw9s~{Gy4P?%1M3^xvzNoC2in* z6$}O7MLzVd(|Ioxn-{}oRdqnbS~h7OMaH)d$eT)0ac~64J>QUdsrs~-LB3y5slK1x zG6zdp7a8%oUz5Q2B?3=53HCzUU^z!W3W@|A{@s#3+Z6fyTXPd%_dZYFrF_1vEX}x7X ztCAMVS9!{Ol1-Eu>#X&xq5=#;qj1cnno+R!JKfTVKy^0_SBH3!eRgLMFiS2+s0SYq zO4@mb@IWn+7i^kaY}OYjjbVh*VFVx?C?_a2H~J4yzrv$hOjnOz^~ukk-Lg*9T#f`j*_ot zH?S3vcO>u4PW}Lt?EVJuk!V9W%3s@bzME{P?ETZH9NP2n3i!eAJjix7{$_OSd8qV@ zpV^`;CEWYj&nT1DFJx~LfmRzbNnd|PMQS;#BU^R#2t}hNjgJ z3Qtg>?Q+qt$dlmQLABv-4t;9YWbm-(f^R>^T7PG+<5|vi#b{VJQjhX8ddMPjKYf~| zseUQK1w9nQB!!L$IhRKP<+6k{1PGoAZm=dO$ukINzk+g{hw$^IYl*qUfx2L%3V;oF zpzCr7YgJ{2siTE4MkH<_wjz*5WF%C3Qy32dq@qCpfx9Vg-D=Iv&sm)T7zT*2!~jSA zi-|lFSe=pmE&=DfO3SfIF<^g{9fBjg6rnY&Z}&i$#el|_!GI+~0fNM(d@4>`a8yNO z@-}IbCEqo#kK&Pp(p=ZI2n)95%*Mvm=xOxbL{I%%uK)l zNFb>d%{##^N)pM2Z{LR(8a!`Pqo_QltPuc+<=g%tO3WE*h*%+%Eea?u{UIw@nEsOe z$BVOlX5rGzvW^)gi{OEoQG+lv`4+>{pI6bmzF}53L`B!lpbCA^tQ;HE`>g^#K@&4O zWZ6~%qa~vwQ=@9?KU}(U2Y((M$+%fb)4#Pf(y?x;*U=BBb#dv+j7zlCd*;e9*Q2pm z+WyIUmb2#gf&4wMz}dRxXAeG4Otc$xa3e(Jkx~3BA*WYw|89SAT>Iiw9U4E}aqAEi z7(6{Mzk-Z<0b?#d?Guo7whI=S(uX13Rj~I?j5S<98S}El`35G9j;vbZTqF!74M1W5 zw>qMqv%3hwQx!M7!@~z+VN-qsWg*?m9JqmuZ_CZXmrubr7O6m*m6uk*vg2dvhwUtXtuIG`+DX)YiZ0qa1V!PWW1{talxM&cY?+FQx!L|A!m=IKp}TSkBcIIFEe9juCxU;#|u5S7rlSOGQ;62*`^M9 zFU-WxMO(sm&{OLtj01AbyUl~PwyuF#8PIPRhk}_}q%xbLHrExR%z=r4J^Jl7aSUm{ zC4|Hn{;EC3hspv4;z5*TFj1B;0(3+y1!p2Qf;V zAy-W}La!S-AldsLWQ>ssD8d?JmzJrL;nO zo$hI0h4scOw$mmiCUQv~G#q6Zk*9`^7xJ57PkwwqQ1+|KXW}=_<#-;n{$n)kZnm9U z;b#AO;T`0l$jN=uUe%9*^L+cpHxARIj3E#D4YWtm_u#!_VkW&CgE5RG8Vp2L;yTIV z{cPp2FfTBYoYmR=pX6cC+1sB!l_o|P7+Q586dps3-tBTdZ|{5fkOY>^9+bPu#vXpZ zf!55INnMc)jz)km@d*($;ZpbLgQSIZ@H)IY^iBz@&M!GWxzW(W`9MSrfi3cMKiB4l zW+I31SvmI6$9eZ~YO2AiT3Kp{KDXzPT|CPl`=?^gB^F|l>m$Ip*mPU8L6@T~KD!I# z-oW#wEJjEJA3fZ2r^7*jiW-1?q`vPof3LpHI#v7cKW4dpSr8jR9x+O4sLmT8WkI%Y z)(6<+*j%jDpHsek_Ub`Q0PUNXGL8k@_C`?jex#+ISF$m9XZtNhiVUZbHV|u7XF_?o zJR9!qeCo_F!135v5&QV)S^cX=ZXA-pnXd;hcvg+U6<5ZL-;FmV#K07tBFAws$}~EV z2`p;2*9`%}Q+7#gn!|bA$z=%3D7cJQo!IrKdJhA`Y^@n=xdA?TTelJN%TYBo?pYcv9pI}$6* zChx)1|6!}`(Y4bul%=gc`;Nv%U#+N^4E|5{t;E0r`|5(!;+kMpkdB zc3jkb1G9)Y8!zAd_24GEF+YV((JLjQK=r!i_Z^H6cl-0Ju%E}W^YuKt2CC`8GN<20 zw`c=*FPb;RVmY1Kv6M6Hb~*LlBGi>qr_M!}EkVhgm};)^2>~gQJ~?w2{6|1FL0nW- z4($2e?%iiYZTU`bLW?s8RF$Xz<3^L`+KRD&n41h9aVH%$`X}3pt9u8VM59f1+QXn6 ztf`9Ktr@v^v>G1EoWbWb;6oiU709(Yj6$Ix5L~KVW{luXDmWl-AE+4e`+|f|7B`_z zcxW;5HmY^`WQpl~m!e}Tq$cn@8}MFi?$j+tJoFz%S$ic)k({Y9S!vCwa6qlR-iiTC zgc2YqbHF^BGUAS2A!xzP=J51EZe-P<%62Nsh^OoV_~x$p@vWxS+gf}+su`E%-`aNqDr-#}ZPWv~}zZ)@2DZsoC%Kwbep>&-P+ zj81OvrTs^0agRrLfT@ywU>{u2_Q57K_`=}$z>|M3rOZSzYSnKfcC6*C{=+b%9Hn5! zvL54|%&aK$gaaBoB*~wcTiy)e(*ZC?fm1+kH4&af59nbN zdLC41uXy1?M-iHdqUOy_cfVay{Q3EWn~*B3CT7~=UKN+sn902%-@MPkcR$4FoMdc#puJPBaPr6d7B%yftT@MxYBe2YV|?%NkOW&&v! zV~j(8p}+Ur*%HPG2w6mfi8LL5h%+oIFd>8EWNYGrx)ygCWt^%7U*D=(%e z_>>M_EajVeQ(pjpqM!r|Fe+&k<0PAR6Z2uc&w&uZk}idPydU;gUtQ{(awo_38ghYF zWmTkoRP6D5c~b6|e-9R6eV0qmm+zbpbj)}F>ky*1XcXNzuJXERw@Cq2$kAcC;TSBC;j$350po|$>ux>F%H0}f|0((JBa4G%)1(Q z0Xj4QZyf5WQ$~6TnNw?mu=s@X1@Xwu^Nc^Z8V8}Z1Wgk#;J;`FO)m?MEaRawJmK%d zz%N6wUUw|qW*8)Oo8~|mCww?np6|WT6;`a;RBC3UZ6s%t8wg{6>eE@wBgUMOFNw(n z1aa-Xi_V`BjPQHV^|dp(trweb*DhpkRM#Z%xLp&e6Sp<2aX8k=CN-KgXHfE2BWJ8< z#{;hx)CpHUv>|<;JW$(rb``3Gp}EmS{$ln8RFnO#zCWphO^4DsIT<_%=7Rv>Av?7S zZxa^4vlyn&vNw9YQ@ds^Gjwu#aEAx8`xJd?88t6v#7qqk452zx3^@<-l#wRV!*Lk6 zs&I^s;)7)l4*i5;?l=HX9J!g+(qS;4^{h~{cA8C}fCdC`5P*PTP83Rm2>1Aw*btk$ zC5#$biQ$Wp3l8?IB>Jt!mY($f9)Lz=5d>&{Oa;_+*rJ@z9jkyh)>8Tma{&5`p);)U z$;hjNx4(J}T1n1?`|3MPxFir3*mUlPky{)GG%i(_AFy?`4B3J}U<0LTkL_C|C%phK z^kJ9=p?f}*az6Rw`IWx=C}RwVe>;B zE=&9Jo+4NI2Xq1Ou5vpt6B8_HNHsMrjiMfydVIqtw7h~y@R+;z3N2bkA zJR~Rj98+dxxEVv6tv)MKP%V~@Z({mR5<6?4Mk}-HEM&;0^;vMXeSEL@e(h3!f>d#R z`F;SSR*4(CvvpS9yP&UApx+1DS{{KGzHMciF6noBvUm&|rX-k`-00Lw_<0M2*IJ}f z>XYPFH8v`N!4I^5lWt6Uu@~`kg7px*3ute7Osgd)&JuH=UPVZLo-YSt1ahUxG0t2N zR0{wgj5^^DHmqZR*%W=9bP}zXF3SjMLVT51(+~#IRN<+*<>`sqPlb`GjPah|q_7K+ zT;x*}n!C1OPgEN}2#P;Y^lrEN z65OyAaBp2S`K&V*M&u*)FC4a0E$g<%l6hpyy;bK!pI+V1BF!O-T3%mThADMhu=@l@ zR+U51MR;=O50#6BuC4s~ChUm@aTle%rA|za^=0(*;Nu}?{CM#G;LAOTG!_7yH8d=O z3WJ}&FL(7eB_aR_L4qVxyhAC{H6YFEn=Q#C!gH{3-_U@`tss7y6j?28A)bi@Z7_j5 z35M(f8N`zMN4m-d)J$kf~5bdUK;&jB{hoP6~lUA zNoW*S!cxBPX_S|9=%f}3pvOjA4GB<7(A8ER@IGI;k+SsnhhbH@)>6qRpEu(CkO!*6 zfFS@hL@5$%hUnu3LxbI%0M#z-ULyke4Mg9Z0Q+c9lT@9#dd| z%h26nd0f$hp2fKnX5UGkFxg{U1eV;n39ENAc%wV+Gq}0)kNQq)>bW2MM2uLa| z2|5J& z(wone5dZ!D{dnG)ZXPVzuOq;ZBq6+}J@d)p!q$_oO-J7U>Q9@ims`dxb-4&N*6Z?{ zNgGPl^PfuAi*Z<1dY3C3=+tHAQX;Qw%3t%mj%*68$3CJ9op9Gk>9`xe3O?WE222kdlD4 z0B}2Oq17Ey1_l_!i#8P zTn>X^rOC_Os=1D&;CTo~yyWwdSt( zBa3WG=FHO(xvw$5H&6MdlPW5ju}mmBd1!cHs*YtPMYinj<@2LH!fQib_KhSNCIdIQ z)_*8{*1OC!9x->2u#=AzG>UKyg?xcO`M+7#mI z_Uel&NBE0RA-9Q@YOz0-AO5la=PCZ~>EQVT->aTlpAQTE_KCnaEyDAxbY6TxkX9JH|IwFtZGe&8YkOAPr>j!U%2;b_u8uCl4bK=9e|!G#}Nb(FrbC7Ryrh!AZBFZx3=K1@y-=TgaqUwHhj>IaH|mz7C=HE#;`;F0nqxqXG` z5%%h79INM&g^DG8rT1=SA@$$JHZ8yq<#*3WWrP}fMG zuW0{Se}kj+;`)nD9!~Ecid24~?c$yS2KQSc|j#+Pn3$lWRQR^copWXIUhFzO)7IfXp2JfDsO<58{x3h=?`usy%rt zL(qZ8pV^EMAd;H(W{kQ0;?*O!5q(IeG?M81e$7k2GqQ$PnI6k@ARt8sbE&6p_N6kt zN+_CPY)#F*>7$;2TdH2*-arG3L}*N_lM51$T`%+JF`%zcw>Lf6Q&W({ny?pj(mDgW zLx7K?CqGl--fK-vL2JJK?Gu;|qmH$mmI7IwT**eGYL9MxyZRtcFr7rj1G?Jr8PhJ? zumpuF_=0sW* zDo4;T+x6rbODqfY-}MhysiKz56uZmi_Z)|LhZ;})GZrJop9hH_Rr?&bEiif<;ht?u zcdXypznhbS!_+Tuc(PENmWRbs0C|N2;DrQI^Zg`=;+$kq2_+}@3(e2R`h<&UJ>IC= zbLgFNP+yp!wH0502?FBpkrTugDB{a4vHz;A(01yJiRvr_{wc3894f)8#Yw8C^CHKL z;99%G1qEa0!PWaAqTt)B(^pD9ch*i!H(p?U9F;1Z@B()87wq)a-t{{>%8QbxMI~%e z4u@99`Xk$W_?;9-yBdgkwnta0J;N-!wfV;*7TQJ?9v`WB)kzi;5 ziBDqSJW(`uA2}2)5uyJjj~~N(Oz=g9Aw(vbTC_Sz8D^jE`v-3yy0XdqjhIPV$sffb z$~QLMV2$Dk{4$R!rX7gEad8Fhi=#4TTe}8e?3NmjzOf!1gymD5;`AVq?rp(*dv%J# zoLXyY<-}lBe{1e^rqJ7C90j$UTcnFgtlTlHpNEfL7`$=Q)pd8K4qGDAR(Vted-Y)I$bTnq zcZVc}(hStqeEOzn%UU8c@3KPUFRpLCf4Q+w5fCBazNJPt{#K^ok3IbL`{BQYv&Y1^ zfjN6yqu}bJUG!WaW@EyZy+Cu4~=BLYQ--kx7g_Cv;&FN%*#>N=5mP~6Pxga!j}^#3OkCNnO_NG8VwozlZErU#Mn zDCsAa09hy{mnz|mWne+p$d^TC575njz%ki#A#N6#r<821WtkRGvt9;w%|1K+5>miCQgSB-hC_` zYs;KBtnbKDHNGzeoZcvkKpFOO@Ji$GYsHa;R^g+|^+UQ-YmsAI;aS1x?6)lpwwcd> z&+W0JN}-^6yZQa%+!r1Fol3Qy`?No6tVnT+cs%Q2n-}$_P44UheT(-a@S2)V1w$SxpTCm6yWinu1BI4s@o1AR z{l-Q%I1E4-x$@6PuZ~@Cxz_>xA#JnSgnSAmOn+K^BiL-s9de3!EAtou ztGE*-Cl0o5;jA@7wKI3!b(o#;P!+}}w8yO;r=_Mg($kq>@>;Kg~)FPJU2 zcAVafTq)Hk`!#jre(%Ld^L--sOtb5PY0o%PkndRNyqOGp8^5nK5-psbq&?Eo)q*Dv z2MTg#M%;@wn3JX0wN^M6;ZTDrB`O0#Q_gx12~w?Ga>+Z1Y769vYaic*3Pw8+8&M= z89_z%Pz)ttexr=PbT zoakKS>ulcF$lHuLo|dT>^L_P6Z}8gvkI&DYD2s{t{pyL%Pu**)5C0{_yiU2dwE5Be z;r&-<|NHjv*$tD4lC!@uWUhU4J;WNwDR*V)tXx8hl&;=TX`u9B5d?_$-f3IUDZBf9 zQMS{H>5cwT{vfDA?I0s#LAvN9sGt^kwB)USp6QYi1Qj|e3#WzdxF?$E{>i)Fbu`%9 z?#HOAckRk@hdqi+kOoLKb&?CqeROVB16%s}`+wK>4_`i@2xfp!wINR3-H(`%4imDe zi%Riiq{{2Y<0et#4N7M0crSChKh~qhq@m2Iz1VfFU~w;k^_}cw(%n-RWy|jk=z+=A zoEnP`-qUW(C6m5P`cM!{=oAPjD53H%z82Xa;79lgQ$Eel&8Fx(9Ygoq-Cf*gnerAq zmIhG)&!Qb&km!=MM*m>&{1`7HfF2wB?n`IS>PrtCYpyMG=t&^*3Q~w@DyBSL1X@YC ztK*Xxz{TkxBp{{B2n98=IpQcFG>A2{#d+qKQc`uk&lHIHhD)=xUPZiT1t9ju=AW)5 zAsB)r0Q?LFlS#AYziO`sE!L|1jbf>_NRTsOn41UV<*7WwWJKQ+mk_L~`^xv9`(OF5 zP4o;*$WsLbYy`DPI#XcPfM!(a@ck*5K{n6ytNV&m{HMLgU8|Fl z(?fNRPN@vxEbs5V)=X=%xzF5Rt*q?6{7>PWZm-*=Hy`%)BRfiWKKyujSeq2Nb|==p zA>YEcG2f=v9hi z&!tw^byv1((U&v~UW8LLMKrr6q>P;l;J|2sXT`bOUp~4yO2JBW09yy5s@PcEQLu9? z-h5nXtvIDt?8nzZtD>hJWc+9)Gf=LF%7HL9{1BG(Lh-EwZrwjcXU{!k(ciF23~m`4 z938c4R%Q0g;9+_m=;V<^7N7_3y?O4+SY5jyzUzFWxvPQjF|h#Euo^F+O1u2x(h{7E zwTvaw6}0R~v{Wv@^;E`c%p!%2@?uI}1*|}{qPsued>RTUK2IR4xL$N-uOyPW&=_J9 zmEcHr2l%Nl1<%SmkF1m~2*0fh7=I=cEMAR&>!b%U>j7F|T|VFtAkt*)fhT~|=zENo zSSZn=&&Wl21xc1(zO*=LzcOC@D(bZGbCO7W4wHa~fQU#NbR1ry$V34GW3lCR$?O+( z;-7cR)&@F69?;$Z+7by|d~mfZd4)xGAo?lj^o z4zOh~HIsWMzQl*LMcjx==Fv!n(&bRlkvkxv!gC^2hU|^Yq)-sOv+rBFIzL-z zT9Tmd3x$o)5>v};HNT(Q%dy5 z|C*YwF}|66`zhCcQ?6^wJvU{0_GU-fm)P^#Kf0~|9{SMp((>`zPGlY|Uykt7+2(Xj za;|fueMi{+-#b+nDZ1x6m0nNoX)XYlv5n6==WVj%%02W3Z<%_yZ<*sW$}+Un)=Az#z6W754}I8}w@$bM_6 zx9qWG;kxwTg$}j1eLdyDVY`;$90cb>6MA(z$_^~23_OAWLwj{0rcqnJ0p{Tptm|-Z zBPp`1^rHB-+(P|g3r}-e!|}+SQMVV**{MJ#Fd>`9*bmUl7sqoK3jv8h_r;e3I0k!L zE}MIy5GVP0u&3^6<-0n0soQdQ(|pHq*0G@mh^_OOcp$<;hXD~pu1VH7?=7Tqp?nJ7 zNqg};PViQ>9?zvq=og&udp@W;a-4O5d2|>$SSEremc~f+i--qhFq(#9sXu?EzfWB4 z+jvB|S+qM?#Y^Ku(Z^01JObAxB!Pc31DBUa%M1zlO|qLf~K@ax~!FdG|n>qJ0DfC38`TCsFQkow+_jU zu1Kj~Xw+zc4T0FLk090^3=z}gY|+-H12lbv)M#yD-y6oE%hRRj8HHjVYGc@)nT!Fb%adq##Z0^2`b14c$OV`&#}+dM5+MK%HChu@FX0zQdNl z00v`O#Y)Rh!REsCao<#o$X5U$qeK|lv6G5hb8%Jt{wx0+Pwaiz_^ff}htlIB3BXGh z?@TE;_Dz#(?7j;XCugT=6%p0=rV# zYa^+$3^aK0>I!ENcww>@Ac97N;RBq)s=H;&C|_XNVCr!1%kj5t|WFR{&LmKiI zK>^8wj+OqvrQaPIm2?H@P1Z1;O%O_EwB9!ePcloM&wEPI)s|-w9Ec`S$bxa-{xf)B z3kI0*4^7imRPTA=PeScJ8Ft)w&7cn-ch;2@1>T0f$JApyf*sVVB{W6yEHdUm?f%-)K>?fE@y;)Fs#7a*pbrcidm+sB&{o42rCx#?Z3#Y{^DWEbl#HeNHt2 zYzfBE_=#;%y%Wh6@5rA>FT|s}d2vy}?2wpIv<^TNd*eme7mM0UXsVr2$(nQJaUDIn zDo{w*Y}$hvzmmsB+nt-GggD#gvF(OiHPq{=7DytCksb*_0b=?*={8#n0r|Yx05uoa z(9$r2$x_slY^DTVNf;eBwFB^EV(xe>wjy(`KUJLGYmSqINrsA|Xh2W>=I*^`^bW)* zY;^F2iBBT)7MUy{ZIZ8=-K2*V-KyBqru6*3;&bZ`86l1cX?-tYCdnl;hTx3Rr$@D^ zb&96Bd*e{RGo8S7F6v9XD-YCRC5M#Z9snjI!95;lm#oo6_IxKkxBqCa#-Hu=CQN3faIA$W}Sd^YHl4$#BQy zt!g-6!b#vjoNV!(>!`5|L{;}pw~tdHKfQ(K1*AM*_VX-uw<=DW8vs4K#mm(<4_g1r zxr<92F=9*#gMn+vzArZ5u{) zYxE_@rv3hsCr;K6?=qAV%={bJIc;&kW|4fWOGUA*;Qxj7R^`8zEehm^UDQocjC4ON zqTyVxtDp>a7fC%@*erze@CoSDvqgC3Pq@1@Or($OA%NHiqJgP{=c6j3BMOSVUEG?o zE?`|l!mW!gCRmP=JrKYXDh6O4#!iMXmadEz6#0!r4s4co0BFKjO_w$LlzMXvr^6XP zl?#<83)Y$fMnqXYd@O{rQTn)4z^kOh##B8pg?8h%*}UYF!plyf>A2_1Et28{1QAQc zjd*1VFf#+mX;7o z)f6#e8WAgvti%#qy4o6>w$uy(FflWPXePoTcl-|uub2PVck^8PV9Y4)JYJF6y)@~p z5jT@(07KH8tU@w9(&um(WIPWH?PY+M1mxXN)}n(|dv?=-+=M(v`MJ-zf7$Xta&r86 zFBz?w(M&-1jC7nxsXs$te)a(c#JY<|fwVikfmHEuS5`&=3J_9uIJKM+-2`T`8 zo{f)>x&xOz9t?)euy2+dk%@y6tI-B9P*}D)etgGrLJ;p&+>4YEU;tWM=RudYdYw<( zp2**np9<}*cONQ1HNKY2&}vKi^N%QaFi8T1@SH_1Bsd6DAFINjjP5vTF=2_KaY+>hnc%36N%eyakZ;Y+I&@5OeJUCEZ0%Ok zOQXO~UtgZNeQ9xZ_`;Sf;g~|#6DE})COugdizOC`iOU zY9!=#s!ZvRx*e5eeoGLFl~Pz`k}ht*eA<&yp~)oe>&KB8rvjf8pLVz0w$Vge<-End z%l|5W!ymp9w$@QH&QjD9qqX8apcfxn3t<>q*ewy3ZsZahtrk-8gDpl)lsE@^Gtb7! ztQZE)uk-$WF`WjkRv0{;wnNU3t~i4O5Hg*{$#E)6yO7|GO57G z?z9Y1dRiV%B%`yJw&{y4l@aB@rK`_c@ z+rv_D@b4VJ3XY2Ugy+5-?DA}mZuC4IrE^R0%eUt*rCT?STX%E+h`sw3M;z$(Op`!m z^2AKx_%Ntiz5b%42k*1kP1lrKQrp3ys_X{XMt z)&^2!Tv(B+Xy{fw8jD0o33-{pY!nXoL!}H}ksu#A7J5~6#A!*=XcmlDPuI#Qu>ZmT;e>M^*0##e-4pheI{n0}qY3oqI~- zR7H0G*Sw5fsJg=QNY@YE#Ag-EC9Iw&Mk4|0sK#NP{U^1YqVLPzww>;hHi}+IH*NHs zI_9Hc{3s`I@g!F2Oq-s~x9-PRz7gIy@yNYh(X$G4uV2!1|F%$NqUAAZe#Zvs#mjXa z0uZW2Q%lQPidmj0!OXIZ(>qM|CGN*FX&7!W@RIf6XQnOr)zNG7=M0*DMFp6M=@yoJ z=h*zRRqgo1U`8fPCZyXm;1SJGCdXhz*os@g+s8>OIEM3jJF^_UlXdBIx3WzqmOllr z!JdqV(H4+}Y_kJJ+&EPQWNI=rxLb7fq=ijJp3f4K;0RC(%3uhGM2sP5%!ddWfOx9I zkJM0xIY+s!ZM2<*E~~b!M4w&3zzY7ZTNpWTeL$joo#y9G9o2)9u|eG@uyTM2SVETB zBu}L#p0Pu)a|@nBP?YCOyHkViJzjl4^>Jb~@)wV%G48S~sl%$#yS8#Hz-rbb7gd@G zSLf7ocFtv{HDI_qlboO{MZa(ZkoP>|qyUs=tRP&;WVxIs*V{lg#C!SoB7wD;El5(~IVJ6$Zu@3pZz1Z@JK-RQL{yp# zwsw9PNa3ib+hGuc94Y9Kz)-}k->&9{HMn)y*}$pFSzO9;P| z9xLQIu2#hMsMH23oGM66mWbBPvaMI`YIIz4a2+!{gX!7kSKGJj_ShNU#jlK%Y>@lrcJo-u(^#*Dfz%LQ3Drvfd0@u4B`3 z+@P-Icbxh^x~)ntzS3jsb{=dHZr8@s2W{Bh0U@}^Mu?%xl1T9-pVxeL8|Mjd-#ExM z1bgw>D=;gVnSl3Ongsd6R!2;% ziK&#fqa=_5KHdCqTndZuuS_o%KS>*e4)*RhbEK=8yk(_4m%h+Vn-9S&O9x_8*M}P)F!R4_;fQ;+3g>LtTIsct2D5e(zPd z>e>3UE9O`Ahq4TY;Sv_6^tpB;&F7*<1`^py!UbOJA|N{cqmhifq{hCzsWeAGzfzGX zCv@EdM{`I0e^B;7ndA&J4L)?KX1`n>|d1RwgZ8 z1R`f5o^8FyWmK)qVcK^Dy~*Rxb&Sy!~@{!H53F8M{gF1)|j(TP+HU99&=D~nawX=$DkWKnTFFBb+Xi#~)vzcTv-q5CWHy#t_AcN0x3L z+SI>!<;GR%XRCp=mU~(?Jh4o_i5iDw7&V)S7nMCV!F^J+|#V)p7Cbuuvb^iyMR;7s44 zK=3R%Heg@ge;P@?FbNP4DB#VJ${OOJN{fdvnM0q=lm0ugzS-^jC#^rsH}oL=EtvB| z_?(~paqPjU6odJ9P8$XTAkke{nm>IoTEv1nwBNQNcGM4^npJaARSz%Z?B8&nMyKQ8 zp3L7tJl9nW2+q>iz4rh7N@`sP)3Hfx2;v})eP=C z9$(7nU%I$e8iIpBE1fUHxpF@OPBX!qx{U-R$mbe~cmx1_941{FY-?=ukZBS~Wn-*( zrG~huehzw2{dT^YwqSA|7n}%&`RH{>=@dF%NzsHBCvQ?oHnrjYipW&@Zi8xlIT7C3 zr)W;2nHT_aM)-?k*MkCB<-q2Aj@HGw(CQ9_s08s>IM#RoKEjV!h(*ty0Zot~%gN`Q zHxI`AJ#MLBCA)*4U*(`W5!e@Ww~gb^enfUpgpPqca4p!2->WOu=U89O6uUUcptWKA zZo*0q-*!2Eb#C?SIs2FrN6C1TN(MX1rjhR}ZnK$?HXXAKfwtd%KaV|#`B{Hx>1lUA zJEOc)AkpC*jfmczQ5sz)DJIpF`t)9?6|CwzogFmp?9D>6Wl&$Qi{R-+Vtu@ZqpQoA zTLGe$O|66S9)aYXt{EWy#W8cP3q`27|CG|I=Rnb8Cq#vYN8 zF*;6ZBi5S0Bme|3MVTm16pSKOC|92Od-c_+NS6-s9qGW0f(-DwsOPtKs{|3GE6_+7 zJ!;k4nGilklR&0~%|TC~caso12`?QRKPaA{%GBgq6@Z{f8kRSm4yHre)p7wsirH?Z zA)@J|IVY75iK`ZvINM4!M!}+aQY!n<>osmXZqy@KX?yKa4l*e<>Q1K>x3=D_G zvyTOy`w7Vk1M`JfSh$RR>;zsn-62+s230a>n1ftF$V_uJ+Wd9T46r;@t0$NCB&g%~ zL7s1ZRC_C6Al+Ix`8#GK^VlGNMU*99hkIx(9}1i#_2sqT5qQ1QV?hq%xa+>7VN>3a zsR_o=#K1i5XjWs;nDy@CbD!6~HOn-+tf?Y{lAnTd8iE|)dZF>s!WYlAj*1Ykd%Zfn z9zCz#kI$Vs(c`)hyu|CYDok#ntgsWEPU$Pg_X)%wTaur#Y2Ry_bs-_m@nu$-DJ)K$ zR4C77ezdR)4zsyMI=Qu7(RA_i29A%TdL5wrFg&S--zBXdFojoToM$qgtg4Jo%{78E zpSy#Y91FCbEpsMInhPJuk$WBe{`&V7`5MW3JHP#4b8(d~v5{~3C`sIhqt`lpRp4U@ zykta+3PvqRbaKK8I+aW##1kM+IYKF?CmWzeJn=Apwjy2aK!{v%z>rNm*NT520$g+G zxTbcL#??jevk*&m^%S|WeMy}Kzz_vHZD@@7a`fbq2m~881^ouSVp(*LP{&(lvPRhV)+L%1@$kJ%@sj>RbI}S^4?L1T`XLVRFx-JXudZ;Q*Wbu zOFzB)cV%>ugTvgUiQm;9eBL|%eTDslAPPZ4!Pt3XeFA%(X3e%#fJwi^*EZ=zXe5J+ zD851Efr08gr}X(nbZ0CYQzu}8Egnck!E9Sd!FYZ)3<#JTG%#znv?Qy7;erYeCn-LV zO>n`nhfkj|xXzH4L`uxF5?Oyts-PnfnE&+*@(4!w2^@hYEAf^w3blV3K!|=q9l8lcCcEfxI*d7O+d|3q9(M z>U9Y&@zmi|7pG4QvuDDi%9Ho)G4?D8O?HW&<2jVZ<6C3^x$z{5!XcOnNmsCur=E7K zQd7I8LP{!xo`QHgb|xGPU{xB|Swg#iil`HxlmyEasofIn8*Nh)z=Xu9;8B8jLvb%| zs?x)WyT6uxMh3Q}Z27Zi2akFP*d*p|v^AyXwtF|lQX{`Qa%9!!F88k;P^}I4Z*Uk< zx-u={ri{X6(%#cz_YZB_k!L!J2|Dl=*P*~0at%?q?{9O~+3RL8Jk^v%BMxq-R}5NR zzwoxMBOipgBQ7xEjk7v7s6va4B&jlI)S>WQs%rnh>#su+3W&D|FA9tb%a+QZ6Em0+ zX8g)UZ1sh3I^ATT zl8|XPy%HQ@7{h_WOaPXwhRLxeOu!qy{=)EJmR+F)pvptxob)n;AV~9LL0BytsO9zP zpj!;!WdIKnMh;JCMNZENY|OHeCH)2KP9_?1x+P}qw+5dK5$xb#P^sy3q0NfxI5-d4 zAS`-&>5tWs2a+5DU5l`x1eJR4SOA_!A)W<@UTJ}us8GOzWsxY8LP7C>Y^Hc^-z$DH zHdQ+aLq6@Hi9*p3=rCum?J>BokiY~BipI-^N&~Z(+UrQ)j!xlu5XrZP%7a;;DJ)tF zc%zCs+05$iaKTmF1@#=@NQR*~N$jQO1ZwekXhS3w%giN}rqC{_0*TSKv4w-L8kw zw%fKcG}t(*DA?VmrCvZ)m~`-^5LI1$-2 zAAD5C|ff5{bSL~_X$rO%1{P%(G9eKD!_VwQnm}QT#Qc5~<%~T$M>*kga=h>pR zttq3NAs_dRWv*S{p<4Vv(%O-d&6iUj{FfVR{&Oc|W-y zzjodwqWti97^ETs1aMI^B3fo9e#Q&qXdM`sb{cL=!^YIL;G_ZI$g!pN$gB7)kgKDnr+cGL}Lru6Yx z@)otOm`hHMOa0ZQa~Fg~^(U|I_a(Hh379o-q9s{eHOxN_Xn!P=(e029imJ4|8jmv3 z_lxA>!@Q&Ui!*D!rI|g7O&AQEczKGbOdhyr=C$Xo>?4j*4NY@rdT?m#uVlZyE!CuX zrW&e1ueL-V@2y{ae(bJPT6}~yXdKn1-y{)WWPR*beFrZ~{aKT(FBEH}n+{PtJ+qUg=@f!tBCwNgT7 zhix%+cIjA8M8=DQ;A4NZPT(HB^LmKyYEw+;8M(XO&oF$dtVFS!-6l z0?4|Tj{y=^RRE82C!}RL=v5`7mKJ8?XDa|xlxd9Mx0r-wQTU3-tysn?WK|I=l#&Re z^^`Km@*G*_4Rb*f-8t7m>CJ9SlCH{Btv2yjB?CVWug$%iD>45$ZT5&9!hlH^1-zGj zI=MvMA^hIesGloy;VSk|+UcU#&I;7?5$Go=0br`_*@*h&%C91yTLW!7b_?aWnRL{8 zuJq!VpR8h&NB)a5U9k)8LDQ<$DNh6TiHPeHIgUweW$%5~NRTuQMrFQPOEq^yivZkF zV_J|C=cGK{z(UI~hGmVr2)|k`s}FuHW1(njV{46tF*ttDbzuoqHoVt%Hia5b8X4fY zyS}obrAbj68-?ouW9In8Bnq$0NfL)M|Gm_?BNpT4Q`vg0p09uKt)h3N*YFgQuBxn@QaQU7o4^owK3tk#z=sfD>1CI(88th!=JxVpM4%>W;or_=x64lh2F>V*S|`an_q#^eFz{42U79~o7lifZjqDP)Mq6|Od2 zC{^k(MYYOZXu#o@3%nqG$V0=4gsdf#HdZ-nk7ZE#S$L;p*Qc>BsmO4l0?f2Fa z7;^mrfMKZYz?JcdPhhTM>6@PM+$5O->9_Jq=83AT$luDhB^>iiSY&UR$#al_0}l-2 zQ>0gy8DPa9NVDMhkseOGL}e1}LkY@cFxYv{5WjdJHr*#oJ(?SY495#dpt4%*$j923 zo;G1@U}YQ{!&M&{!p{zd;oQ0(hZCUg&)M9%OI&X+vxsxWg7jO}Rb+)*Ux42D1Jwo= zEA!n4*K<#)e811NpVm5e-#1)h7RLaiI6$4TC@!xp3hJmLaNgnIJ!z_dfSX|hEH028 zrnOHor z7}yIRDjq|F#Rh2kyA92Xx+|okGEL+l>oMbODjs$cWiYBd)3Qrs-ir_h!@LsD$KbND z7-P6X!0znhREg-qc;1dT7V5b&0H4&!YK$8(`4dy zVNB?)HP>hE1G#_T=I18wN)ZT}^etm?LSwiO*X^`1aLJlJiiZ%iN!)o=Ky~xR#J6e7E1PE0hHQTZ$!RXeSh51K@_PC5kYuuUzD0%9S-}4>VTcvMhwslf#jl zdZ~9dLY}hLOcGvnm5rK!DGdS(Act<%aLOd&JY>=o7|Ejv85tZJ$T(K9p7Y|G(K||a zRfSHmiy(<8W5$yqgo_X_eezEb!BaA@A*{snWZIsF^6kiYlELBM4uQ$snUfwB{+9;J zgFO(ufH`BMs`V4(HJSA&saE>N6wP*hcYu>2BbOjc-^axigio7e`A6;DOJ8*EbUH>A z$9nMslhRpLK^lga2LQRE8~d_7+u0gxNV%6@A5^<7xn}~3!)na@56M02i-d9g-TwRG zG!G-05MdpYeCx|ZaC|-Jxp(2iItGr?cRnhDCn8~*C_E7k`<%05QN`{};kk$`rHD|w zIXvqwJ5W!N78u(@V+*@#A9f`Gc)_bO%mNDdxG!%RR1DLzPCJ&X>(Wx=2RoJru@Z3n zkH0e>JgMGbs`#DmLALtZPsY*Q7IN~Ot+@rv)CSF^FT_;>H;TL01R7}C7r`s|JUf@>eib7t-wGLiD=K=<=2+J23n zCrrv;>jSOGP!EX4x?9j%@g2g8GHN&TO+Mswh?{UKvr>>-}Mj3ny->XL8d= zEjr@2_Kg{^mk?O%V^EXlvR)My_qdq)_NW;b_x|sVOjaaUDdO&>yJz=>PvEX^q$j90 zIeaf~4~7q=lGD za2US8km~%PbaxD%%b1^g6fv595(SX7*jsd!QGrn&BpJc0XDwS$u(0N@=yro|^WKOK z`(UvgEp&Ns8jnOVdj(*yQ{JC`>)t$v6BxHB63Ity0dNw`bY7rB1BcL$;ZIbVg{G+F zI?N!yZLedXd6#cRW&=72XTE2l5#F^o>%Z2J!e=8Hb+4dv`q{Ut=dX$`JU$+{5%qJ4 zb20#jr1h_V0Oew}wkI0oI?JqTcZimnA|43hnHi(HjfA&vqC(W|Xrol9LZbrh$c^N0 zLNMN~z$#JHmVC0nD@@q6r^R|KH&@P#7# z+cKDJl>ha9g$J*@a(!HQ+~0-$u6p3~a7D-3AB+!M4gDsCz--R%^sC7;w3<_LU6iie z&E(?ShaWn7UGRRrB5K&Pqw(6B^%)5mK!{!aG%)lj?TU=Bgd9q)uxp#$G1%~uW;vIUf+U%MM&c`cdf)bL7-gsMYF#<= zgsBQO%UZ_V)SEIajenmf!B*LDuc5`?#Ra2mAIV^-&_87a<7=t`ife zs^P8uNfCe`c#aOSGe{Db&oNhE7#IQ`_}PcJCY)p|pGL*c2))HqE1HLuY3IoBT?~b|9n{>rq25F z4)61!qly52zOX1birr_mj}@SJ;3n0zR*5r(3vWCWkQ9u(92;Ip#1V}mLwH^xO7F(e z&X>f7A?z#+RM7dfv(zYQ(xLfvUtV}?xY`LVBlMCH%S@-$%CvGpTndh^S=aR`{CLDg zc7s`V`ceFH6?WO`tLBh>VrUi{*$IxR4nE}?&q7l#^vD_c zv9^J7Y?5PHf^aZS96F%gKkHoNrx#Sffrh_{-`OFl3s)MWW61^#lBfODQxE?(2igDt zZ}4B!)eP((X@&` zF8ATQ0^tJd+1d7i29(rlr0zF$B+t{5za9$)hmDBc+^_d4{BHIzxh-mBDNz{?Y>B%g zUXLZaft?OuH(1bQrgc}3Q4zYvXXssbvcqPa072rEiegU#*sLEgv8$Prcv3A*8RnlS zreab(S`!qJFdmb$_!sW)*nyPg_DEWUO%6(ECGtx9gJtg=mZ(J&6d6DU!`%n;tngGt z{@%1Y^}kF1b~pdF58U;^o#Rz|a90+hznz}rjvU&ta88Q7`Xo&dhoIaD==l2PBKrkl#fwTpb@;Pop%RyXe|t@Zpk%U9Z=KJW_WYPdhghY zg`-8Gk^N*8<{Lu5K=qg|TJ=z9*WlsFATb%NWMW%LA2X}V<>K`Xh<_{T=@BG}{qsXQ zJ&D&genwnIV9D-kR{UEZt=#_tfi-8p&cYn!7oPvR&ckZ>cd(X-bV9Dz2sF>41jRvBcg&kMJu30euhC_ zxfW|EUu#NyKwm@fpkjB_$GBTlouqPnSTJ7N#}nIRSfnEbJsR^p)SENN zt(^^5D_KbEE67}NL|q9MNWy47q1_><9%R>Mj9KDraN->%%CM`A&B9HGu<|on40Pt8 zYZXs=;jBpQ=qDRn8J(#j<(}m-cs4_;pYbHikruf3=yMEG2pW>PE0V<}C)MQKPJORx zS}{Gc{f*a+%|DwXXMP`##HJRuL*ALYWgTS`ymTO;aleKrxSjs6oiP@^Sjb?-q z1W1LPJT)B>*zRE=Gpj=o2D;iFf5KIcHt0;^o91-N4H6PGhxN^X>dC*?%6GYBh-jX| z?>vrF1At-KC(4!D^ggq`HJ#=8@7N|dbmZUaTj3o$|E6y1m(rvx*(9~X%ZwuQN*TYWpl;5Q#YY4{)a29M;s!X)%0^36yZrv)>z}@uQt4fJ8 zO=&Ah&gS#V+k^g0ZuQXAuvt146x2n2N4ysBO8QWy_!D$Bfmegpv;!1HP^I_5PM_kuGjWQosGsz zONM$9{FqU3Co%SV3Bv=xzcrw;&Nz!m8)`2SxjT}6=OaVz4U#S>rlRp56 zomudQW!CiJk=Eit=(%M|5cTGdk@AN-5KQcC3{;&1aLk}Gcqh)oh zDb}qOCw%+Iw21pMyk$e$TUtcvt+Bi>3#bdTq_dIR!si86YD16th>4w9z4|lug)6MZ zwB9-D+!qj@jVA+cOq7?r#q`tLZkIU6=>w|pDfX3_P>|VR&W?|DWUKd=l^9T0}%L0TkyQEI!?ugu8oO*9fR(Y0xP`dqTlZ&$W z2%3HX#iLNh0Ix}pIzX-B7l*{S6eS`@J`)rzG6M@;Qoh`ZxmpAcxE?&|Kjdb*TF8C> z$nW~r{?#$Zq)zy9{bTuG`L#161_pOTp)}QGZ-;XvCNI!_7)sy8PD|p{IWtaMGVH&8 za7HN$5}C`*-_L2%YHo&c52(!rb;9LD&5^C=1ajQ)xeB1U;&9>i3g0`|IVD?DQU@j* zlfAC(^qK`>=Hlh&7h@w&xy8wRc1*#mQOOvP#3`ZBD9$*DWJyh0XL_i^1E(bu$zgC{ zwE%JBHverz`eSjV_&5%tChhsW_>|5-OfS5CS7MJR%&zh!LD3y+MK;Wc=UxOn%8j2qj><$oQyER>qW)vA$AR+?Eue*NzT8Rc=dk{v$+rGB1?7d&44S<%_%z$uQ^LqGS;Y`&v zO`-2{haYr%-872mDnBjN@#x>`2_lHt_GVN7TKSuHzhBviZ-mkE|D~V6n|i(_?A@u) zZ?}kn)yn_;Pv2**(B2Ha(KFrr{!$14tjc0)Tmw7ve#whb0PG{P!skN&>YjP5zKZ;p zdl*1EN=ouYMnjiY%@(*-f3c4d*fZPC9KP}D6#S#?{z`4W^2~mk9L!IF z_Mjbn@Gr{{s>I><{x&Z@ATqPNR1JhbjO%T-#jiUIbY$(P5*2%04^m{Rg3NUR8|-x; zqj)`U?WOi;P}J}jRv?9@WKI@F4}{I4L17BB&2Qy=&tC6yr0X8n(+ck>_sJUC`k$UCdzPe4E ziGk6M0D8s%`P*FXvdTDPEo!(UT_^sfndvzj_&~cX=Lhx_YivRqr zbiPgmFp9d#e) zzp7`13%|qvFjpC@I{(XhGkg5QlR8vLlY`ecMw_smVc(7x?9)s&vw~MYC2mYKA*$_; ztjA0}Gf=W{lw`2!t~lg2F&bTmB_#Lu=7I}tdytZ?t+>TUNAb0>JKGn7a!=0189zS0 zs}uDuI3kEO|rXQXy72k6auUaiwr#_ z85{0{!GrhH@%D032-gm=`hgO^J1iR%C=tJN)zBc|sIrODrS1?;AyYzM2ZRROr*~ql zo3f6B5}%VLLWQ3DFQMUt#>XlEIIby1XCYwQ@3DK)(J3(!uu^T$igy$| z_CW({&slWWCFzzEdaQAV#}Tx0lw0rOmR$qa&pmS@0aV|ho# zGidc$gAn8!sw|UMl<$xnXdRL6pmX+?aeHvNZFT00m4I*RRF?sActfPt@q~a#koL5& zD_X7n-Um^SOp}w(m+0B0L|-BTu?K!HD=-*Q8uDWk!%<3rjgiNyp^<#p6PPS!P?H=c zV)zIsH}$?HfWr9U9gVwwJjIhy=MUyM91VEAk{#74xAkqiwO~{>9Y9BZepzVb9lehA4R5YkGGVMXuQ#u}BiGe8mY2IZWhNFI-gcQ)9nhbprYq9iP zW=X@8hJ|f z%Fe+vkz2MSL8<-omXj!al(Yu`6|-(3N)vU?`SeS}a!640OXQyv3gj(DpVq7rL5+OW z1F?F2a#~nFp+=vyhvH{?!|vx$0WCF-dS;)pQ*^TSi*%3{8n3V+a`*wwL}wjquHja|aM3!I* z0{1D%U24yLqo{mm3Q{fG!x8P6uFPvb?}nQ04wK2%sIOOQ3)Z?Le$@6*WL#WSNtl3- z>5tFl@!sU1l4;2i*ESuOnnQ-mPH=Al?&wuW6%PK;#P_tkn)DE+k}2mE)6;M=X^Wh5 z^J;!=$>SO4Gdvmvv+6nOB`HXScWgWsBm&+TkA_x-&c!;u64+qVuaO=t)IW(2FwEwUN)&Lpl@6 z+dKUNQtfj9nk>El>CHxb%KncHFs7h%rO}n5k*|QoQ=(wLJ`uhbk|1)~{s5_}o76DM&znYtw z+bD6^yDb3J`S8ov?TP^SpC{v^UGbSeOr>vTNBRfp4rb{kUAge?O-U6B@KtvpQLl$j zZD4a?Ex;ULiyIs|0d39W7x)&{Po!Nhe5&6$k_{O1+Xi;uc5ViuI6`jHt7<=F8Xx2- zB3QGwfq;=%!a|S-?`BJ=X9zv|WG#R0z$?3T;~ugUj_}#}g3C${|4_e5v!~Z7Hwv8? zZIxv7tJq{|&+fTbHg`Q+OK3heyoKx#OfF^hpeGA+$VpZbLj^ql&_RtdK^Tj5xpOh#e6^_ooB@`$032k1aHpT z`Xqp@MtU3hH#)>2OY_A3C?YPG;Hte1|G-Vi(OxPUVJQR@WExUU^f+6pcKkibadc6i zD%$0(3sWQQ;za&P!#VYX#3RtfHY*`@g6@AA{hpC`zXkZr0Ne3_&61Bc4Jf5mq1W6mvY z1lQL86%MbmoVEAG0s646qsF6ecKSAV3%~daoZIpBv0|?uEZB>dZoO1$hLKM}0PE0yk;vvo#bLkmAKKb02Zv0$lzgsz81Z>@+vM74t6*W<#N9PH zcGlUV_ZQ#1t1-{}q2fADBqhhRvnT?7rnaRaMO8OVW$(nq;2|uT zi?L9NS`qhr>Hkc8?t_DvlFdwz(o`0z5?ePIl#RwRVMiE)U3(NEP)$0p#W*PbXnJa( z+ZeEtGmm3n=_z54J8Ec1}G#mpel#G-YNR#`9*BzcP}-o{dHUx0%IVA?GF4vqSF~{uo(# z?qZxuJaxs>FTD!zx27O`f_bj934Bi)>RDzy(oykt29|$?$c-_>lte35m^}XP7$HwA zPq0uEv7e9BRrB|=upXZa}s(tbJ0 zvVr1Pbl4R#fe1%|CI|tXfaBBxXD?OGK_L@gQX_Cc81_rudyD1Mt!vVN=83jfz$+hz zrdG(Z01E&afOD|^{oB;35G{*{G1*lUB0FVY;o1DG*=>LZk(@S#Zq+ioe>p1j$|@&( zm7Z?s#NHC|ElU1Vb7tz$%EIPjC6CT0jp2?aFCF0B!*jM}gAdBBL}5 z7C>c*RONBKPDdmzrB)uUFxIb z94?If2rumw+nLSD?n;U5#X}57NkIxikpaRuhG8+o6VWyNypPi@Y===Z2?&V;7zQAy zDKe;pEbQUb04gg!V6U1^x;*uAUM8q@iFL1wEq;1ZSO6?&FpPL{= zKOb>@z99F|+q;hc##kgBo!G3BWGQuJHu1PMHstDsuC!MNv?I3yNd6{0_lhtMCbLSh z6n>u>75H+71A{3Pz#|xlAkBUEelinrD$%E^>5f1Ga>`^_b3z~ZAOX9A;;6uQnua6?Rv_RT42lwbRc3W$|3r`Czp_0# z>{)`yrwnAJs#G+bBs5~1=0=0a=5!)s))~%-fw~@{vaeI@61|T4Tlg{kamLo4paVsr zE-$04m>n-0JulrmGjr9mLH>Al%5?hh_IuYl2$64H9TPua-?aPh@aE&TSDa&B$B?Yn z*chzt%49A!*w zToRo)kc_|zU>SVP?AG&9RwFcbv?c2HZ8wR@hIB)h*Dn&e!gLzYvp9&RSKPEw&y*Sb z_HpGsXJa)Uq8iEVy5$*_=`)y1#GqUMe{mrY)zIwi=RA^_0Ec9Z@Nn!j#2USqj_bt~ z4F~MnSu)hEKUhr}XP~=Wk_1&9ShjRxq=>B_LEz<0a>J$fnk!}#Wt#bgBGekRkRTOZ zLK>^Dac8Mjp<~X4Db@)W8E7?W?%>;?N<~4BbZ%&sYi&xU2tpp+Y+iO25!hSYXOsCGyN5(IFUIejh@3OacEh+X?}uD)5wdLbuN z5|aI?*D!~OfbuQb5sroQ8QtRgj|A(x*%LSgc8Rj1269XvU)yOj+O74KOymM_b56P< z{G7P((~4DAkX0< zlTD@Hs=oRfgt0obx&7&51(DQ=FJv#mpuZbhjIh>;}UP#HX9X!|`c|1iN znt%i3kQBq0a_^EfGuJ=I-U_=U=5!KNDVlgi_NDL(b@=3E{zC>sQC}Aj9}@Hx88}=T z0)xYWL{BVmodwjdLz4mm1-VwJ3niHdiDS)HB?WDyiPoE#A9A$ zXq8QSIid;nwIm@Tt|R$R+-SuxRer2b`oO5^`b)@Z8`*<~t zp?_Cor#$1Y^^)M3qT1ft_ERch(Bwh5n9yCv<#|CvJrs?G<&S%9ZPk1yTKgmL zG9wq=7bdJ#oGWZ}SqVS?f;A?|A3;ys4a_*Rs>-xJ?@f81t}>QSWZ2kvKN2|};+WPe zU^dnur>d=-L>rtnU{cg!aS_=ZN93xp2%g#qWF#3V&PKSEK%~sdNKUg}mU~U;`@rW- zSy|GSt=R@+x1uxNjcICz$lxhAM3s;XQaW16Sq>5%{vL#cb}gOs4SRf`?y=j54*cN#xR#UC zNJf$c{)zJb=xhYgB6NQ(@jMysxB{htE=-oh8_m1x(dQQRVC_&>LU~VSoWdrrKXr@z zcssE<$>U0hKPwOhqdX0EEx7rR>UVZ|Aq`N;)7Jkb05C$^>^%yo!L=Q-kQq3A5|02& zX)prGMzgSaZ*Td-w?VJ9I!!!<1}MqN>~RbNq6;EooeK$LrDblPB-QU_0YDY^eS$D~ zWqnZavGRCd=E{!P;33ZJN!@-U&;q?H7Q^!w7y4lhBmvDHrfhh0_??S$!*YROF4N1) zx@!Lgd)A%{_J%E{I(?$*t=ZP4GW!XqdR)S1l^aOWxLKQ!3ediLn__kzD_H{Pm8 zT(1>AKv_k_OILxk2aAj3n%bbs<(3;Y0LEH5lkZohCh%|dhg_W7hOecHY!eHU6J z-B7(D{(PMlE&PvTKn9nDVb-5ZTnNifQH-v+f39 zBiAl}phV+mfaknyXF3ire8ny~1f4+_nYxi*TCv!zAeVHgc^PxVN;3)rAvfMcL)+f& z{$+Ts-S`@VEnL7t^RweiWb0>Ua+9BwvcT<($1D45Ws(3Ar3vyOYnY;>=tsDX!+46fC4aDqieLgaDTJJ!n|DkbWC!VNlk+k&KGkFk z>Jo&aPua;@MLx-JPMRvk9;}#sCsvBHWT5|Le0iGa0T-cdj=CI2i*9dJrbB58$Z1rA z!wV-?%5awc?Z=k+eToqOdG=td>9Cv6=*wR>;rSX?)d04CN?7DVx6GB8<9df$a<^~! zuTJbsoP#+>Jxyzu{J`J*edMOg@Am(@Fcm*=ylpj6BK*X@Xf_6YJ0)ge1bKk$0|6{x zJ?)$jf}{~38P|IV;1;W9&rq%k zGPDF^1c0>n4|x9bq*qVzs$~`uP-3Hmzuf3+RyxweuI%^Zh)%~Ntc9rzgC@RT#ZS_o zPOMMk%DxjS4+fd6F3n5B$7jNQMwCkoX}PcqE9~v1p{IA>?GnDR(R{xtMh$el-DWKC zh~fW%FHU0SA|MDre6;d7+Nr56|LKLj1321%;P;TH112tI&ka33TjAFwwtF0M7Yk?* zdnptVLI2ER?~Yq|Oi>-Wa#*SqQ-$Vt-yCWkIy5A?Ps=(yGc0&B13qmY(8;I9{5R@^O1Ca%W|9UqaME zl*s)lijhy&7yr0z>IJ88Eg3tvFJ7$T4CiA9wxVQ;Soa6EckUS~(c5`;=c0jW-@adZ zVKa6vLT+xV6|s5Idi%*JJl%@Gw$_o}$|i0YQeOW)Xr(#QpQ1WqRX3PpDIVG~>X0NM zJXAQXVW#x+L+s-rhd?ePzrE)3zmvI##uX*V_)>qWKIlVwzG`(wyBQ6J9e0wr{ORgg zkz(h$9NW@sd&`2pXa;Bx?@O_(kYlwMhMRqE^X_g~Y6-tGb;r8IathZmNlp2d8w%agN>_5<*)j?Er!mvo&|s<+H&Sp zW&!7?AU}BPtm+H0Z=>4(qw&ZcgOZ=NE`k^=%P+})3>m(7_-+OkNW2um$8S3_5JbST zO#s7Yo7Mmt{t}7$|2DsF`hA#{%9bG`I^J))cwL$7B&JA$L@Hbf2m%2Y-s$6WI`Xqpr-$3Si{r3Db*A{BNJ}Ct2;mCT{XOls0*w))v zhJU`Bq~0Y5^BpSf-?OGs^D<8@61u2cUOMafCBAHp99FsOy_&y$qfi#Gdb4jg?yL&N z>m*bA(P(n3YDy}OizDFDH>wFXk(c#sOk{n7G{!%U9Eja}@}t+Z|F(|s%!?;F|5Lc| zb9402^$?^lgjQ|IJW;O=SHQ5S4th8Qdfs+l#d-cL_sirXvn68P1ZpL7k8)K}viR#q zbu)1RN2dMma7Hiap}5nmif7y}@{Ro=C+pr=tSp}*#t)k|+9Ps}hHZ2aB})6Fb9mD> zeqy_Aijxksk9$Y!=4hSb>@GNU%4EaiwUYOLZ(r*!X#5Jk{r!XU+QqwRm*)2Z;PthR zUE;x~cbr@}950=uyHKjz z0sq3{nM*fF!BcuiqS~9C?DoGbd-dhTgVB*Pxm$CQjlwIux4D{kd;S$Gai!4=Bn6_+RtuzA(T+vQ zy6;jm9%?#34)=^`W48ada{Tem_=~T795sbZ;n4r|)sLmwfqHTZ@ZsDDZ@~yOm`4gA z%)zavjh#+*A80#-5azr};KND1WU};M+YwP5pA2w~wo_Y&Cy5}CIR}t|QU2j7E9$ZA zw<#C>?QjsdE0;id;0EUZ{`6zLp9y`wSZ_&-YD1a4^3L_tu3yFIy_ILX1&J)LU zB&+rQ6>q-(^JetM7WxCPsx6B#%3o*iK2mex8b4^n=kstV9JN;;Ie{Wu>D*)p2GWI` zluBDNx6Et%wT^HVb4*ll;UjEJ5uwY~5B-gBRe(1knDPHWt-t!a=g_*%D z;e%LxE)-mSK2J%4jRq@7Lc7SFi|uEB3BFxyZ+Fye^-)x`uVzMwLnF-nqK*{GtA!BQ zJ&*aV^(Lx0n+j|nH9y?h%GY=NgHCr-zLFJf>S#LRC1ltK0-s(A^Y|gFuZ6m~Tgb<) z<&~UwiIkR5`9kqKJ5g-=>9R*kpIB$4P95{X3>)*+hs(ifvui$1I;&$bj8%o&&`>n@IC(#0)$RI#w zX@BjbgY(gDK8Z<(Ds zYVS8X(vQtkH8QL$UFrV&FShQA5&QXM=V|Jsw}WdT#sLm`d`3yEks&nevRd- zlOjS84&gq{+JXd6{ihBb_ZTj+K_tI)1~AQWd|B+j0<*P$ahu^^kLz!WIJ;oLw4|6p zH^KoBLU^5K4PO@ao#X`11cF>O0Fix(0IGREqlPmlK&Lb$$NTo+^^pE4kdjH z(Oh`pbN|Bj)>hR^k2g2W{6G3W0PorK^G2| zJm)>-S#>b%NVAO!&_z}Zq4O^4ed&@NRD9}A)SXd*pn|6W2OB(W&-==3x$Yl0S|NFR zdiV42jSLFtVblyOg&~#c26d{P(jEN@`a>aB=~(;nN3Su$OUw!SMwMYsk0=8`#BFb- z+ySFm98ppDr|a2Jsw+E1hI(5On{HdX4?9E%iOBQwuZI&bZ7!8|DN`9wNsgWnf4>gg zcRC?Z;UGW|-Z@0Z_68-Cf0?tQEynE%$3!+g$tmUp29C*px^y*bz%q>;L`3S~tlx#9*Ln0;|Wd;Oj<ON>W!`i{*sWHGX|zDOkI@*oq$MJR zB?dyEQ2Bag{nhiG?*~qfTD-ae7{-91zsL0F+24B%&nyUSn8y#(i4Ye-(6M@1Mgakm znSr0HQ?D=Pi3OE5)hUZmkTiy93#?ncdqa%Z#6&YPnA3UZP#Rx;+5NlD?l>;)j1yEE zT)BT7deoqI9`c?PODU%>lbCJ+k;u5KSyU4huhbS zLM@6{7Gqyu6f~4(=SI3}X1zN1s&0KzU(2>zWCx$!L?>%%;)U|Oo5V8ugd$44j^5!k zwmuVfP_A@*IO2^u@^$~C_@-5Ub7*18klm@vd+xu(qjO~#{78hdznUr1s77^Mf`8(v zhoLAVbjZzQrwD{Q@O!7toO0uPg2;%!Vy}?}8e`JHNZICbYqu>BUb2(oUi}Ei62W95 zu|s<}o_EMupw>Vai2l|0lpTw2&lYT8O4%}R5;Fsi$i{or>ROu(D^5ZL}9-k|6(_=Qa`Sg2B_$UCI5ED(HJapc zprUIWjk$Qm&meyG+I52${&y<9b#f0r?g*eD8bx#QmwAr5B9?YC_AMso6)C*ga=q0& zmB46Ga)-5;k^QKyO2>$Z=f3vd6zsW}lMn+r`<#X8Ro?;!*sv2t zqc!(`Y~>NkD2HO#v~C8C&qgM2t>?Y)tp1s9rJqq67QU2--AEpx+ia{M|+#Uf$1*pcdcl~db ztWi^rsw7V?KmR)~DvFfg;x>x90Bwk#&{z`P`{z;n^}C^-V)QZm`Nh7i%UzEQUuzp) z+u|4z9*yPmPfMpE&STwVI=Z%rAJ$u%d_G}AaE=Vfc~y9|+X=@GHVJJbocJ|=eMV96 z?+Ocu@sZKVnfiGB0R7?E`xl972Cy9*3^FO+Zj>UWfxLjrx#q0u8SY%p>aD+$YYw~D zPH!_gI?=CbBaVA|L9out(YVGIfgg@bty06&Q_#HxM@<<%f@G=~hU#Muy@zfTncCxQkH28A6YH2fSZL=+T(agg)5 z_5>>t>}A0{uje~nc*-dgv5xBGUfpvk1~%B?>)5f6lKdLS;x9p8jKAh>J=^jq2z$5& zE$aLYy?f}?Mq~nvDE}c-(2jicrxC&%&H$AEpqoC8E~(S>^HXDR-eI_ z32DRRW>}kd4-J^^ zk3C(y$LM`{+-B{)ZK953^Cmi%$$z_wVMqa}k^sxV5aQ=^Ft?782-ra!)`!gRBG}9t zul)EqlDv!V{C0A8UwErByeQxy2C%#%vlRSI%Wf(x3%qPpNCfzn>nHxWZM`-5s0qct zCNLE#Az*itPJeB$s~RX&i@`;S1brxFe9wE>660{J?L%(ki8uG6n{(a;MLmg39jN-W zL}mIYX`qMPLmEQ&6>EbMiYgz636wE?DvoC}v8+GpDH7xqn2Ce3C1pxv^a#K| zc;&MC%JRX_m4f!4YucaJbk_8^lBJ}qb#XcrUjU1>>K?XLy;M8)c+ZIXqTo&|n)8l* z$e+#=KH2%A=}0imEJ(bKGnXL|43N4&8AVNOoCb}e42o##j%{cJd&+i?%s1Qu776Zb zASz@MdN!Fxa@s@Xg#h>}Md$75xM<4+ula5{;-F-yYOdPWw3BiwCwc1=YNG4 zvqA*J32yytsj>W8IV7Fc%O+Tv13nBmn`9YByZ9oJMzcfM$r!`Ti?1@11 zGShwb!dBtqBFbPl!TO|Fj)-WbijS^flMW(1Bf@&P2m$a zFlQbneH?;aM)Oh;TPeX|v#R;X!xs=FHS;t=uYCqYVp8xC1PT>m^uNktf!)SB*%G8>{3_i{ z`6nh`Ge>Z@2f&4$F7`E8-9e~#;8%14PaaqQ<*U~}uSH44-1e8erK36 zidx3b?l)^ba#TQ3Pu~-_gUfJiDwUlF@SK8oDHmtdD~of%0a=Po%i}+u94HT!^6luK zve(iS$rJegUaKOc#H|-chkZss6qgII2oi;0m16VVv#DYa5L`u^;rhtXuqaX`#NKnY z0)5n<{8POIbKdO9>pVwWK%1k>p&3Bb{pT`c&r2t9JK@kx^OqcjRD=sf`^#jgLrL(0 zx1?R~9;Vdd{<<49lS5lI!TgEyS4KlZn z|K6uP9cZ#2$)kx$q;Y(c@iQO<5Z&%&qW2!P(Xgc02$eO>nteH5Cd#8w;U|Wsu;xuK zJ2K#IYMvurnJH!V*5K_BCQ(F#i}Q+1={7D?P%F(NbPXOpi-bc}tn<@`&bZZu<2(X&?^TLgM_ztq_YgFq+nA?EMh`$IWTs`EP^nr`ereo4_- z&McmzVfqqx&YD@K^jn|nCr(l4O4V20`Z)DVCM*EvotnB+H!6@!$GFOcoGy7Ja2)Iw z*{25GPDCCc)ZZi^1EjGiKIQX^BPL%eoJia~RY~Y@sG6xUF3aVRK_PFJ%D_SgTr!&G zjYaTzgGOd^`>nqF76Jua?}$_A8{tX5i4VUm!#~lx$2LTug2`7ZdLKnDa)sM@q&`TN zy*XDuRJnoCW8=0bO}6M}UT>2s=>t4S$F%F%^pNmUh)34yJvD5iE8ZixW_kw#O-%XF z!{p~qw&%8~M8%{=)TmZOiSp}y2O0j`{ks0+TC6UEGI5K!bIa>H*T<`Qs0{j2>m0F`|L?x4eW%GEm(-9W?l2w{l$`6LGv=GPQ+L#{C16!Wd zM7hq;n>;xY^>4JsImm`=BAVn0^Eh{J_S~I7ok!C&g)Se2xo{mqYqFIe8Ch|x&D{B# z3)@vQ_B#dBaQVb+2~z)j!}79_o9l508;7K|bGDlS>z5`1*aiU)k3Zl0X+R(0@(p** zeeoGueX&#hyk4Z(YUJsR z0bh(t>bCgL+y6@V{+Ikh7(2F@AhFqZTpXj}={zeChycR3D}ej#n_q%CpF~Z2(dh@b z&J#ynt3lU)e|LQY*wx~@6K9;xaFE~u@%OoZ-+rg>;t*#r_hFI#zR1bsSG!^@XyghE z@6U3ptE2q%p1TtzQipeuEmSP8Pp2dq*|2}O<7uf>n!I$sBih`$;v`RYK~)q*klb@X z_0KYujCL$6e$>(YwNKjc_Z3rygZzp_9#=;OfOvI_EO2SzVjzTNTaocY)EJ&hM zP0*{MBcH5@qibEKtIB;(eDzP_VIt<#M*W_Tu~9}D&yG!ZO}$u4{(bVIv`Cvycj?9c z28@T#G`i_zF)DbOzWT}{hrh>Ck&)sDJ3JMWt6$WkaloOKo|~;O+KqhpG#}lG8989Z zy}(|;Djx5;LcWf-Z=s{n;22D`l6h6;5(TQ+j?0-2qLfdrw5^=_2UeBKjZK^6naR9gAGKmSFea zo3^&o-g#JCDu1*6Uuup>V72p{$4uBAJ1eSZ;I*ZMFHVn|tp)X^KPGOeCS5#i!k+%s zU6%eGP4`?q{A@ECE+(YrHjUi5cyCGH$Dw7ildojsoO>ZY>KOT7_qG==;thA=3G7S9 zD1dQN9zeM`bJrKA?U|;bk4~mx^)g86Xx-(k*8{hud4f0pr8e$FyOZW+|Jy;L^VO}P zm-+uCtK$xI`>z6<-qXv8T+5*SI(wD`j#ln94rxiFmE;t84Pc4&jDCs~!HuSsaTy?e z0ky$x%qLDR#V6%mX~vPSI#!uI?>OzDE#os}l2Pjy@m@_E>!^-yTR1@gpERhlCB5VC z+=De_dFpw@4@TCv1HMwaWM9eQ$pe}?`D#UIAdDi_w&q-xn(HPLdSWi)SXAbfw9rT1 z!WzVm?^{~n=4b*kt?OVXnu$@T?EIA7l=MENBz4=5x6402yL(qBI_I$_B1X@r$l$+= zPR5pGwX4-S1y*~FU6D_5c>U4I@~Mk8sZND}pj-EfgDqRjxV+h5oj^wEMJt)3qum5? zpqFIC=2TQOD-=V5f!t*!m^TyIS7aeHsed5i4Lh$q`KRkC zij9<#VAhSiXYB^bgTDEiNg-Q~N#?dYl;Xr;z=F%Z+L@`LbwSP_4>8aP{~j<$ zh-ILpjNAbv!6xzpw%AsAC*F)M&_~NIwCaSG$^zR?%#Na#hnT^yNkq4=oSFR|hmn#vq@-C{W z=Ki>sKY_$kiJoMe%!CgTQli_;PW;sEhwvOJWkQPIj5V2%PeTKAywF6)2tz?BTDXVxD@)}5$*VM=+ZZN|Mm{aS`6aY7GCDFm zecf;NRkV+++`U$C@nk`|t*`O7l*5K;_!3pRqhmYXdQ6i5C0UeY!w7S~ zZips1}mr(S$7wwLJAMS%^gs0sg|UqIoHRc${XGE6N-~MYC-Ig z9$lM`Lg0pd?cASMA`5B}|F@kHpoFnQzvErx74d-3A!9)XzM}3&QPLJ$e)f+v(Rs!% ztC*^E?^Mfaqw6i!EuckLyi8rhMJE31kyCLeyB4a2Sblzer@IOsKZLRf!!>!_(Qzr& zpVlr?l%yej7HUlaKiX0`oZw3^%rXn-T-r&B{cqyhnZ?sT7^Yg)r;VV_oa0OOb5ak^ z-4jFnu``apRg%Dtt$s9DFL~XEL{6$Q-9${Z`Ba%Z`xdn?mi*v?VsazDQz(9vVu$R^1y!?Y zYB@UVOM)X8M9m$6>iYQ}ZP}J3{O~SZ#E&z}3IUML!s2G$K zv!sCkO-)Jx7oj@AM+(7_wC59Vq3X$ZgbpdNTuF$I8YwuI=2_O?qUaWEG9!>qz(9v7 zohg--s_uc8?Q@@9e_vYmbzJI4())(U{EM1+ev<>)CsPYM+x)InPZH5E>m{5Vbar`| zM6+}t{NHOy_Kr*MiL^nW;P7VaT)+v4@?Vq=xSZam8|o$ebnHVm*c0QA6xdarkB2MH z5VeF^@X{!5ppxQCbfq+8AC{1uiwNyCw zsN&h!aDj)VwE%R|C1q_BeMIHJlaptq_g*$C^(aKD)$G0XlNovRvVK~&%Qd%-A>D#M z_B#Z1CBLU~zPDWQ^HbqQ?tTss1Zl2%xz_rj>BQ}EHa0o(U?BkwM5XuarBH{WzK+id zpbU1dU*A|d^u^=V?PP+v8hh;XP0Zo-I(T zi++VO$Aks_%0c}es2>#0{QXRdVavl5%S zCXtxXmmsNn_~-j^|1(>H94d~TR=R|t{Ewou4rprq!}z;ojDZ^r9HnD~1BQ;2(z}gt z5=u*{V{|DXBIZ4Vfg`0Qy(6Wi1w|bxEd~e}7fe+2V(0b#&hO9td3Mfu&o`du^CcbIP`LoV?HWt2T_+A}r7SLyK!H4gDee0eRA8Kr8#LQ}5?CD0KP3h7+OlOmxT zn`!(Gj-WF{)oH!JVT2m>5bk5und0t;5aUyZ6wmooA8i43D-hr5p_W2VRj&2xjOp{X;qZ!KDk6udJ^`AuFAXC9D4 z{f(Mke9_JXcv2#er#Iy3X-KGObcCDhIG_j022&nHwk2;%ik_heN)~)l1DLYTY8M;M zm3JqUbTF;0(Z-uUd7HWwm-5YUIj|Bir&qE<{`%wqpyT_>O*-opbG6t>i|grHd{NoE zCyw#9do~z{vP4!039RhS70v8HP;{1EKmaThL+AjzSvK`L^fKbs$%%FXK*~sUAEvr?tFkyv=zV{SQ%+?cv$5`S_q?kqxU zSkOLpMMm3n&eprRX;)MIjb!ET17|O-O`dk{x>5M-lDriMKzD+-UA=RBtv0+S^0*=5 zu~xRZ>ZMngKl>VWD-!Bs%~2#&3L6gY^ha7}_smmF5jnfHU=&+=o}rut&o*VKo_L6) zmMNxhykt1x-XrR|`CfL-B`Bw%E5KBQur0zMvEEvbr1zv=St7(!pO(7E+eDcS+_W0NjhSX z+=K@#Go&bvLyXIh7yjNipU z@V>n29uC0e^fHK(Mg-c}yW@Zbw1jL@P(Xl&i8PzzO=jic$`O>ZBc*}+xbiR67C}IP zu`-_kw5Yc6c&0KXX~j^8<~gVtq`A2s*$Hp>1SzQlpvUO=J`MtPC)jzkus{qUg1&IHd{b` zp5}z~RUut}h;@y?sEPfY0$5cP`>vueI015(W1tRA@;sj?EyCrTwfQAA z0iKxV8g3e?)H_^EGqC+*2W&mBz6WuM#LtKvn|C3i-2TjL$wN zeg^NO;#Bw4GVsx|R9$!PM3u1=FpSV}AdBGSLwfq8O1Mpztnuiw?5XLv8@K*U{pXie z*f2*0%lIq*>)a2CEGA#WjwL}{AD!GX3En%~p@BF&s1gW}NQ5n*ih${QZ1(>B0+3y$ zEy%`5wg8Ha(C3s^IyWc+3l%9Em?CNiijN&zQ@AwlFAyb$C69z9J)!X8I>k;U9ap=q zj{Sk{uM;?uARQp98dex3!RoG+0v0Lit|FX>!*SE-`MK?KCV> zzuJ23HM9HC(#PZBU(q~a!|o%0aG06x+pNAt{885*LhzR&gf<6sd-1Sa#Zum?*yiFS zGIkjUh!n_4sqK#9rVpbRq7SlLlvB?HQEZ$B=Qkan4d4H5bk+q&>s5#O)gYIra5E9wYE7^}LIB%V34XxBI&hh63(~QQV2_diqqup|Iu!R#~c%F13aYT-u($ zKiBf#Av7MNxe!s;{dV9@7IItawGRu`Ko_D)ph1|!PsAWXZmKn2$>h>*chn|Rn9m`D z^HCbe3+lPjnFz>`ATt(|;aZZa`zYoz`|7oKoZZM%Y}q=J3C!rLCup? zJ-Iy(zTd@$p6s$6MjNzIOzKOz@QD$&yi>@!C{fDjphFJH(23nm*RCGmCz}HC8jJEt z;m;>~PtE`FLH1`b-|0MR;pg{1Umg3QpkG=S(!P>>RwP0!GZ}G^BK`z2>GP)xZ?2dd zD;zvpaMl>pCF5ZFR!2xhpF#qX9UIo<19!mYat^>D>p=y!Avcj#SXhH>VF&ep zPE=z5sHlY3Gv{h&Q@8ieglFhnHSl0M^^G9AVg&~;e|nOstO=+PkF;(&#jG0Xg64X9 z8!bA~C?H^IBgsJK+map#JN0xLZg`AN;IG`7WgqsxXHl4UY`D)EG` zn&K|9e;a%K9!0-Ec@u(&g`hDh6g*9rps7MWlP>N<55a{RlqdBIGDIq@n-kcbns;*3 zOrpHQJ)4?4WI|oVYo^N7Dhsh=MzhCVGEe2~lmDmZc&tcb<;kKwKOruTE+oD8krsc*+?kq3y^6 zKYxFG>07k&I6T~GRIiY;aFks9=y8f+QgIUC6R2o_5*gOe0dq9UDZ%{2f%SClv{ZEm z=aJMx%Yy25e3DTKPLmEMHAv`|-Xp3n&OAC3c5KO0@91*c=S}S5x`RTgy&Kw1J$zvw zQcv>|yO{&{V-pD6U9XCHfx@mYL?t2+0keOz|J$(|7HrfKp7L&8QaD4BWl5)gj-~CV z6ulZbv2D+u;De7k1ahIH>P{OzAJUO3*_BYF3ob#92}qu@OjfLdjIR*{!DhwCtQU9} zhSw5!NyEKk$j_`b1u4RrUl?3K;?1S#W@Y>YIx<6doY!91lJ#ok_W~Uame>6q(>r5CoHoVx(N3 z0xKo-m-j*N0TP7ENyeeM3|X9sOEZH!E5t%n9IysX$A`%%^I|ADmMJ{T)2eDs@O`sq z-)Te99UkNODzZ&dytZE7Z4Rn20^4eAhO8& zv~@I{zy3b!n7os(EK9kr&#fgMR(BVQaLa9yqaTm-w45)SUVl!x?8HlWQ*!vogJ;E| zAFs3>{?06u_EObB;_ezTq7Vd4q@>6$fJU=R2tVI#5G2caGgZZB+s43^*z+)3pZtty zywpwYwag32-Fp-qUJb53!+>_l-CPWK`f)|;uuB(NeOGQZ;?iQ#18HIXvC6s5gyh;% z^-g(0w+Hd=M{_AF2tpQja5yMkSZu@u)cUp(KA2#k8+{IU*O8V}Lh#6)+LB&PJwBjT zRBT?4mNy=CqW8YQsOMtTO;Pfy5m+sGfjr0C_+n5J3M47>C|W!UTvZeyZ8^joB9aT> z;@=e*32d@)^z=$fsw;~rr$h88+ko=4P>pMhw_D&^?@Ed*K0or5r?HKn(zggAJgc&$a72h2kaQ~5B)#S?>ByN| z_Zj~mhQ9(Rz4?a$!qyYf+YV{dnr%!RNNs4?p4cdLrSD_l&rCkD(uoRSZRSb_q~HwGHwj>pdu9So{QLTb}JW%FMdq4xhsWjE4GPuG^;GsP)DMB5qyr(V{B z>mMEst+2}h<*u@^E9X?&v%ABLsnfV7Pm8v?H-`@1z23x?A|eN0@k6CpsQWQ20FcG6 zFkeAu_kG_a}0TVBnBF|psH-!C;=7e2$lFKKSUVm!8HWRsxO%Nei z*kv-2A~8qgEcIQa-H4{k4eG^Edt5IU%yw1Qy-v9D!crE)FI_FPw7IzBSXcO;CjW^q ze{sH+gDW1$R4Q#|3|_$z?Oe&kHf5^3OUdt__fUTh9E@K4Ir>BKrT#yK>FgByWB`QJ z0{B0z>ioFl_eOQ8DT;B>$aepg`rULJv-mY*@y!)ibZr2}-Hip3D5+XFgi3*m7fF?b zLrw=pG{Q~_5rC-25rsxCqyvMsI|wMG3a2*60}{?^nZ0_!(stqzx)Mh4x_B3}68oyJspfO#UOBwpNaHa5U4Z9U^tZo0o)quet@VX-ko;&oW8EYl(lC+;^_IL-4aj1Ta+pNFO?0Uvi7^dXL^ti`=8ymXt;Mo3^w$gTH z>Ok1GwOt=ae%yat79j&Pl7TXon41G3kS;W`WXZzqCN8O4qP#pc9$B(+@73Ag4O%oJ zY$H=jg>&kt5OhmK3wKIVsjR(tQG10>>6B_0CxgUqqrtlbXch~B1VO@e;@ynRZ?`;n znHRp_gec8kcH6)vFmD4F9$HLgC{-5du_{-+pkS6V5`zS<@!FXD{Z#$S^`@b<%Z)4u z?y+4R^M{&y-jpvRw~LvucbDf~eD^?4HtwJs2A#dQ6KY)gw$=S&mZg&j*b3!XKm!3k zzF{W27H4vlzZp1(U;|PP`PdvgW%>2qa+?Q=h~!uRyizT7*}Tg{DM|X`sm#xZya{gJ zy?7q_&`q=?s`-%BpSNPXxM_1Ug}DjxwuILEQIjV;Zx5CbL~}jOn7LZUFWbHL0q)rilHCXdt{r6hsVX%D``!7x`R1mNUw^4apQ-xq(!rA1iN4N0 zkCHG7u!YC_ViD2q{nWVy*sCJ2y=kDY7ZT*l8jd}eB;tKyirLa28KlPM+*WFsLTv9y z^}bwshl9e16CTx4f(zG7j^rqz8ag~CSmz$H5rufZtCL>-ZY{S4t?(X(Pc_-JBE&^7 zFJ>c!q@=Mo?mzVmq6!_Ozjt3Nvj^||i~g^0Ujt~ed=i8s6sSGAx}=;gNIHxGCWsb_ zQlT>&V30{&j?2aw(i9d|L;_u<4QkoyIU}DU{(Nz@?jFMza>yTO^xd-MOUSxL!ApvbQE05%!ymsIQw%MIW*?)eU&&;Lc8uNF;cz)2MBS)=HcEeg?7j2lVQCW)pvbQGP;d+-M$PC5#aKDmA!Ir{z1>@9c`n?# zwV$u+d!^@uw57bolHv7*?<&U!T2ZOm&bJa@f9~ynck5rQbn{;y4~E8-TKoDqj~BHG zdUIAa=o{G47WZgEVsU!PwBEejx3@n+m;Z$hew-K#GyP#%P{Yy$7~#qDr1BW!0nL52sRMsKcPj0`~bCdB*BizZeX_Q4L2wNL7g-kxN6v0xUE6~l|&Ue zO}+SSp@~M=wgn@CT{S(`KICTJam(VuS(!j1A_{i%-Zg1!IvsuU@!^v*qtQ6nuWOfbb;knQ%c>lEH{56i)4>Q!}zm*i*2N6&P z=nr(F-2Tj@oXW95w<+aatzPH+kTbuQBFAVX0YW0e?gn&ujdVK=G!+dK@%ZO7NGVt-@n`cHs=SWvwm(n)b2);ssS=6TNXU2Ijvyoj zhXj>arCI>R|H3w{{rCDZDS8;u+ZKC~j+Yk=0v6;$uEU9ruOw}> zewySbudO|(R876}VbkU#)9Utv?z8P9hH!TefR>B)$cq_dOfl$6anx65=~ULxp;0QG zx=fQ*dr_fGL=o%)HB30!w)x@SA4;9A1-nJLdsgC?8zGgK^S|FO{=9BAKW6i<*LdX8 z!ywJGXM15{NT&L|CBLi!j;*4DF4-YI8K2f*teSTC|A>S-ff52I#z_+Zd?<>4-IJ4V;`smm?EkWNWLQ*%lORp<@~gbHpyCvgm^ld8naBdf z*TgY$UGR{>F^Zz8;y;;_D+?L>T2P__lP*5g?V|g<2J~L|#XmWtCAkUE;zD>}QytQB zsJ%kMQedtzh`7}#>zI-xqb&2Wv;(`lj5C9N@{ zx!rQ>x4iQvXa~v&uE19Q#G;u8o?? zpxA-Y9F);^hWD(iiw#|nm^gMO{!%tU%q>kZ6=EWvcZsFrTGqCF>9BOxbA~}58USJw zMfHZOGY6(hE=RG7H0eVw4w9o1TJjLW#|CtL&xCd8;Z&uB!b+pWI5@^My6SDe{_z?E zoWC<#!U9xybYU2Sh$SF~^C=CloR_Z@h=Z)m`PUN-S&7@$=MdJoELpirag(Tjl*uaa zSHTl7{7icHx1k8;LEVS6uX-L>OiXxd>00Q@Biwg~J)fg!DwfPLhxBTTt2liD4Cdpc z(zL^S-dW}^P!jAsnu^Zd^=jHy^m2Ro&3h0Hg96^VnWm!?Chs(4J4j#M8Yo#VNcXvp zdq2*uyZo7UW8m+vZ-#Ji8luIP>iu=_>}X_5NZcK&9iRI&GF#Wx(if??X%OXWd1m-4 zy*C9xXn&!s`Ysk(Nyn~ukTi#4ibaHw(XlGUWDQH4E@`5pzI|Unc`k$?vUoQw$NCgW zXhpu3kwtpVt%%k>ncBh1#o~v|)o^(o_#ie|F8a}Xz52z~z=Sg+T^RG@a$7XFm0$pu zdH_qbSXbV*U~XuIAquqFS!y!{->|ke>l;as5*tSx6jBHGZU9KQkmqMEGHiq<1(o9+ zV@3wE5FDxIZv1{e5Y2(g20h+9EOojF1ugDK zv57B<=l^+R>y5B=k=%jm(NfbYt4B}P-XR3Bp%*kD0b-=DQAqIkWfYLECDZ~OE~6ma zQd?|@3#LS;4lW%%!`p*r1z-k~0Jp}JN)$%{_ZC*+Blo*p975QJlz{|}R7hzkv`!Kr zW?N6Bjy@JCzXMni(2 z@fHXS!@5(3pWXmD%JKE<488^ysYm8r>EA$%3c4PZxMF-8e>nlC^q`~`K|sb%ivo^r z`XKwjQVEYaV??=zLsthNq=0uwd+k-#H@)xNRk2V2K%&!0t%2Waeq(<=db_Xa(6rM* zzY)eGgY!7FE~KlJZ?!own1grG8rLe0krX6x2L~u=+?zQ!rgjv?C*oKpQ{z+hBsBtw z>Ht9{@S~H13^J5%sndtYI0%MHBA0BN{}eZrzeH}FbVyHAf z-Ekf6T2u?e8g|}r&WOHU22BgiN*sku)v3z}sZ4Y0%*|K2laL@BlCCNAkYTsI+tInN z**Jd=2%o6L+JyBgKD_dF>qp74{!kCjzdg)0xa?`WuA6B`&l>CZtUi-B-;q2g-(n+mIktyDXptS{YQ&4!xg0j%b78Kb7` zxtg7=Og(rM=@FnwYRlp=-FWJh|yo!lW>bNP;>U^i_;ig&*?{g zL``C{hG?Ub>_Ax4&f{0_S{$Zq*hHnSnd2ZNk;M|7;r|!*^TM^-Xve;K!yN&AC!MK6 zU5J@q5&HN(+t5NceSDloLTc7!!h5wnKIvy~{x-Fepym>RsG4UVE9(Ee=LT_F!KOV{kxh z2Ud`yRnAasb9!AdkC&DTZ%r9k)}gM|;ob2~exkBj**O=w+^SqtBwZSq5A*vpSZrBS z1tKm59RaGlx zHQ$7>)sl;q1|;e|uT7XAM5>@*s|?ET*YzIVb1zN59`SI1?VMR7Gd0{{lwV1HzLix* z{xBpC+@my7!5)B-lbj8PD4CS<{4do!9m8jU*}BtFugpkdto10^eX^!asJEZgd z#?0xgxy88$YvNrpaNy0LU%Licj2J+Zf3+TLRZVci2#LsE5t=1!zQ;hb{PJb9;VagfUBM851cfE&@mY;^<~q!T%_JL3P;__LyL0|9y2!tS#EwPSzVNM#yATBGEY zRjn-w(ABusfp=ad1zr2Cv8YhV&=W_faZ`OhZtZ& zPu6Hl)#&Is^4IQxbmb$d@+2F7+X{AB*v{2!OD)}DVe~GQb}~{q`{ZuNat$OY%1Isv zXi2b9!!F9Hm}HMe=4#MX;iGVNmT?;?;+Be)I4TQ9cg)Fvnjs^~Y3)*_hy~1^ExoxmLLnH*jx4u=jUHaz! z+v4MWQcl3FZwglH`lqM&7=}Gq<%=VoVmoz0b$sf${;_cA+nBk_Rl==6r~9DJY_7bq z=URuNX(*iv|0M#-F&Y$rvt?#_qBdG@HKLaaOb}E7a2biYTLUf3GOqvmc;@`)&!r5r zJ*Ms)tosF>>v|F-z229+KCNU8C@KdmeSh@k!;7sNo&5p92$OuVkA&wB&Gr^UI*Ojb zotxMj)`aj)%SYP6eQHXS<%#MWQ@`CVIW=6YEp$>)Z)tu-Qm)|UaiU-+x2!xl#MMMa zuC9hRMG3UA;Y;>@&ry#Q!RGj2=UcX(VPsP<09lN&hDo_>*ub}+({~iHhhB-5$&iN3 zh57lqyMkqN=Le>6^wTu`>F61nm4*Hj4MH+lb}CL8D4#xtfC99aJ$NC~P#m%DnSH)` zb!y2EzzX^{w$d?Gf7aS-4$mPJOOJuU$!(hw-o;{R$n9}YWx@d!rw~36{08aI+91GD zL8f#OXv>kd``M*KORB$JW1j+(lj&X|m{F*%s zjv4;8yD#KJ0QM7QDze;n`H=F$+NthMly*kRBOwkV^E=gi`km87 z9MvhX-{!#BM9$lm-}XP>eB=N7XX_u2`Z3dY>c?Ln@#$QeUow5g2M{E}=Bh+kwI0L# z{X)OOS!Sf-n)t;f2kcVNzGE_%70ui--i5dTuB)SZV8u}+ngtdSJa`$yI@dhY$ylOX zUO4&F@u%O3H}80Dol!+*+hl+*6+&>&>U!JYS;ESd7UH^Rjm5n_@gN)@p>_!kHO%c2fIZBUB zSjnrrT0FdiVD$vm!aWlwx^EmQ#e0BP`>yyEhRE=c)icy8_N%kWUKDhzN9caN>cE@aHerXI-Bb*;T4KJT1lx(#|nIpmw zwroVg6{j63tQvgi$Fz^{oetbdX8GFSe1We>>I7ma5D{Q{NhJ!q{(g5MJpo;w>Olk@i>~UG8I@nQGRr^YV)lZ+iZ7oM8u!I*TUBNyHCjH$HYYKA=wBd6)&^I;nIlk`AzAW^!yN_;W!uRybh z#G{tAPdq%L6Q5Tf&_MV|qE! zEy4`CdOy0#nP#z3NzYDQOw^xNT@E&m{7djlmDX#({+{2 zj>s<&kR?LIGI_AI+c&Dy#Dy^|7a(C|Pw67(Hb`5eJCe};=bKvDJ7!W<+-{%z%I><7 zX*xj$diNV=k=^ispLnRV7Ew9?;ENEd17BWlY%BcKuECa<)o_&u26m7c^~=fVCOB_9kBEc7j%dk(zrceB79EjlItm10W=o}wM}wHq=rVh z%9?#!2ue+j(r#WNM40&@T%mH+lHsjLv&FVOdn35YsV-z0V1{E>q>SkmF6&7%v(KN; z+OZwvEP$Lry6wQevtz9X7w1lKooV`oHEy80FyiSpvfB{K*ojB^H~-14qnB^Vo%!u7 zLjtJ?r3H|r(3Oc`eH0r}+j#tgOqhXq>%rUkyZK&9x!U(i^Jq-NVCH3FRHh+dnwS*S z9DULMU z?`cB}z<4>B3p+~qD{dIi=xh9BiEmgW0}YQX_EnhI7@QgugcC{VJLZdb7~lA8F~ubZ zcUF`)r7G$Wznd?D_r_Y~o&~#iHy;KB^F$oAq3qzyN zVJ6|n`i8^zmb-;0is)xoBEApoeRAuE!hgH|yL}+y+{_rUy#OqrJEo@+R+_JTsZJiG zwh>sV8L(ywBiab0Sm@=`MME*+%sPFpE1^iy^4%&&iO`W(F(BKk>RYKSB+3Q}V8eCh zoH>@G5ZGpc&Ghs3YEtB|z@49JJAWAew`Rx-hEcd^QZQQ~mxwEHlWUh%_k1Srp!WD} zSnw*{!@8@6iq5Ix5~Oh&INL@Z01_fJriI2NA_)u<5s_>wQj;scUy{7kU*6z$WumX8 zZ@WgYk!y!yF9{l5o`9zuRY#tt0*6%H2D%2>#hpf}u`(#Lb@e66=5*AlejbJq+Gr@d zSD04?;Y=JlAN1^hE3bMJL!UQ614snaoaHZh%|rvZ(LBAMVqo?&?q9iYPfvN@(k3n& z>7|Rc{7En|3zzP?CBq9NSZT|eYa?cWL8)l7E6}u3;nZtBomk_~d5|Ek~#=(P0nSHR1lr zRGoU@_abjc$-;J4R-P2zb?D&-gB`Wrn5}?<#{m5lBGQP-yLKK~?9U<@9YJmcv~^R}n)2iP{DGq~JiUG-6#*lydLDy2yZSIOXqGg9p)qar ztmV#;aCDA%w&Dfsf4>tZCsuTPlzmdKN^|Ql5=kxK(mgb>;ob4WuXe|$?QSm|4E+#Mdy8pE=>ZM?VG=Mc1L{=FZ)@a`W<1#Wb_3lRJkuk4@Yt_W$C1Xb}q-l`U{`|f;5_t0|>`@8aNqUbnaI{fk9~(+qKlp zlrg;X{uZ^jvbz+AXmCX#L|wXS^^f}BxeV0#54m_m@PtxWdmQ$?%$6;8+ba_&EH%IT zU$B}wztEBmPX;8*&jXI4n43gHKO6)l@xR9o{qo(s5KdreWSq-Gh>y#pd2s`TOyas; z2klXnNByJ9nFp?-M6C9-UeTN)6Ud(D&siqE{Ni#>#+_|a>VS}7Y??b#(vg^MgweI0 zEjw2#myXK5HehtO_!7Id!q8Pu0+4>!SCmGYM0WPoK~6g%Z3ssXcE@vBXgwp*!ye-w zVdp2C1Kp5HZoa&H>dfYZhtn0?|D5`eO8KT|OqZ-r4XGe_1^^y-tq*MZ<5R%U^SA-R z1N;K-btY@LVRFk_jHXQr?`ov8)XnQD;g=Gpeg27?sfjG%2i}+cr)kSWqllcSE!ipu zZhi?ov!ER5U*$T?;XC1`wvte{tj!MnD1gl7M(f@@4`>Hir{-}qx5cGK#EQsauv92Y0QLlS?x}LGq)0A@*3~^3@)rL5{9#X<|(6i2*b!7%!)X(-nLtStX zp~2CU<&GuQff}{|%Bx7N=;&Bbo2Tt}Y`K*#n_Ikdza_1b5OPUvN7mIVQ&7^Sp(^F{ z#U^2^^aVAf^$tA@uC=K{8VGv;9dQ!_kdl~biUdMpOpyBw!FC242iPuIXn=sZKTAqW z2>|G0^EX;|I&X;bqJQJYUf%in`qN|Of^%3Ff;DM2I9{63BfE1&<&QOB4B>`bO1J-W zFoFIg8!qxGlJyIfA@f;(+|m47r&8L50#Hn-u+V+5F6_(YXgYRu}QcBj#+Jgj}q8`^7-dOj5#`WfVLt3 z^O^TAe=X_UeD>F;!)m|(*!j`wIh81@rqhQPMQ%2WZ$8kY)N$iZBQ0+efTi%075f&{ zHv;o&W9*aH&Rwhat_sVqnaU?xH-D_~wqoXNtq;>}tJlmwf;4vYdm~oEpRzWzkHt2< zU(Iq;CwP?6f+j!|lG5B$h)!}3jks&6Zs8C(98o)5)_F2mW*O-6a^eNM-w*x`ti9mS2;0u`u&waxvsdW!ULV1 zT?Lr|u+}v>ReCIlZCf3y`QC#lJ%j>*Ol^*&x8=|L(ygf@F}D@S3X~&ynN340#ay}r z&*k+{!OJnxZR}LgiO_dUDPtX8rAAOBv&w9A$y3=w)*d0D&E;0P^mK=|*i%ofo$$5e zF;bmyS6P^)TpBz-0E4cgm_N-R7s|cXFgRykpz3c2xj}q(JnSEb1wPnqVLw^Pf-%18 z2#doqqZzt;vRaRQhWbS6$7Vw@7Iol1NafrzCG; zi_P2m)SB;YU$^xBZOl_J3?@#EUQ43vO-sXc77pSxmOBy2S>W)AcWK%3Vbz1JchT?#(hbZ$huwH?>+7r+AG})@kh@RJe3~ye zyEO9R+LGhb=4oyIuc)^0yrGgItA8w=ZmC_>;Hz9}fjo0Xkrx!PZ2 zZ1S+v^on<*>uFmV0Zs@(02W@MDS?z!7kC{EC@|XQ=*!>7q$O;+N(+(8*?l>|5e?|D zS(ZqXGo_dzH=zq$&$Ru#t{!yGXH>ZZ;dR3Hl0!HnYH+WyL5f#Mp0*c&#eEup2vKRP zTO23jicJ70#!^zdIUY(ePQ7I-rF_voglAVD_Y~BQu<_T0UE#Xut4cA^2n4Y8g`TjY zR-9^F6y6TA3MAd2*m`|G^E|AG+8o_t0ET8*4{G3z>v9cy{BewM@69zL$`}>Nn?J$( z6;GgvPf)SKtfRt(Z7qKFT$IUjFrd;awbjOg^{{r;ED2AE5y-zfPLrL)*Bwj8h*w}= z)P>7`zi2rSsHtvThy}ZMED3a3%k_nU6%7qZuhh)7okE}IrtKJTcwV}rz&u?-0hR}1 zG_!Y!C0eN%4U;w>Gi@{1@&%!=gyfo^3@ik}3LB6_B7eA?k%{PF9NwfeS`0|KIE<2n z@1EpkCNWvm$EdX+VLh(8OoR@%jk!=dHMXAIFqy!ykZ@>%T8G!Uf6F-D))*URX}9mu zxj@*fB?%xo zYCnOk!s#yKZGT%cc&?ef`(r{MKMWGFwDC5Xv1zGrc!=bH=0Ot}q`Y@BU6c$mZ2-%b z#RGi|mmDbL^MSaV-F0u`je-}=nAIQ^X0Qh0i8z!F{0VizAt}&0adhjkALpO3@W4!2 zjLU3v+F81>vc3R=*fe=cfq@p0iyXzV0disuASJ%;)t<15 zjAetnCtjqd5Ap$;ay zgE0kA(R6iIOy*V~q}Zx%;K~GfN8*8sQw}7tYwp!9m-SoFjPXnoNBP0AA^2dkZ)os- zgbp4xqsE$!p2t8#G5BWLC?@mk=)0@yM(Z9c59_^nbDCAf_X1X0?azlqwM)BrbU~|D z%g9lvAGm%RPu-Y1)~@6f&hs?dN-Pkfx5A+f|2F;j>xh+~OPHrVD~-HSQ#QXCvfT2b zzsbJ;z&$^_b@#fo&9>6l7N$t53y&}ml~`Aiz8(gR+9w-=vyzz(X%W(q!YSV{6*NT{ zHGdu?FC$^`HIs=J%nap_183ZKCQ_V)gq!wvLr6+S(@%1xc6{#!L+K5P5F69M!)^Lq zeDx4goEb)@*5);~ZK$Es;&NLu!;Uvp zc+axly_Z|)u%G|PKak@U?PW`>r2(=hMC47qG+%on#RK+fr*7`6^_28KXQu|3+d??T zWIc0`sG6i~8tkWJQY+L1h8z(R1ZD#1uwuEC7$!O(2)e0ZJ3sYVzktl6P)J%dJ&UD_ zA-fHLoVvCv&NWY-H#)6cCZO*)UtDIHKEY}XXMH=)_@<9~x2dO1MhU(gG{lLtxQ~YY z*tiQ0=2PN`g{YYI#WR<_$9HXf=j$x7wAo=;RzbiS zX3Q+*^}UmysA|6J&~ae>AF~Ul@l}{~91bTL^8Z+HK%1P&r@%+1@fbW326)1Y%;Hcd zKry7*bUxI{*WeMMoQ`5+sXl)#P7qNLz_;&7YI|QVWdM?Gw%604eG4vjYl{M4tcfJb zG#3Teo{{g7&MDbnruVj-q6?~KgV=`6In3hd%WPM9wM`<~!JDYXwN7P_eN# zou!1Ps`A>}K#-Kd22O#<&BR3gg5~}PYK$1bV^W6Xk4!#adfnDH4v7o#0M$raG%K0t%4f~J4G%`_fF$pe2zbcsH($!WT1oTtq~39Z56xudu*bNO z99CZb4{EK6QhrW=x@4yTivfJ=juwPJ;^4%T0)&!^$8I1ouzHb%4O?KDP4Awd5u};W zAX|re_u;YVde7|#%%|J=8FQRo@*rvo&Wi;cP#@&q*)Eml9%AR-jvCqHmkQeM&+AOpMw7(lY}vRCvENp6nlU)iAY z?RkH(SrgsM972j)t{aUP%nBpYeL0*7{IHz{p0!*}fgVoZ==*zzR2{YI?zL!B=SQRp z`}alKdTYI5xTK`jmZ)ORmp`u8kfR~Uc#xEYxOAK?<>*R=CE`Q}4LFF7IyA&)iC82< zB-NOtYHX7lfCGk8G@3k-#Lk4V3nkjx3}mh$Kv9N(KDa*dykc*v6%Ccd0FnVWFW<7o z9m2-Kff9Qr?xdF%WL%`H*Ud5Hg~)z>!5=|yVF8$M%Mr*@hX>7%$TUZU?rc35aE^w8 zn&AzQKEUed6ow;LX^lBl%l`NGUKl-1KDO>5X|o^IoWB=*)i9aV!6Ks75jbfs@l;Z% z^7ej`Fn|tsZH`_9T_&0h4Qa3dRuGKvPKavGxxE`Tz0jB(G}1%TXXhbO(W5woQkrz$ z=8u`M%l2$C2?Wp)PrUYh#vQWJcPU|kG^)wu;=XY2qb|*3*Tue-Cb8_0Fs2`?Y{<8E z%R6;!B67qV!RsE%QfERKmW+Yg*(o-De|TMK2n`TTkf3u|-=9G^_bBTT`Caa^*=mF| zkFf0)kcAP>)z^wcO)noi?qWzlP$ghLD^8pAjPK_1&#trWXX~EnB!4Vt!$xBUw;?rQ zAg}DpXlZ^hzNIOgLSU+dEe>R=@N|~nQO+x#PSTaJ))9&XYpmWbOHeaR8@1tbnAd&| z{i=w&9`MKInqfQ&V>rHy^)1u%^7gvCcRn)V^s;q+mDetjKEeyRtOecnE>>m5j-_2n ze74~gl)YGTAp9jS?!%zf0p|AoZS9TJ6SKuWV`9$1uhP5nIMb+Lh)cvsk{nwK*|;Po zU=jil2!s~xtO5ei_;Tzc(gEO!vj_*_Bs|zOObbe*$q^xLFhi9*k)l3Ik$8`^xeeJ! z$fAwPEXI~19HrAHBXVa;T)Vz&b-pI*o|!4pNOAXKM<#PmM&a2xPj@Q~Whk9;+q+ji zONB?CPg<{E({{`pGbSNvNnI)YwgpSTlrbWDRA+GV>exI5nZfFMpZ5Xjb`I0?g$MN9 z3~o1fy45t<$ZKk`casq>`}djE<1j?~A@}Q0;@Oi#Qp$VyF3209A9OT#!V!G^3ZC z(1~c34V7#yBH)p&COoXM?mR_FH|#GPEYk_XKV2$sh`#Ek2=3vIokd+Hhv5cVHDv*A zSU@GBifb0MxQw7X8$~wdivyltlAI&~=FEF}hWUM#p3UCRh+^m{hT13o9yh-5hv>*3 z1rbP#e`M?K#83cBVrvnHVEx2K9U4;bxa(Af6k%^e@{?GxuqnpmNz$!W0sB0GhYADo z{jHm_lDKV}5V~zJSaI`Pb(uMhZF?lzIA$s0@GWjn6~TJ)*8SXVrj*PQ9e{>FSZ@B{ zLmCSVDLsz)``_DFlw}v@wRRDRH=dpSRgnM3N@=Kb`H5$-XR|AcAGj$N7M!@IzI}~o zZ-*Cg8=%`q%Ix^R;G+SA7zsr=LrjQ}%pImqt}yR;(}Ii%ZT@5Mb09#E?T!i};^?+4 zAsJD#v1>3hdUe!6me$YLPfVm_%}IHBlXUe&!I2GWHP8Je$cCM$oC&;xjkg9u-v;mP zMA#j2C&&%I0QWnTN&d!-E@thzm%1OI>tANY+@g57=bY#HJ+((tn)Ob%bxuaTFm-x! zaa30;ZnMhd`NmtblVs2*v;4HBe-jP$On&(4$H|MMT85@J0VGU5YK@gtARCfk?L!kK zg)yo+#y4i}H75J$jaT$i3<#)lR-P-~y|#4mTG1tp=zz#J-AchUS@Ww@nLCqmF4r4# z#5s{2{E%<7JE>-MOy?5fKEku;7|z>u?7*Gy`h*=yieq z6!22oZBX=OS+W&N-KU5l$k)&ZS+K`%0(5KwD*g0jpjVTS%XQLM2?Hbv%P|a zEtppCCOFwVUR4CDwznvvousDTM(XsLq-+;cY67gv#<22>Kdi(g%1XFZW9Dpkd#c2r z3c4S>40-XJxk4NOIGf*=1@fZlvRXg0l|OzG8&~^8k7F|sQj(z$h6VGRQ4+}8;3+X1 zERoGiXYc9|(DqioPn`AH?$Ma~1$%w~h^zn|+n{?Ri}ER-%RU5{!BrKxwu$p!s%_>F zwsrq48$mN!9lf6O2!c%rtm&*AzH;(T!KSG1MOxzpLGSq^r=_EcPpBu}t46uE3_zk^ zB`IVZe6V*(h;`b}bB1~W1DL=ZmV;zK@oGgn-aH3_W97ba43z9K+$V?(|Op$|RI+hB*1@0zT+OLJ`d z72trv_G2Gg!-Mr~ZGFE;-#a%tv9Je=k-)L?EdwZQaMsX=kwD?lmYG2Y)~C($ti7Js zF33s)#=&rMPTR%e8*~c&R-BWusF@W#*XTv4M3qPaDGRQ2ZnjmnNjra2Y{V<;x@#S@ zSHjuN%Iu}QDVzo#$L)SFCM!6X`%rY3N1ICS?pfCPB4wbX;nPNuEeqGlM180y#nfVL z@vM64_8@Js#ZB+`zb!x9P};K!qWVxNic`UHsb$~(i#@I zW8C^ghX@`UE-R4ndV6|6N@Bft2?h-%V!m4_+;~v>{B-MMkm*Yu@ov=)P*IYEkJN*9 z2X&u7$}@p`0GU{Gt2C%gK!MPX-AdyGGa3~_0Y5;dM#IcGb4u`h#SwMs zX#sg#4i<+6d(aVp5A)NBox|Thj$aD5dyZR~r%RAV>%K@F#^o$OzLQusqiY)Y;?bL~ z^#={ogajSm?pPd@j1y?RIAWJAqa+A{PXuBnY7jBY@na@qK>&)p9);~>RLrx8KrMz6 zWdL&gG690A#GJG>TACrDCr#wl#z~G`*_xlShB=z0LMXt| z0I{NXo{_7dVA5&Yyhb12LI9NK-(a-=;bs!o#zQO>tYwOz#(<%N&u+Zm^-tno;l=M3 zNbs&Z393A&EL*4Io&iIjms76iUR>@={~dMjL(v4Y;c(lyyVWeD&Tl0lF=eZA! zsGHw5xgNv2u}xI=gQ1E;=Q6KdTdg1Bi$|kFd#8*BO^x^hBp0h_Bf}!@VP6|Q9uQEn z5y9bzS)2c4evIB&vl`7U4FgRq>`S2jXhvO4Karp8pqHo+)(~RJ5$U+Et>C@j00>Rd_YYY(LoMBrp)aHOEFQO~O3@{K+`j=5Ahp_f_VcC&LVJ z$Xbi|W8toE+P<~^qwV`~nHd>|0p+T8Vryr9O}zc_&&}U0KO%$t71m_0pF7bk@xv={ z^OiP=rp497)&TRr+G(pnIg%U39j;A+wpke#)td+8j%EI3%r*ZWi0D&Tnbn|ZOQP95|fH8)BHOv{su*5tjRz6_`)H4B$ zYTF16&S(C~`C_yyGSJ@-^rai7D%GLiWaUV(U*v?tg}tSh{s?sZ>bfp26PWAlnH^YY z`0dQEk_-;P>?Dl#*&q>?9HmD*RbGcGYNzz{(61$zodb!y>TA zlDT9)PJ^rdlTdvxF#qjxHhPTLeM_6M2}vjUmve;#!C$ zB2K+kR^Ff(JQ1J}lUJvHANj8JD)#rAC((vqf+WY4=s+;k{epNORKD6QmS$Mzj2A!n~FaWCmy~5G*nnA6> zW&X<4=xcq4-$23AIS;X2jWTk*^Euty-(39~V#KMy7wkh2C=QPI zWW@8`ZW+ja{w?UblWst&40(G>KZOUA_F$WckcNk0iE%Sskzwgmtlh zzx@wSVEi@s=I^yPf4{tULH>$FS))&#ranASp~@%dEGgc-t%LX>_Ljz_AO85&tTZxu z`s!n$>k##3E>1y!C4)mfnaPRdWQw^|DM1?tyC?}_>B{$0M&DdF*^5bI6LIu{K4l>l zt7;wmJ2!d{GrC`+t9DAkr=&aW@-{9G5%nA{$7T=bnjhpK_-8PI8pj_`r>xT_nhyJy zT>Y+g$YjEGHNr6#+YN0AuS1(VZ<_Li(1$Ri%tYlC@!MLof1W4&(Mqc}fPXt;=_ES(A%-BxT8S)k z>-;d@Fqp#kSM;ws<;L@fh_Gyv9oMYfrGq{R1jFz77k;q~KgT(?bXW;!DERYv`d${9 zb@qJF*8V`k z`$W*}oAZzUb+~ZT3U@uKjktvC^dB7woU&Rpj)3@EjY+-#cE9+rz5BnF`{$Os3#9G~ z6GMogw%xt58(Za)0sb=)!AFe@&AUncc3NpH?oPZWhZnQL7qHkH@QH^to%v z;sHn!9jU1BZV65C#3*r-%S;6@Bq~T2zap0~ytNd>@_sySe*hN z2c)MlyI)5?ZQEZc&t92t@A<0_s(}c|r}g(={Xs9jiVxDv0)Rm0?e`0wt3CXv#RAO+ z4mq_E5^Snafk^_4Covyyd3Qg^8zS)kl)@r3_>{iq$rSHB$Nzb2+*pTa06THCgQ?G23jxqX*uIQ(R-VColaQ?6D-?7UR|GTttpfeS3 zXTKzDMgs{+d;Tl_#;5-PGvw3&UArqL&F>=!t5zu<7E%*?7rpj)cr)f|Qha!a^yBEs z6{!ZrHA$zLsisQ#HOi4*`g7Sk6TY|jX)30Bs6mZX1^GC%xIDJs&^B%=jT?sLdH_Mb zGVFGptn6sa^0Az3tH{#XvwOXwm?Oh4Cw(qOe`c&H?7|{Wdo4t(#0N3Nl{m?L{*$@` zdb&ARo?q-Vyp*HxG9uiYIFlqJ-nO&Y7S5basJp}rBW_yhHwi?ZSjX8WvhQ5aG&77F z@igA@U&%W`m4g@hD+>);$MDRS0O?FNPn5*ZOV=p{s&)_msYHA9p%}|6xqp7 zvEu-p@m7Eh)%WrwAew#GX%sUc$TDeKs*0TSs|A}uKL~bVwnT=Ve_}GFm`CAon0<%k zDr-Is-#@V6W9_ZWOsmo^^Mo*hjLI`)-(wWO%{RDrG>U^N4(0?PmL;#AIFE9`aAipd zhmVTTj25e(ru5Uj{~vf%KQF#Y|J!t6VSioY9Nv5-l8{0<^RswsWPhf3GYi=}V9+}3+oZCG zu<~jX7D!+$P;ArgqnXm%;WSE75 z2q@;j6uQcPuCR9Lv@%wJQl?6sK4VgOUi@Xu!Q@c$wu*)Vi5Cq6HP(o!+zw+|CMY>U z9Na``_2MU5Jrl-busopyBk5U+?~8(kMk`eU2pCJ=vBj>8ITx$pCjElb*)18of?>~G zk=q;sf?tXA9!Yan+^s@>oS3GrbY=6D3OC99Lj8;8r{AHR2!}2GT}gVcV_Fh3G6uT7 zjb}c!4Ub`{X>iOc+WVk=_Sdxyn>-UZg7G7ItQO(F6)!jJ$lURj5-(5J-gla%Yo!k0 zeJr9`bjWw{9xrA#7tK=#T1{A;X}fdh&wtzTEjHKAG&=C3tnGr=0jlR4ArnjuWc@=W zbzd;niQYgES-*E%2ls$Zs=v!~a}tIopiEFCUAYG6-F9M(+}qNF1DG&9#XKxcfI0K) zpFP)$N<~I|4FIKdcjSw;qsPB*gFHv?`eY`z7c^X?Gosv{{nfj?xwiIQoW@CI9y{2+ z&#rEtj1bxc$qG3p;9)%ky~#1;R8SO#j$|?&=m3PH0N8d%5D2L5gW_EZ_!(373Ib@M z_4AjxQ2%E* z@vShGs*Yd5JAXy&y7bcE(leZY0)#YkK+n#N@2tPx9H?l(3tiiY+ZYd*jcwe`$4V<8 z>_epsf7^TN51!5V@p||be|<%uefm_kTD4jMy-ekE$+fRIIqsWFzHKcdgW7FnVjxr8 z6f52b`}>feX}HbUTyAdh*_#$GPqIWeA~iR-4jwUo-a7p_b5^o`M$p$6OHveGW?QG?QpcX?MJ5j@F^k8FrGE{a*Qjlg-ZOjBbDTzD%y1DiIn09rZLp?S%d6T5l{k<|u%K z$dXl?OIf;i?@*`C-hInvu@Pr)nKW=gFMzYs83sB$QSX?n)8Cu+LFMpdOzm43HI@Fewq1F_O`jNP(2<$q1etD4O2vQO)tF)%q%rNO25 zq06D#uV!-^B{nx&^fmnnOZm;(3FpIH2Ny8*CIFqEGo!*u>|Q{$U0BDJ>~2A)ht z<>y@sc96C(UH0koV~T-0rU8G{qy7(r^LOeyW0%4Vf<$sD;^d)D2?jMo^`=b^fhS7# zqgeB;*vbRFIV32Cuhu!T(M#&J0up+!rRjOt@5Vnhes?=RP~VCZdwJ3L{`Beh7yNpe z@ZJ-gziA`e^*&)E?DSE7O{ZG&%c+3%&ZMPySIsZbAmy4DkWazO^SlEUa3Br^E$So} zqB~k@JP)Ny%J8A`!D#fVmab$W077B;2+%f0cvJ!uPzVl4F&>4Z0z$@o!<9_}1E*S3 zOWnw!p3Y+u_vEoo5$*PdVsa!+k0awGK_s_Oe$ly}f~&1Gc>#aN!@%-6oj=e93v!vtk-72m(38m6c*={ic5p*LB{gvcek2gZSYTD2bf{m1FXCMHUt72L9Ul)-|HI^sgS{wQrECf$Acx1Ibw)lv zoV@6It{{O&$2sA8JOYLt?tXakUD~gqxhW`1nGNk>v>PH984j-kb#*f#gW_a>Y<#G4 zjB#H@Q{gB)83LeBTJ%@VHx4QcVRjGb9g>}AnQAkG1!KMM|0+55#neJT>55oSt#erM z{7Dyp;YR|jb?P#YwAko+lC+Q^D`3hGl7l9`z26cuj|*aJU|FI$DS`C00OGpAFLypU z*V>{vRwlt-N{m@~>O;=VEtbFig3_3Pd_>Wp2+Odi1{eYkKM3Vvf{y4agePkQL0WC- zSPz0{W$Mm7Z)nzmMVt}8R2i+>#giQinF<*r#XYo#x+5$rl%bVrM(tMM+2gnB%P>x+ zuEYvRkIE+dx5+ZZQ;d=ggIcxQD#vmYdAjN~r81u3Td(Zq14CaciDsFxGH&rw6ya#2 z{k+EZK<&pPnU+fT^S=zwFU4Qh`td4NA)rd8Y3fU}9{}VYvxnL!WR!tQD*aT2VSpV+ zZ+z(7+yW|s6}&i;Kjr?J%Cm5^5_k>)=0VXX~;F_sWZ`oI#6{tMbw5Z?iYco z*rrDJ7Hi8lD7mcMYFc(XnTVregb$S+;y;V)Eog}PA$Qxszw^b0_oG5W=(D#nB{*3> z1mL5Im8w-a>^AG+aw5T$jvETN)ADR;bzy|*c%`)KvE3Z-a7-{YOtvc|Mko-pu?z&n zRm~}7DZZHpI9-6?0RoFJ*9tF0g*!U}Fez#ncy#BaHcf{)T0h63nI|`HPydrHG63ce4RurKL`LtU=fhOf%Y0vGM8ZpRd~V7IX<E!9oKUoQ&hu+imMwW{nfDR z#rNCAGFi^?3WNE31wtWKezJv5+U?r86Y;8NM|8~Ute*MN0DR%l-LB&!21~Xu)hSV1 zGa@dPZ)qTQP84kw9sA>q%phr#b5|jOZo~gi>MiuX{_@<_Kjt&^uN?~2kRx2Z*sXY2 zPen{zo~uVr<*{>*I0Wyi>7D`t#DT0U6uf?4hH`9pddl4ZVorOD;L*S(vvk>8sk&vV zra`u&r06S2DErckverl(YQ2qgplgdHJi<7!-#w>LQgOx>%fqX2D_Zp^eJVMerUehu zczj-=xF2La%ewCd1PX}oymmktz|I8Jo-W+7CUKZV1#6Q^$X3SdTw=xBsd8cag`@BV&-hstr+FGOkvNqs$x(L*0Dc^^1o+4TCjt zdIv0GZ=r8*RMD($5#W#x@hJXcGZWL^WSVzxCabW{*1?cWwZ+aXtm+a-UcFywbZ%z% zXO#g8%`dGR2KM?7mzyW@zIpdfLuN;#Q$RnrBf z9vbe{MIL>B;a?3;M@E2-*}-*dI||MRmp=kJ*7XzMwdO|0sg2WlkCOp=jINA*{>h7< z3vi}@fgmu^zb_f#rAeBhE_w!oq%3gJo4U3b$O+TGa2^uxMQhLM0}Vs0w;0jvx)q~b z2V{uT$EMN{0X$x{JW{o8dd7nGGX$v-*A{=GTEer$lCWXkaiR`fH-dG1CVGONTFEhr zs+fjL0SzLNq7{JJ$M7+>I2~&_1*mB6`J~<1dY%{eX70`zneX^g8wl{Y>D4%)mm>{4 ze{#A}gQEYEDAcEDp(O)gTsLer#`W+KIop?Z_~sE~R{=D>fI=elAO9tEMruz#8=_5& z{HiS}IdgqKTQr6)2M;4)CUyjGhYW6iU^M#9TYji~yM|L!AW#M{eMT}|JQck^DuIM@ z)PJ$z3IWW7UlOMmBafqZytdIu7nCt|6exol!nmeac`qv+TQWB7!;BdE2afvRcTnRm zK-q#u++ugZ5KjyvyiOh&8Uo@B14}Dn0}j?F#)89EWozg2|5(rZRua4s`6%#9*m>#^ zcLLvO=QB1I{|}FE34?eR`k0jTq?{W~^|db8{zqTwK85CwA2*8jPO`(PKoGoY362|- zCSTnb5_NpyjmO=^S#CpPrv#JCb!^LiaP+|G*s%xu0|XN+;IB%8Fprg>%{G8Iv=Cg$ zIo_Ke8j0m*=Yf%pwN8(~`4AfvAtBfh^saf+SRi$l>D4PE&|77+Vd?$F_Tf1}Z@+$= zJtpY-i7?@W1e&N_yFkrNvE5DcTR(Q{_J4VhLFDCMiGd$K8@mGIpyi9HfW#+B0=#X2 zIc9T(O=?188{lm>#|(*}V?wBiX+-IsmZ(XWX@CQhqMs!jbk5i$LiptP}SwE^hFuGXy-TUL{0EXq1Xlh(_dG4x4@Fm-& z#B{07Qa{0YC1(tru5U6m)Y#;mip2vEx56zC1GP5s2;#EBNCY9E*7c)5GB0#iIes8DDEe*u+ZF^GccH4rJc1oKM`Zp#sWEY|yu zmA&be>8~yM@T0ZS`}RKCEma(Kddq-I4KO`>6z{vo+9wJc4*M3+K1yA}c08aL1Cd{f%sJ0q zir1*$yVAbA%|YGQdDAkMj706g1vAgDj(r&;iS2q>g@F%xa7t-i~Cm%fbvCE0(dnW6XRyKOdTrp7|^_Fzgu_UU_P#Ysi zWgzpoB^O$2sSldyWuzbjhD_IUpQYTdn8dwu zUV)=5HQ8`MQEPb|;8&LbA7FtP&3qvpy!Gi$;`@f225*nolC)SrUyRV*#z^m)zAHvAzcf&zl;ST$~CQ~V!Ol|iCHkN^1^WV zR!f1Bn`foGik7wNvbKr!I(O4@Jx+RLT^@Jrs3M072&i0A_9?Qn-_QCGVH%?r8A;Z* z!KCC^?yT5kYT-*YY$>k{AxY0LeSzvl%Yq5h`& zXp=uzGhfWVSUd>zVE?um_*zfbE3Wa$hRKQZaJkH80;KIrtL^EjX{ksX**;o&fI=t& z?ae@nfzvLNJekywQQ-!KCbvLdqy2T7x-Z}9z#NWW>ui*@zsQJJ-y)ecKv6;3PYD?c zF_iL(k6sl)-rBdKuBI|~*?A*x*KiGTy%mU?zp<6+AhWSQxb8q~kcX>;*oTmJUGwBIZ)hB?pqqbt7)|S5%m;3z20C!>{X{$pDZlE>Zr7 zss#~}#67YyvL|QW#~SZX=INA3qWXOb(vAY>@9o1-k<7F}vj-1o90C%^&)Rk$36R@c zmT0f0n6I|bUxpE?r_gb`0EK0TqTNWS^#VR?I2fW8lNr&n)D=50z7DfYW3sF9CJ{$j z19dIqb{G23+`Zy=UbUxy#^sZ$o6{yX!2|_;AO=~~yPH0HkS_o1F3^$U2zSk<5>}|{ zYH4a@s*~ZMaC~P|;pdcKJszM(^ED69Dh!h?dQ&vKF;_PZ4&DG{oui^d8y_5uaEa|J(;Q)vyVbCd z16)Svc3GIidXsk__twYGgq_k3AI5q)_ZBu(7!fSq7xo_iH6Tx+KnplsfA;Z>Nx3It zz`=%>V(+x(d=tA^na92fPHI~S=vNdt1HYpWIfuHKWhhLkV=c z4?op}g$c)Uph%N3N3CBgCs6$2V2G)t3(G}Lh8|~`%GVO+tsbuBdJ{n4i9Y5%wM&>|SFq9CNU8zb&XymdOd1AH)`QPwE#_HbRo?keX z75pV18Z4o+2i3`{!iR0psBa}NWeG!o0j4mHO3d`rkzq-a#C1p@w*Zr+mqHERI$;oA zqP`C$)cTdFMY!(-M+L@DG@*Py&Q;s66R%2_w?lG5-))Rh!-zZ_YQ!TiZTh(zOa}?D z(oDNk{n&Bb+hb6fZdB*Z&ax8rcV zyiEQ;j4DhegYz8anvTYLJ|a~BZp1uXpZKitm(ibi`ok`m9Pc4Wruf%hto~AZSU8pb zq?)VE)ZG(7OQ*+sczI$A+|h2${mxcxh`uyg+`p6RxI0dCZoo+^xG)bNvUK;kU;JkD z08tO(7xnA%S;}Jo)!QeAxr;yb2J-9r)=zX$JQ=TP1#v_Q8A5>Fm-ZP4D=$|BoXO64 z#-9qjuE(m~fbwPZ7a0cnx)dLl-88%VQMI;$0chaZ={W@FZ06LcFBQCO<)17N8k#TQ zu87*nRLV1~5i4r2Y^N}ldqcO!n*c`51RZKzibL~_L*o?cNOrL|8&aHb3$0V)T4GrL zMK>gbTzq<`F+F@VGBrl=3Lfmd9zD5gD*LLu>HDJ2g?;;%Pj9)=lqBCypjJVl27PW2 z=Q^Q671v<lXHo zO7x(fgZ{QM_|a@xSzDFzYU>CbE^{9M3~41s=VO&7g%yh)qBB)qrK;Qhg5R4b<6VIm zGUx$RoiKlk_gKu)O5k%x3h+UU6ez27M^Yx#MVO(6J~-BymafvJBDf_d9#&c5p=yMS(Mt|W!Sb#$W=v^E8&`p&#L;TKeLUIHqCep-O3f-&r;0lz8iCmyi ztMgFQlXO*h4r`z{V$C?Hm=dD?OP zl%Z;!Ri~rcy%BJ0yB$=WI3U|w^3|%|uIRSq0v(P@Y!M{n>aiMpP&N-Dwd&>jvh{~# zLsWc-<8S$dq2#^w8YTYqJ_LvepzJr#>zU4CyyE>Ght4DiAoYI1mc3GmcCrD*W~(UF`72qr%u(t-Q)`yTpF#cw90@+| zvCNMDz6*BMxZR^Umpnh>(w$ZDas1k|4#&>a^XnCY_56>esr=Szt6}pP6`A@$km*D! z14-E!B5}GKb`~#%=*XttkivY>k-NQb*=yGW?*LMkJV7R!r)};VZE6>%EzajhAP$*L zqSJj0_X-WsnD@^n8Yv#3^4QJdw=8K}n?+svg(0@Sbb5{VB|j&MDFNf30vA>17Ow3t^ks|gIEWs~V`dU0Xy82Wv@bW&YUK8^J&PzrN& z)XH^<8c?-#jRdS0*Y=+p8(Q(90-=TU<>yPUzFN63BmvL>34EzC=nxT5`re;=G)CL2 zM!a=9B;Fxq{O!0xW&o8xnt{XbA~4K7;P}8H*@U)xvdo?tGTlMFzU{+-88=%JcsxsY`9K#PMgq^GXLwqyZm(mBg)7{(ayYF zq$8p1$nllEyA6cuTNnc6`sD_fD%0#OSR}-`^<1l@PFXgGT;Fmg=}bbhDk_{oO^(1~ z$kc2FBO;x|+}iTVAP(7YIYE8?A%QP1_%~Hj3y1fJqd8XaJ0i_G-)Jfj?w##&{c~?v z3vEVVwzGdWcVyrg;Zz|WeMr#sG}V2;_x*>eb6H&;fpcRyidRu0!KgLWRBcj4myduI zGvMM-HK5wVs!dz_C-S{_gDt5r#OA4r!=CDdP+Y`b2UT>~10}ezErlEDejew8-)Prk zBc*5b>XuHu0~O7u6b_x-9UJgJG;ts~Ixpnmz%QNkinRV1lY8orr<@ag=yhFNMMj2) z+RDh&gJ)L{TIb(-T_S#Fk;w+U$_#;LmNJ?m+5@u!lr~`}w`6ppSy=L};w>v>c8O{? Jh%!=${|9tV9<~4g literal 0 HcmV?d00001 diff --git a/assets/js/0630e3af.41380c38.js b/assets/js/0630e3af.7a61a9e7.js similarity index 68% rename from assets/js/0630e3af.41380c38.js rename to assets/js/0630e3af.7a61a9e7.js index 49bcc2bc4..0e72311cc 100644 --- a/assets/js/0630e3af.41380c38.js +++ b/assets/js/0630e3af.7a61a9e7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2041],{9752:a=>{a.exports=JSON.parse('{"tag":{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2041],{9752:a=>{a.exports=JSON.parse('{"tag":{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/09a8bfdb.896da601.js b/assets/js/09a8bfdb.2bff3c81.js similarity index 96% rename from assets/js/09a8bfdb.896da601.js rename to assets/js/09a8bfdb.2bff3c81.js index cc83ff92e..02385cea3 100644 --- a/assets/js/09a8bfdb.896da601.js +++ b/assets/js/09a8bfdb.2bff3c81.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5579],{1689:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var s=t(4848),n=t(8453);const o={title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/embedding-the-un-embeddable",source:"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",date:"2023-10-29T00:00:00.000Z",tags:[{label:"video",permalink:"/blog/tags/video"},{label:"discord",permalink:"/blog/tags/discord"}],readingTime:8.92,hasTruncateMarker:!0,authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],frontMatter:{title:"Embedding the Un-Embeddable",description:"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.",slug:"embedding-the-un-embeddable",authors:[{name:"Simulping",title:"Maintainer / Encoder",url:"https://github.com/Simulping",image_url:"https://avatars.githubusercontent.com/u/12994794?v=4",imageURL:"https://avatars.githubusercontent.com/u/12994794?v=4"}],tags:["video","discord"],image:"/img/discord-embed-blog-image.webp",hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Encoding Animation with SVT-AV1: A Deep Dive",permalink:"/blog/svt-av1-deep-dive"},nextItem:{title:"AV1 Encoding for Dummies",permalink:"/blog/av1-encoding-for-dummies"}},d={authorsImageUrls:[void 0]},h=[{value:"A Scenario",id:"a-scenario",level:2},{value:"But First, a Quick Disclosure",id:"but-first-a-quick-disclosure",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"The Website's End",id:"the-websites-end",level:3},{value:"Discord's End",id:"discords-end",level:3},{value:"Strengths & Limitations",id:"strengths--limitations",level:2},{value:"Strengths",id:"strengths",level:4},{value:"Limitations",id:"limitations",level:4},{value:"Differences between Sites",id:"differences-between-sites",level:2},{value:"The Lore",id:"the-lore",level:2},{value:"Dwayne",id:"dwayne",level:3},{value:"Discovery",id:"discovery",level:3},{value:"The Experiments & Interactive Site",id:"the-experiments--interactive-site",level:3},{value:"Virality",id:"virality",level:3},{value:"Closing",id:"closing",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.img,{alt:"Feature image",src:t(9395).A+"",width:"1920",height:"1080"}),"\n",(0,s.jsx)(i.strong,{children:'A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film "Cosmos Laundromat"'})]}),"\n",(0,s.jsx)(i.h2,{id:"a-scenario",children:"A Scenario"}),"\n",(0,s.jsx)(i.p,{children:"While chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it."}),"\n",(0,s.jsx)(i.p,{children:"It loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"stolen.shoes",src:t(6689).A+"",width:"1088",height:"318"})}),"\n",(0,s.jsxs)(i.p,{children:["The truth is, there are ",(0,s.jsx)(i.em,{children:"multiple"})," site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://stolen.shoes",children:"https://stolen.shoes"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://discord.nfp.is",children:"https://discord.nfp.is"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://embeds.video",children:"https://embeds.video"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://x266.mov/discord-embed",children:"https://x266.mov/discord-embed"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://autocompressor.net/av1",children:"https://autocompressor.net/av1"})}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["The big question is, ",(0,s.jsx)(i.strong,{children:"how do they work?"})," Let's get to dissecting."]}),"\n",(0,s.jsx)(i.h2,{id:"but-first-a-quick-disclosure",children:"But First, a Quick Disclosure"}),"\n",(0,s.jsx)(i.p,{children:"The Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately."}),"\n",(0,s.jsx)(i.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,s.jsx)(i.p,{children:"The entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park)."}),"\n",(0,s.jsx)(i.p,{children:"The technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end."}),"\n",(0,s.jsx)(i.h3,{id:"the-websites-end",children:"The Website's End"}),"\n",(0,s.jsx)(i.p,{children:"If you view each website's source, you will find this specific line in each one but they may have a different order:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n\n\n'})}),"\n",(0,s.jsxs)(i.p,{children:["These are the ",(0,s.jsx)(i.code,{children:"head"})," parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the ",(0,s.jsx)(i.code,{children:""})," and ",(0,s.jsx)(i.code,{children:""})," tags. Here's an example of a static HTML site serving one specific video:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-html",children:'\n\n\n \n \n some embed site\n \n \n \n \n \n\n\n