diff --git a/404.html b/404.html index 4135d912f5..dad814fc70 100644 --- a/404.html +++ b/404.html @@ -4,8 +4,8 @@ Page Not Found | TUnit - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

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

diff --git a/assets/js/1e1af249.48201efe.js b/assets/js/1e1af249.48201efe.js deleted file mode 100644 index b15471ca8d..0000000000 --- a/assets/js/1e1af249.48201efe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8718],{1144:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=t(4848),o=t(8453);const i={sidebar_position:1},r="Extensions",a={id:"extensions/cleanup",title:"Extensions",description:"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.",source:"@site/docs/extensions/cleanup.md",sourceDirName:"extensions",slug:"/extensions/cleanup",permalink:"/TUnit/docs/extensions/cleanup",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Extensions",permalink:"/TUnit/docs/category/extensions"},next:{title:"Tutorial - Assertions",permalink:"/TUnit/docs/category/tutorial---assertions"}},c={},d=[{value:"Code Coverage",id:"code-coverage",level:2},{value:"TRX Test Reports",id:"trx-test-reports",level:2},{value:"Crash Dump",id:"crash-dump",level:2},{value:"Hang Dump",id:"hang-dump",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"extensions",children:"Extensions"})}),"\n",(0,s.jsx)(n.p,{children:"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.\nHere will list a few of them."}),"\n",(0,s.jsx)(n.h2,{id:"code-coverage",children:"Code Coverage"}),"\n",(0,s.jsxs)(n.p,{children:["Code coverage is provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.CodeCoverage"})," NuGet package.\n",(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-code-coverage",children:"More information can be found here"})]}),"\n",(0,s.jsx)(n.h2,{id:"trx-test-reports",children:"TRX Test Reports"}),"\n",(0,s.jsxs)(n.p,{children:["Trx reports are provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.TrxReport"})," NuGet package.\n",(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-test-reports",children:"More information can be found here"})]}),"\n",(0,s.jsx)(n.h2,{id:"crash-dump",children:"Crash Dump"}),"\n",(0,s.jsxs)(n.p,{children:["Crash dump is an extension to help diagnose unexplained crashes, provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.CrashDump"})," NuGet package.\n",(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-diagnostics",children:"More information can be found here"})]}),"\n",(0,s.jsx)(n.h2,{id:"hang-dump",children:"Hang Dump"}),"\n",(0,s.jsxs)(n.p,{children:["Hang dump is an extension to help diagnose unexplained hanging in your test suite, provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.HangDump"})," NuGet package.\n",(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-diagnostics",children:"More information can be found here"})]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(6540);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6a12013c.fe504b16.js b/assets/js/6a12013c.5f852033.js similarity index 66% rename from assets/js/6a12013c.fe504b16.js rename to assets/js/6a12013c.5f852033.js index b24f7bcd0a..8a09aff9e5 100644 --- a/assets/js/6a12013c.fe504b16.js +++ b/assets/js/6a12013c.5f852033.js @@ -1 +1 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[5770],{5627:t=>{t.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Tutorial - Assertions","description":"Asserting data using TUnit.","slug":"/category/tutorial---assertions","permalink":"/TUnit/docs/category/tutorial---assertions","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Extensions","permalink":"/TUnit/docs/extensions/cleanup"},"next":{"title":"Awaiting","permalink":"/TUnit/docs/tutorial-assertions/awaiting"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[5770],{5627:t=>{t.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Tutorial - Assertions","description":"Asserting data using TUnit.","slug":"/category/tutorial---assertions","permalink":"/TUnit/docs/category/tutorial---assertions","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Class Constructor Helpers","permalink":"/TUnit/docs/tutorial-extras/class-constructors"},"next":{"title":"Awaiting","permalink":"/TUnit/docs/tutorial-assertions/awaiting"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/8b1309c7.0ed4b64b.js b/assets/js/8b1309c7.0ed4b64b.js new file mode 100644 index 0000000000..d66d316841 --- /dev/null +++ b/assets/js/8b1309c7.0ed4b64b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[3398],{380:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var t=n(4848),r=n(8453);const o={sidebar_position:13},i="Class Constructor Helpers",c={id:"tutorial-extras/class-constructors",title:"Class Constructor Helpers",description:"Some test suites might be more complex than others, and a user may want control over 'newing' up their test classes.",source:"@site/docs/tutorial-extras/class-constructors.md",sourceDirName:"tutorial-extras",slug:"/tutorial-extras/class-constructors",permalink:"/TUnit/docs/tutorial-extras/class-constructors",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"Executors",permalink:"/TUnit/docs/tutorial-extras/executors"},next:{title:"Tutorial - Assertions",permalink:"/TUnit/docs/category/tutorial---assertions"}},a={},l=[];function d(e){const s={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"class-constructor-helpers",children:"Class Constructor Helpers"})}),"\n",(0,t.jsxs)(s.p,{children:["Some test suites might be more complex than others, and a user may want control over 'newing' up their test classes.\nThis control is given to you by the ",(0,t.jsx)(s.code,{children:"[ClassConstructorAttribute]"})," - Where ",(0,t.jsx)(s.code,{children:"T"})," is a class that implements ",(0,t.jsx)(s.code,{children:"IClassConstructor"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"This interface is very generic so you have freedom to construct and dispose as you please."}),"\n",(0,t.jsx)(s.p,{children:"By giving the freedom of how classes are created, we can tap into things like Dependency Injection."}),"\n",(0,t.jsx)(s.p,{children:"Here's an example of that using the Microsoft.Extensions.DependencyInjection library"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-csharp",children:"using TUnit.Core;\n\nnamespace MyTestProject;\n\npublic class DependencyInjectionClassConstructor : IClassConstructor\n{\n private static readonly IServiceProvider _serviceProvider = CreateServiceProvider();\n \n private static readonly ConditionalWeakTable Scopes = new();\n\n public T Create<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>() where T : class\n {\n var scope = _serviceProvider.CreateAsyncScope();\n \n var instance = ActivatorUtilities.GetServiceOrCreateInstance(scope.ServiceProvider);\n \n Scopes.Add(instance, scope);\n \n return instance;\n }\n\n public async Task DisposeAsync(T t)\n {\n if (t is IAsyncDisposable asyncDisposable)\n {\n await asyncDisposable.DisposeAsync();\n }\n else if (t is IDisposable disposable)\n {\n disposable.Dispose();\n }\n \n if (t != null && Scopes.TryGetValue(t, out var scope))\n {\n scope.Dispose();\n }\n }\n\n private static IServiceProvider CreateServiceProvider()\n {\n return new ServiceCollection()\n .AddSingleton()\n .AddSingleton()\n .AddTransient()\n .BuildServiceProvider();\n }\n}\n\n[ClassConstructor]\npublic class MyTestClass(SomeClass1 someClass1, SomeClass2 someClass2, SomeClass3 someClass3)\n{\n [Test]\n public async Task Test()\n {\n // ...\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,r.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:()=>i,x:()=>c});var t=n(6540);const r={},o=t.createContext(r);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b1309c7.f8deeafa.js b/assets/js/8b1309c7.f8deeafa.js deleted file mode 100644 index 4f1f7f1058..0000000000 --- a/assets/js/8b1309c7.f8deeafa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[3398],{380:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var t=n(4848),r=n(8453);const o={sidebar_position:13},c="Class Constructor Helpers",i={id:"tutorial-extras/class-constructors",title:"Class Constructor Helpers",description:"Some test suites might be more complex than others, and a user may want control over 'newing' up their test classes.",source:"@site/docs/tutorial-extras/class-constructors.md",sourceDirName:"tutorial-extras",slug:"/tutorial-extras/class-constructors",permalink:"/TUnit/docs/tutorial-extras/class-constructors",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"Executors",permalink:"/TUnit/docs/tutorial-extras/executors"},next:{title:"Extensions",permalink:"/TUnit/docs/category/extensions"}},a={},l=[];function d(e){const s={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"class-constructor-helpers",children:"Class Constructor Helpers"})}),"\n",(0,t.jsxs)(s.p,{children:["Some test suites might be more complex than others, and a user may want control over 'newing' up their test classes.\nThis control is given to you by the ",(0,t.jsx)(s.code,{children:"[ClassConstructorAttribute]"})," - Where ",(0,t.jsx)(s.code,{children:"T"})," is a class that implements ",(0,t.jsx)(s.code,{children:"IClassConstructor"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"This interface is very generic so you have freedom to construct and dispose as you please."}),"\n",(0,t.jsx)(s.p,{children:"By giving the freedom of how classes are created, we can tap into things like Dependency Injection."}),"\n",(0,t.jsx)(s.p,{children:"Here's an example of that using the Microsoft.Extensions.DependencyInjection library"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-csharp",children:"using TUnit.Core;\n\nnamespace MyTestProject;\n\npublic class DependencyInjectionClassConstructor : IClassConstructor\n{\n private static readonly IServiceProvider _serviceProvider = CreateServiceProvider();\n \n private static readonly ConditionalWeakTable Scopes = new();\n\n public T Create<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>() where T : class\n {\n var scope = _serviceProvider.CreateAsyncScope();\n \n var instance = ActivatorUtilities.GetServiceOrCreateInstance(scope.ServiceProvider);\n \n Scopes.Add(instance, scope);\n \n return instance;\n }\n\n public async Task DisposeAsync(T t)\n {\n if (t is IAsyncDisposable asyncDisposable)\n {\n await asyncDisposable.DisposeAsync();\n }\n else if (t is IDisposable disposable)\n {\n disposable.Dispose();\n }\n \n if (t != null && Scopes.TryGetValue(t, out var scope))\n {\n scope.Dispose();\n }\n }\n\n private static IServiceProvider CreateServiceProvider()\n {\n return new ServiceCollection()\n .AddSingleton()\n .AddSingleton()\n .AddTransient()\n .BuildServiceProvider();\n }\n}\n\n[ClassConstructor]\npublic class MyTestClass(SomeClass1 someClass1, SomeClass2 someClass2, SomeClass3 someClass3)\n{\n [Test]\n public async Task Test()\n {\n // ...\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,r.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:()=>c,x:()=>i});var t=n(6540);const r={},o=t.createContext(r);function c(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ff4cdb2.1a8dddbc.js b/assets/js/8ff4cdb2.1a8dddbc.js new file mode 100644 index 0000000000..d577d83473 --- /dev/null +++ b/assets/js/8ff4cdb2.1a8dddbc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[2590],{2056:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=t(4848),o=t(8453);const i={sidebar_position:1},r="Extensions",a={id:"extensions/extensions",title:"Extensions",description:"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.",source:"@site/docs/extensions/extensions.md",sourceDirName:"extensions",slug:"/extensions/",permalink:"/TUnit/docs/extensions/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Extensions",permalink:"/TUnit/docs/category/extensions"}},c={},d=[{value:"Code Coverage",id:"code-coverage",level:2},{value:"TRX Test Reports",id:"trx-test-reports",level:2},{value:"Crash Dump",id:"crash-dump",level:2},{value:"Hang Dump",id:"hang-dump",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"extensions",children:"Extensions"})}),"\n",(0,s.jsx)(n.p,{children:"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.\nHere will list a few of them."}),"\n",(0,s.jsx)(n.h2,{id:"code-coverage",children:"Code Coverage"}),"\n",(0,s.jsxs)(n.p,{children:["Code coverage is provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.CodeCoverage"})," NuGet package."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-code-coverage",children:"More information can be found here"})}),"\n",(0,s.jsx)(n.h2,{id:"trx-test-reports",children:"TRX Test Reports"}),"\n",(0,s.jsxs)(n.p,{children:["Trx reports are provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.TrxReport"})," NuGet package."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-test-reports",children:"More information can be found here"})}),"\n",(0,s.jsx)(n.h2,{id:"crash-dump",children:"Crash Dump"}),"\n",(0,s.jsxs)(n.p,{children:["Crash dump is an extension to help diagnose unexplained crashes, provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.CrashDump"})," NuGet package."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-diagnostics",children:"More information can be found here"})}),"\n",(0,s.jsx)(n.h2,{id:"hang-dump",children:"Hang Dump"}),"\n",(0,s.jsxs)(n.p,{children:["Hang dump is an extension to help diagnose unexplained hanging in your test suite, provided via the ",(0,s.jsx)(n.code,{children:"Microsoft.Testing.Extensions.HangDump"})," NuGet package."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-extensions-diagnostics",children:"More information can be found here"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(6540);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/914d3ab3.526633d9.js b/assets/js/914d3ab3.526633d9.js new file mode 100644 index 0000000000..985d23d15b --- /dev/null +++ b/assets/js/914d3ab3.526633d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[6532],{7136:t=>{t.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Intro","href":"/TUnit/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Tutorial - Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing TUnit","href":"/TUnit/docs/tutorial-basics/installing","docId":"tutorial-basics/installing","unlisted":false},{"type":"link","label":"Writing your first test","href":"/TUnit/docs/tutorial-basics/writing-your-first-test","docId":"tutorial-basics/writing-your-first-test","unlisted":false},{"type":"link","label":"Running your tests","href":"/TUnit/docs/tutorial-basics/running-your-tests","docId":"tutorial-basics/running-your-tests","unlisted":false},{"type":"link","label":"Data Driven Tests","href":"/TUnit/docs/tutorial-basics/data-driven-tests","docId":"tutorial-basics/data-driven-tests","unlisted":false},{"type":"link","label":"Data Source Driven Tests","href":"/TUnit/docs/tutorial-basics/data-source-driven-tests","docId":"tutorial-basics/data-source-driven-tests","unlisted":false},{"type":"link","label":"Matrix Tests","href":"/TUnit/docs/tutorial-basics/matrix-tests","docId":"tutorial-basics/matrix-tests","unlisted":false},{"type":"link","label":"Things to know","href":"/TUnit/docs/tutorial-basics/things-to-know","docId":"tutorial-basics/things-to-know","unlisted":false},{"type":"link","label":"Congratulations!","href":"/TUnit/docs/tutorial-basics/congratulations","docId":"tutorial-basics/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---basics"},{"type":"category","label":"Tutorial - Extras","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Test Set Ups","href":"/TUnit/docs/tutorial-extras/setup","docId":"tutorial-extras/setup","unlisted":false},{"type":"link","label":"Test Clean Ups","href":"/TUnit/docs/tutorial-extras/cleanup","docId":"tutorial-extras/cleanup","unlisted":false},{"type":"link","label":"Retrying","href":"/TUnit/docs/tutorial-extras/retrying","docId":"tutorial-extras/retrying","unlisted":false},{"type":"link","label":"Repeating","href":"/TUnit/docs/tutorial-extras/repeating","docId":"tutorial-extras/repeating","unlisted":false},{"type":"link","label":"Timeouts","href":"/TUnit/docs/tutorial-extras/timeouts","docId":"tutorial-extras/timeouts","unlisted":false},{"type":"link","label":"Properties","href":"/TUnit/docs/tutorial-extras/properties","docId":"tutorial-extras/properties","unlisted":false},{"type":"link","label":"Test Context","href":"/TUnit/docs/tutorial-extras/test-context","docId":"tutorial-extras/test-context","unlisted":false},{"type":"link","label":"Test Filters","href":"/TUnit/docs/tutorial-extras/test-filters","docId":"tutorial-extras/test-filters","unlisted":false},{"type":"link","label":"Explicit","href":"/TUnit/docs/tutorial-extras/explicit","docId":"tutorial-extras/explicit","unlisted":false},{"type":"link","label":"Not in Parallel","href":"/TUnit/docs/tutorial-extras/not-in-parallel","docId":"tutorial-extras/not-in-parallel","unlisted":false},{"type":"link","label":"Depends On","href":"/TUnit/docs/tutorial-extras/depends-on","docId":"tutorial-extras/depends-on","unlisted":false},{"type":"link","label":"Ordering Tests","href":"/TUnit/docs/tutorial-extras/order","docId":"tutorial-extras/order","unlisted":false},{"type":"link","label":"Parallel Limiter","href":"/TUnit/docs/tutorial-extras/parallel-limiter","docId":"tutorial-extras/parallel-limiter","unlisted":false},{"type":"link","label":"Executors","href":"/TUnit/docs/tutorial-extras/executors","docId":"tutorial-extras/executors","unlisted":false},{"type":"link","label":"Class Constructor Helpers","href":"/TUnit/docs/tutorial-extras/class-constructors","docId":"tutorial-extras/class-constructors","unlisted":false}],"href":"/TUnit/docs/category/tutorial---extras"},{"type":"category","label":"Tutorial - Assertions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Awaiting","href":"/TUnit/docs/tutorial-assertions/awaiting","docId":"tutorial-assertions/awaiting","unlisted":false},{"type":"link","label":"And Conditions","href":"/TUnit/docs/tutorial-assertions/and-conditions","docId":"tutorial-assertions/and-conditions","unlisted":false},{"type":"link","label":"Or Conditions","href":"/TUnit/docs/tutorial-assertions/or-conditions","docId":"tutorial-assertions/or-conditions","unlisted":false},{"type":"link","label":"Type Checking","href":"/TUnit/docs/tutorial-assertions/type-checking","docId":"tutorial-assertions/type-checking","unlisted":false},{"type":"link","label":"Delegates","href":"/TUnit/docs/tutorial-assertions/delegates","docId":"tutorial-assertions/delegates","unlisted":false},{"type":"link","label":"Congratulations","href":"/TUnit/docs/tutorial-assertions/congratulations","docId":"tutorial-assertions/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---assertions"},{"type":"category","label":"Test Framework Comparisons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Attributes","href":"/TUnit/docs/comparison/attributes","docId":"comparison/attributes","unlisted":false},{"type":"link","label":"Framework Differences","href":"/TUnit/docs/comparison/framework-differences","docId":"comparison/framework-differences","unlisted":false}],"href":"/TUnit/docs/category/test-framework-comparisons"},{"type":"category","label":"Extensions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Extensions","href":"/TUnit/docs/extensions/","docId":"extensions/extensions","unlisted":false}],"href":"/TUnit/docs/category/extensions"}]},"docs":{"comparison/attributes":{"id":"comparison/attributes","title":"Attributes","description":"Here are TUnit\'s equivalent attributes to other test frameworks.","sidebar":"tutorialSidebar"},"comparison/framework-differences":{"id":"comparison/framework-differences","title":"Framework Differences","description":"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.","sidebar":"tutorialSidebar"},"extensions/extensions":{"id":"extensions/extensions","title":"Extensions","description":"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Intro","description":"TUnit is another testing framework for .NET 8 and up.","sidebar":"tutorialSidebar"},"tutorial-assertions/and-conditions":{"id":"tutorial-assertions/and-conditions","title":"And Conditions","description":"TUnit can chain assertions together, using the And property. This reads very much like English, and aims to keep the test easy to read and understand, and doesn\'t require you repeat boilerplate code such as Assert.That over and over.","sidebar":"tutorialSidebar"},"tutorial-assertions/awaiting":{"id":"tutorial-assertions/awaiting","title":"Awaiting","description":"In TUnit, the await keyword is responsible for performing the assertion.","sidebar":"tutorialSidebar"},"tutorial-assertions/congratulations":{"id":"tutorial-assertions/congratulations","title":"Congratulations","description":"That\'s all you need to know about assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/delegates":{"id":"tutorial-assertions/delegates","title":"Delegates","description":"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:","sidebar":"tutorialSidebar"},"tutorial-assertions/or-conditions":{"id":"tutorial-assertions/or-conditions","title":"Or Conditions","description":"Similar to the And property, there is also the Or property.","sidebar":"tutorialSidebar"},"tutorial-assertions/type-checking":{"id":"tutorial-assertions/type-checking","title":"Type Checking","description":"TUnit assertions try to check the types at compile time.","sidebar":"tutorialSidebar"},"tutorial-basics/congratulations":{"id":"tutorial-basics/congratulations","title":"Congratulations!","description":"You have just learned the basics of writing a test in TUnit.","sidebar":"tutorialSidebar"},"tutorial-basics/data-driven-tests":{"id":"tutorial-basics/data-driven-tests","title":"Data Driven Tests","description":"It\'s common to want to repeat tests but pass in different values on each execution.","sidebar":"tutorialSidebar"},"tutorial-basics/data-source-driven-tests":{"id":"tutorial-basics/data-source-driven-tests","title":"Data Source Driven Tests","description":"A limitation of passing data in with [Arguments(...)] is that the data must be constant values. For example, we can\'t new up an object and pass it into this attribute as an argument. This is a constraint of the language and we can\'t change that.","sidebar":"tutorialSidebar"},"tutorial-basics/installing":{"id":"tutorial-basics/installing","title":"Installing TUnit","description":"First create an empty .NET console application:","sidebar":"tutorialSidebar"},"tutorial-basics/matrix-tests":{"id":"tutorial-basics/matrix-tests","title":"Matrix Tests","description":"Combinative tests can take multiple values for different arguments, and then generate every possible combination of all of those arguments.","sidebar":"tutorialSidebar"},"tutorial-basics/running-your-tests":{"id":"tutorial-basics/running-your-tests","title":"Running your tests","description":"As TUnit is built on-top of the newer Microsoft.Testing.Platform, and combined with the fact that TUnit tests are source generated, running your tests is available in a variety of ways.","sidebar":"tutorialSidebar"},"tutorial-basics/things-to-know":{"id":"tutorial-basics/things-to-know","title":"Things to know","description":"TUnit has made some decisions by design. You may need to know about them:","sidebar":"tutorialSidebar"},"tutorial-basics/writing-your-first-test":{"id":"tutorial-basics/writing-your-first-test","title":"Writing your first test","description":"Start by creating a new class:","sidebar":"tutorialSidebar"},"tutorial-extras/class-constructors":{"id":"tutorial-extras/class-constructors","title":"Class Constructor Helpers","description":"Some test suites might be more complex than others, and a user may want control over \'newing\' up their test classes.","sidebar":"tutorialSidebar"},"tutorial-extras/cleanup":{"id":"tutorial-extras/cleanup","title":"Test Clean Ups","description":"TUnit supports having your test class implement IDisposable or IAsyncDisposable. These will be called after your test has finished executing. However, using the attributes below offers better support for running multiple methods, and without having to implement your own try/catch logic. Every [After] method will be run, and any exceptions will be lazily thrown afterwards.","sidebar":"tutorialSidebar"},"tutorial-extras/depends-on":{"id":"tutorial-extras/depends-on","title":"Depends On","description":"A test can depend on another test. This means that your test will not start unless the other test has finished.","sidebar":"tutorialSidebar"},"tutorial-extras/executors":{"id":"tutorial-extras/executors","title":"Executors","description":"In some advanced cases, you may need to control how a test or hook is executed.","sidebar":"tutorialSidebar"},"tutorial-extras/explicit":{"id":"tutorial-extras/explicit","title":"Explicit","description":"If you want a test to only be run explicitly (and not part of all general tests) then you can add the [ExplicitAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/not-in-parallel":{"id":"tutorial-extras/not-in-parallel","title":"Not in Parallel","description":"By default, TUnit tests will run in parallel.","sidebar":"tutorialSidebar"},"tutorial-extras/order":{"id":"tutorial-extras/order","title":"Ordering Tests","description":"By default, TUnit tests will run in parallel. This means there is no order and it doesn\'t make sense to be able to control that.","sidebar":"tutorialSidebar"},"tutorial-extras/parallel-limiter":{"id":"tutorial-extras/parallel-limiter","title":"Parallel Limiter","description":"TUnit allows the user to control the parallel limit on a test, class or assembly level.","sidebar":"tutorialSidebar"},"tutorial-extras/properties":{"id":"tutorial-extras/properties","title":"Properties","description":"Custom properties can be added to a test using the [PropertyAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/repeating":{"id":"tutorial-extras/repeating","title":"Repeating","description":"If you want to repeat a test, add a [RepeatAttribute] onto your test method or class. This takes an int of how many times you\'d like to repeat. Each repeat will show in the test explorer as a new test.","sidebar":"tutorialSidebar"},"tutorial-extras/retrying":{"id":"tutorial-extras/retrying","title":"Retrying","description":"Unfortunately sometimes our tests hit issues. It could be a blip on the network, but that could cause our entire test suite to fail which is frustrating.","sidebar":"tutorialSidebar"},"tutorial-extras/setup":{"id":"tutorial-extras/setup","title":"Test Set Ups","description":"Most setup for a test can be performed in the constructor (think setting up mocks, assigning fields.)","sidebar":"tutorialSidebar"},"tutorial-extras/test-context":{"id":"tutorial-extras/test-context","title":"Test Context","description":"All tests have a TestContext object available to them.","sidebar":"tutorialSidebar"},"tutorial-extras/test-filters":{"id":"tutorial-extras/test-filters","title":"Test Filters","description":"Running TUnit via dotnet run supports test filters.","sidebar":"tutorialSidebar"},"tutorial-extras/timeouts":{"id":"tutorial-extras/timeouts","title":"Timeouts","description":"If you want to stop a test after a specified amount of time, add a [TimeoutAttribute] onto your test method or class. This takes an int of how many milliseconds a test can execute for.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/914d3ab3.dce564f4.js b/assets/js/914d3ab3.dce564f4.js deleted file mode 100644 index ceebf690a3..0000000000 --- a/assets/js/914d3ab3.dce564f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[6532],{7136:t=>{t.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Intro","href":"/TUnit/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Tutorial - Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing TUnit","href":"/TUnit/docs/tutorial-basics/installing","docId":"tutorial-basics/installing","unlisted":false},{"type":"link","label":"Writing your first test","href":"/TUnit/docs/tutorial-basics/writing-your-first-test","docId":"tutorial-basics/writing-your-first-test","unlisted":false},{"type":"link","label":"Running your tests","href":"/TUnit/docs/tutorial-basics/running-your-tests","docId":"tutorial-basics/running-your-tests","unlisted":false},{"type":"link","label":"Data Driven Tests","href":"/TUnit/docs/tutorial-basics/data-driven-tests","docId":"tutorial-basics/data-driven-tests","unlisted":false},{"type":"link","label":"Data Source Driven Tests","href":"/TUnit/docs/tutorial-basics/data-source-driven-tests","docId":"tutorial-basics/data-source-driven-tests","unlisted":false},{"type":"link","label":"Matrix Tests","href":"/TUnit/docs/tutorial-basics/matrix-tests","docId":"tutorial-basics/matrix-tests","unlisted":false},{"type":"link","label":"Things to know","href":"/TUnit/docs/tutorial-basics/things-to-know","docId":"tutorial-basics/things-to-know","unlisted":false},{"type":"link","label":"Congratulations!","href":"/TUnit/docs/tutorial-basics/congratulations","docId":"tutorial-basics/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---basics"},{"type":"category","label":"Tutorial - Extras","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Test Set Ups","href":"/TUnit/docs/tutorial-extras/setup","docId":"tutorial-extras/setup","unlisted":false},{"type":"link","label":"Test Clean Ups","href":"/TUnit/docs/tutorial-extras/cleanup","docId":"tutorial-extras/cleanup","unlisted":false},{"type":"link","label":"Retrying","href":"/TUnit/docs/tutorial-extras/retrying","docId":"tutorial-extras/retrying","unlisted":false},{"type":"link","label":"Repeating","href":"/TUnit/docs/tutorial-extras/repeating","docId":"tutorial-extras/repeating","unlisted":false},{"type":"link","label":"Timeouts","href":"/TUnit/docs/tutorial-extras/timeouts","docId":"tutorial-extras/timeouts","unlisted":false},{"type":"link","label":"Properties","href":"/TUnit/docs/tutorial-extras/properties","docId":"tutorial-extras/properties","unlisted":false},{"type":"link","label":"Test Context","href":"/TUnit/docs/tutorial-extras/test-context","docId":"tutorial-extras/test-context","unlisted":false},{"type":"link","label":"Test Filters","href":"/TUnit/docs/tutorial-extras/test-filters","docId":"tutorial-extras/test-filters","unlisted":false},{"type":"link","label":"Explicit","href":"/TUnit/docs/tutorial-extras/explicit","docId":"tutorial-extras/explicit","unlisted":false},{"type":"link","label":"Not in Parallel","href":"/TUnit/docs/tutorial-extras/not-in-parallel","docId":"tutorial-extras/not-in-parallel","unlisted":false},{"type":"link","label":"Depends On","href":"/TUnit/docs/tutorial-extras/depends-on","docId":"tutorial-extras/depends-on","unlisted":false},{"type":"link","label":"Ordering Tests","href":"/TUnit/docs/tutorial-extras/order","docId":"tutorial-extras/order","unlisted":false},{"type":"link","label":"Parallel Limiter","href":"/TUnit/docs/tutorial-extras/parallel-limiter","docId":"tutorial-extras/parallel-limiter","unlisted":false},{"type":"link","label":"Executors","href":"/TUnit/docs/tutorial-extras/executors","docId":"tutorial-extras/executors","unlisted":false},{"type":"link","label":"Class Constructor Helpers","href":"/TUnit/docs/tutorial-extras/class-constructors","docId":"tutorial-extras/class-constructors","unlisted":false}],"href":"/TUnit/docs/category/tutorial---extras"},{"type":"category","label":"Extensions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Extensions","href":"/TUnit/docs/extensions/cleanup","docId":"extensions/cleanup","unlisted":false}],"href":"/TUnit/docs/category/extensions"},{"type":"category","label":"Tutorial - Assertions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Awaiting","href":"/TUnit/docs/tutorial-assertions/awaiting","docId":"tutorial-assertions/awaiting","unlisted":false},{"type":"link","label":"And Conditions","href":"/TUnit/docs/tutorial-assertions/and-conditions","docId":"tutorial-assertions/and-conditions","unlisted":false},{"type":"link","label":"Or Conditions","href":"/TUnit/docs/tutorial-assertions/or-conditions","docId":"tutorial-assertions/or-conditions","unlisted":false},{"type":"link","label":"Type Checking","href":"/TUnit/docs/tutorial-assertions/type-checking","docId":"tutorial-assertions/type-checking","unlisted":false},{"type":"link","label":"Delegates","href":"/TUnit/docs/tutorial-assertions/delegates","docId":"tutorial-assertions/delegates","unlisted":false},{"type":"link","label":"Congratulations","href":"/TUnit/docs/tutorial-assertions/congratulations","docId":"tutorial-assertions/congratulations","unlisted":false}],"href":"/TUnit/docs/category/tutorial---assertions"},{"type":"category","label":"Test Framework Comparisons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Attributes","href":"/TUnit/docs/comparison/attributes","docId":"comparison/attributes","unlisted":false},{"type":"link","label":"Framework Differences","href":"/TUnit/docs/comparison/framework-differences","docId":"comparison/framework-differences","unlisted":false}],"href":"/TUnit/docs/category/test-framework-comparisons"}]},"docs":{"comparison/attributes":{"id":"comparison/attributes","title":"Attributes","description":"Here are TUnit\'s equivalent attributes to other test frameworks.","sidebar":"tutorialSidebar"},"comparison/framework-differences":{"id":"comparison/framework-differences","title":"Framework Differences","description":"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.","sidebar":"tutorialSidebar"},"extensions/cleanup":{"id":"extensions/cleanup","title":"Extensions","description":"As TUnit is built on top of Microsoft.Testing.Platform, it can tap into generic testing extension packages.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Intro","description":"TUnit is another testing framework for .NET 8 and up.","sidebar":"tutorialSidebar"},"tutorial-assertions/and-conditions":{"id":"tutorial-assertions/and-conditions","title":"And Conditions","description":"TUnit can chain assertions together, using the And property. This reads very much like English, and aims to keep the test easy to read and understand, and doesn\'t require you repeat boilerplate code such as Assert.That over and over.","sidebar":"tutorialSidebar"},"tutorial-assertions/awaiting":{"id":"tutorial-assertions/awaiting","title":"Awaiting","description":"In TUnit, the await keyword is responsible for performing the assertion.","sidebar":"tutorialSidebar"},"tutorial-assertions/congratulations":{"id":"tutorial-assertions/congratulations","title":"Congratulations","description":"That\'s all you need to know about assertions.","sidebar":"tutorialSidebar"},"tutorial-assertions/delegates":{"id":"tutorial-assertions/delegates","title":"Delegates","description":"TUnit can execute your delegates for you, and this allows you to assert on the data returned (if any was) - Or on any exceptions thrown:","sidebar":"tutorialSidebar"},"tutorial-assertions/or-conditions":{"id":"tutorial-assertions/or-conditions","title":"Or Conditions","description":"Similar to the And property, there is also the Or property.","sidebar":"tutorialSidebar"},"tutorial-assertions/type-checking":{"id":"tutorial-assertions/type-checking","title":"Type Checking","description":"TUnit assertions try to check the types at compile time.","sidebar":"tutorialSidebar"},"tutorial-basics/congratulations":{"id":"tutorial-basics/congratulations","title":"Congratulations!","description":"You have just learned the basics of writing a test in TUnit.","sidebar":"tutorialSidebar"},"tutorial-basics/data-driven-tests":{"id":"tutorial-basics/data-driven-tests","title":"Data Driven Tests","description":"It\'s common to want to repeat tests but pass in different values on each execution.","sidebar":"tutorialSidebar"},"tutorial-basics/data-source-driven-tests":{"id":"tutorial-basics/data-source-driven-tests","title":"Data Source Driven Tests","description":"A limitation of passing data in with [Arguments(...)] is that the data must be constant values. For example, we can\'t new up an object and pass it into this attribute as an argument. This is a constraint of the language and we can\'t change that.","sidebar":"tutorialSidebar"},"tutorial-basics/installing":{"id":"tutorial-basics/installing","title":"Installing TUnit","description":"First create an empty .NET console application:","sidebar":"tutorialSidebar"},"tutorial-basics/matrix-tests":{"id":"tutorial-basics/matrix-tests","title":"Matrix Tests","description":"Combinative tests can take multiple values for different arguments, and then generate every possible combination of all of those arguments.","sidebar":"tutorialSidebar"},"tutorial-basics/running-your-tests":{"id":"tutorial-basics/running-your-tests","title":"Running your tests","description":"As TUnit is built on-top of the newer Microsoft.Testing.Platform, and combined with the fact that TUnit tests are source generated, running your tests is available in a variety of ways.","sidebar":"tutorialSidebar"},"tutorial-basics/things-to-know":{"id":"tutorial-basics/things-to-know","title":"Things to know","description":"TUnit has made some decisions by design. You may need to know about them:","sidebar":"tutorialSidebar"},"tutorial-basics/writing-your-first-test":{"id":"tutorial-basics/writing-your-first-test","title":"Writing your first test","description":"Start by creating a new class:","sidebar":"tutorialSidebar"},"tutorial-extras/class-constructors":{"id":"tutorial-extras/class-constructors","title":"Class Constructor Helpers","description":"Some test suites might be more complex than others, and a user may want control over \'newing\' up their test classes.","sidebar":"tutorialSidebar"},"tutorial-extras/cleanup":{"id":"tutorial-extras/cleanup","title":"Test Clean Ups","description":"TUnit supports having your test class implement IDisposable or IAsyncDisposable. These will be called after your test has finished executing. However, using the attributes below offers better support for running multiple methods, and without having to implement your own try/catch logic. Every [After] method will be run, and any exceptions will be lazily thrown afterwards.","sidebar":"tutorialSidebar"},"tutorial-extras/depends-on":{"id":"tutorial-extras/depends-on","title":"Depends On","description":"A test can depend on another test. This means that your test will not start unless the other test has finished.","sidebar":"tutorialSidebar"},"tutorial-extras/executors":{"id":"tutorial-extras/executors","title":"Executors","description":"In some advanced cases, you may need to control how a test or hook is executed.","sidebar":"tutorialSidebar"},"tutorial-extras/explicit":{"id":"tutorial-extras/explicit","title":"Explicit","description":"If you want a test to only be run explicitly (and not part of all general tests) then you can add the [ExplicitAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/not-in-parallel":{"id":"tutorial-extras/not-in-parallel","title":"Not in Parallel","description":"By default, TUnit tests will run in parallel.","sidebar":"tutorialSidebar"},"tutorial-extras/order":{"id":"tutorial-extras/order","title":"Ordering Tests","description":"By default, TUnit tests will run in parallel. This means there is no order and it doesn\'t make sense to be able to control that.","sidebar":"tutorialSidebar"},"tutorial-extras/parallel-limiter":{"id":"tutorial-extras/parallel-limiter","title":"Parallel Limiter","description":"TUnit allows the user to control the parallel limit on a test, class or assembly level.","sidebar":"tutorialSidebar"},"tutorial-extras/properties":{"id":"tutorial-extras/properties","title":"Properties","description":"Custom properties can be added to a test using the [PropertyAttribute].","sidebar":"tutorialSidebar"},"tutorial-extras/repeating":{"id":"tutorial-extras/repeating","title":"Repeating","description":"If you want to repeat a test, add a [RepeatAttribute] onto your test method or class. This takes an int of how many times you\'d like to repeat. Each repeat will show in the test explorer as a new test.","sidebar":"tutorialSidebar"},"tutorial-extras/retrying":{"id":"tutorial-extras/retrying","title":"Retrying","description":"Unfortunately sometimes our tests hit issues. It could be a blip on the network, but that could cause our entire test suite to fail which is frustrating.","sidebar":"tutorialSidebar"},"tutorial-extras/setup":{"id":"tutorial-extras/setup","title":"Test Set Ups","description":"Most setup for a test can be performed in the constructor (think setting up mocks, assigning fields.)","sidebar":"tutorialSidebar"},"tutorial-extras/test-context":{"id":"tutorial-extras/test-context","title":"Test Context","description":"All tests have a TestContext object available to them.","sidebar":"tutorialSidebar"},"tutorial-extras/test-filters":{"id":"tutorial-extras/test-filters","title":"Test Filters","description":"Running TUnit via dotnet run supports test filters.","sidebar":"tutorialSidebar"},"tutorial-extras/timeouts":{"id":"tutorial-extras/timeouts","title":"Timeouts","description":"If you want to stop a test after a specified amount of time, add a [TimeoutAttribute] onto your test method or class. This takes an int of how many milliseconds a test can execute for.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/9f69b8de.cdc93977.js b/assets/js/9f69b8de.5e8226a8.js similarity index 52% rename from assets/js/9f69b8de.cdc93977.js rename to assets/js/9f69b8de.5e8226a8.js index e6997555bb..fffac3b748 100644 --- a/assets/js/9f69b8de.cdc93977.js +++ b/assets/js/9f69b8de.5e8226a8.js @@ -1 +1 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8642],{3726:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Extensions","slug":"/category/extensions","permalink":"/TUnit/docs/category/extensions","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Class Constructor Helpers","permalink":"/TUnit/docs/tutorial-extras/class-constructors"},"next":{"title":"Extensions","permalink":"/TUnit/docs/extensions/cleanup"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8642],{3726:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Extensions","slug":"/category/extensions","permalink":"/TUnit/docs/category/extensions","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Framework Differences","permalink":"/TUnit/docs/comparison/framework-differences"},"next":{"title":"Extensions","permalink":"/TUnit/docs/extensions/"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/f08d5324.0d89f896.js b/assets/js/f08d5324.0d89f896.js new file mode 100644 index 0000000000..2f84f7c291 --- /dev/null +++ b/assets/js/f08d5324.0d89f896.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[5803],{1010:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=s(4848),i=s(8453);const a={sidebar_position:2},r="Framework Differences",o={id:"comparison/framework-differences",title:"Framework Differences",description:"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.",source:"@site/docs/comparison/framework-differences.md",sourceDirName:"comparison",slug:"/comparison/framework-differences",permalink:"/TUnit/docs/comparison/framework-differences",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Attributes",permalink:"/TUnit/docs/comparison/attributes"},next:{title:"Extensions",permalink:"/TUnit/docs/category/extensions"}},l={},c=[{value:"xUnit",id:"xunit",level:2},{value:"Async tests parallel limit",id:"async-tests-parallel-limit",level:3},{value:"Set up and tear downs",id:"set-up-and-tear-downs",level:3},{value:"Assembly level hooks",id:"assembly-level-hooks",level:3},{value:"TestContext",id:"testcontext",level:3},{value:"Assertions",id:"assertions",level:3},{value:"NUnit",id:"nunit",level:2},{value:"Shared test class instances",id:"shared-test-class-instances",level:3},{value:"Setting properties based off of dynamically injected data",id:"setting-properties-based-off-of-dynamically-injected-data",level:3},{value:"Assembly & class level attributes",id:"assembly--class-level-attributes",level:3},{value:"Assertions",id:"assertions-1",level:3},{value:"Other",id:"other",level:2},{value:"Source generated + Native AOT Support + Single File Support",id:"source-generated--native-aot-support--single-file-support",level:3},{value:"More lifecycle hooks",id:"more-lifecycle-hooks",level:3},{value:"Test dependencies",id:"test-dependencies",level:3},{value:"Class Arguments",id:"class-arguments",level:3}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"framework-differences",children:"Framework Differences"})}),"\n",(0,n.jsx)(t.p,{children:"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.\nSo you'll be asking why use TUnit instead of them, right?\nHere are some things I've stumbled across in the past that I've found limiting when writing a test suite."}),"\n",(0,n.jsx)(t.h2,{id:"xunit",children:"xUnit"}),"\n",(0,n.jsx)(t.h3,{id:"async-tests-parallel-limit",children:"Async tests parallel limit"}),"\n",(0,n.jsxs)(t.p,{children:["xUnit gives you a way to limit the 'thread count' - but this doesn't map 1-to-1 to async tests. 1 thread can run multiple async tests when they yield, and that means limiting the thread count doesn't limit the test count. This can be problematic in certain scenarios. For example, running UI tests, you might want to limit the number of concurrent tests because spawning up too many browser instances overwhelms your system. With TUnit, you can pass in a CLI flag to limit the number of concurrent tests: ",(0,n.jsx)(t.code,{children:"--maximum-parallel-tests 8"})]}),"\n",(0,n.jsx)(t.h3,{id:"set-up-and-tear-downs",children:"Set up and tear downs"}),"\n",(0,n.jsxs)(t.p,{children:["Set ups and tear-downs work largely off of constructors and the ",(0,n.jsx)(t.code,{children:"IDisposable"})," interface (TUnit can do this too if you like this pattern). If you have async requirements, you can implement an ",(0,n.jsx)(t.code,{children:"IAsyncLifetime"})," interface. While some people like this approach as its familiar, things get messier when your classes rely on inheritance. If your base class uses these interfaces, you have to then hide the base members, implement your version, and then call the base method manually. Also with tear downs, if you want to guarantee execution of multiple pieces of code, you can't implement the interface multiple times. So you end up having to do lots of try/catches. In TUnit, you can declare multiple methods with ",(0,n.jsx)(t.code,{children:"[After(Test)]"})," attributes, and they are all guaranteed to run, even if a previous one failed. And it'll lazily aggregate and throw any exceptions after they've all run. On top of this, any set ups and tear downs are collected all the way down to the base class, and run in an order than means members are initialised and cleaned up that makes sense:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"For set ups, that means base set up methods are run first, and then the subsequent inherited class's methods"}),"\n",(0,n.jsx)(t.li,{children:"For clean ups, the top most clean ups are run first, and then the subsequent base methods"}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"assembly-level-hooks",children:"Assembly level hooks"}),"\n",(0,n.jsxs)(t.p,{children:["There isn't a simplistic way to do something on starting an assembly's tests. For example, we might want to spin up 1 in-memory server to run some tests against. TUnit supports this with a simple static class, with a method containing the attribute ",(0,n.jsx)(t.code,{children:"[Before(Assembly)]"}),". Tear down is as simple as another method with ",(0,n.jsx)(t.code,{children:"[After(Assembly)]"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"testcontext",children:"TestContext"}),"\n",(0,n.jsxs)(t.p,{children:["Sometimes we want to access information about the state of a test. For example, when running UI tests, I like to take a screenshot on a test failure, so I can more easily see what went wrong. xUnit does not have a native way of determining if a test failed when you're in a tear down method. With TUnit, you can inject in a ",(0,n.jsx)(t.code,{children:"TestContext"})," object into your tear down method, or you can call the static ",(0,n.jsx)(t.code,{children:"TestContext.Current"})," static method."]}),"\n",(0,n.jsx)(t.h3,{id:"assertions",children:"Assertions"}),"\n",(0,n.jsx)(t.p,{children:"xUnit assertions are fairly basic and have the problem of it being unclear which argument goes in which position, without sifting through intellisense/documentation."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:"var one = 2;\nAssert.Equal(1, one)\nAssert.Equal(one, 1)\n"})}),"\n",(0,n.jsx)(t.h2,{id:"nunit",children:"NUnit"}),"\n",(0,n.jsx)(t.h3,{id:"shared-test-class-instances",children:"Shared test class instances"}),"\n",(0,n.jsxs)(t.p,{children:["This one has bitten me so many times, and I've seen it bite many others too. And a lot of people don't even know it. But the default behaviour of NUnit is to run all your tests within a class, against a single instance of that class. That means if you're storing state in fields/properties, they're going to be left over from previous tests.\nThis is what I call leaky test states, and I am firmly against it. Tests should be isolated from one another and really unable to affect one another. So TUnit by design runs every test against a new instance, and there is no way to change that because I consider it bad practice. If you want to share state in a field, then that's entirely possible by making it ",(0,n.jsx)(t.code,{children:"static"}),". By utilising the language instead, it makes it clear to anyone reading it whether multiple tests can access that."]}),"\n",(0,n.jsx)(t.h3,{id:"setting-properties-based-off-of-dynamically-injected-data",children:"Setting properties based off of dynamically injected data"}),"\n",(0,n.jsx)(t.p,{children:"I had a scenario in a multi-tenanted test suite where tests tests were repeated with different tenants injected in.\nLike this:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:"[TestFixtureSource(typeof(Tenant), nameof(Tenant.AllTenants))]\npublic class MyTests(Tenant tenant)\n{\n [Test]\n public async Task Test1()\n {\n ...\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["With this, I wanted to be able to filter by the tenant. So I tried using a custom attribute with ",(0,n.jsx)(t.code,{children:"IApplyToTest"})," and setting a property based on the constructor argument. This didn't work. I think they're enumerated upon starting, and so you can't set this up beforehand. With TUnit, tests are enumerated and initialised via source-generation so this is all done up-front. So I could set a property in TUnit with an attribute with ",(0,n.jsx)(t.code,{children:"IOnTestDiscoveryAttribute"}),", set a property based constructor arguments, and then run ",(0,n.jsx)(t.code,{children:"dotnet run --treenode-filter /*/*/*/*[Tenant=MyTenant]"})]}),"\n",(0,n.jsx)(t.h3,{id:"assembly--class-level-attributes",children:"Assembly & class level attributes"}),"\n",(0,n.jsxs)(t.p,{children:["Want to use the ",(0,n.jsx)(t.code,{children:"[Repeat]"})," or ",(0,n.jsx)(t.code,{children:"[Retry]"})," attributes on a class? Or even an assembly? You can't. They're only supported for test methods. With TUnit, most attributes are supported at Test, Class & Assembly levels. Test takes the highest priority, then class, then assembly. So you could set defaults with an assembly/class attribute, and then override it for certain tests by setting that same attribute on the test."]}),"\n",(0,n.jsx)(t.h3,{id:"assertions-1",children:"Assertions"}),"\n",(0,n.jsxs)(t.p,{children:["NUnit assertions largely influenced the way that TUnit assertions work. However, NUnit assertions do not have compile time checks. I could check if a string is negative (",(0,n.jsx)(t.code,{children:'NUnitAssert.That("String", Is.Negative);'}),") or if a boolean throws an exception (",(0,n.jsx)(t.code,{children:"NUnitAssert.That(true, Throws.ArgumentException);"}),"). These assertions don't make sense. There are analyzers to help catch these - But they will compile if these analyzers aren't run. TUnit assertions are built with the type system in mind (where possible!). Specific assertions are built via extensions to the relevant types, and not in a generic sense that could apply to anything. That means when you're using intellisense to see what methods you have available, you should only see assertions that are relevant for your type. This makes it harder to make mistakes, and decreases your feedback loop time."]}),"\n",(0,n.jsx)(t.h2,{id:"other",children:"Other"}),"\n",(0,n.jsx)(t.h3,{id:"source-generated--native-aot-support--single-file-support",children:"Source generated + Native AOT Support + Single File Support"}),"\n",(0,n.jsx)(t.p,{children:"As mentioned, TUnit is source generated. This should mean things are fast. And you can check out the generated code yourself! Because tests are source generated and not scanned via reflection, this means you can build your test projects using Native AOT or as a Single File application - Something that you can't current do with NUnit or xUnit."}),"\n",(0,n.jsx)(t.h3,{id:"more-lifecycle-hooks",children:"More lifecycle hooks"}),"\n",(0,n.jsx)(t.p,{children:"TUnit has tried to make it easy to hook into a range of lifecycles.\nThe attributes you can use on your hook methods are:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Test)]"})," - Run before every test in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Test)]"})," - Run after every test in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Class)]"})," - Run once before all tests in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Class)]"})," - Run once after all tests in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Assembly)]"})," - Run once before all tests in the assembly it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Assembly)]"})," - Run once after all tests in the assembly it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(TestSession)]"})," - Run once before all tests in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(TestSession)]"})," - Run once after all tests in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(TestDiscovery)]"})," - Run once before any tests are discovered"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(TestDiscovery)]"})," - Run once after all tests are discovered"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Test)]"})," - Run before every test in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Test)]"})," - Run after every test in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Class)]"})," - Run before the first test in every class in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Class)]"})," - Run after the last test in every class in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Assembly)]"})," - Run before the first test in every assembly in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Assembly)]"})," - Run after the last test in every assembly in the test run"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["And all those hooks allow injecting in a relevant ",(0,n.jsx)(t.code,{children:"[HookType]Context"})," object - So you can interrogate it for information about the test run so far. Hopefully meeting the needs of most users!"]}),"\n",(0,n.jsx)(t.h3,{id:"test-dependencies",children:"Test dependencies"}),"\n",(0,n.jsxs)(t.p,{children:["Got tests that require another test to execute first?\nIn other frameworks it usually involves turning off parallelisation, then setting an ",(0,n.jsx)(t.code,{children:"[Order]"})," attribute with 1, 2, 3, etc.\nIn TUnit, you can use a ",(0,n.jsx)(t.code,{children:"[DependsOn(...)]"})," attribute. That test will wait to start, only once its dependencies have finished. And you don't have to turn off parallelisation of other tests!"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:" [Test]\n public async Task Test1()\n {\n ...\n }\n \n [Test]\n public async Task Test2()\n {\n ...\n }\n \n [Test]\n [DependsOn(nameof(Test1))]\n [DependsOn(nameof(Test2))]\n public async Task Test3()\n {\n ...\n }\n"})}),"\n",(0,n.jsx)(t.h3,{id:"class-arguments",children:"Class Arguments"}),"\n",(0,n.jsxs)(t.p,{children:["A lot of the data injection mechanisms in xUnit/NUnit work for the method, or the class, and not vice-versa. With TUnit, you can use ",(0,n.jsx)(t.code,{children:"[Arguments(...)]"})," or ",(0,n.jsx)(t.code,{children:"[Matrix(...)]"})," or ",(0,n.jsx)(t.code,{children:"[MethodDataSource(...)]"})," etc. for both classes and test methods, making it super flexible!"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>o});var n=s(6540);const i={},a=n.createContext(i);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f08d5324.578bc1cc.js b/assets/js/f08d5324.578bc1cc.js deleted file mode 100644 index efc8582b53..0000000000 --- a/assets/js/f08d5324.578bc1cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[5803],{1010:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=s(4848),i=s(8453);const a={sidebar_position:2},r="Framework Differences",o={id:"comparison/framework-differences",title:"Framework Differences",description:"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.",source:"@site/docs/comparison/framework-differences.md",sourceDirName:"comparison",slug:"/comparison/framework-differences",permalink:"/TUnit/docs/comparison/framework-differences",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Attributes",permalink:"/TUnit/docs/comparison/attributes"}},l={},c=[{value:"xUnit",id:"xunit",level:2},{value:"Async tests parallel limit",id:"async-tests-parallel-limit",level:3},{value:"Set up and tear downs",id:"set-up-and-tear-downs",level:3},{value:"Assembly level hooks",id:"assembly-level-hooks",level:3},{value:"TestContext",id:"testcontext",level:3},{value:"Assertions",id:"assertions",level:3},{value:"NUnit",id:"nunit",level:2},{value:"Shared test class instances",id:"shared-test-class-instances",level:3},{value:"Setting properties based off of dynamically injected data",id:"setting-properties-based-off-of-dynamically-injected-data",level:3},{value:"Assembly & class level attributes",id:"assembly--class-level-attributes",level:3},{value:"Assertions",id:"assertions-1",level:3},{value:"Other",id:"other",level:2},{value:"Source generated + Native AOT Support + Single File Support",id:"source-generated--native-aot-support--single-file-support",level:3},{value:"More lifecycle hooks",id:"more-lifecycle-hooks",level:3},{value:"Test dependencies",id:"test-dependencies",level:3},{value:"Class Arguments",id:"class-arguments",level:3}];function d(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"framework-differences",children:"Framework Differences"})}),"\n",(0,n.jsx)(t.p,{children:"TUnit is inspired by NUnit and xUnit, and first and foremost I want to say that these are amazing frameworks and no hate to them.\nSo you'll be asking why use TUnit instead of them, right?\nHere are some things I've stumbled across in the past that I've found limiting when writing a test suite."}),"\n",(0,n.jsx)(t.h2,{id:"xunit",children:"xUnit"}),"\n",(0,n.jsx)(t.h3,{id:"async-tests-parallel-limit",children:"Async tests parallel limit"}),"\n",(0,n.jsxs)(t.p,{children:["xUnit gives you a way to limit the 'thread count' - but this doesn't map 1-to-1 to async tests. 1 thread can run multiple async tests when they yield, and that means limiting the thread count doesn't limit the test count. This can be problematic in certain scenarios. For example, running UI tests, you might want to limit the number of concurrent tests because spawning up too many browser instances overwhelms your system. With TUnit, you can pass in a CLI flag to limit the number of concurrent tests: ",(0,n.jsx)(t.code,{children:"--maximum-parallel-tests 8"})]}),"\n",(0,n.jsx)(t.h3,{id:"set-up-and-tear-downs",children:"Set up and tear downs"}),"\n",(0,n.jsxs)(t.p,{children:["Set ups and tear-downs work largely off of constructors and the ",(0,n.jsx)(t.code,{children:"IDisposable"})," interface (TUnit can do this too if you like this pattern). If you have async requirements, you can implement an ",(0,n.jsx)(t.code,{children:"IAsyncLifetime"})," interface. While some people like this approach as its familiar, things get messier when your classes rely on inheritance. If your base class uses these interfaces, you have to then hide the base members, implement your version, and then call the base method manually. Also with tear downs, if you want to guarantee execution of multiple pieces of code, you can't implement the interface multiple times. So you end up having to do lots of try/catches. In TUnit, you can declare multiple methods with ",(0,n.jsx)(t.code,{children:"[After(Test)]"})," attributes, and they are all guaranteed to run, even if a previous one failed. And it'll lazily aggregate and throw any exceptions after they've all run. On top of this, any set ups and tear downs are collected all the way down to the base class, and run in an order than means members are initialised and cleaned up that makes sense:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"For set ups, that means base set up methods are run first, and then the subsequent inherited class's methods"}),"\n",(0,n.jsx)(t.li,{children:"For clean ups, the top most clean ups are run first, and then the subsequent base methods"}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"assembly-level-hooks",children:"Assembly level hooks"}),"\n",(0,n.jsxs)(t.p,{children:["There isn't a simplistic way to do something on starting an assembly's tests. For example, we might want to spin up 1 in-memory server to run some tests against. TUnit supports this with a simple static class, with a method containing the attribute ",(0,n.jsx)(t.code,{children:"[Before(Assembly)]"}),". Tear down is as simple as another method with ",(0,n.jsx)(t.code,{children:"[After(Assembly)]"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"testcontext",children:"TestContext"}),"\n",(0,n.jsxs)(t.p,{children:["Sometimes we want to access information about the state of a test. For example, when running UI tests, I like to take a screenshot on a test failure, so I can more easily see what went wrong. xUnit does not have a native way of determining if a test failed when you're in a tear down method. With TUnit, you can inject in a ",(0,n.jsx)(t.code,{children:"TestContext"})," object into your tear down method, or you can call the static ",(0,n.jsx)(t.code,{children:"TestContext.Current"})," static method."]}),"\n",(0,n.jsx)(t.h3,{id:"assertions",children:"Assertions"}),"\n",(0,n.jsx)(t.p,{children:"xUnit assertions are fairly basic and have the problem of it being unclear which argument goes in which position, without sifting through intellisense/documentation."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:"var one = 2;\nAssert.Equal(1, one)\nAssert.Equal(one, 1)\n"})}),"\n",(0,n.jsx)(t.h2,{id:"nunit",children:"NUnit"}),"\n",(0,n.jsx)(t.h3,{id:"shared-test-class-instances",children:"Shared test class instances"}),"\n",(0,n.jsxs)(t.p,{children:["This one has bitten me so many times, and I've seen it bite many others too. And a lot of people don't even know it. But the default behaviour of NUnit is to run all your tests within a class, against a single instance of that class. That means if you're storing state in fields/properties, they're going to be left over from previous tests.\nThis is what I call leaky test states, and I am firmly against it. Tests should be isolated from one another and really unable to affect one another. So TUnit by design runs every test against a new instance, and there is no way to change that because I consider it bad practice. If you want to share state in a field, then that's entirely possible by making it ",(0,n.jsx)(t.code,{children:"static"}),". By utilising the language instead, it makes it clear to anyone reading it whether multiple tests can access that."]}),"\n",(0,n.jsx)(t.h3,{id:"setting-properties-based-off-of-dynamically-injected-data",children:"Setting properties based off of dynamically injected data"}),"\n",(0,n.jsx)(t.p,{children:"I had a scenario in a multi-tenanted test suite where tests tests were repeated with different tenants injected in.\nLike this:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:"[TestFixtureSource(typeof(Tenant), nameof(Tenant.AllTenants))]\npublic class MyTests(Tenant tenant)\n{\n [Test]\n public async Task Test1()\n {\n ...\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["With this, I wanted to be able to filter by the tenant. So I tried using a custom attribute with ",(0,n.jsx)(t.code,{children:"IApplyToTest"})," and setting a property based on the constructor argument. This didn't work. I think they're enumerated upon starting, and so you can't set this up beforehand. With TUnit, tests are enumerated and initialised via source-generation so this is all done up-front. So I could set a property in TUnit with an attribute with ",(0,n.jsx)(t.code,{children:"IOnTestDiscoveryAttribute"}),", set a property based constructor arguments, and then run ",(0,n.jsx)(t.code,{children:"dotnet run --treenode-filter /*/*/*/*[Tenant=MyTenant]"})]}),"\n",(0,n.jsx)(t.h3,{id:"assembly--class-level-attributes",children:"Assembly & class level attributes"}),"\n",(0,n.jsxs)(t.p,{children:["Want to use the ",(0,n.jsx)(t.code,{children:"[Repeat]"})," or ",(0,n.jsx)(t.code,{children:"[Retry]"})," attributes on a class? Or even an assembly? You can't. They're only supported for test methods. With TUnit, most attributes are supported at Test, Class & Assembly levels. Test takes the highest priority, then class, then assembly. So you could set defaults with an assembly/class attribute, and then override it for certain tests by setting that same attribute on the test."]}),"\n",(0,n.jsx)(t.h3,{id:"assertions-1",children:"Assertions"}),"\n",(0,n.jsxs)(t.p,{children:["NUnit assertions largely influenced the way that TUnit assertions work. However, NUnit assertions do not have compile time checks. I could check if a string is negative (",(0,n.jsx)(t.code,{children:'NUnitAssert.That("String", Is.Negative);'}),") or if a boolean throws an exception (",(0,n.jsx)(t.code,{children:"NUnitAssert.That(true, Throws.ArgumentException);"}),"). These assertions don't make sense. There are analyzers to help catch these - But they will compile if these analyzers aren't run. TUnit assertions are built with the type system in mind (where possible!). Specific assertions are built via extensions to the relevant types, and not in a generic sense that could apply to anything. That means when you're using intellisense to see what methods you have available, you should only see assertions that are relevant for your type. This makes it harder to make mistakes, and decreases your feedback loop time."]}),"\n",(0,n.jsx)(t.h2,{id:"other",children:"Other"}),"\n",(0,n.jsx)(t.h3,{id:"source-generated--native-aot-support--single-file-support",children:"Source generated + Native AOT Support + Single File Support"}),"\n",(0,n.jsx)(t.p,{children:"As mentioned, TUnit is source generated. This should mean things are fast. And you can check out the generated code yourself! Because tests are source generated and not scanned via reflection, this means you can build your test projects using Native AOT or as a Single File application - Something that you can't current do with NUnit or xUnit."}),"\n",(0,n.jsx)(t.h3,{id:"more-lifecycle-hooks",children:"More lifecycle hooks"}),"\n",(0,n.jsx)(t.p,{children:"TUnit has tried to make it easy to hook into a range of lifecycles.\nThe attributes you can use on your hook methods are:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Test)]"})," - Run before every test in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Test)]"})," - Run after every test in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Class)]"})," - Run once before all tests in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Class)]"})," - Run once after all tests in the class it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(Assembly)]"})," - Run once before all tests in the assembly it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(Assembly)]"})," - Run once after all tests in the assembly it's defined in"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(TestSession)]"})," - Run once before all tests in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(TestSession)]"})," - Run once after all tests in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[Before(TestDiscovery)]"})," - Run once before any tests are discovered"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[After(TestDiscovery)]"})," - Run once after all tests are discovered"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Test)]"})," - Run before every test in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Test)]"})," - Run after every test in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Class)]"})," - Run before the first test in every class in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Class)]"})," - Run after the last test in every class in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[BeforeEvery(Assembly)]"})," - Run before the first test in every assembly in the test run"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"[AfterEvery(Assembly)]"})," - Run after the last test in every assembly in the test run"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["And all those hooks allow injecting in a relevant ",(0,n.jsx)(t.code,{children:"[HookType]Context"})," object - So you can interrogate it for information about the test run so far. Hopefully meeting the needs of most users!"]}),"\n",(0,n.jsx)(t.h3,{id:"test-dependencies",children:"Test dependencies"}),"\n",(0,n.jsxs)(t.p,{children:["Got tests that require another test to execute first?\nIn other frameworks it usually involves turning off parallelisation, then setting an ",(0,n.jsx)(t.code,{children:"[Order]"})," attribute with 1, 2, 3, etc.\nIn TUnit, you can use a ",(0,n.jsx)(t.code,{children:"[DependsOn(...)]"})," attribute. That test will wait to start, only once its dependencies have finished. And you don't have to turn off parallelisation of other tests!"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-csharp",children:" [Test]\n public async Task Test1()\n {\n ...\n }\n \n [Test]\n public async Task Test2()\n {\n ...\n }\n \n [Test]\n [DependsOn(nameof(Test1))]\n [DependsOn(nameof(Test2))]\n public async Task Test3()\n {\n ...\n }\n"})}),"\n",(0,n.jsx)(t.h3,{id:"class-arguments",children:"Class Arguments"}),"\n",(0,n.jsxs)(t.p,{children:["A lot of the data injection mechanisms in xUnit/NUnit work for the method, or the class, and not vice-versa. With TUnit, you can use ",(0,n.jsx)(t.code,{children:"[Arguments(...)]"})," or ",(0,n.jsx)(t.code,{children:"[Matrix(...)]"})," or ",(0,n.jsx)(t.code,{children:"[MethodDataSource(...)]"})," etc. for both classes and test methods, making it super flexible!"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>o});var n=s(6540);const i={},a=n.createContext(i);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.62c7c9b7.js b/assets/js/main.62c7c9b7.js new file mode 100644 index 0000000000..afee02c0c5 --- /dev/null +++ b/assets/js/main.62c7c9b7.js @@ -0,0 +1,2 @@ +/*! For license information please see main.62c7c9b7.js.LICENSE.txt */ +(self.webpackChunktunit_docs_site=self.webpackChunktunit_docs_site||[]).push([[8792],{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={"0b7a5dd9":[()=>n.e(1379).then(n.bind(n,773)),"@site/docs/tutorial-basics/data-source-driven-tests.md",773],"0e384e19":[()=>n.e(3976).then(n.bind(n,619)),"@site/docs/intro.md",619],"13e939a4":[()=>n.e(4298).then(n.t.bind(n,6038,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-category-tutorial-extras-153.json",6038],"13f17bf8":[()=>n.e(4761).then(n.bind(n,6660)),"@site/docs/tutorial-extras/order.md",6660],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,7247)),"@theme/DocCategoryGeneratedIndexPage",7247],17896441:[()=>Promise.all([n.e(1869),n.e(9408),n.e(8401)]).then(n.bind(n,8632)),"@theme/DocItem",8632],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,5579)),"@site/src/pages/index.tsx",5579],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(9408),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"2a9ef78c":[()=>n.e(7564).then(n.bind(n,2381)),"@site/docs/tutorial-assertions/congratulations.md",2381],"3609cdcd":[()=>n.e(9069).then(n.bind(n,1075)),"@site/docs/tutorial-basics/matrix-tests.md",1075],"393be207":[()=>n.e(4134).then(n.bind(n,633)),"@site/src/pages/markdown-page.md",633],"49462f00":[()=>n.e(6168).then(n.bind(n,7104)),"@site/docs/tutorial-assertions/or-conditions.md",7104],"4b18aed1":[()=>n.e(2225).then(n.bind(n,5516)),"@site/docs/tutorial-extras/retrying.md",5516],"4c5555c4":[()=>n.e(7969).then(n.t.bind(n,2550,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-category-test-framework-comparisons-ae7.json",2550],"55c176cd":[()=>n.e(7543).then(n.bind(n,680)),"@site/docs/tutorial-extras/test-context.md",680],"58d4c641":[()=>n.e(6458).then(n.bind(n,6729)),"@site/docs/tutorial-basics/data-driven-tests.md",6729],"5c580d35":[()=>n.e(3604).then(n.bind(n,4568)),"@site/docs/tutorial-extras/parallel-limiter.md",4568],"5dbdde90":[()=>n.e(6220).then(n.bind(n,1218)),"@site/docs/tutorial-assertions/awaiting.md",1218],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"6a12013c":[()=>n.e(5770).then(n.t.bind(n,5627,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-category-tutorial-assertions-fd2.json",5627],"6a21048e":[()=>n.e(9814).then(n.bind(n,9130)),"@site/docs/comparison/attributes.md",9130],"73e1c817":[()=>n.e(6866).then(n.t.bind(n,2878,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-category-tutorial-basics-580.json",2878],"7c0d1a7d":[()=>n.e(3818).then(n.bind(n,2451)),"@site/docs/tutorial-extras/properties.md",2451],"822bd8ab":[()=>n.e(2748).then(n.bind(n,8611)),"@site/docs/tutorial-basics/congratulations.md",8611],"85aaec92":[()=>n.e(9081).then(n.bind(n,5020)),"@site/docs/tutorial-extras/cleanup.md",5020],"8b1309c7":[()=>n.e(3398).then(n.bind(n,380)),"@site/docs/tutorial-extras/class-constructors.md",380],"8b247495":[()=>n.e(8732).then(n.bind(n,8778)),"@site/docs/tutorial-extras/executors.md",8778],"8ff4cdb2":[()=>n.e(2590).then(n.bind(n,2056)),"@site/docs/extensions/extensions.md",2056],"914d3ab3":[()=>n.e(6532).then(n.t.bind(n,7136,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-10b.json",7136],"9f69b8de":[()=>n.e(8642).then(n.t.bind(n,3726,19)),"@generated/docusaurus-plugin-content-docs/default/p/t-unit-docs-category-extensions-aca.json",3726],a34b2a44:[()=>n.e(6538).then(n.bind(n,4077)),"@site/docs/tutorial-extras/not-in-parallel.md",4077],a66eab3e:[()=>n.e(9372).then(n.bind(n,7642)),"@site/docs/tutorial-assertions/delegates.md",7642],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,1723)),"@theme/DocVersionRoot",1723],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],b1a8519a:[()=>n.e(1647).then(n.bind(n,7182)),"@site/docs/tutorial-extras/explicit.md",7182],b3030475:[()=>n.e(2473).then(n.bind(n,4374)),"@site/docs/tutorial-basics/writing-your-first-test.md",4374],ba7c896e:[()=>n.e(8584).then(n.bind(n,1653)),"@site/docs/tutorial-basics/things-to-know.md",1653],ba8db043:[()=>n.e(2321).then(n.bind(n,7898)),"@site/docs/tutorial-extras/timeouts.md",7898],be2154f8:[()=>n.e(7846).then(n.bind(n,4056)),"@site/docs/tutorial-extras/test-filters.md",4056],c566dcac:[()=>n.e(2984).then(n.bind(n,9097)),"@site/docs/tutorial-extras/repeating.md",9097],cb1d92ed:[()=>n.e(6617).then(n.bind(n,4421)),"@site/docs/tutorial-extras/depends-on.md",4421],d3238b2f:[()=>n.e(8715).then(n.bind(n,1362)),"@site/docs/tutorial-assertions/and-conditions.md",1362],e10a8de7:[()=>n.e(4956).then(n.bind(n,8903)),"@site/docs/tutorial-basics/running-your-tests.md",8903],e1f02bbc:[()=>n.e(7326).then(n.bind(n,8883)),"@site/docs/tutorial-basics/installing.md",8883],e322696d:[()=>n.e(1114).then(n.bind(n,89)),"@site/docs/tutorial-extras/setup.md",89],f08d5324:[()=>n.e(5803).then(n.bind(n,1010)),"@site/docs/comparison/framework-differences.md",1010],f7b7b503:[()=>n.e(1747).then(n.bind(n,8225)),"@site/docs/tutorial-assertions/type-checking.md",8225]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.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:l,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 s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const l=a.__props;return delete a.__props,(0,s.jsx)(c.W,{value:i,children:(0,s.jsx)(o,{...a,...l,...n})})}})}const f=[{path:"/TUnit/markdown-page",component:d("/TUnit/markdown-page","339"),exact:!0},{path:"/TUnit/docs",component:d("/TUnit/docs","d39"),routes:[{path:"/TUnit/docs",component:d("/TUnit/docs","70a"),routes:[{path:"/TUnit/docs",component:d("/TUnit/docs","cc8"),routes:[{path:"/TUnit/docs/category/extensions",component:d("/TUnit/docs/category/extensions","dca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/category/test-framework-comparisons",component:d("/TUnit/docs/category/test-framework-comparisons","9e0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/category/tutorial---assertions",component:d("/TUnit/docs/category/tutorial---assertions","26f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/category/tutorial---basics",component:d("/TUnit/docs/category/tutorial---basics","f77"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/category/tutorial---extras",component:d("/TUnit/docs/category/tutorial---extras","45e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/comparison/attributes",component:d("/TUnit/docs/comparison/attributes","618"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/comparison/framework-differences",component:d("/TUnit/docs/comparison/framework-differences","39a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/extensions/",component:d("/TUnit/docs/extensions/","0d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/intro",component:d("/TUnit/docs/intro","cdb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/and-conditions",component:d("/TUnit/docs/tutorial-assertions/and-conditions","cde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/awaiting",component:d("/TUnit/docs/tutorial-assertions/awaiting","2ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/congratulations",component:d("/TUnit/docs/tutorial-assertions/congratulations","38b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/delegates",component:d("/TUnit/docs/tutorial-assertions/delegates","3a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/or-conditions",component:d("/TUnit/docs/tutorial-assertions/or-conditions","b61"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-assertions/type-checking",component:d("/TUnit/docs/tutorial-assertions/type-checking","28a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/congratulations",component:d("/TUnit/docs/tutorial-basics/congratulations","548"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/data-driven-tests",component:d("/TUnit/docs/tutorial-basics/data-driven-tests","812"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/data-source-driven-tests",component:d("/TUnit/docs/tutorial-basics/data-source-driven-tests","f27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/installing",component:d("/TUnit/docs/tutorial-basics/installing","366"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/matrix-tests",component:d("/TUnit/docs/tutorial-basics/matrix-tests","728"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/running-your-tests",component:d("/TUnit/docs/tutorial-basics/running-your-tests","c4c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/things-to-know",component:d("/TUnit/docs/tutorial-basics/things-to-know","cbe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-basics/writing-your-first-test",component:d("/TUnit/docs/tutorial-basics/writing-your-first-test","6a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/class-constructors",component:d("/TUnit/docs/tutorial-extras/class-constructors","14d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/cleanup",component:d("/TUnit/docs/tutorial-extras/cleanup","72b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/depends-on",component:d("/TUnit/docs/tutorial-extras/depends-on","d3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/executors",component:d("/TUnit/docs/tutorial-extras/executors","8e9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/explicit",component:d("/TUnit/docs/tutorial-extras/explicit","137"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/not-in-parallel",component:d("/TUnit/docs/tutorial-extras/not-in-parallel","c3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/order",component:d("/TUnit/docs/tutorial-extras/order","732"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/parallel-limiter",component:d("/TUnit/docs/tutorial-extras/parallel-limiter","77f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/properties",component:d("/TUnit/docs/tutorial-extras/properties","8cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/repeating",component:d("/TUnit/docs/tutorial-extras/repeating","580"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/retrying",component:d("/TUnit/docs/tutorial-extras/retrying","52d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/setup",component:d("/TUnit/docs/tutorial-extras/setup","b6e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/test-context",component:d("/TUnit/docs/tutorial-extras/test-context","56b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/test-filters",component:d("/TUnit/docs/tutorial-extras/test-filters","28c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/TUnit/docs/tutorial-extras/timeouts",component:d("/TUnit/docs/tutorial-extras/timeouts","6aa"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/TUnit/",component:d("/TUnit/","d59"),exact:!0},{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})}},7815:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),s=n(4784),l=n(8193);const u=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),d=n(6347),f=n(2831),p=n(4848);function g(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5260),m=n(4586),y=n(6025),b=n(6342),v=n(1003),w=n(2131),x=n(4090);const k="default";var S=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function T(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(T,{}),(0,p.jsx)(E,{}),(0,p.jsx)(_.A,{tag:k,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const A=new Map;var j=n(6125),N=n(6988),O=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 L=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,O.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,f.u)(c.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,p.jsx)(L,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const U=I,F="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",M="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

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

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(U,{location:e,children:q})}function K(){return(0,p.jsx)(W.A,{children:(0,p.jsx)(N.l,{children:(0,p.jsxs)(j.x,{children:[(0,p.jsxs)(g,{children:[(0,p.jsx)(H,{}),(0,p.jsx)(C,{}),(0,p.jsx)($,{}),(0,p.jsx)(Y,{})]}),(0,p.jsx)(G,{})]})})})}var Q=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const 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 X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(o.vd,{children:(0,p.jsx)(ae,{children:(0,p.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/TUnit/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/TUnit/docs","mainDocId":"intro","docs":[{"id":"comparison/attributes","path":"/TUnit/docs/comparison/attributes","sidebar":"tutorialSidebar"},{"id":"comparison/framework-differences","path":"/TUnit/docs/comparison/framework-differences","sidebar":"tutorialSidebar"},{"id":"extensions/extensions","path":"/TUnit/docs/extensions/","sidebar":"tutorialSidebar"},{"id":"intro","path":"/TUnit/docs/intro","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/and-conditions","path":"/TUnit/docs/tutorial-assertions/and-conditions","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/awaiting","path":"/TUnit/docs/tutorial-assertions/awaiting","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/congratulations","path":"/TUnit/docs/tutorial-assertions/congratulations","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/delegates","path":"/TUnit/docs/tutorial-assertions/delegates","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/or-conditions","path":"/TUnit/docs/tutorial-assertions/or-conditions","sidebar":"tutorialSidebar"},{"id":"tutorial-assertions/type-checking","path":"/TUnit/docs/tutorial-assertions/type-checking","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/congratulations","path":"/TUnit/docs/tutorial-basics/congratulations","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/data-driven-tests","path":"/TUnit/docs/tutorial-basics/data-driven-tests","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/data-source-driven-tests","path":"/TUnit/docs/tutorial-basics/data-source-driven-tests","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/installing","path":"/TUnit/docs/tutorial-basics/installing","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/matrix-tests","path":"/TUnit/docs/tutorial-basics/matrix-tests","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/running-your-tests","path":"/TUnit/docs/tutorial-basics/running-your-tests","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/things-to-know","path":"/TUnit/docs/tutorial-basics/things-to-know","sidebar":"tutorialSidebar"},{"id":"tutorial-basics/writing-your-first-test","path":"/TUnit/docs/tutorial-basics/writing-your-first-test","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/class-constructors","path":"/TUnit/docs/tutorial-extras/class-constructors","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/cleanup","path":"/TUnit/docs/tutorial-extras/cleanup","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/depends-on","path":"/TUnit/docs/tutorial-extras/depends-on","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/executors","path":"/TUnit/docs/tutorial-extras/executors","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/explicit","path":"/TUnit/docs/tutorial-extras/explicit","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/not-in-parallel","path":"/TUnit/docs/tutorial-extras/not-in-parallel","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/order","path":"/TUnit/docs/tutorial-extras/order","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/parallel-limiter","path":"/TUnit/docs/tutorial-extras/parallel-limiter","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/properties","path":"/TUnit/docs/tutorial-extras/properties","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/repeating","path":"/TUnit/docs/tutorial-extras/repeating","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/retrying","path":"/TUnit/docs/tutorial-extras/retrying","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/setup","path":"/TUnit/docs/tutorial-extras/setup","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/test-context","path":"/TUnit/docs/tutorial-extras/test-context","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/test-filters","path":"/TUnit/docs/tutorial-extras/test-filters","sidebar":"tutorialSidebar"},{"id":"tutorial-extras/timeouts","path":"/TUnit/docs/tutorial-extras/timeouts","sidebar":"tutorialSidebar"},{"id":"/category/tutorial---basics","path":"/TUnit/docs/category/tutorial---basics","sidebar":"tutorialSidebar"},{"id":"/category/tutorial---extras","path":"/TUnit/docs/category/tutorial---extras","sidebar":"tutorialSidebar"},{"id":"/category/tutorial---assertions","path":"/TUnit/docs/category/tutorial---assertions","sidebar":"tutorialSidebar"},{"id":"/category/test-framework-comparisons","path":"/TUnit/docs/category/test-framework-comparisons","sidebar":"tutorialSidebar"},{"id":"/category/extensions","path":"/TUnit/docs/category/extensions","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/TUnit/docs/intro","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 s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"}}}');var u=n(4848);const c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},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),s=n(781),l=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.rA)(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)(l.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)(s.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),s=n(6654),l=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:v}=(0,i.A)(),{trailingSlash:w,baseUrl:x}=v,k=v.future.experimental_router,{withBaseUrl:S}=(0,c.hH)(),_=(0,u.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const T=f||p;const C=(0,s.A)(T),A=T?.replace("pathname://","");let j=void 0!==A?(N=A,y&&(e=>e.startsWith("/"))(N)?S(N):N):void 0;var N;"hash"===k&&j?.startsWith("./")&&(j=j?.slice(1)),j&&C&&(j=(0,o.Ks)(j,{trailingSlash:w,baseUrl:x}));const O=(0,r.useRef)(!1),P=n?a.k2:a.N_,L=l.A.canUseIntersectionObserver,R=(0,r.useRef)(),I=()=>{O.current||null==j||(window.docusaurus.preload(j),O.current=!0)};(0,r.useEffect)((()=>(!L&&C&&l.A.canUseDOM&&null!=j&&window.docusaurus.prefetch(j),()=>{L&&R.current&&R.current.disconnect()})),[R,j,L,C]);const U=j?.startsWith("#")??!1,F=!b.target||"_self"===b.target,D=!j||!C||!F||U&&"hash"!==k;m||!U&&D||_.collectLink(j),b.id&&_.collectAnchor(b.id);const M={};return D?(0,d.jsx)("a",{ref:E,href:j,...T&&!C&&{target:"_blank",rel:"noopener noreferrer"},...b,...M}):(0,d.jsx)(P,{...b,onMouseEnter:I,onTouchStart:I,innerRef:e=>{E.current=e,L&&e&&C&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),R.current.observe(e))},to:j,...n&&{isActive:h,activeClassName:g},...M})}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:()=>l});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 s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({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=s({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,{Ay:()=>s,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const 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 s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=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),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>m,g1:()=>b});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),s=n(679),l=n(9532),u=n(4848);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function g(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return(0,u.jsx)(p.Provider,{value:n,children:t})}function m(e){let{children:t}=e;return(0,u.jsx)(h,{children:t})}function y(){const e=(0,r.useContext)(p);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>u});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(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)(s.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(s);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},4718:(e,t,n)=>{"use strict";n.d(t,{d1:()=>T,Nr:()=>p,w8:()=>y,$S:()=>g,cC:()=>f,B5:()=>E,Vd:()=>k,QB:()=>_,fW:()=>S,OF:()=>x,Y:()=>v});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),s=n(9169);function l(e){return Array.from(new Set(e))}var u=n(3886),c=n(3025),d=n(609);function f(e){const t=(0,c.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,a.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),m=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,s.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,s.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function x(){const e=(0,d.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,u.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>l([t,n,a].filter(Boolean))),[t,n,a])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function _(e,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- ${l(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,c.r)(),i=t.routes,s=i.find((e=>(0,a.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,u=l?r.docsSidebars[l]:void 0;return{docElement:(0,o.v)(i),sidebarName:l,sidebarItems:u}}function T(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},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 s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(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 s(t)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return l(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>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";var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(3213)(`./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),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,s.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?l.anchorWithHideOnScrollNavbar:l.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),s=n(6347),l=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,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??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),x=n(5041);function k(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){return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const C={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,x.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:C.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:C.announcementBarPlaceholder}),(0,c.jsx)(T,{className:C.announcementBarContent}),o&&(0,c.jsx)(_,{onClick:n,className:C.announcementBarClose})]})}var j=n(9876),N=n(3104);var O=n(9532),P=n(5600);const L=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,P.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,O.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)(L.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function U(){const e=(0,r.useContext)(L);if(!e)throw new O.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}=U();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 D=n(5293),M=n(2303);function z(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 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:"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 $={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,M.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.A)($.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.A)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,c.jsx)(z,{className:(0,a.A)($.toggleIcon,$.lightToggleIcon)}),(0,c.jsx)(B,{className:(0,a.A)($.toggleIcon,$.darkToggleIcon)})]})})}const W=r.memo(H),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,D.G)();return r?null:(0,c.jsx)(W,{className:t,buttonClassName:"dark"===n?V.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,j.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(k,{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:s,prependBaseUrlToHref:l,...u}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(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,{...s&&{width:12,height:12}})]})};return a?(0,c.jsx)(Z.A,{href:l?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),se=n(9169),le=n(4586);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,c.jsxs)("div",{ref:l,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:s.to?void 0:"#",className:(0,a.A)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:s.children??s.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ee,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.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),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Ee,{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),xe=n(4718);var ke=n(3886);function Se(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const _e={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,le.A)(),f=(0,ge.o)(),{search:p,hash:g}=(0,s.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,l.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,xe.QB)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!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,xe.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,xe.Vd)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,s.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:g}=(0,ke.g1)(n),h=[...a,...p.map((function(e){const t=Se(e,f);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...o],m=(0,xe.Vd)(n)[0],y=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&h.length>1?void 0:Se(m,f).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 Ee(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=_e[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Te(){const e=(0,j.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ee,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ce(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ae(){const e=0===(0,w.p)().navbar.items.length,t=U();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ce,{onClick:()=>t.hide()}),t.content]})}function je(){const e=(0,j.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)(Te,{}),secondaryMenu:(0,c.jsx)(Ae,{})}):null}const Ne={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Oe(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,j.M)(),{navbarRef:s,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,N.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?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:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Ne.navbarHideable,!d&&Ne.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Oe,{onClick:i.toggle}),(0,c.jsx)(je,{})]})}var Le=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)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ue(e){let{error:t}=e;const n=(0,Le.rA)(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 De="right";function Me(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 ze(){const{toggle:e,shown:t}=(0,j.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(Me,{})})}const Be={colorModeToggle:"colorModeToggle_DEke"};function $e(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)(Ee,{...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 We(){const e=(0,j.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??De)}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)(ze,{}),(0,c.jsx)(Y,{}),(0,c.jsx)($e,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)($e,{items:r}),(0,c.jsx)(G,{className:Be.colorModeToggle}),!a&&(0,c.jsx)(ve,{children:(0,c.jsx)(ye.A,{})})]})})}function Ve(){return(0,c.jsx)(Pe,{children:(0,c.jsx)(We,{})})}function Ge(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...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.hH)(),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 st=r.memo(it),lt=(0,O.fM)([D.a,x.o,N.Tv,ke.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(P.y_,{children:(0,c.jsx)(j.e,{children:(0,c.jsx)(R,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(lt,{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)(l.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)(Ue,{error:t})})]})})})}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.be,{title:s,description:l}),(0,c.jsx)(v,{}),(0,c.jsx)(A,{}),(0,c.jsx)(Ve,{}),(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)(st,{})]})}},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),s=n(1122),l=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.Ay)(s?.href||"/"),g=n?"":t,h=s?.alt??g;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(u,{logo:s,alt:h,imageClassName:c}),null!=n&&(0,l.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 s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,o.A)(),{colorMode:c}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.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),s=n(4848);const l="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??l}`,height:`${t}px`}}function s(){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?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));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:l,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:c,style:u?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(c.current,n),i?.(n))},className:l,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,u]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&u(t)}),[a,t]),a?(0,s.jsx)(h,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>g});var r=n(6540),a=n(2303),o=n(679),i=n(9532),s=n(6342),l=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,s.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,l.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>m});var r=n(6540),a=n(8193),o=n(9532),i=n(679),s=n(6342),l=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,s.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 l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,l.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}},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),s=n(9532);function l(e){!function(e){const t=(0,i.W6)(),n=(0,s._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,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const c=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!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 s.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>l,y_:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){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[,s]=o,l=(0,a.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>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:()=>s});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!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",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},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 s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=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 s=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,l.hH)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:s}),t&&(0,c.jsx)("meta",{property:"og:title",content:s}),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),s=(0,a.A)(i,t);return(0,c.jsxs)(f.Provider,{value:s,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function g(e){let{children:t}=e;const n=s(),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:()=>s,_q:()=>i,dV:()=>l,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 s(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function 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:()=>s,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 s(){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)),s=n(4848);const l=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,s.jsx)(l.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(l);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?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(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 i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?l:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},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:s}}=(0,r.A)(),{pathname:l}=(0,a.zy)(),u=(0,o.Ks)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),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.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(/[#?]/),s="/"===i||i===r?i:(l=i,u=n,u?a(l):o(l));var l,u;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var a=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(a).default}});var o=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>T,yJ:()=>p,sC:()=>A,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 s=n(1561);function l(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(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}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},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[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 s=l(t),h=l(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,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,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,i(e,c,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(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),s=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,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 s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,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)},5651:()=>{!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var a="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",s="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(o),c=RegExp(l(a+" "+o+" "+i+" "+s)),d=l(o+" "+i+" "+s),f=l(a+" "+o+" "+s),p=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),g=r(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,m=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),y=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,m]),b=/\[\s*(?:,\s*)*\]/.source,v=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[y,b]),w=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,g,b]),x=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),k=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[x,y,b]),S={keyword:c,punctuation:/[<>()?,.:[\]]/},_=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,E=/"(?:\\.|[^\\"\r\n])*"/.source,T=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[E]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,k]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,m]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,f,h]),inside:S}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[g]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,y]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,m,h,k,c.source,g,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[m,g]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(k),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var C=E+"|"+_,A=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[C]),j=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),N=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,O=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[y,j]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[N,O]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[N]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[j]),inside:e.languages.csharp},"class-name":{pattern:RegExp(y),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var P=/:[^}\r\n]+/.source,L=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),R=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[L,P]),I=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[C]),2),U=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[I,P]);function F(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,P]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[R]),lookbehind:!0,greedy:!0,inside:F(R,L)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[U]),lookbehind:!0,greedy:!0,inside:F(U,I)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},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,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=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(s){for(var l=0;l=o.length);l++){var u=s[l];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?s.splice.apply(s,[l,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return s}(n.tokens)}}}})}(Prism)},905:()=>{!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},3213:(e,t,n)=>{var r={"./prism-csharp":5651,"./prism-powershell":905};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=3213},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 s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes: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