From d7e934ddc9a60ffe242b9667e90a7e568cfadf08 Mon Sep 17 00:00:00 2001 From: cpuguy83 Date: Fri, 19 Apr 2024 21:11:09 +0000 Subject: [PATCH] deploy: c363b50e7d765643a59fddf1bfb5a11f47da26c1 --- docs/404.html | 4 +- ...84e19.da6d13db.js => 0e384e19.2153afa8.js} | 2 +- docs/assets/js/935f2afb.0e804b13.js | 1 - docs/assets/js/935f2afb.c13c73e6.js | 1 + docs/assets/js/b56bba22.ebde0b66.js | 1 + ...eeaf0.d14e7ac7.js => e2ceeaf0.e87b3e4b.js} | 2 +- docs/assets/js/fbe93038.446c92b1.js | 1 - docs/assets/js/fbe93038.fadb26ba.js | 1 + docs/assets/js/main.2c3a25e1.js | 2 - docs/assets/js/main.eb5d0d43.js | 2 + ...CENSE.txt => main.eb5d0d43.js.LICENSE.txt} | 0 docs/assets/js/runtime~main.b472d86c.js | 1 - docs/assets/js/runtime~main.e1e0f726.js | 1 + docs/editor-support/index.html | 8 +- docs/index.html | 7 +- docs/sitemap.xml | 2 +- docs/sources/index.html | 106 ++++++++++++++++++ docs/testing/index.html | 8 +- 18 files changed, 129 insertions(+), 21 deletions(-) rename docs/assets/js/{0e384e19.da6d13db.js => 0e384e19.2153afa8.js} (95%) delete mode 100644 docs/assets/js/935f2afb.0e804b13.js create mode 100644 docs/assets/js/935f2afb.c13c73e6.js create mode 100644 docs/assets/js/b56bba22.ebde0b66.js rename docs/assets/js/{e2ceeaf0.d14e7ac7.js => e2ceeaf0.e87b3e4b.js} (98%) delete mode 100644 docs/assets/js/fbe93038.446c92b1.js create mode 100644 docs/assets/js/fbe93038.fadb26ba.js delete mode 100644 docs/assets/js/main.2c3a25e1.js create mode 100644 docs/assets/js/main.eb5d0d43.js rename docs/assets/js/{main.2c3a25e1.js.LICENSE.txt => main.eb5d0d43.js.LICENSE.txt} (100%) delete mode 100644 docs/assets/js/runtime~main.b472d86c.js create mode 100644 docs/assets/js/runtime~main.e1e0f726.js create mode 100644 docs/sources/index.html diff --git a/docs/404.html b/docs/404.html index 2f0a3c05e..a1c7aa472 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,8 +4,8 @@ Dalec - - + +
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/docs/assets/js/0e384e19.da6d13db.js b/docs/assets/js/0e384e19.2153afa8.js similarity index 95% rename from docs/assets/js/0e384e19.da6d13db.js rename to docs/assets/js/0e384e19.2153afa8.js index 8368b1735..3e3f533ed 100644 --- a/docs/assets/js/0e384e19.da6d13db.js +++ b/docs/assets/js/0e384e19.2153afa8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[976],{1512:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>r});var t=a(4848),s=a(8453);const i={title:"Introduction",slug:"/"},o=void 0,c={id:"intro",title:"Introduction",description:"Dalec is a tool for producing container images by first building packages",source:"@site/docs/intro.md",sourceDirName:".",slug:"/",permalink:"/dalec/",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/intro.md",tags:[],version:"current",frontMatter:{title:"Introduction",slug:"/"},sidebar:"sidebar",next:{title:"Editor Support",permalink:"/dalec/editor-support"}},l={},r=[{value:"Spec",id:"spec",level:2},{value:"Example",id:"example",level:3},{value:"Building from source(s)",id:"building-from-sources",level:3},{value:"Targets",id:"targets",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Additional Reading",id:"additional-reading",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:'Dalec is a tool for producing container images by first building packages\ntargeting the linux distribution used by the container image.\nThe final output image is a "distroless" container image with the package and all its dependencies installed.'}),"\n",(0,t.jsx)(n.p,{children:"Additionally other outputs can be produced such as source and binary packages, buildroots, and more."}),"\n",(0,t.jsx)(n.h2,{id:"spec",children:"Spec"}),"\n",(0,t.jsx)(n.p,{children:"The dalec spec is a yaml file that describes the package to be built and any\ncustomizations to the output image. It includes package metadata like name,\nversion, packager, and other things typically found in a system package. It\nalso includes a list of build and runtime dependencies, how to build the project\nto be packaged, and what files are included in the package."}),"\n",(0,t.jsx)(n.p,{children:'In addition to building a traditional package that installs binaries and other\nfiles you can also create a "virtual" package, which is a package that\nreferences other packages but doesn\'t install any files itself. This is useful\nfor creating a package that is just a collection of dependencies.'}),"\n",(0,t.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,t.jsx)(n.p,{children:"In this example we'll build a virtual package that just installs other packages as dependencies."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can build it with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ docker build -t my-package-image:1.0.0 --target=mariner2 -f my-package.yml .\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": The ",(0,t.jsx)(n.code,{children:"syntax"})," line tells docker the parser to use so it can understand the dalec spec format."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.em,{children:["Note: You could also pass the dalec spec file via stdin ",(0,t.jsx)(n.code,{children:"docker build -t my-package-image:1.0.0 -< my-package.yml"})]}),"\n",(0,t.jsxs)(n.em,{children:["Note: See ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/build/",children:"docker's documentation"})," for more details on how you can pass the spec file to docker."]})]}),"\n",(0,t.jsxs)(n.p,{children:["This will produce a container image named ",(0,t.jsx)(n.code,{children:"my-package-image:1.0.0"})," that has the\n",(0,t.jsx)(n.code,{children:"my-package"}),' virtual package installed along with its runtime dependencies. The\nproduced container image is a "distroless" container image that only contains\nthe package and its dependencies. You can customize the base image to use for\nthe prooduced container. Below is an example that uses the mariner "core" image\nas the base image which includes a shell and other tools.']}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n\ntargets:\n mariner2:\n image:\n base: mcr.microsoft.com/cbl-mariner/base/core:2.0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can also set other image settings like entrypoint/cmd, environment\nvariables, working directory, labels, and more.\nFor now, the best place to find what all is available to set is to look at the\n",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/spec.go",children:"code"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n\nimage:\n entrypoint: /bin/sh -c\n"})}),"\n",(0,t.jsx)(n.p,{children:"Note how this is at the top level of the spec and not under a build target.\nThis means that it applies to all targets, but can also be customized per target by adding it under a target."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n image:\n entrypoint: /bin/sh -c\n"})}),"\n",(0,t.jsx)(n.h3,{id:"building-from-sources",children:"Building from source(s)"}),"\n",(0,t.jsx)(n.p,{children:"Virtual packages are helpful but we need to build packages from source too.\nTo do this we'll need a few things:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"A list of sources to pull from"}),"\n",(0,t.jsx)(n.li,{children:"A build script to build the sources"}),"\n",(0,t.jsx)(n.li,{children:"A list of artifacts to include in the package"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Here we'll pull from a github repo.\nIt will use the ",(0,t.jsx)(n.code,{children:"go-md2man"})," repo and build the ",(0,t.jsx)(n.code,{children:"go-md2man"})," from the v2.0.3 tag in the repo."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": See the full example from ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/docs/examples/go-md2man-1.yml",children:"examples/go-md2man.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# syntax=ghcr.io/azure/dalec/frontend:latest\nname: go-md2man\nversion: 2.0.3\npackager: Dalec Example\nvendor: Dalec Example\nlicense: MIT\ndescription: A tool to convert markdown into man pages (roff).\nwebsite: https://github.com/cpuguy83/go-md2man\n\nsources:\n src:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n\ndependencies:\n build:\n golang:\n\nbuild:\n env:\n CGO_ENABLED: "0"\n steps:\n - command: |\n export GOMODCACHE="$(pwd)/gomods"\n cd src\n go build -o go-md2man .\n\nartifacts:\n binaries:\n src/go-md2man:\n\nimage:\n entrypoint: go-md2man\n cmd: --help\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"sources"})," section there is a single source called ",(0,t.jsx)(n.code,{children:"src"})," that references\nthe github repo at tag v2.0.3. The name ",(0,t.jsx)(n.code,{children:"src"})," is arbitrary, however this is\nwhere the source will be checked out to in the build phase. You can add\nmultiple sources, and in the build phase they will be checked out to the name\nyou give them."]}),"\n",(0,t.jsxs)(n.p,{children:["One thing to note, in many build systems you will not have access to the\ninternet while building the package, and indeed that is the case with the\n",(0,t.jsx)(n.code,{children:"mariner2"})," target.\nAs such, this build will fail because ",(0,t.jsx)(n.code,{children:"go build"})," will try to download the go modules."]}),"\n",(0,t.jsxs)(n.p,{children:["What is actually happening with ",(0,t.jsx)(n.code,{children:"sources"}),' is the source is fetched and stored\nsuch that it can be packed up into a "source package". What a source package\nentails is dependent on the system. For rpm based systems this is an ',(0,t.jsx)(n.code,{children:"srpm"})," or\n",(0,t.jsx)(n.code,{children:".src.rpm"}),", on debian based systems this is a ",(0,t.jsx)(n.code,{children:".dsc"}),". These packages contain\neverything needed to build the package (aside from dependencies on other\npackages). Source packages can be published to a package repository and then\nanother system can download the source package and build it."]}),"\n",(0,t.jsxs)(n.p,{children:["In the case of the above example, we need to include the go modules in the\nlist of sources. We'll accomplish this by add a source which will run ",(0,t.jsx)(n.code,{children:"go mod download"})," in a docker image with the ",(0,t.jsx)(n.code,{children:"src"})," source mounted and then extract the\ngo modules from the resulting filesystem."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": See the full example from ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/docs/examples/go-md2man-2.yml",children:"examples/go-md2man.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# syntax=ghcr.io/azure/dalec/frontend:latest\nname: go-md2man\nversion: 2.0.3\npackager: Dalec Example\nvendor: Dalec Example\nlicense: MIT\ndescription: A tool to convert markdown into man pages (roff).\nwebsite: https://github.com/cpuguy83/go-md2man\n\nsources:\n src:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n gomods: # This is required when the build environment does not allow network access. This downloads all the go modules.\n path: /build/gomodcache # This is the path we will be extracing after running the command below.\n image:\n ref: mcr.microsoft.com/oss/go/microsoft/golang:1.21\n cmd:\n dir: /build/src\n mounts:\n # Mount a source (inline, under `spec`), so our command has access to it.\n - dest: /build/src\n spec:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n steps:\n - command: go mod download\n env:\n # This variable controls where the go modules are downloaded to.\n GOMODCACHE: /build/gomodcache\n\ndependencies:\n build:\n golang:\n\nbuild:\n env:\n CGO_ENABLED: "0"\n steps:\n - command: |\n export GOMODCACHE="$(pwd)/gomods"\n cd src\n go build -o go-md2man .\n\nartifacts:\n binaries:\n src/go-md2man:\n\nimage:\n entrypoint: go-md2man\n cmd: --help\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Finally, we can add a test case to the spec file which helps ensure the package is assembled as expected.\nThe following test will make sure ",(0,t.jsx)(n.code,{children:"/usr/bin/go-md2man"})," is installed and has the expected permissions.\nThese tests are automatically executed when building the container image.\nThis can get added to the spec file like so:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"tests:\n - name: Check bin\n files:\n /usr/bin/go-md2man:\n permissions: 0755\n"})}),"\n",(0,t.jsx)(n.h3,{id:"targets",children:"Targets"}),"\n",(0,t.jsxs)(n.p,{children:["So far we've only really built a spec file asusming a single target distro (mariner2).\nHowever many things, such as package dependencies and base images are specific to a distro or a subset of distros (e.g. Debian and Ubuntu).\nThe dalec spec allows you to move these distro specific things into a ",(0,t.jsx)(n.code,{children:"target"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Instead of specifying a package dependency at the root of the spec, you can specify it under a target.\nThis allows you to include different packages for different targets."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n dependencies:\n build:\n - golang\n\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Dalec can never hope to support every distro, so it allows you to specify a custom builder image for a target that the build will be forwarded to.\nThis lets you keep the same spec file for all targets and use one ",(0,t.jsx)(n.code,{children:"# syntax="})," directive to build the package for any target.\nIt also allows you to replace the built-in targets with your own custom builder."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n frontend:\n image: docker.io/my/custom:mariner2\n"})}),"\n",(0,t.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(n.p,{children:"You can include client-side metadata in the spec file.\nThis may be useful when you want to parse the spec file and do something with your own tooling."}),"\n",(0,t.jsxs)(n.p,{children:["Any field at the top-level that begins with ",(0,t.jsx)(n.code,{children:"x-"})," will be ignored by the dalec parser.\nAny unknown fields besides those that start with ",(0,t.jsx)(n.code,{children:"x-"})," will cause the parser to fail."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'soruces:\n src:\n http:\n url: https://example.com/foo.tar.gz\n\nx-my-custom-field: "foo"\n'})}),"\n",(0,t.jsx)(n.p,{children:"As an example use-case, you may want to use this to store the targeted image name for a CI/CD pipeline."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'x-image-name: "my-package-image:1.0.0"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Your CI/CD tooling can then parse the spec file and use the ",(0,t.jsx)(n.code,{children:"x-image-name"})," field to tag the built image."]}),"\n",(0,t.jsxs)(n.p,{children:["To re-itterate: the ",(0,t.jsx)(n.code,{children:"x-"})," fields are ignored by the dalec parser and are only for client-side use."]}),"\n",(0,t.jsx)(n.h2,{id:"additional-reading",children:"Additional Reading"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Details on editor support in ",(0,t.jsx)(n.a,{href:"/dalec/editor-support",children:"editor-support.md"})]}),"\n",(0,t.jsxs)(n.li,{children:["More in-depth documentation for testing can be found in ",(0,t.jsx)(n.a,{href:"/dalec/testing",children:"testing.md"}),"."]}),"\n"]})]})}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,a)=>{a.d(n,{R:()=>o,x:()=>c});var t=a(6540);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[976],{1512:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>r});var t=a(4848),s=a(8453);const i={title:"Introduction",slug:"/"},o=void 0,c={id:"intro",title:"Introduction",description:"Dalec is a tool for producing container images by first building packages",source:"@site/docs/intro.md",sourceDirName:".",slug:"/",permalink:"/dalec/",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/intro.md",tags:[],version:"current",frontMatter:{title:"Introduction",slug:"/"},sidebar:"sidebar",next:{title:"Editor Support",permalink:"/dalec/editor-support"}},l={},r=[{value:"Spec",id:"spec",level:2},{value:"Example",id:"example",level:3},{value:"Building from source(s)",id:"building-from-sources",level:3},{value:"Targets",id:"targets",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Additional Reading",id:"additional-reading",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:'Dalec is a tool for producing container images by first building packages\ntargeting the linux distribution used by the container image.\nThe final output image is a "distroless" container image with the package and all its dependencies installed.'}),"\n",(0,t.jsx)(n.p,{children:"Additionally other outputs can be produced such as source and binary packages, buildroots, and more."}),"\n",(0,t.jsx)(n.h2,{id:"spec",children:"Spec"}),"\n",(0,t.jsx)(n.p,{children:"The dalec spec is a yaml file that describes the package to be built and any\ncustomizations to the output image. It includes package metadata like name,\nversion, packager, and other things typically found in a system package. It\nalso includes a list of build and runtime dependencies, how to build the project\nto be packaged, and what files are included in the package."}),"\n",(0,t.jsx)(n.p,{children:'In addition to building a traditional package that installs binaries and other\nfiles you can also create a "virtual" package, which is a package that\nreferences other packages but doesn\'t install any files itself. This is useful\nfor creating a package that is just a collection of dependencies.'}),"\n",(0,t.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,t.jsx)(n.p,{children:"In this example we'll build a virtual package that just installs other packages as dependencies."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can build it with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ docker build -t my-package-image:1.0.0 --target=mariner2 -f my-package.yml .\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": The ",(0,t.jsx)(n.code,{children:"syntax"})," line tells docker the parser to use so it can understand the dalec spec format."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.em,{children:["Note: You could also pass the dalec spec file via stdin ",(0,t.jsx)(n.code,{children:"docker build -t my-package-image:1.0.0 -< my-package.yml"})]}),"\n",(0,t.jsxs)(n.em,{children:["Note: See ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/build/",children:"docker's documentation"})," for more details on how you can pass the spec file to docker."]})]}),"\n",(0,t.jsxs)(n.p,{children:["This will produce a container image named ",(0,t.jsx)(n.code,{children:"my-package-image:1.0.0"})," that has the\n",(0,t.jsx)(n.code,{children:"my-package"}),' virtual package installed along with its runtime dependencies. The\nproduced container image is a "distroless" container image that only contains\nthe package and its dependencies. You can customize the base image to use for\nthe prooduced container. Below is an example that uses the mariner "core" image\nas the base image which includes a shell and other tools.']}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n\ntargets:\n mariner2:\n image:\n base: mcr.microsoft.com/cbl-mariner/base/core:2.0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can also set other image settings like entrypoint/cmd, environment\nvariables, working directory, labels, and more.\nFor now, the best place to find what all is available to set is to look at the\n",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/spec.go",children:"code"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"# syntax=ghcr.io/azure/dalec/frontend:latest\nname: my-package\nversion: 1.0.0\npackager: Contoso\nvendor: Contoso\nlicense: MIT\ndescription: A virtual package that, when installed, triggers other packages to be installed\nwebsite: http://contoso.com\n\ndependencies:\n runtime:\n - my-package-foo\n - my-package-bar\n\nimage:\n entrypoint: /bin/sh -c\n"})}),"\n",(0,t.jsx)(n.p,{children:"Note how this is at the top level of the spec and not under a build target.\nThis means that it applies to all targets, but can also be customized per target by adding it under a target."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n image:\n entrypoint: /bin/sh -c\n"})}),"\n",(0,t.jsx)(n.h3,{id:"building-from-sources",children:"Building from source(s)"}),"\n",(0,t.jsx)(n.p,{children:"Virtual packages are helpful but we need to build packages from source too.\nTo do this we'll need a few things:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"A list of sources to pull from"}),"\n",(0,t.jsx)(n.li,{children:"A build script to build the sources"}),"\n",(0,t.jsx)(n.li,{children:"A list of artifacts to include in the package"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Here we'll pull from a github repo.\nIt will use the ",(0,t.jsx)(n.code,{children:"go-md2man"})," repo and build the ",(0,t.jsx)(n.code,{children:"go-md2man"})," from the v2.0.3 tag in the repo."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": See the full example from ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/docs/examples/go-md2man-1.yml",children:"examples/go-md2man.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# syntax=ghcr.io/azure/dalec/frontend:latest\nname: go-md2man\nversion: 2.0.3\npackager: Dalec Example\nvendor: Dalec Example\nlicense: MIT\ndescription: A tool to convert markdown into man pages (roff).\nwebsite: https://github.com/cpuguy83/go-md2man\n\nsources:\n src:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n\ndependencies:\n build:\n golang:\n\nbuild:\n env:\n CGO_ENABLED: "0"\n steps:\n - command: |\n export GOMODCACHE="$(pwd)/gomods"\n cd src\n go build -o go-md2man .\n\nartifacts:\n binaries:\n src/go-md2man:\n\nimage:\n entrypoint: go-md2man\n cmd: --help\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"sources"})," section there is a single source called ",(0,t.jsx)(n.code,{children:"src"})," that references\nthe github repo at tag v2.0.3. The name ",(0,t.jsx)(n.code,{children:"src"})," is arbitrary, however this is\nwhere the source will be checked out to in the build phase. You can add\nmultiple sources, and in the build phase they will be checked out to the name\nyou give them."]}),"\n",(0,t.jsxs)(n.p,{children:["One thing to note, in many build systems you will not have access to the\ninternet while building the package, and indeed that is the case with the\n",(0,t.jsx)(n.code,{children:"mariner2"})," target.\nAs such, this build will fail because ",(0,t.jsx)(n.code,{children:"go build"})," will try to download the go modules."]}),"\n",(0,t.jsxs)(n.p,{children:["What is actually happening with ",(0,t.jsx)(n.code,{children:"sources"}),' is the source is fetched and stored\nsuch that it can be packed up into a "source package". What a source package\nentails is dependent on the system. For rpm based systems this is an ',(0,t.jsx)(n.code,{children:"srpm"})," or\n",(0,t.jsx)(n.code,{children:".src.rpm"}),", on debian based systems this is a ",(0,t.jsx)(n.code,{children:".dsc"}),". These packages contain\neverything needed to build the package (aside from dependencies on other\npackages). Source packages can be published to a package repository and then\nanother system can download the source package and build it."]}),"\n",(0,t.jsxs)(n.p,{children:["In the case of the above example, we need to include the go modules in the\nlist of sources. We'll accomplish this by add a source which will run ",(0,t.jsx)(n.code,{children:"go mod download"})," in a docker image with the ",(0,t.jsx)(n.code,{children:"src"})," source mounted and then extract the\ngo modules from the resulting filesystem."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Note"}),": See the full example from ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/blob/main/docs/examples/go-md2man-2.yml",children:"examples/go-md2man.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# syntax=ghcr.io/azure/dalec/frontend:latest\nname: go-md2man\nversion: 2.0.3\npackager: Dalec Example\nvendor: Dalec Example\nlicense: MIT\ndescription: A tool to convert markdown into man pages (roff).\nwebsite: https://github.com/cpuguy83/go-md2man\n\nsources:\n src:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n gomods: # This is required when the build environment does not allow network access. This downloads all the go modules.\n path: /build/gomodcache # This is the path we will be extracing after running the command below.\n image:\n ref: mcr.microsoft.com/oss/go/microsoft/golang:1.21\n cmd:\n dir: /build/src\n mounts:\n # Mount a source (inline, under `spec`), so our command has access to it.\n - dest: /build/src\n spec:\n git:\n url: https://github.com/cpuguy83/go-md2man.git\n commit: "v2.0.3"\n steps:\n - command: go mod download\n env:\n # This variable controls where the go modules are downloaded to.\n GOMODCACHE: /build/gomodcache\n\ndependencies:\n build:\n golang:\n\nbuild:\n env:\n CGO_ENABLED: "0"\n steps:\n - command: |\n export GOMODCACHE="$(pwd)/gomods"\n cd src\n go build -o go-md2man .\n\nartifacts:\n binaries:\n src/go-md2man:\n\nimage:\n entrypoint: go-md2man\n cmd: --help\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Finally, we can add a test case to the spec file which helps ensure the package is assembled as expected.\nThe following test will make sure ",(0,t.jsx)(n.code,{children:"/usr/bin/go-md2man"})," is installed and has the expected permissions.\nThese tests are automatically executed when building the container image.\nThis can get added to the spec file like so:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"tests:\n - name: Check bin\n files:\n /usr/bin/go-md2man:\n permissions: 0755\n"})}),"\n",(0,t.jsx)(n.h3,{id:"targets",children:"Targets"}),"\n",(0,t.jsxs)(n.p,{children:["So far we've only really built a spec file asusming a single target distro (mariner2).\nHowever many things, such as package dependencies and base images are specific to a distro or a subset of distros (e.g. Debian and Ubuntu).\nThe dalec spec allows you to move these distro specific things into a ",(0,t.jsx)(n.code,{children:"target"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Instead of specifying a package dependency at the root of the spec, you can specify it under a target.\nThis allows you to include different packages for different targets."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n dependencies:\n build:\n - golang\n\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Dalec can never hope to support every distro, so it allows you to specify a custom builder image for a target that the build will be forwarded to.\nThis lets you keep the same spec file for all targets and use one ",(0,t.jsx)(n.code,{children:"# syntax="})," directive to build the package for any target.\nIt also allows you to replace the built-in targets with your own custom builder."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"targets:\n mariner2:\n frontend:\n image: docker.io/my/custom:mariner2\n"})}),"\n",(0,t.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(n.p,{children:"You can include client-side metadata in the spec file.\nThis may be useful when you want to parse the spec file and do something with your own tooling."}),"\n",(0,t.jsxs)(n.p,{children:["Any field at the top-level that begins with ",(0,t.jsx)(n.code,{children:"x-"})," will be ignored by the dalec parser.\nAny unknown fields besides those that start with ",(0,t.jsx)(n.code,{children:"x-"})," will cause the parser to fail."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'soruces:\n src:\n http:\n url: https://example.com/foo.tar.gz\n\nx-my-custom-field: "foo"\n'})}),"\n",(0,t.jsx)(n.p,{children:"As an example use-case, you may want to use this to store the targeted image name for a CI/CD pipeline."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'x-image-name: "my-package-image:1.0.0"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Your CI/CD tooling can then parse the spec file and use the ",(0,t.jsx)(n.code,{children:"x-image-name"})," field to tag the built image."]}),"\n",(0,t.jsxs)(n.p,{children:["To re-itterate: the ",(0,t.jsx)(n.code,{children:"x-"})," fields are ignored by the dalec parser and are only for client-side use."]}),"\n",(0,t.jsx)(n.h2,{id:"additional-reading",children:"Additional Reading"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Details on editor support in ",(0,t.jsx)(n.a,{href:"/dalec/editor-support",children:"editor-support.md"})]}),"\n",(0,t.jsxs)(n.li,{children:["More in-depth documentation for testing can be found in ",(0,t.jsx)(n.a,{href:"/dalec/testing",children:"testing.md"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Explanation of sources and how to use them can be found in ",(0,t.jsx)(n.a,{href:"/dalec/sources",children:"sources.md"}),"."]}),"\n"]})]})}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,a)=>{a.d(n,{R:()=>o,x:()=>c});var t=a(6540);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/935f2afb.0e804b13.js b/docs/assets/js/935f2afb.0e804b13.js deleted file mode 100644 index b2d8d1e4d..000000000 --- a/docs/assets/js/935f2afb.0e804b13.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Introduction","href":"/dalec/","docId":"intro","unlisted":false},{"type":"link","label":"Editor Support","href":"/dalec/editor-support","docId":"editor-support","unlisted":false},{"type":"link","label":"Testing","href":"/dalec/testing","docId":"testing","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"editor-support":{"id":"editor-support","title":"Editor Support","description":"There is a json schema file which can be used to integrate with your editor.","sidebar":"sidebar"},"intro":{"id":"intro","title":"Introduction","description":"Dalec is a tool for producing container images by first building packages","sidebar":"sidebar"},"testing":{"id":"testing","title":"Testing","description":"Dalec supports adding tests to your spec file.","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/935f2afb.c13c73e6.js b/docs/assets/js/935f2afb.c13c73e6.js new file mode 100644 index 000000000..35f1855ec --- /dev/null +++ b/docs/assets/js/935f2afb.c13c73e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Introduction","href":"/dalec/","docId":"intro","unlisted":false},{"type":"link","label":"Editor Support","href":"/dalec/editor-support","docId":"editor-support","unlisted":false},{"type":"link","label":"Sources","href":"/dalec/sources","docId":"sources","unlisted":false},{"type":"link","label":"Testing","href":"/dalec/testing","docId":"testing","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"editor-support":{"id":"editor-support","title":"Editor Support","description":"There is a json schema file which can be used to integrate with your editor.","sidebar":"sidebar"},"intro":{"id":"intro","title":"Introduction","description":"Dalec is a tool for producing container images by first building packages","sidebar":"sidebar"},"sources":{"id":"sources","title":"Sources","description":"A \\"source\\" in Dalec is an abstraction for fetching dependencies of a build.","sidebar":"sidebar"},"testing":{"id":"testing","title":"Testing","description":"Dalec supports adding tests to your spec file.","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/b56bba22.ebde0b66.js b/docs/assets/js/b56bba22.ebde0b66.js new file mode 100644 index 000000000..b8d9311e5 --- /dev/null +++ b/docs/assets/js/b56bba22.ebde0b66.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[703],{6155:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(4848),i=o(8453);const s={},r="Sources",c={id:"sources",title:"Sources",description:'A "source" in Dalec is an abstraction for fetching dependencies of a build.',source:"@site/docs/sources.md",sourceDirName:".",slug:"/sources",permalink:"/dalec/sources",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/sources.md",tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"Editor Support",permalink:"/dalec/editor-support"},next:{title:"Testing",permalink:"/dalec/testing"}},a={},l=[{value:"Top-level source configuration",id:"top-level-source-configuration",level:2},{value:"Source Types",id:"source-types",level:2},{value:"Git",id:"git",level:3},{value:"HTTP",id:"http",level:3},{value:"Build context",id:"build-context",level:3},{value:"Inline",id:"inline",level:3},{value:"Docker Image",id:"docker-image",level:3},{value:"Build",id:"build",level:3},{value:"Advanced Source Configurations",id:"advanced-source-configurations",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"sources",children:"Sources"}),"\n",(0,t.jsx)(n.p,{children:'A "source" in Dalec is an abstraction for fetching dependencies of a build.\nUsually this is source code but technically it could be anything.\nThe source abstraction enables fetching build sources over various protocols.'}),"\n",(0,t.jsx)(n.p,{children:"Some sources are considered as inherently file-based sources, like HTTP URLs or local directories.\nOther sources are considered as inherently directory-based sources, like git repositories.\nDepending on the source type, the behavior of certain things may be different, depending on the target implementation (e.g. mariner2, jammy, windows, etc).\nSources are injected into the root path of the build environment using the name of the source."}),"\n",(0,t.jsx)(n.p,{children:"Ideally the content of a source is platform agnostic (e.g. no platform specific binaries).\nThese sources are used to create source packages for the target platform, such as an srpm or a debian dsc.\nHowever, some source types may allow you to mount another source type in or are wrappers for other source types, like docker images or build sources respectively.\nOnly the output of a top-level source is included in the build environment.\nThese wrapper types (docker image, build) are useful for more advanced use-cases where you need to generate content or utilize other tooling in order to create the source."}),"\n",(0,t.jsx)(n.h2,{id:"top-level-source-configuration",children:"Top-level source configuration"}),"\n",(0,t.jsx)(n.p,{children:"For all source types, you can specify the following top-level configuration:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"path"}),": The path to extract from the source type"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"includes"}),": A list of glob patterns to include from the source"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"excludes"}),": A list of glob patterns to exclude from the source"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The below example uses a ",(0,t.jsx)(n.a,{href:"#build-context",children:(0,t.jsx)(n.code,{children:"context"})})," source type.\nThe root of the source is the ",(0,t.jsx)(n.code,{children:"path/in/source"})," directory.\nThe source will include all ",(0,t.jsx)(n.code,{children:".txt"})," files within ",(0,t.jsx)(n.code,{children:"path/in/source"})," except for ",(0,t.jsx)(n.code,{children:"secret.txt"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'sources:\n someSource:\n path: path/in/source\n includes:\n - "*.txt"\n excludes:\n - "secret.txt"\n context: {}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"source-types",children:"Source Types"}),"\n",(0,t.jsx)(n.h3,{id:"git",children:"Git"}),"\n",(0,t.jsx)(n.p,{children:"Git sources fetch a git repository at a specific commit.\nYou can use either an SSH style git URL or an HTTPS style git URL."}),"\n",(0,t.jsx)(n.p,{children:"For SSH style git URLs, if the client (such as the docker CLI) has provided\naccess to an SSH agent, that agent will be used to authenticate with the git\nserver."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someSource1:\n git:\n # This uses an SSH style git URL.\n url: git@github.com:myOrg/myRepo.git\n commit: 1234567890abcdef\n someSource2:\n git:\n # This uses an HTTPS style git URL.\n url: https://github.com/myOrg/myRepo.git\n commit: 1234567890abcdef\n keepGitDir: true # [Optional] Keep the .git directory when fetching the git source. Default: false\n"})}),"\n",(0,t.jsxs)(n.p,{children:["By default, Dalec will discard the ",(0,t.jsx)(n.code,{children:".git"})," directory when fetching a git source.\nYou can override this behavior by setting ",(0,t.jsx)(n.code,{children:"keepGitDir: true"})," in the git configuration."]}),"\n",(0,t.jsx)(n.p,{children:'Git repositories are considered to be "directory" sources.'}),"\n",(0,t.jsx)(n.h3,{id:"http",children:"HTTP"}),"\n",(0,t.jsx)(n.p,{children:"HTTP sources fetch a file from an HTTP URL.\nHTTP content is not verified by digest today, but it is in the roadmap."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someSource1:\n http:\n # No Digest verification\n url: https://example.com/someFile.txt\n"})}),"\n",(0,t.jsx)(n.p,{children:'The HTTP source type is considered to be a "file" source.'}),"\n",(0,t.jsx)(n.h3,{id:"build-context",children:"Build context"}),"\n",(0,t.jsx)(n.p,{children:"Clients provide a build context to Dalec.\nAs an example, here is how the Docker client provides a build context to Dalec:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ docker build .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In this case the ",(0,t.jsx)(n.code,{children:"."}),", or current directory, is the build context.\nDalec is able to use the build context as a source:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someSource:\n context: {}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Note the empty brackets.\nThis is an unfortunate syntax requirement to not have ",(0,t.jsx)(n.code,{children:"context"})," considered as a nil value.\nThis is the equivelent of the following:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'sources:\n someSource:\n context:\n name: "context"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:'name: "context"'}),", not to be confused with the source type ",(0,t.jsx)(n.code,{children:"context"}),", is named by convention by the docker CLI.\nAdditionally contexts can be passed in from the docker cli: ",(0,t.jsx)(n.code,{children:"docker build --build-context ="}),".\nThe ",(0,t.jsx)(n.code,{children:""})," would be the name to use in your yaml to access it."]}),"\n",(0,t.jsxs)(n.p,{children:["This could also be written as below, since the ",(0,t.jsx)(n.code,{children:"name: context"})," is the default and is the main build context passed in by the client:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someSource:\n context: {}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"context"}),' source type is considered to be a "directory" source.']}),"\n",(0,t.jsx)(n.h3,{id:"inline",children:"Inline"}),"\n",(0,t.jsxs)(n.p,{children:["Inline sources are sources that are defined inline in the Dalec configuration.\nYou can only specify one of ",(0,t.jsx)(n.code,{children:"file"})," or ",(0,t.jsx)(n.code,{children:"dir"})," in an inline source.\nDirectories cannot be nested in inline sources.\nFilenames must not contain a path separator (",(0,t.jsx)(n.code,{children:"/"}),")."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someInlineFile:\n inline:\n # This is the content of the source.\n file:\n uid: 0\n gid: 0\n permissions: 0644\n contents: |\n some content\n some more content\n\n someInlineDir:\n inline:\n dir:\n uid: 0\n gid: 0\n permissions: 0755\n files:\n # This is the content of the source.\n file1:\n contents: |\n some content\n some more content\n permissions: 0644\n uid: 0\n gid: 0\n file2:\n contents: |\n some content\n some more content\n permissions: 0644\n uid: 0\n gid: 0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Inline sources with ",(0,t.jsx)(n.code,{children:"file"}),' are considered to be "file" sources.\nInline sources with ',(0,t.jsx)(n.code,{children:"dir"}),' are considered to be "directory" sources.']}),"\n",(0,t.jsx)(n.h3,{id:"docker-image",children:"Docker Image"}),"\n",(0,t.jsx)(n.p,{children:"Docker image sources fetch a docker image from a registry.\nThe output of this source is a directory containing the contents of the image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someDockerImage:\n image:\n ref: docker.io/library/alpine:3.14\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can also run commands in the image before fetching the contents.\nThis is especially useful for generating content."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someDockerImage:\n image:\n ref: docker.io/library/alpine:3.14\n cmd:\n dir: / # Default path that command steps are executed in\n cache_dirs: null # Map of cache mounts. Default value: `null`\n /foo: {\n mode: shared # The other options are `locked` or `private`\n key: myCacheKey\n include_distro_key: false # Add the target key from the target being built into the cache key\n include_arch_key: false # add the architecture of the image to run the command in into the cache key\n }\n \n steps:\n - command: echo ${FOO} ${BAR}\n env: # Environment variables to set for the step\n FOO: foo\n BAR: bar\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can mount any other source type into the image as well.\nHere's an example mounting an inline source, modifying it, and extracting the result:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someDockerImage:\n path: /bar # Extract `/bar` fromt he result of running the command in the docker image below\n image:\n ref: docker.io/library/alpine:3.14\n cmd:\n mounts: # Mount other sources into each command step\n - dest: /foo\n spec:\n inline:\n file:\n uid: 0\n gid: 0\n permissions: 0644\n contents: |\n some content\n some more content\n steps:\n - command: echo add some extra stuff >> /foo; mkdir /bar; cp /foo /bar\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can use the docker image source to produce any kind of content for your build."}),"\n",(0,t.jsx)(n.p,{children:'Docker image sources are considered to be "directory" sources.'}),"\n",(0,t.jsx)(n.h3,{id:"build",children:"Build"}),"\n",(0,t.jsxs)(n.p,{children:["Build sources allow you to build a dockerfile and use the resulting image as a source.\nIt takes as input another source which must include the dockerfile to build.\nThe default dockerfile path is ",(0,t.jsx)(n.code,{children:"Dockerfile"})," just like a normal docker build."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"sources:\n someBuild:\n build:\n source: # Specfy another source to use as the build context of this build operation\n git:\n url: https://github.com/Azure/dalec.git\n commit: v0.1.0\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example will fetch the git repo and build the dockerfile at the root of the repo."}),"\n",(0,t.jsx)(n.p,{children:"Here's another example using an inline source as the build source:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:' someBuild:\n path: /hello.txt\n build:\n dockerfile_path: other.Dockerfile # [Optional] Change dockerfile path. Default value: "Dockerfile"\n source:\n inline:\n dir:\n uid: 0\n gid: 0\n permissions: 0755\n files:\n Dockerfile:\n contents: |\n FROM alpine:3.14 AS base\n RUN echo "hello world" > /hello.txt\n\n FROM scratch\n COPY --from=base /hello.txt /hello.txt\n'})}),"\n",(0,t.jsxs)(n.p,{children:["You can also specify a ",(0,t.jsx)(n.code,{children:"target"})," which is the name of the build stage to execute.\nBuild args can be specified as well as ",(0,t.jsx)(n.code,{children:"args"})," which is a map of key value pairs."]}),"\n",(0,t.jsx)(n.p,{children:'Build sources are considered to be "directory" sources.'}),"\n",(0,t.jsx)(n.h2,{id:"advanced-source-configurations",children:"Advanced Source Configurations"}),"\n",(0,t.jsxs)(n.p,{children:["You can see more advanced configurations in our ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/dalec/tree/main/test/fixtures",children:"test fixtures"}),".\nThese are in here to test lots of different edge cases and are only mentioned to provide examples of what might be possible\nwhen these simple configurations are not enough.\nThe examples in that directory are not exhaustive and are not guaranteed to work in all cases or with all inputs and are\nthere strictly for testing purposes."]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/e2ceeaf0.d14e7ac7.js b/docs/assets/js/e2ceeaf0.e87b3e4b.js similarity index 98% rename from docs/assets/js/e2ceeaf0.d14e7ac7.js rename to docs/assets/js/e2ceeaf0.e87b3e4b.js index 44357a122..792988a62 100644 --- a/docs/assets/js/e2ceeaf0.d14e7ac7.js +++ b/docs/assets/js/e2ceeaf0.e87b3e4b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[802],{1331:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=n(4848),i=n(8453);const o={title:"Editor Support"},r=void 0,l={id:"editor-support",title:"Editor Support",description:"There is a json schema file which can be used to integrate with your editor.",source:"@site/docs/editor-support.md",sourceDirName:".",slug:"/editor-support",permalink:"/dalec/editor-support",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/editor-support.md",tags:[],version:"current",frontMatter:{title:"Editor Support"},sidebar:"sidebar",previous:{title:"Introduction",permalink:"/dalec/"},next:{title:"Testing",permalink:"/dalec/testing"}},a={},c=[{value:"VSCode",id:"vscode",level:2}];function d(e){const s={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["There is a ",(0,t.jsx)(s.a,{href:"https://github.com/Azure/dalec/blob/main/docs/spec.schema.json",children:"json schema file"})," which can be used to integrate with your editor.\nThis will help validate your yaml files and provide intellisense for the spec."]}),"\n",(0,t.jsx)(s.h2,{id:"vscode",children:"VSCode"}),"\n",(0,t.jsxs)(s.p,{children:["For VSCode you'll need to use a YAML plugin that supports JSON schemas, such as ",(0,t.jsx)(s.a,{href:"https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml",children:"YAML Support by Red Hat"}),".\nFollow the plugins instructions to add the schema to your workspace.\nHere are some examples of vscode workspace configs ",(0,t.jsx)(s.code,{children:"settings.json"})," enabling the JSON schema:"]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Schema is locally available and enable it for yml files under a single directory."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "docs/spec.schema.json": "test/fixtures/*.yml"\n }\n}\n'})}),"\n",(0,t.jsxs)(s.ol,{start:"2",children:["\n",(0,t.jsx)(s.li,{children:"Schema is locally available and enable it for yml files under multiple directories."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "docs/spec.schema.json": [\n "test/fixtures/*.yml",\n "docs/**/*.yml"\n ]\n }\n}\n'})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Directly reference schema from GitHub repository URL."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "https://raw.githubusercontent.com/Azure/dalec//docs/spec.schema.json" : "test/fixtures/*.yml"\n }\n}\n'})}),"\n",(0,t.jsx)(s.p,{children:"You may find with this extension that null-able yaml objects will show as errors in the editor unless you specify the empty value. An example:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"args:\n FOO:\n"})}),"\n",(0,t.jsxs)(s.p,{children:["In this example the json schema says that ",(0,t.jsx)(s.code,{children:"FOO"})," should be a string but we've left it null which is perfectly valid yaml and will unmarshal to an empty string.\nThe yaml plugin will complain that it is an incorrect type. To fix this you can specify the empty string as the value:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'args:\n FOO: ""\n'})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>l});var t=n(6540);const i={},o=t.createContext(i);function r(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[802],{1331:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=n(4848),i=n(8453);const o={title:"Editor Support"},r=void 0,l={id:"editor-support",title:"Editor Support",description:"There is a json schema file which can be used to integrate with your editor.",source:"@site/docs/editor-support.md",sourceDirName:".",slug:"/editor-support",permalink:"/dalec/editor-support",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/editor-support.md",tags:[],version:"current",frontMatter:{title:"Editor Support"},sidebar:"sidebar",previous:{title:"Introduction",permalink:"/dalec/"},next:{title:"Sources",permalink:"/dalec/sources"}},a={},c=[{value:"VSCode",id:"vscode",level:2}];function d(e){const s={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["There is a ",(0,t.jsx)(s.a,{href:"https://github.com/Azure/dalec/blob/main/docs/spec.schema.json",children:"json schema file"})," which can be used to integrate with your editor.\nThis will help validate your yaml files and provide intellisense for the spec."]}),"\n",(0,t.jsx)(s.h2,{id:"vscode",children:"VSCode"}),"\n",(0,t.jsxs)(s.p,{children:["For VSCode you'll need to use a YAML plugin that supports JSON schemas, such as ",(0,t.jsx)(s.a,{href:"https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml",children:"YAML Support by Red Hat"}),".\nFollow the plugins instructions to add the schema to your workspace.\nHere are some examples of vscode workspace configs ",(0,t.jsx)(s.code,{children:"settings.json"})," enabling the JSON schema:"]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Schema is locally available and enable it for yml files under a single directory."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "docs/spec.schema.json": "test/fixtures/*.yml"\n }\n}\n'})}),"\n",(0,t.jsxs)(s.ol,{start:"2",children:["\n",(0,t.jsx)(s.li,{children:"Schema is locally available and enable it for yml files under multiple directories."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "docs/spec.schema.json": [\n "test/fixtures/*.yml",\n "docs/**/*.yml"\n ]\n }\n}\n'})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Directly reference schema from GitHub repository URL."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "yaml.schemas": {\n "https://raw.githubusercontent.com/Azure/dalec//docs/spec.schema.json" : "test/fixtures/*.yml"\n }\n}\n'})}),"\n",(0,t.jsx)(s.p,{children:"You may find with this extension that null-able yaml objects will show as errors in the editor unless you specify the empty value. An example:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"args:\n FOO:\n"})}),"\n",(0,t.jsxs)(s.p,{children:["In this example the json schema says that ",(0,t.jsx)(s.code,{children:"FOO"})," should be a string but we've left it null which is perfectly valid yaml and will unmarshal to an empty string.\nThe yaml plugin will complain that it is an incorrect type. To fix this you can specify the empty string as the value:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'args:\n FOO: ""\n'})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>l});var t=n(6540);const i={},o=t.createContext(i);function r(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/fbe93038.446c92b1.js b/docs/assets/js/fbe93038.446c92b1.js deleted file mode 100644 index 9c70002cd..000000000 --- a/docs/assets/js/fbe93038.446c92b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[133],{3510:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>h});var s=t(4848),c=t(8453);const a={},i="Testing",o={id:"testing",title:"Testing",description:"Dalec supports adding tests to your spec file.",source:"@site/docs/testing.md",sourceDirName:".",slug:"/testing",permalink:"/dalec/testing",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/testing.md",tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"Editor Support",permalink:"/dalec/editor-support"}},l={},h=[{value:"Checks for files",id:"checks-for-files",level:2},{value:"Check file existence",id:"check-file-existence",level:3},{value:"Check file contents",id:"check-file-contents",level:3},{value:"Check that a file contains some value:",id:"check-that-a-file-contains-some-value",level:4},{value:"Check that a file starts with some value:",id:"check-that-a-file-starts-with-some-value",level:4},{value:"Check that a file ends with some value:",id:"check-that-a-file-ends-with-some-value",level:4},{value:"Check that a file matches a regular expression:",id:"check-that-a-file-matches-a-regular-expression",level:4},{value:"Check that a file does not exist",id:"check-that-a-file-does-not-exist",level:4},{value:"Check that a path is a directory",id:"check-that-a-path-is-a-directory",level:4},{value:"Check file permissions",id:"check-file-permissions",level:4},{value:"Add multiple checks together",id:"add-multiple-checks-together",level:4},{value:"Run a command",id:"run-a-command",level:3},{value:"Capture stdio streams",id:"capture-stdio-streams",level:4},{value:"Inject a file into the container for additional checks",id:"inject-a-file-into-the-container-for-additional-checks",level:4}];function r(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(n.p,{children:"Dalec supports adding tests to your spec file.\nThese tests are run against the container produced by your spec.\nDalec provides a few test helpers to make it easier to write tests when your image doesn't have the tools you need."}),"\n",(0,s.jsx)(n.h2,{id:"checks-for-files",children:"Checks for files"}),"\n",(0,s.jsx)(n.h3,{id:"check-file-existence",children:"Check file existence"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /usr/bin/foo:\n"})}),"\n",(0,s.jsx)(n.h3,{id:"check-file-contents",children:"Check file contents"}),"\n",(0,s.jsx)(n.p,{children:"Here are some examples on how to check the contents and metadata of a file in the output container.\nYou can use these to check that the files you expect are present and have the correct contents."}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-contains-some-value",children:"Check that a file contains some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," contains the string ",(0,s.jsx)(n.code,{children:"foo=bar"}),".\nYou can specify multiple values to check for."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n contains:\n - foo=bar\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-starts-with-some-value",children:"Check that a file starts with some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," starts with the string ",(0,s.jsx)(n.code,{children:"foo"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n starts_with: foo\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-ends-with-some-value",children:"Check that a file ends with some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," ends with the string ",(0,s.jsx)(n.code,{children:"bar"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n ends_with: bar\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-matches-a-regular-expression",children:"Check that a file matches a regular expression:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," matches the regular expression ",(0,s.jsx)(n.code,{children:"foo=.*"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n matches: "foo=.*"\n'})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-does-not-exist",children:"Check that a file does not exist"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the file ",(0,s.jsx)(n.code,{children:"/some/nonexistent/path"})," does not exist."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /some/nonexistent/path:\n not_exist: true\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-path-is-a-directory",children:"Check that a path is a directory"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the path ",(0,s.jsx)(n.code,{children:"/some/path"})," is a directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /some/path:\n is_dir: true\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-file-permissions",children:"Check file permissions"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," has the permissions ",(0,s.jsx)(n.code,{children:"0644"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n permissions: 0644\n"})}),"\n",(0,s.jsx)(n.h4,{id:"add-multiple-checks-together",children:"Add multiple checks together"}),"\n",(0,s.jsx)(n.p,{children:"You can add multiple checks together to check multiple things about a file.\nNote that some checks are mutually exclusive and will cause an error if you try to use them together."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n contains:\n - foo=bar\n starts_with: foo\n ends_with: bar\n matches: "foo=.*"\n permissions: 0644\n'})}),"\n",(0,s.jsx)(n.h3,{id:"run-a-command",children:"Run a command"}),"\n",(0,s.jsx)(n.p,{children:"You can run a command in the container and check the stdout and/or stderr of that command.\nThese commands are run before any of the file checks are run and may influence the output of those checks."}),"\n",(0,s.jsx)(n.p,{children:"Because these images often will not have a shell in them, if you want a shell you'll need to run it explicitly."}),"\n",(0,s.jsx)(n.h4,{id:"capture-stdio-streams",children:"Capture stdio streams"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n steps:\n -\n command: echo "hello world"\n stdout:\n equals:\n - hello world\\n\n -\n # Note: the image used for this test would need to have a shell in it for this to work\n command: /bin/sh -c \'echo "hello world" >&2\'\n stderr:\n equals:\n - hello world\\n\n'})}),"\n",(0,s.jsx)(n.p,{children:"Pass in stdin to the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n steps:\n -\n command: cat\n stdin: hello world\n stdout:\n equals:\n - hello world\n"})}),"\n",(0,s.jsx)(n.h4,{id:"inject-a-file-into-the-container-for-additional-checks",children:"Inject a file into the container for additional checks"}),"\n",(0,s.jsx)(n.p,{children:"Test cases support source mounts just like in the main spec.\nYou can use this to inject files, build helper binaries, or add whatever you need to run a test."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n mounts:\n -\n dest: /target/mount/path\n spec:\n build:\n source:\n inline:\n file:\n contents: |\n FROM busybox\n RUN echo hello > /hello\n\n FROM scratch\n COPY --from=busybox /hello /hello\n steps:\n -\n command: cat /path/in/container\n stdout:\n equals: hello\n\n"})})]})}function d(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var s=t(6540);const c={},a=s.createContext(c);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/fbe93038.fadb26ba.js b/docs/assets/js/fbe93038.fadb26ba.js new file mode 100644 index 000000000..53af977f4 --- /dev/null +++ b/docs/assets/js/fbe93038.fadb26ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[133],{3510:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>h});var s=t(4848),c=t(8453);const a={},i="Testing",o={id:"testing",title:"Testing",description:"Dalec supports adding tests to your spec file.",source:"@site/docs/testing.md",sourceDirName:".",slug:"/testing",permalink:"/dalec/testing",draft:!1,unlisted:!1,editUrl:"https://github.com/Azure/dalec/blob/main/website/docs/docs/testing.md",tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"Sources",permalink:"/dalec/sources"}},l={},h=[{value:"Checks for files",id:"checks-for-files",level:2},{value:"Check file existence",id:"check-file-existence",level:3},{value:"Check file contents",id:"check-file-contents",level:3},{value:"Check that a file contains some value:",id:"check-that-a-file-contains-some-value",level:4},{value:"Check that a file starts with some value:",id:"check-that-a-file-starts-with-some-value",level:4},{value:"Check that a file ends with some value:",id:"check-that-a-file-ends-with-some-value",level:4},{value:"Check that a file matches a regular expression:",id:"check-that-a-file-matches-a-regular-expression",level:4},{value:"Check that a file does not exist",id:"check-that-a-file-does-not-exist",level:4},{value:"Check that a path is a directory",id:"check-that-a-path-is-a-directory",level:4},{value:"Check file permissions",id:"check-file-permissions",level:4},{value:"Add multiple checks together",id:"add-multiple-checks-together",level:4},{value:"Run a command",id:"run-a-command",level:3},{value:"Capture stdio streams",id:"capture-stdio-streams",level:4},{value:"Inject a file into the container for additional checks",id:"inject-a-file-into-the-container-for-additional-checks",level:4}];function r(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(n.p,{children:"Dalec supports adding tests to your spec file.\nThese tests are run against the container produced by your spec.\nDalec provides a few test helpers to make it easier to write tests when your image doesn't have the tools you need."}),"\n",(0,s.jsx)(n.h2,{id:"checks-for-files",children:"Checks for files"}),"\n",(0,s.jsx)(n.h3,{id:"check-file-existence",children:"Check file existence"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /usr/bin/foo:\n"})}),"\n",(0,s.jsx)(n.h3,{id:"check-file-contents",children:"Check file contents"}),"\n",(0,s.jsx)(n.p,{children:"Here are some examples on how to check the contents and metadata of a file in the output container.\nYou can use these to check that the files you expect are present and have the correct contents."}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-contains-some-value",children:"Check that a file contains some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," contains the string ",(0,s.jsx)(n.code,{children:"foo=bar"}),".\nYou can specify multiple values to check for."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n contains:\n - foo=bar\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-starts-with-some-value",children:"Check that a file starts with some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," starts with the string ",(0,s.jsx)(n.code,{children:"foo"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n starts_with: foo\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-ends-with-some-value",children:"Check that a file ends with some value:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," ends with the string ",(0,s.jsx)(n.code,{children:"bar"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n ends_with: bar\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-matches-a-regular-expression",children:"Check that a file matches a regular expression:"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the content of the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," matches the regular expression ",(0,s.jsx)(n.code,{children:"foo=.*"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n matches: "foo=.*"\n'})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-file-does-not-exist",children:"Check that a file does not exist"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the file ",(0,s.jsx)(n.code,{children:"/some/nonexistent/path"})," does not exist."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /some/nonexistent/path:\n not_exist: true\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-that-a-path-is-a-directory",children:"Check that a path is a directory"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the path ",(0,s.jsx)(n.code,{children:"/some/path"})," is a directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /some/path:\n is_dir: true\n"})}),"\n",(0,s.jsx)(n.h4,{id:"check-file-permissions",children:"Check file permissions"}),"\n",(0,s.jsxs)(n.p,{children:["Here we check that the file ",(0,s.jsx)(n.code,{children:"/etc/foo.conf"})," has the permissions ",(0,s.jsx)(n.code,{children:"0644"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n permissions: 0644\n"})}),"\n",(0,s.jsx)(n.h4,{id:"add-multiple-checks-together",children:"Add multiple checks together"}),"\n",(0,s.jsx)(n.p,{children:"You can add multiple checks together to check multiple things about a file.\nNote that some checks are mutually exclusive and will cause an error if you try to use them together."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n files:\n /etc/foo.conf:\n contains:\n - foo=bar\n starts_with: foo\n ends_with: bar\n matches: "foo=.*"\n permissions: 0644\n'})}),"\n",(0,s.jsx)(n.h3,{id:"run-a-command",children:"Run a command"}),"\n",(0,s.jsx)(n.p,{children:"You can run a command in the container and check the stdout and/or stderr of that command.\nThese commands are run before any of the file checks are run and may influence the output of those checks."}),"\n",(0,s.jsx)(n.p,{children:"Because these images often will not have a shell in them, if you want a shell you'll need to run it explicitly."}),"\n",(0,s.jsx)(n.h4,{id:"capture-stdio-streams",children:"Capture stdio streams"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n steps:\n -\n command: echo "hello world"\n stdout:\n equals:\n - hello world\\n\n -\n # Note: the image used for this test would need to have a shell in it for this to work\n command: /bin/sh -c \'echo "hello world" >&2\'\n stderr:\n equals:\n - hello world\\n\n'})}),"\n",(0,s.jsx)(n.p,{children:"Pass in stdin to the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n steps:\n -\n command: cat\n stdin: hello world\n stdout:\n equals:\n - hello world\n"})}),"\n",(0,s.jsx)(n.h4,{id:"inject-a-file-into-the-container-for-additional-checks",children:"Inject a file into the container for additional checks"}),"\n",(0,s.jsx)(n.p,{children:"Test cases support source mounts just like in the main spec.\nYou can use this to inject files, build helper binaries, or add whatever you need to run a test."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: My Package\n# ... other spec fields\n\ntests:\n -\n name: My Test case\n mounts:\n -\n dest: /target/mount/path\n spec:\n build:\n source:\n inline:\n file:\n contents: |\n FROM busybox\n RUN echo hello > /hello\n\n FROM scratch\n COPY --from=busybox /hello /hello\n steps:\n -\n command: cat /path/in/container\n stdout:\n equals: hello\n\n"})})]})}function d(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var s=t(6540);const c={},a=s.createContext(c);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/main.2c3a25e1.js b/docs/assets/js/main.2c3a25e1.js deleted file mode 100644 index e2db40205..000000000 --- a/docs/assets/js/main.2c3a25e1.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.2c3a25e1.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"0e384e19":[()=>n.e(976).then(n.bind(n,1512)),"@site/docs/intro.md",1512],17896441:[()=>Promise.all([n.e(869),n.e(401)]).then(n.bind(n,4313)),"@theme/DocItem",4313],"5e95c892":[()=>n.e(647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"6d7771d4":[()=>n.e(863).then(n.t.bind(n,1966,19)),"/home/runner/work/dalec/dalec/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],"935f2afb":[()=>n.e(581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],a7bd4aaa:[()=>n.e(98).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(869),n.e(48)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],e2ceeaf0:[()=>n.e(802).then(n.bind(n,1331)),"@site/docs/editor-support.md",1331],fbe93038:[()=>n.e(133).then(n.bind(n,3510)),"@site/docs/testing.md",3510]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.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,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.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,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],g=(0,u.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)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 o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,l.jsx)(c.W,{value:i,children:(0,l.jsx)(o,{...a,...n})})}})}const f=[{path:"/dalec/",component:d("/dalec/","ea7"),routes:[{path:"/dalec/",component:d("/dalec/","96a"),routes:[{path:"/dalec/",component:d("/dalec/","97d"),routes:[{path:"/dalec/",component:d("/dalec/","cf7"),exact:!0,sidebar:"sidebar"},{path:"/dalec/editor-support",component:d("/dalec/editor-support","7df"),exact:!0,sidebar:"sidebar"},{path:"/dalec/testing",component:d("/dalec/testing","710"),exact:!0,sidebar:"sidebar"}]}]}]},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(4625),i=n(545),l=n(8193);const s=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),c=n(6347),d=n(2831),f=n(4848);function p(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var g=n(5260),h=n(4586),m=n(6025),y=n(6342),b=n(1003),v=n(2131),w=n(4090),k=n(2967),x=n(440),S=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,v.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(g.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,c.zy)();return e+(0,x.applyTrailingSlash)((0,m.A)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(g.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function _(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(g.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(b.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(S.A,{tag:k.Cy,locale:e}),(0,f.jsx)(g.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const A=new Map;function T(e){if(A.has(e.pathname))return{...e,pathname:A.get(e.pathname)};if((0,d.u)(u.A,e.pathname).some((e=>{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}}var N=n(6125),O=n(6988),L=n(205);function P(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()=>a.forEach((e=>e?.()))}const j=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,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)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}),P("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)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?P("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=P("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,f.jsx)(j,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(c.qh,{location:t,render:()=>e})})}}const D=I,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(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(/{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 a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.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 Q=n(6921);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.u)(u.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,Q.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=>!J()&&!X.has(e))(e)&&(X.add(e),R(e))},te=Object.freeze(ee),ne=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(i.vd,{children:(0,f.jsx)(o.Kd,{children:(0,f.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};R(window.location.pathname).then(l)}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/dalec/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/dalec/","mainDocId":"intro","docs":[{"id":"editor-support","path":"/dalec/editor-support","sidebar":"sidebar"},{"id":"intro","path":"/dalec/","sidebar":"sidebar"},{"id":"testing","path":"/dalec/testing","sidebar":"sidebar"}],"draftIds":[],"sidebars":{"sidebar":{"link":{"path":"/dalec/","label":"intro"}}}}],"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 l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.2.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.2.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.2.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.2.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.2.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.2.1"}}}');var u=n(4848);const c={siteConfig:a.A,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function f(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),u=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,u.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,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.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,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,u.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)(f,{children:(0,u.jsxs)(h,{fallback:()=>(0,u.jsx)(c,{error:t,tryAgain:n}),children:[(0,u.jsx)(o.A,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.A,{children:(0,u.jsx)(c,{error:t,tryAgain:n})})]})})}const g=e=>(0,u.jsx)(p,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.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??g)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={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:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),u=n(3427),c=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":m,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.A)(),{withBaseUrl:k}=(0,c.h)(),x=(0,u.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=f||p;const C=(0,l.A)(E),_=E?.replace("pathname://","");let A=void 0!==_?(T=_,y&&(e=>e.startsWith("/"))(T)?k(T):T):void 0;var T;A&&C&&(A=(0,o.applyTrailingSlash)(A,{trailingSlash:v,baseUrl:w}));const N=(0,r.useRef)(!1),O=n?a.k2:a.N_,L=s.A.canUseIntersectionObserver,P=(0,r.useRef)(),j=()=>{N.current||null==A||(window.docusaurus.preload(A),N.current=!0)};(0,r.useEffect)((()=>(!L&&C&&null!=A&&window.docusaurus.prefetch(A),()=>{L&&P.current&&P.current.disconnect()})),[P,A,L,C]);const R=A?.startsWith("#")??!1,I=!b.target||"_self"===b.target,D=!A||!C||!I||R;return m||!R&&D||x.collectLink(A),b.id&&x.collectAnchor(b.id),D?(0,d.jsx)("a",{ref:S,href:A,...E&&!C&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(O,{...b,onMouseEnter:j,onTouchStart:j,innerRef:e=>{S.current=e,L&&e&&C&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),P.current.observe(e))},to:A,...n&&{isActive:h,activeClassName:g}})}const p=r.forwardRef(f)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>s});var r=n(6540),a=n(4848);function o(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 l(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 s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function u(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=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(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 a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,h:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.z)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(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 a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(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,a.jsx)(o.Provider,{value:l,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>h,vT:()=>f,Gy:()=>c,HW:()=>m,ht:()=>d,r7:()=>g,jh:()=>p});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("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 f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=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})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function p(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.A,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(793)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:f}}=(0,o.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const p=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",f?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.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"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>pt});var r=n(6540),a=n(4164),o=n(7489),i=n(1003),l=n(6347),s=n(1312),u=n(5062),c=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(h,{className:b.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.A)(C.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,w.p)(),{isActive:t,close:n}=(0,k.Mj)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:A.announcementBarPlaceholder}),(0,c.jsx)(_,{className:A.announcementBarContent}),o&&(0,c.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var N=n(9876),O=n(3104);var L=n(9532),P=n(5600);const j=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,N.M)(),t=(0,P.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(j.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(j);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(5293),z=n(2303);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.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,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.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,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.G)();return r?null:(0,c.jsx)(V,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var q=n(3465);function Y(){return(0,c.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,N.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.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,c.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(Y,{}),(0,c.jsx)(G,{className:"margin-right--md"}),(0,c.jsx)(K,{})]})}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:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.A)(r),f=(0,X.A)(t),p=(0,X.A)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.A)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,g&&(0,c.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,c.jsx)(Z.A,{href:s?p:a,...u,...h}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...u,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.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:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.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)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ce,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[u,d,g]),(0,c.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.A)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),p()},children:s.children??s.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Ce,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,c.jsx)(r,{...n})}var ge=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.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 me="iconLanguage_nlXk";var ye=n(418);const be={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.A)(n,be.navbarSearchContainer),children:t})}var we=n(4070),ke=n(1754);var xe=n(5597);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.A)(),f=(0,ge.o)(),{search:p,hash:g}=(0,l.zy)(),h=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}${a}`;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],m=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(pe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(he,{className:me}),m]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(ye.A,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,l.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:g}=(0,xe.g1)(n),h=[...a,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...o],m=(0,ke.Vd)(n)[0],y=t&&h.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&h.length>1?void 0:Se(m).path;return h.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function Ce(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function _e(){const e=(0,N.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ce,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.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 Te(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function Ne(){const e=(0,N.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,c.jsx)(F,{header:(0,c.jsx)(Q,{}),primaryMenu:(0,c.jsx)(_e,{}),secondaryMenu:(0,c.jsx)(Te,{})}):null}const Oe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,N.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,O.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Oe.navbarHideable,!d&&Oe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Le,{onClick:i.toggle}),(0,c.jsx)(Ne,{})]})}var je=n(440);const Re={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ie(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.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 De(e){let{error:t}=e;const n=(0,je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Re.errorBoundaryError,children:n})}class Fe extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Me="right";function ze(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,N.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.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,c.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(Fe,{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,c.jsx)(Ce,{...e})},t)))})}function He(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function Ve(){const e=(0,N.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Me)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)(He,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Be,{}),(0,c.jsx)(Y,{}),(0,c.jsx)(Ue,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(Ue,{items:r}),(0,c.jsx)(G,{className:$e.colorModeToggle}),!a&&(0,c.jsx)(ve,{children:(0,c.jsx)(ye.A,{})})]})})}function We(){return(0,c.jsx)(Pe,{children:(0,c.jsx)(Ve,{})})}function Ge(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.A)(n),s=(0,X.A)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,c.jsx)(te.A,{})]})}function qe(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(Ge,{item:t})},t.href??t.to)}function Ye(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(qe,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(Ye,{column:e},t)))})}function Qe(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(Ge,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(Ze,{item:e}),t.length!==n+1&&(0,c.jsx)(Qe,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Ke,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,c.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(ot,{style:a,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:r&&(0,c.jsx)(rt,{logo:r}),copyright:t&&(0,c.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,L.fM)([M.a,k.oq,O.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(P.y_,{children:(0,c.jsx)(N.e,{children:(0,c.jsx)(R,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(st,{children:t})}var ct=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.A,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Ie,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(De,{error:t})})]})})})}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.J)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.be,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(T,{}),(0,c.jsx)(We,{}),(0,c.jsx)("div",{id:d,className:(0,a.A)(m.G.wrapper.main,ft.mainWrapper,r),children:(0,c.jsx)(o.A,{fallback:e=>(0,c.jsx)(dt,{...e}),children:t})}),!n&&(0,c.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.A)(t.src),dark:(0,a.A)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.A)(l?.href||"/"),g=n?"":t,h=l?.alt??g;return(0,s.jsxs)(r.A,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:h,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,o.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>u});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.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 ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function g(e){if(!a.A.canUseDOM)return e?c:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:c,style:u?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(c.current,n),i?.(n))},className:s,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&u(t)}),[a,t]),a?(0,l.jsx)(h,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>h,oq:()=>g});var r=n(6540),a=n(2303),o=n(9466),i=n(9532),l=n(6342),s=n(4848);const u=(0,o.Wf)("docusaurus.announcement.dismiss"),c=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===u.get(),f=e=>u.set(String(e)),p=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>m});var r=n(6540),a=n(8193),o=n(9532),i=n(9466),l=n(6342),s=n(4848);const u=r.createContext(void 0),c="theme",d=(0,i.Wf)(c),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,g=e=>a.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new o.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:()=>y,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),u=n(9466),c=n(4848);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,u.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.Wf)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function h(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(g.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.C5?(0,c.jsx)(m,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function b(){const e=(0,r.useContext)(g);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>u});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>g});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342),c=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function p(e){let{children:t}=e;const n=f();return(0,c.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.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"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>p,w8:()=>m,C5:()=>f,B5:()=>E,Vd:()=>k,QB:()=>S,fW:()=>x,OF:()=>w,Y:()=>b});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(2252),u=n(6588);function c(e){return Array.from(new Set(e))}var d=n(9169);const f=!!i.Gy;function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const g=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return m(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||m(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,u.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const u=l.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.v)(i),sidebarName:u,sidebarItems:c}}},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>d,Jx:()=>g});var r=n(6540),a=n(4164),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(4586);var c=n(4848);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.h)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),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}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),l=(0,a.A)(i,t);return(0,c.jsxs)(f.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function g(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>u,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>c});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s 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 u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.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 a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);const s=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)(s.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.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 a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>s});n(6540);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"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,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(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=o(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),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._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:()=>a});var r=n(4586);function a(){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 a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,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(/[#?]/),l="/"===i||i===r?i:(s=i,n?a(s):o(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},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 a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.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}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>_,yJ:()=>p,sC:()=>T,AO:()=>f});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(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 f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=p(n);a&&a!==g&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;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 a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),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)*a(Math.random()*t,.1,.95)),t=a(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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},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 a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i{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},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),g=f.indexOf(p);if(g>-1){++a;var h=f.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(g+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(m),y&&b.push.apply(b,i([y])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},83:()=>{!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},793:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-json":2514,"./prism-yaml":83};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=793},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=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 l.name="Invariant Violation",l}}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:o,resetWarningCache:a};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),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n