From e5edaaeaa35a2fc23e2cd63836aba3c1a54b009c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 13:37:47 +0000 Subject: [PATCH] Deploy to GitHub pages --- 404.html | 15 ++ assets/404.b0d8fe8a.js | 1 + assets/404.html.beaa804c.js | 1 + assets/404.html.bee13de6.js | 1 + assets/Layout.f68faebd.js | 1 + assets/app.22727b9e.js | 8 + assets/automate.html.18b5ee3d.js | 1 + assets/automate.html.f8e0d483.js | 12 ++ assets/back-to-top.8efcbe56.svg | 1 + assets/csharp-script.html.66921e8d.js | 1 + assets/csharp-script.html.b6baa528.js | 37 ++++ assets/getting-started.html.640b3ed8.js | 11 + assets/getting-started.html.a51a07e5.js | 1 + assets/index.html.2aaa5aee.js | 5 + assets/index.html.504c7800.js | 1 + assets/index.html.56e1725b.js | 1 + assets/index.html.710bbd8d.js | 1 + assets/index.html.80ef201c.js | 1 + assets/index.html.c4b28ab0.js | 1 + assets/plugin-vue_export-helper.21dcd24c.js | 1 + assets/search.0782d0d1.svg | 1 + assets/style.217a916a.css | 1 + assets/submodules.html.2b2978a2.js | 8 + assets/submodules.html.7c452965.js | 1 + assets/task-configuration.html.9ea86763.js | 17 ++ assets/task-configuration.html.a73375a6.js | 1 + assets/task-runner.html.5a8991f3.js | 1 + assets/task-runner.html.9b743ad8.js | 83 +++++++ assets/troubleshoot.html.42443789.js | 1 + assets/troubleshoot.html.5431d5aa.js | 1 + assets/with_emojis.4821a031.png | Bin 0 -> 59339 bytes assets/without_emojis.375b51ee.png | Bin 0 -> 29544 bytes assets/workflow.290a20c9.jpg | Bin 0 -> 141515 bytes contribution/index.html | 19 ++ favicon.ico | Bin 0 -> 4286 bytes guide/automate.html | 26 +++ guide/csharp-script.html | 51 +++++ guide/getting-started.html | 25 +++ guide/index.html | 15 ++ guide/submodules.html | 22 ++ guide/task-configuration.html | 31 +++ guide/task-runner.html | 97 +++++++++ guide/troubleshoot.html | 15 ++ index.html | 15 ++ schema.json | 227 ++++++++++++++++++++ troubleshoot/with_emojis.png | Bin 0 -> 59339 bytes troubleshoot/without_emojis.png | Bin 0 -> 29544 bytes workflow.jpg | Bin 0 -> 141515 bytes 48 files changed, 760 insertions(+) create mode 100644 404.html create mode 100644 assets/404.b0d8fe8a.js create mode 100644 assets/404.html.beaa804c.js create mode 100644 assets/404.html.bee13de6.js create mode 100644 assets/Layout.f68faebd.js create mode 100644 assets/app.22727b9e.js create mode 100644 assets/automate.html.18b5ee3d.js create mode 100644 assets/automate.html.f8e0d483.js create mode 100644 assets/back-to-top.8efcbe56.svg create mode 100644 assets/csharp-script.html.66921e8d.js create mode 100644 assets/csharp-script.html.b6baa528.js create mode 100644 assets/getting-started.html.640b3ed8.js create mode 100644 assets/getting-started.html.a51a07e5.js create mode 100644 assets/index.html.2aaa5aee.js create mode 100644 assets/index.html.504c7800.js create mode 100644 assets/index.html.56e1725b.js create mode 100644 assets/index.html.710bbd8d.js create mode 100644 assets/index.html.80ef201c.js create mode 100644 assets/index.html.c4b28ab0.js create mode 100644 assets/plugin-vue_export-helper.21dcd24c.js create mode 100644 assets/search.0782d0d1.svg create mode 100644 assets/style.217a916a.css create mode 100644 assets/submodules.html.2b2978a2.js create mode 100644 assets/submodules.html.7c452965.js create mode 100644 assets/task-configuration.html.9ea86763.js create mode 100644 assets/task-configuration.html.a73375a6.js create mode 100644 assets/task-runner.html.5a8991f3.js create mode 100644 assets/task-runner.html.9b743ad8.js create mode 100644 assets/troubleshoot.html.42443789.js create mode 100644 assets/troubleshoot.html.5431d5aa.js create mode 100644 assets/with_emojis.4821a031.png create mode 100644 assets/without_emojis.375b51ee.png create mode 100644 assets/workflow.290a20c9.jpg create mode 100644 contribution/index.html create mode 100644 favicon.ico create mode 100644 guide/automate.html create mode 100644 guide/csharp-script.html create mode 100644 guide/getting-started.html create mode 100644 guide/index.html create mode 100644 guide/submodules.html create mode 100644 guide/task-configuration.html create mode 100644 guide/task-runner.html create mode 100644 guide/troubleshoot.html create mode 100644 index.html create mode 100644 schema.json create mode 100644 troubleshoot/with_emojis.png create mode 100644 troubleshoot/without_emojis.png create mode 100644 workflow.jpg diff --git a/404.html b/404.html new file mode 100644 index 0000000..0447885 --- /dev/null +++ b/404.html @@ -0,0 +1,15 @@ + + +
+ + + +Husky.Net brings the dev-dependency concept to the .NET ecosystem.
You can attach husky to your project without adding extra dependencies! This way the other contributors will use your pre-configured tasks automatically.
To attach Husky to your project, you can use the following command:
dotnet husky attach <path-to-project-file>
+
This will add the required configuration to your project file.
check out the Manual Attach section for more details.
You can set the HUSKY
environment variable to 0
in order to disable husky in CI/CD pipelines.
To manually attach husky to your project, add the below code to one of your projects (.csproj/.vbproj).
<Target Name="husky" BeforeTargets="Restore;CollectPackageReferences" Condition="'$(HUSKY)' != 0">
+ <Exec Command="dotnet tool restore" StandardOutputImportance="Low" StandardErrorImportance="High"/>
+ <Exec Command="dotnet husky install" StandardOutputImportance="Low" StandardErrorImportance="High"
+ WorkingDirectory="../../" /> <!--Update this to the relative path to your project root dir -->
+</Target>
+
TIP
Make sure to update the working directory depending on your folder structure it should be a relative path to your project root dir
WARNING
Adding the above code to a multiple targeted project will cause husky to run multiple times. e.g <TargetFrameworks>netcoreapp3.1;net5.0;net6.0;net7.0</TargetFrameworks>
to avoid this, you can add the $(IsCrossTargetingBuild)' == 'true'
condition to the target. e.g
<Target Name="husky" BeforeTargets="Restore;CollectPackageReferences" Condition="'$(HUSKY)' != 0 and '$(IsCrossTargetingBuild)' == 'true'">
+...
+
If you are using the npm, add the below code to your package.json file will automatically install husky after the npm install
"scripts": {
+ "prepare": "dotnet tool restore && dotnet husky install"
+ }
+
You can use task runner exec
command to execute a C# script.
e.g
dotnet husky exec <csx-file-path>
+# e.g
+# dotnet husky exec .husky/csx/hello.csx
+
Also, you can use your csx scripts in your tasks.
{
+ "command": "dotnet",
+ "args": ["husky", "exec", ".husky/csx/hello.csx"]
+}
+
This repo is using a csharp script to lint the commit messages, you can check it here:
`,9),k={href:"https://github.com/alirezanet/Husky.Net/blob/master/.husky/csx/commit-lint.csx",target:"_blank",rel:"noopener noreferrer"},m=t("commit-lint.csx"),b=n(`using System.Text.RegularExpressions;
+
+private var pattern = @"^(?=.{1,90}$)(?:build|feat|ci|chore|docs|fix|perf|refactor|revert|style|test)(?:\\(.+\\))*(?::).{4,}(?:#\\d+)*(?<![\\.\\s])$";
+private var msg = File.ReadAllLines(Args[0])[0];
+
+if (Regex.IsMatch(msg, pattern))
+ return 0;
+
+Console.ForegroundColor = ConsoleColor.Red;
+Console.WriteLine("Invalid commit message");
+Console.ResetColor();
+Console.WriteLine("e.g: 'feat(scope): subject' or 'fix: subject'");
+Console.ForegroundColor = ConsoleColor.Gray;
+Console.WriteLine("more info: https://www.conventionalcommits.org/en/v1.0.0/");
+
+return 1;
+
#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+dotnet husky run --name "commit-message-linter" --args "$1"
+echo
+echo Great work! \u{1F942}
+echo
+
],
+ "tasks": [
+ {
+ "name": "commit-message-linter",
+ "command": "dotnet",
+ "args": ["husky", "exec", ".husky/csx/commit-lint.csx", "--args", "\${args}"]
+
cd <Your project root directory>
+dotnet husky install
+
TIP
With the global installation, you don't need to add the dotnet
prefix to the commands.
dotnet husky add pre-commit -c "echo 'Husky.Net is awesome!'"
+git add .husky/pre-commit
+
git commit -m "Keep calm and commit"
+# \`echo 'Husky.Net is awesome!'\` will run every time you commit
+
Any kind of contribution is welcome.
start contributing to the project by submitting pull requests
Husky.Net documentation is powered by vuePress, All the markdown source files are placed in docs
directory.
by running the following commands, you can run the documentation site locally:
',8),m=e("div",{class:"language-cmd ext-cmd line-numbers-mode"},[e("pre",{class:"language-cmd"},[e("code",null,`yarn install +yarn dev +`)]),e("div",{class:"line-numbers"},[e("span",{class:"line-number"},"1"),e("br"),e("span",{class:"line-number"},"2"),e("br")])],-1),b=e("div",{class:"language-cmd ext-cmd line-numbers-mode"},[e("pre",{class:"language-cmd"},[e("code",null,`npm install +npm run dev +`)]),e("div",{class:"line-numbers"},[e("span",{class:"line-number"},"1"),e("br"),e("span",{class:"line-number"},"2"),e("br")])],-1),f=e("h2",{id:"how-to-contribute",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#how-to-contribute","aria-hidden":"true"},"#"),o(" How to contribute")],-1),g=o("check out the "),x={href:"https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project",target:"_blank",rel:"noopener noreferrer"},k=o("github contributing guide"),y=e("h2",{id:"contributors",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#contributors","aria-hidden":"true"},"#"),o(" Contributors")],-1),v={href:"https://github.com/alirezanet",target:"_blank",rel:"noopener noreferrer"},j=o("AliReZa Sabouri"),w={href:"https://github.com/SajjadHosseinPour",target:"_blank",rel:"noopener noreferrer"},C=o("Sajjad Hossein Pour"),A={href:"https://github.com/atifaziz",target:"_blank",rel:"noopener noreferrer"},z=o("Atif Aziz"),G={href:"https://github.com/acesyde",target:"_blank",rel:"noopener noreferrer"},H=o("Pierre Mercier"),I=e("li",null,"Add your name",-1);function N(P,S){const s=r("CodeGroupItem"),i=r("CodeGroup"),n=r("ExternalLinkIcon");return c(),l(d,null,[p,t(i,null,{default:a(()=>[t(s,{title:"yarn"},{default:a(()=>[m]),_:1}),t(s,{title:"npm"},{default:a(()=>[b]),_:1})]),_:1}),f,e("p",null,[g,e("a",x,[k,t(n)])]),y,e("ul",null,[e("li",null,[e("a",v,[j,t(n)])]),e("li",null,[e("a",w,[C,t(n)])]),e("li",null,[e("a",A,[z,t(n)])]),e("li",null,[e("a",G,[H,t(n)])]),I])],64)}var E=h(_,[["render",N]]);export{E as default}; diff --git a/assets/index.html.504c7800.js b/assets/index.html.504c7800.js new file mode 100644 index 0000000..8fe03b2 --- /dev/null +++ b/assets/index.html.504c7800.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper.21dcd24c.js";const r={};function _(c,n){return null}var o=e(r,[["render",_]]);export{o as default}; diff --git a/assets/index.html.56e1725b.js b/assets/index.html.56e1725b.js new file mode 100644 index 0000000..5c56b23 --- /dev/null +++ b/assets/index.html.56e1725b.js @@ -0,0 +1 @@ +import{r as n,o as r,c as a,b as e,a as s,F as i,e as o}from"./app.22727b9e.js";import{_ as l}from"./plugin-vue_export-helper.21dcd24c.js";var d="/Husky.Net/assets/workflow.290a20c9.jpg";const c={},h=e("h1",{id:"introduction",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#introduction","aria-hidden":"true"},"#"),o(" Introduction")],-1),u=e("p",null,[e("img",{src:d,alt:"Husky.Net WorkFlow"})],-1),_=e("blockquote",null,[e("p",null,"Husky improves your commits and more \u{1F436} woof!"),e("p",null,"Run linters against staged git files and don't let \u{1F4A9} slip into your code base!")],-1),m=o("These two quotes from "),p={href:"https://github.com/typicode/husky",target:"_blank",rel:"noopener noreferrer"},f=o("husky"),y=o(" and "),k={href:"https://github.com/okonet/lint-staged",target:"_blank",rel:"noopener noreferrer"},g=o("lint-staged"),b=o(" JS tools inspired me to create Husky.Net for dotnet developers. it provides a simple native way to do both also has a lot of other cool features, You can use it to lint your commit messages, run tests, lint/format code, etc... when you commit or push. \u{1F680}\u{1F680}"),w=e("h2",{id:"features",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#features","aria-hidden":"true"},"#"),o(" Features")],-1),v=e("li",null,[o("\u{1F525} It brings the "),e("strong",null,"dev-dependency"),o(" concept to the .NET world!")],-1),x=e("li",null,"\u{1F525} Supports all Git & gitflow hooks",-1),N=e("li",null,"\u{1F525} Internal task runner!",-1),S=e("li",null,"Multiple file states (staged, last-commit, git-files, etc...)",-1),H=e("li",null,"CSharp scripts (csx)",-1),I=e("li",null,"Supports macOS, Linux and Windows",-1),C=e("li",null,"Powered by modern new Git feature (core.hooksPath)",-1),T=e("li",null,"User-define variables",-1),G=o("Compatible with "),j={href:"https://github.com/dotnet/format",target:"_blank",rel:"noopener noreferrer"},L=o("dotnet-format"),W=o(", "),E={href:"https://csharpier.com/",target:"_blank",rel:"noopener noreferrer"},F=o("CSharpier"),A=o(", "),B={href:"https://www.jetbrains.com/help/resharper/ReSharper_Command_Line_Tools.html",target:"_blank",rel:"noopener noreferrer"},R=o("ReSharper command line tools"),U=o(" and other formatting tools"),V=e("li",null,"User-friendly messages",-1),q=e("li",null,"Git GUIs",-1),D=e("li",null,"Custom directories",-1),M=e("li",null,"Monorepo",-1),O=e("p",null,[o("-"),e("em",null,"A lot of features are coming soon, stay tuned! \u{1F441}\uFE0F\u200D\u{1F5E8}\uFE0F\u{1F440}")],-1),P=e("h2",{id:"why-use-hooks-and-husky-net",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#why-use-hooks-and-husky-net","aria-hidden":"true"},"#"),o(" Why use Hooks and Husky.Net?")],-1),Y=e("p",null,"We, as developers, love platforms like GitHub, GitLab, Atlassian, Azure DevOps etc., as our managed git system and collaboration platform. We also love clean code and keep inventing new linters and rules to enforce it. In my opinion, every commit should allow the codebase to deploy to production. There is nothing worse than commits like \u201Cfixed style errors\u201D or \u201Cfixed build\u201D. These are often small mistakes you want to know as early as possible in your development cycle. You don\u2019t want to break the build for the next developer because he pulled your \u2018mistake\u2019 or waste precious build minutes of your CI server. Say you have asked your teammate to review your code; in the meantime, the build server rejects your code. That means you have to go back and fix this, and your teammate has to come back and possibly review again after the changes (i.e., approvals reset on new commit). Doing so would waste a lot of time and effort.",-1),z=e("p",null,"Husky.Net offers a very simple way to start using git hooks or running certain tasks, write and run custom scripts and more ...",-1);function J(K,Q){const t=n("ExternalLinkIcon");return r(),a(i,null,[h,u,_,e("p",null,[m,e("a",p,[f,s(t)]),y,e("a",k,[g,s(t)]),b]),w,e("ul",null,[v,x,N,S,H,I,C,T,e("li",null,[G,e("a",j,[L,s(t)]),W,e("a",E,[F,s(t)]),A,e("a",B,[R,s(t)]),U]),V,q,D,M]),O,P,Y,z],64)}var $=l(c,[["render",J]]);export{$ as default}; diff --git a/assets/index.html.710bbd8d.js b/assets/index.html.710bbd8d.js new file mode 100644 index 0000000..01595a2 --- /dev/null +++ b/assets/index.html.710bbd8d.js @@ -0,0 +1 @@ +const t={key:"v-42d847c6",path:"/contribution/",title:"Contribute to the project",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Todos",slug:"todos",children:[]},{level:2,title:"Documentation",slug:"documentation",children:[]},{level:2,title:"How to contribute",slug:"how-to-contribute",children:[]},{level:2,title:"Contributors",slug:"contributors",children:[]}],git:{updatedTime:1673097895e3},filePathRelative:"contribution/README.md"};export{t as data}; diff --git a/assets/index.html.80ef201c.js b/assets/index.html.80ef201c.js new file mode 100644 index 0000000..e1f945e --- /dev/null +++ b/assets/index.html.80ef201c.js @@ -0,0 +1 @@ +const t={key:"v-8daa1a0e",path:"/",title:"Welcome",lang:"en-US",frontmatter:{home:!0,title:"Welcome",tagline:"It brings the dev-dependency concept to the .NET world!",actions:[{text:"Get Started",link:"/guide/getting-started.md",type:"primary"},{text:"Introduction",link:"/guide/",type:"secondary"}],features:[{title:"Easy To Use",details:"Just with a few commands you can start using the git hooks to keep your code clean and organized."},{title:"Git hooks",details:"Supports all git and git-flow hooks, powered by modern git features."},{title:"Task Runner",details:"Has a powerful task runner that you can use to manage and run linters, tests, scripts, and more."},{title:"Automate for everyone",details:"You can configure it to automatically run your tasks when other contributors work with your repository."},{title:"Multiple File States",details:"Supports multiple file states like staged, last-commit, git-files, etc, and user-defined states."},{title:"CSharp Script",details:"Supports C# scripting for more complex tasks."}],footer:"MIT Licensed | Copyright \xA9 2022-present AliReZa Sabouri"},excerpt:"",headers:[],git:{updatedTime:1642251873e3},filePathRelative:"README.md"};export{t as data}; diff --git a/assets/index.html.c4b28ab0.js b/assets/index.html.c4b28ab0.js new file mode 100644 index 0000000..4c8d3fe --- /dev/null +++ b/assets/index.html.c4b28ab0.js @@ -0,0 +1 @@ +const e={key:"v-fffb8e28",path:"/guide/",title:"Introduction",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Features",slug:"features",children:[]},{level:2,title:"Why use Hooks and Husky.Net?",slug:"why-use-hooks-and-husky-net",children:[]}],git:{updatedTime:1680598084e3},filePathRelative:"guide/README.md"};export{e as data}; diff --git a/assets/plugin-vue_export-helper.21dcd24c.js b/assets/plugin-vue_export-helper.21dcd24c.js new file mode 100644 index 0000000..aae20ad --- /dev/null +++ b/assets/plugin-vue_export-helper.21dcd24c.js @@ -0,0 +1 @@ +var a=(t,o)=>{const r=t.__vccOpts||t;for(const[e,_]of o)r[e]=_;return r};export{a as _}; diff --git a/assets/search.0782d0d1.svg b/assets/search.0782d0d1.svg new file mode 100644 index 0000000..03d8391 --- /dev/null +++ b/assets/search.0782d0d1.svg @@ -0,0 +1 @@ + diff --git a/assets/style.217a916a.css b/assets/style.217a916a.css new file mode 100644 index 0000000..fbc4595 --- /dev/null +++ b/assets/style.217a916a.css @@ -0,0 +1 @@ +:root{--external-link-icon-color:#aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}:root{--medium-zoom-z-index:100;--medium-zoom-bg-color:#ffffff;--medium-zoom-opacity:1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--c-brand:#3eaf7c;--c-brand-light:#4abf8a;--c-bg:#ffffff;--c-bg-light:#f3f4f5;--c-bg-lighter:#eeeeee;--c-bg-navbar:var(--c-bg);--c-bg-sidebar:var(--c-bg);--c-bg-arrow:#cccccc;--c-text:#2c3e50;--c-text-accent:var(--c-brand);--c-text-light:#3a5169;--c-text-lighter:#4e6e8e;--c-text-lightest:#6a8bad;--c-text-quote:#999999;--c-border:#eaecef;--c-border-dark:#dfe2e5;--c-tip:#42b983;--c-tip-bg:var(--c-bg-light);--c-tip-title:var(--c-text);--c-tip-text:var(--c-text);--c-tip-text-accent:var(--c-text-accent);--c-warning:#e7c000;--c-warning-bg:#fffae3;--c-warning-title:#ad9000;--c-warning-text:#746000;--c-warning-text-accent:var(--c-text);--c-danger:#cc0000;--c-danger-bg:#ffe0e0;--c-danger-title:#990000;--c-danger-text:#660000;--c-danger-text-accent:var(--c-text);--c-details-bg:#eeeeee;--c-badge-tip:var(--c-tip);--c-badge-warning:var(--c-warning);--c-badge-danger:var(--c-danger);--t-color:.3s ease;--t-transform:.3s ease;--code-bg-color:#282c34;--code-hl-bg-color:rgba(0, 0, 0, .66);--code-ln-color:#9e9e9e;--code-ln-wrapper-width:3.5rem;--font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code:Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height:3.6rem;--navbar-padding-v:.7rem;--navbar-padding-h:1.5rem;--sidebar-width:20rem;--sidebar-width-mobile:calc(var(--sidebar-width) * .82);--content-width:740px;--homepage-width:960px}.back-to-top{--back-to-top-color:var(--c-brand);--back-to-top-color-hover:var(--c-brand-light)}.DocSearch{--docsearch-primary-color:var(--c-brand);--docsearch-text-color:var(--c-text);--docsearch-highlight-color:var(--c-brand);--docsearch-muted-color:var(--c-text-quote);--docsearch-container-background:rgba(9, 10, 17, .8);--docsearch-modal-background:var(--c-bg-light);--docsearch-searchbox-background:var(--c-bg-lighter);--docsearch-searchbox-focus-background:var(--c-bg);--docsearch-searchbox-shadow:inset 0 0 0 2px var(--c-brand);--docsearch-hit-color:var(--c-text-light);--docsearch-hit-active-color:var(--c-bg);--docsearch-hit-background:var(--c-bg);--docsearch-hit-shadow:0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background:var(--c-bg)}.external-link-icon{--external-link-icon-color:var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color:var(--c-bg)}#nprogress{--nprogress-color:var(--c-brand)}.pwa-popup{--pwa-popup-text-color:var(--c-text);--pwa-popup-bg-color:var(--c-bg);--pwa-popup-border-color:var(--c-brand);--pwa-popup-shadow:0 4px 16px var(--c-brand);--pwa-popup-btn-text-color:var(--c-bg);--pwa-popup-btn-bg-color:var(--c-brand);--pwa-popup-btn-hover-bg-color:var(--c-brand-light)}.search-box{--search-bg-color:var(--c-bg);--search-accent-color:var(--c-brand);--search-text-color:var(--c-text);--search-border-color:var(--c-border);--search-item-text-color:var(--c-text-lighter);--search-item-focus-bg-color:var(--c-bg-light)}html.dark{--c-brand:#3aa675;--c-brand-light:#349469;--c-bg:#22272e;--c-bg-light:#2b313a;--c-bg-lighter:#262c34;--c-text:#adbac7;--c-text-light:#96a7b7;--c-text-lighter:#8b9eb0;--c-text-lightest:#8094a8;--c-border:#3e4c5a;--c-border-dark:#34404c;--c-tip:#318a62;--c-warning:#ceab00;--c-warning-bg:#7e755b;--c-warning-title:#ceac03;--c-warning-text:#362e00;--c-danger:#940000;--c-danger-bg:#806161;--c-danger-title:#610000;--c-danger-text:#3a0000;--c-details-bg:#323843;--code-hl-bg-color:#363b46;color-scheme:dark}html.dark .DocSearch{--docsearch-logo-color:var(--c-text);--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow:inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);--docsearch-key-gradient:linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}body,html{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px}a,p a code{color:var(--c-text-accent)}a{font-weight:500;text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400}code,kbd{font-family:var(--font-family-code)}body,kbd{color:var(--c-text)}kbd{background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{color:var(--c-text-lighter);padding:.25rem .5rem;font-size:.85em;background-color:var(--c-bg-light);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color),color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p,code{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:0}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid var(--c-border-dark)}tr:nth-child(2n){background-color:var(--c-bg-light)}td,th{border:1px solid var(--c-border-dark);padding:.6em 1em}.arrow,.badge{display:inline-block}.arrow{width:0;height:0}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.up{border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-top:6px solid var(--c-bg-arrow)}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.right{border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-right:6px solid var(--c-bg-arrow)}.badge{font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning)}.badge.danger{background-color:var(--c-badge-danger)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:0 0!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers .line-number,div[class*=language-].line-numbers-mode .line-numbers br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;font-size:.85em;line-height:0}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}div[class*=language-].ext-c:before{content:"c"}div[class*=language-].ext-cpp:before{content:"cpp"}div[class*=language-].ext-cs:before{content:"cs"}div[class*=language-].ext-css:before{content:"css"}div[class*=language-].ext-dart:before{content:"dart"}div[class*=language-].ext-docker:before{content:"docker"}div[class*=language-].ext-fs:before{content:"fs"}div[class*=language-].ext-go:before{content:"go"}div[class*=language-].ext-html:before{content:"html"}div[class*=language-].ext-java:before{content:"java"}div[class*=language-].ext-js:before{content:"js"}div[class*=language-].ext-json:before{content:"json"}div[class*=language-].ext-kt:before{content:"kt"}div[class*=language-].ext-less:before{content:"less"}div[class*=language-].ext-makefile:before{content:"makefile"}div[class*=language-].ext-md:before{content:"md"}div[class*=language-].ext-php:before{content:"php"}div[class*=language-].ext-py:before{content:"py"}div[class*=language-].ext-rb:before{content:"rb"}div[class*=language-].ext-rs:before{content:"rs"}div[class*=language-].ext-sass:before{content:"sass"}div[class*=language-].ext-scss:before{content:"scss"}div[class*=language-].ext-sh:before{content:"sh"}div[class*=language-].ext-styl:before{content:"styl"}div[class*=language-].ext-ts:before{content:"ts"}div[class*=language-].ext-toml:before{content:"toml"}div[class*=language-].ext-vue:before{content:"vue"}div[class*=language-].ext-yml:before{content:"yml"}@media (max-width:419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:0}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width:419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600;margin-bottom:-.4rem}.custom-container.danger,.custom-container.tip,.custom-container.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:0;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .actions,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p,.home .footer{color:var(--c-text-lighter)}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;transition:border-color var(--t-color)}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .actions,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar,.sidebar{position:fixed;left:0;box-sizing:border-box}.navbar{z-index:20;top:0;right:0;height:var(--navbar-height);border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);z-index:10;margin:0;top:var(--navbar-height);bottom:0;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate(5.5px,5.5px)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scaleX(0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate(6px,-6px)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-container,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-container,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-container,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-container,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-container,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-container,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}.theme-default-content:not(.custom){max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}@media (max-width:959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width:719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height:calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.navbar-items,.navbar-items a{display:inline-block}.navbar-items a{line-height:1.4rem;color:inherit}.navbar-items a.router-link-active,.navbar-items a:hover{color:var(--c-text-accent)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}@media (max-width:719px){.navbar-items .navbar-item{margin-left:0}}@media (min-width:719px){.navbar-items a.router-link-active,.navbar-items a:hover{color:var(--c-text)}.navbar-item>a.router-link-active,.navbar-item>a:hover{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width:719px){.toggle-sidebar-button{display:block}}.toggle-dark-button{display:flex;margin:auto;margin-left:1rem;border:0;background:0 0;color:var(--c-text);opacity:.8;cursor:pointer}.toggle-dark-button:hover{opacity:1}.toggle-dark-button .icon{width:1.25rem;height:1.25rem}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:0 0;border:0;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover,.navbar-dropdown-wrapper .navbar-dropdown-title:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.navbar-dropdown-wrapper.open .navbar-dropdown-title,.navbar-dropdown-wrapper.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper .navbar-dropdown-title{display:none}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0;font-size:15px;line-height:2rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:720px){.navbar-dropdown-wrapper{height:1.8rem}.navbar-dropdown-wrapper.open .navbar-dropdown,.navbar-dropdown-wrapper:hover .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper.open:blur{display:none}.navbar-dropdown-wrapper .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.page{padding-bottom:2rem;display:block}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width:959px){.page-meta{padding:2rem}}@media (max-width:419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}.page-meta .last-updated{float:right}@media (max-width:719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"\2190"}.page-nav .next{float:right}.page-nav .next a:after{content:"\2192"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width:719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default}.sidebar-item.sidebar-heading{color:var(--c-text);transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-item.sidebar-heading.collapsible,a.sidebar-item{cursor:pointer}.sidebar-item.sidebar-heading.collapsible+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;color:var(--c-text);border-left:.25rem solid transparent;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading).active{font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-item:hover{color:var(--c-text-accent)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .3s ease}.fade-slide-y-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}:root{scroll-behavior:smooth}:root{--search-bg-color:#ffffff;--search-accent-color:#3eaf7c;--search-text-color:#2c3e50;--search-border-color:#eaecef;--search-item-text-color:#5d81a5;--search-item-focus-bg-color:#f3f4f5;--search-input-width:8rem;--search-result-width:20rem}.search-box{display:inline-block;position:relative;margin-left:1rem}.search-box input{cursor:text;width:var(--search-input-width);height:2rem;color:var(--search-text-color);display:inline-block;border:1px solid var(--search-border-color);border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:0;transition:all ease .3s;background:var(--search-bg-color) url(/Husky.Net/assets/search.0782d0d1.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:var(--search-accent-color)}.search-box .suggestions{background:var(--search-bg-color);width:var(--search-result-width);position:absolute;top:2rem;right:0;border:1px solid var(--search-border-color);border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion.focus{background-color:var(--search-item-focus-bg-color)}.search-box .suggestion.focus a{color:var(--search-accent-color)}.search-box .suggestion a{white-space:normal;color:var(--search-item-text-color)}.search-box .suggestion .page-title{font-weight:600}.search-box .suggestion .page-header{font-size:.9em;margin-left:.25em}@media (max-width:720px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:420px){.search-box input:focus{width:8rem}.search-box .suggestions{width:calc(100vw - 4rem);right:-.5rem}}:root{--back-to-top-z-index:5;--back-to-top-color:#3eaf7c;--back-to-top-color-hover:#71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url(/Husky.Net/assets/back-to-top.8efcbe56.svg) no-repeat;mask:url(/Husky.Net/assets/back-to-top.8efcbe56.svg) no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width:959px){.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--nprogress-color:#29d;--nprogress-z-index:1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px var(--nprogress-color),0 0 5px var(--nprogress-color);opacity:1;transform:rotate(3deg) translateY(-4px)} diff --git a/assets/submodules.html.2b2978a2.js b/assets/submodules.html.2b2978a2.js new file mode 100644 index 0000000..9158b36 --- /dev/null +++ b/assets/submodules.html.2b2978a2.js @@ -0,0 +1,8 @@ +import{r as u,o as l,c as p,b as a,a as s,w as e,F as c,e as t,d as o}from"./app.22727b9e.js";import{_ as i}from"./plugin-vue_export-helper.21dcd24c.js";const d={},r=a("h1",{id:"git-submodules",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#git-submodules","aria-hidden":"true"},"#"),t(" Git submodules")],-1),h=a("p",null,"Husky handles git submodules in two ways:",-1),k=a("li",null,"The project hooks and husky steps are completely ignored when the project is a git submodule.",-1),g=t("The hooks are installed in the submodule's git directory. This is the default mode following the step in "),m=t("Installation"),_=t(" and "),y=t("Attach Husky to your project"),b=t(" should get you up and running."),q=o(`When running dotnet husky install
Husky will alert you when it detects a submodule and tell you where it will attach the hooks:
Submodule detected, attaching .../Repository/Project/mySubmodule/.husky hooks to .../Repository/Project/.git/modules/mySubmodule
+
WARNING
The submodule hooks will only be executed when you're issuing git commands from inside the submodule folder.
For Husky to ignore installing when in a submodule, call dotnet husky install --ignore-submodule
. This will make the install step a no-op. No git configurations will be applied and your hooks won't be attached.
A message will alert you when this is happening:
Submodule detected and [--ignore-when-submodule] is set, skipping install target
+
The generated block will look something like this, If you're attaching husky manually copy the target to your .csproj
and adjust WorkingDirectory
accordingly.
<Target Name="husky" BeforeTargets="Restore;CollectPackageReferences" Condition="'$(HUSKY)' != 0 and '$(IgnoreSubmodule)' != 0">
+ <Exec Command="dotnet tool restore" StandardOutputImportance="Low" StandardErrorImportance="High"/>
+ <Exec Command="dotnet husky install --ignore-submodule" StandardOutputImportance="Low" StandardErrorImportance="High"
+ WorkingDirectory="../../" /> <!--Update this to the relative path to your project root dir -->
+</Target>
+
TIP
If you want your submodule hooks ignored but still want the MsBuild target to run, remove the and '$(IgnoreSubmodule)' != 0
condition. dotnet husky install --ignore-submodule
is enough to prevent the installation of the hooks.
Each task in task-runner.json
is a JSON object with the following properties:
name | optional | type | default | description |
---|---|---|---|---|
command | false | string | - | path to the executable file or script or executable name |
args | true | [string array] | - | command arguments |
include | true | [array of glob] | **/* | glob pattern to select files |
name | true | string | command | name of the task (recommended) |
group | true | string | - | group of the task (usually it should be the hook name) |
branch | true | string (regex) | - | run task on specific branches only |
pathMode | true | [absolute, relative] | relative | file path style (relative or absolute) |
cwd | true | string | project root directory | current working directory for the command, can be relative or absolute |
output | true | [always, verbose, never] | always | output log level |
exclude | true | [array of glob] | - | glob pattern to exclude files |
filteringRule | true | [variable, staged] | variable | match include/exclude against the used variables or git staged files |
windows | true | object | - | overrides all the above settings for windows |
Husky.Net supports the standard dotnet FileSystemGlobbing
patterns for include or exclude task configurations. The patterns that are specified in the include
and exclude
can use the following formats to match multiple files or directories.
Value | Description |
---|---|
*.txt | All files with .txt file extension. |
. | All files with an extension. |
* | All files in top-level directory. |
.* | File names beginning with '.'. |
word | All files with 'word' in the filename. |
readme.* | All files named 'readme' with any file extension. |
styles/*.css | All files with extension '.css' in the directory 'styles/'. |
scripts// | All files in 'scripts/' or one level of subdirectory under 'scripts/'. |
images*/* | All files in a folder with name that is or begins with 'images'. |
Value | Description |
---|---|
*/ | All files in any subdirectory. |
dir/**/* | All files in any subdirectory under 'dir/'. |
To match all files in a directory named "shared" at the sibling level to the base directory use ../shared/*
.
There are some variables that you can use in your task arguments (args
).
husky run
command using --args
optione.g.
"args": [ "\${staged}" ]
+
You can define your own variables by adding a task to the variables
section in task-runner.json
.
e.g.
defining custom \${root-dir-files}
variable to access root directory files
{
+ "variables": [
+ {
+ "name": "root-dir-files",
+ "command": "cmd",
+ "args": ["/c", "dir", "/b"]
+ }
+ ],
+ "tasks": [
+ {
+ "command": "cmd",
+ "args": ["/c", "echo", "\${root-dir-files}"]
+ }
+ ]
+}
+
Linting makes more sense when run before committing your code. By doing so you can ensure no errors go into the repository and enforce code style. But running a lint process on a whole project is slow, and linting results can be irrelevant. Ultimately you only want to lint files that will be committed.
After installation, you must have a task-runner.json
file in your .husky
directory that you can use to define your tasks.
you can run and test your tasks with dotnet husky run
command. Once you are sure that your tasks are working properly, you can add it to the hook.
e.g
dotnet husky add pre-commit -c "dotnet husky run --group pre-commit"
+
{
+ "$schema": "https://alirezanet.github.io/Husky.Net/schema.json",
+ "tasks": [
+ {
+ "name": "dotnet-format",
+ "group": "pre-commit",
+ "command": "dotnet",
+ "args": ["dotnet-format", "--include", "\${staged}"],
+ "include": ["**/*.cs", "**/*.vb"]
+ },
+ {
+ "name": "commit-message-linter",
+ "command": "dotnet",
+ "args": [
+ "husky",
+ "exec",
+ ".husky/csx/commit-lint.csx",
+ "--args",
+ "\${args}"
+ ]
+ },
+ {
+ "name": "warning-check",
+ "command": "dotnet",
+ "group": "pre-push",
+ "args": ["build", "/warnaserror"],
+ "include": ["**/*.cs", "**/*.vb"]
+ },
+ {
+ "name": "eslint",
+ "group": "pre-commit",
+ "pathMode": "absolute",
+ "cwd": "Client",
+ "command": "npm",
+ "args": ["run", "lint", "\${staged}"],
+ "include": ["**/*.ts", "**/*.vue", "**/*.js"]
+ },
+ {
+ "name": "prettier",
+ "group": "pre-commit",
+ "pathMode": "absolute",
+ "cwd": "Client",
+ "command": "npx",
+ "args": ["prettier", "--write", "\${staged}"],
+ "include": [
+ "**/*.ts",
+ "**/*.vue",
+ "**/*.js",
+ "**/*.json",
+ "**/*.yml",
+ "**/*.css",
+ "**/*.scss"
+ ]
+ },
+ {
+ "name": "Welcome",
+ "output": "always",
+ "command": "bash",
+ "args": ["-c", "echo Nice work! \u{1F942}"],
+ "windows": {
+ "command": "cmd",
+ "args": ["/c", "echo Nice work! \u{1F942}"]
+ }
+ },
+ {
+ "name": "Run JB Clean Up Code",
+ "command": "cmd",
+ "pathMode": "relative",
+ "args": [
+ "/c",
+ "dotnet",
+ "jb",
+ "cleanupcode",
+ "proj.sln",
+ "--profile=Team: Full Cleanup",
+ "--include=\${args}"
+ ],
+ "group": "pre-commit"
+ }
+ ]
+}
+
Before | After |
---|---|
If none of the above solutions worked, you can disable husky unicode characters by setting the HUSKY_NOUNICODE
environment variable to true
or use the no-unicode
or -u
option after husky run
command.
VA)pG~*zsb{p>f1=-y6!ImFpFg?6b+4}ivX8_5!I9Ge=1S=^bea%rqT0fP?OQuk`jO@0F=+>*K*S8*h4!vjiNj&5f3 zDt)wa6WiCoJDy+> %K3SnC-uJ_HS~A)YGmmcQo)Tj2bE-FMsOYW}n^B7WLW^$jJRh c>Vm%we4(C`!ecyrD-s0Pc9A i~ zF`)SdchE1mD y$S3vz%=8vOdDRpz=?5|4C{DL z6D#y+v>STdcwLkzn)E$dBTer~9|O(*YF}pOTbkU3QrS_4X}Fw{X1fA!nK+~Ad9^8o zbGIUrX^(V!2JGC$j5uv%O!T}c_;*_5*VuYo$A&&1`K6H2cv6>k=6%N0UmqQ*Lr%|y zKX-VU94-n;x(f2*R8)bmbR4_P(SnwXM2tGT-(5Noria@Nn?Sd1!`hys6Q1s7nm|g2 zDwGZ#B^}LM{%&Dvs2fZx^6S*SpU%8(`SY2B?QWYJ5#MpDFL?&`T)F*o*%z+uZ&&co zj|YqR?gt=QfZ=4eRyVa(Soq~nO*T{adZY1x*H7?qY%i0fUPkv~iIGoBUC$UjNpsZk z2F+ph;dSX}SwZJ`b=a(Q^Xf}J=PW_w;pjWao%4!&g1dIH#Kt1Vuw~j~cxOk3$B*E9 z)#{p@lGmE4v0(!DUJ_t37i@mPZ?`}6V@ieTOP2FAFH*3)ui-gxfW#Qtr0Tn`&K=yF z)PI-a(al2%?$RH{5xgqX^BY)p3R&qwR0I;Bn9Ec;`s<}WZ9zfAm_4DdzchSlNn&OJ z)3U@@u~)}5(uu`zsv-c-ZO*k)J9kIZOuQL{GA5g2nEjLe91TTheL&jv#?vT!+DZK` zYaHejHZcw><@AQ;1Wk{26rg7#FEFL%WwV)cVi^4SC1Fjx)i9h*HcYR^2gWQf$Q-_Z zDKcPVJtOUBSKYs)D2v{H@QaaF_n41hQBAe0IUm)gbE-$a`-8sW9;H~@ayJB%IGy@E zEB#Y1ayT{Ln0hxAflaUb==l!;lfU)BB`L{$v0~E!NacnSe#+HShaU|1N6|;i>hzWP z2zFYF=ja4`I!p5tfaBCc+C@;MUG#jN$Qyv)j~Vkh>-z43Fp|&`GZ6f!=m*H*vBOKP z!(-u0kuJPey19ld`&qEy8?o?PzPgV1LKuBGU$_HlpeaquAi=~c+KD67{@U<+xr${N zIXd8{zTmrL*P-;(1G)3v+Y1!#$`$1Yy{<#aIavSQ-RA&bc2{&aJh}k6c?H?vb7e*L zi%YtvO03OAf0^S{r1?<&snXIjzc;R7;geP9M%`gbm|a}a?Wr06Glts~W21G`B+&RH zOl^U*qp!e1s;;E;XYSK<2T7BDp@AHj^F+FzozdYtwM+y<4W>*^j)iZevG%NSur?gU zDf#29#nBX I+Rb4ST#=;~xt343WzUYnC)z?BfYZUNn0nXG8>i=Qc$A;9uVQDd z=KhGyJiXb-Ysp&ZEhWA{`Fw>OK_uonL;$05=#$8nONLVVF7z25@DoJDVaS#=De6#Q zfarGe!nFzUG0f>VF5*Qd-ObH@C{-#_WPY9hp6=?N3(Tva2zo?@9HrP^9*@Y_&Td#) zICEz)_-D;I#Ps4OQxWyXn5ZAyv9zOyI3pqXxVaZqPB=!ouyS%}I^buYH2;f7*0+3j z7#aUTzJnR=JhVRVqq{aPTCPNlf#KA3c{RfUUG;EOiRPEDKJYc*y`yE?0UQwxgR z3{0FB^~w%Mm6mXcOxExMV%{W
zb+&bR(`WnwU~s^`rm4T_GfCTZVTSf&6y+r> zg*wxpEpu2@_OWLKn<9(Kb}%%@mW=&=Wz&v?MKO5AewrEu|Kh{slec+y$^x!hPC|_< zzGuF02*DKfryS{5(U|k_9eK73_wD4*5C?PKZVGNT|1nPm70lKW`)KqNogh4~W(_W{ zK2M>DYEUjP`v2CcA94b90_d+z&*+huTnr0WcTgFl6NoW4rm61SeSV79Dta2!N74&y z^2w0O $&xB?VRm3q^As7-5zH4JB&oV&^BW 9UemdX-4ue1)anZVrzs;L)2FMC0r_PFs+zeR4G{^yatt*P z6zWe8BG>D@-)E04mASWgJM5#sCEY3R{@)rjq)q=eXvh$5y=ec}tG(yD`4iK9(V*p? zncbv4ZI*6R+2is)gaZV22B))UwVDy1MwYE>#t~=#zvDd9Pd7H!5kC+xvj+4QPeZ?} zs82Ma+k}L3W@vs+)3cfJGij9EjPAOEaDZXuKcdoX*(rU_$4@J`Wv#Z7U2n^sQzCCB zB`&CLgvp`+Aubu#dP_ZSW;XM%LlNu{ ^~%+3!272)nbVX }I*ld$F5GS Y zp|@N4Lm79$AGCg3PW0Fu{lmWCx6>Zq;ZnbI-sk@y_V+&s;e_p1@M7T$QTov1G74<* zkm2nR&&hkF6Mn{i+ppnk#;BUB>{b~+dP(CP6D;@PG*1mOB2Igx918r!MNp2UFYT9% z-Bp}MeLfsfgf+d(dIu*({Wso}9P6+c>N_(boXnSW%%<{M``bp^5MyUUN(&GLXAU=Q z*<-J;9dNd`&~G(KAN&e}5k_vkUUen@aTtV~p{}&9B7M*bmv6_V^C ?6y$hRR1?n`8U6u`-JAP69 wjzqxj zIkGC`gXk3PY$ZPXOFM`?_bqXx->Fd;(!ySOGww(B9-O^e- tNl{bAq6?(%5&`p$_jxBtuTF!3(-KkW`)o^Wh|N-mD2#+GPTw >u8ERCSkw0qr&rvxluB2|wl`XW9g}wmm;xW9};+r8v zeLT5gDP1sx$~>OgJ#&HD-NW3?Z_T`3nO07{L;}ai`)NHHe1E}b !=rPCE>eqEa zLUN~J?2Tq|Vf9FJQbx-bhu7HSoyPHhCfXjt0%9Yd<>=OLp68$oljo!3gLHf5(_dUw z{yk6%Ro{UwT#EI<%kFA49*|qGtvS*@AsW55ecN%jue<-PCCqP89C_4UZ}dHWLcvK2 zKqh;Fx4vk(s@X$X;ozV4aE_uCFMFp!4_{$3)YKuAv2{9eUX0cZ?I~Zp33{VLeTD7a zYg_SHww-N_PyexWapiR_XBiESw@@!J{~paPShCr*6ic(-KeohSN-m90N@6B;_U__s zRR=BEB-{QieDwQmf{|6)d;c}oCk;PEF5Li~h9F$@1o=WShE8{k8gPI8*Qh~lTgS;S z#RslzaY9l-wrej}d ASB8lTj(fImiAP`LKwgot0SE4(8Y!bj{9d-`H?$ z0p4CQ+`Yhc)}5NsDu!7;RvC}tJqv}&!xmos@ks@Sqfv? rxtGDtcM z53fbC&gh;yj5>u?x!8n*PLddPoJ6bH1?-Ex2o!Gv2`H|NTm5X&JlOb`B+D-;y^)We zj)R$KE~h)24H+*^_cQR5>oc??+xq*|T}_al$o#oy0R_*Zy^M{Kc1ipd%7{1KpLw$# zusx!YOvElIJBB#fcJWZZNlgq>*Vw;Vwo}Xa{t jt)`1DV uV}XnM1$ZBJ4bNWp+Si| Dzyj?W?%g+07ARx#O;G9iMy)1;qg(^f$yUrCSdh`{_3lsmx3qDPxo zbCugd(( OooVDn}UdT;$O;l1?h!|x?UNu2YaNx8o+^1>E6=@ #)`b?N@Iyy%a4U?wn(iXw? z61%9I1GwqSF-5bcWqUaW91v+xN83>l`*S+J8wU$K4C^v>@J%^scn#6cAdb<^m+e#6 zk>Pp0iD2uBB#R&RoGx@?FJi{c1gYFwq{oyWhy4=0*SY~|Vt6(PevEjK1E4Sbwh7rfWx}+GBa7y!GrW{V=g#LH&~g^ST-`VeD@RDS$=pArBZ514 zs;HrtcHbntqNJN{PzXqQhV8x`lRutdpVrn1dUy<@T=k1JY0=}st;@TR=GBB{Ss21t z15OWmRQ#^weezu34L5rsox?f9fqD;ngh+r7!HipQ` `$3@!l4<>2#svY?H|xr9=&Sp(Hb+LSp}cEPCW;jq>P z7Rb@_JveyW;0}Ba!8*@0EEykS$iQ|xGrEqcCn}hhs`bnE#02ET(4%WVm3>mUxLjN0 z7*Js0X)0$F$!`X3lL48QoaBSm;fa!-tBygE@=UxnS2UCc*_4O>u6*Kbj{V>qk~N|h z-(0yULB2g-x|JYWx*&jkoc!|TZU(`%j_~DQ;f~RbO~U&<%0C&k*NnPJ^=iy7sXtfq zsNuAmn~s7r6e{_8pL)Lik-d{AWZ5{JF?X}zBgXn#r?wd22}m>$laAiVqfy3A!q5xb z|3Gw*?yrwZYs8O#;ktYLQ18p|!}dhp%MAmE1UWfTffL{8sweLs!lXe`tQ87RyRJIh zd|P+>_f4)s`?atV^?_{2k#zLy*Z<7?qAG>Tyrlc==fMZr#$402?xzk8Fn4(2<}+$} z%oi eODab-iZ<~UUgO58Qd_1nz8&KJ(h &jTzG#p$6nmMbToH{!Q$a0RAFQlT zp7)5RzqAhfiyC(wa&KOl|$Ji@ ^<}wk6 zhohUkg4NrG);h&B7E>YbuowOb&j->iV8aH&itWHrF4p(zIEd={{qV1zW0fEzPSm}k z983VbtsP$xr5DUCgBTMZchqX@e|MsHxULyq{7&_n#wfyilOV_rERnR>a^HqDJ+}{@ zx+C&SO*X!h_5fvl2!G_Qd%cgdEn_wSUr+`_FFSb68W)N0tS(!y>bTioK&2Z02WxK{ z(A2rM;kLC(-HO;c(8>^7E7T&S)Iyk3W!IsI(K?_^QL#`75C$0%GE`Af5l~P-0z~S7 zh!7DWKuDr8L<|9CNEj0!BoP9HBxIh>LfdZJZ|`q7=ltL=Su0uVeV_Mv?)$pY{BJX0 zrQQYiMW+vE@pDVy!7&zfk>Tn_%FX(+~6O{>usT4 z-?(Oo1mZuw`1opj!@^jwcdDY2ku8QES(C?wYkn4gQQt4~2vEz3wd)GwsvetYbD z7X?#mgp+h#;CLE1P`{VT`aDhZg2gKfw8Sb${Nq&ZGe4Ogm5=lx9Vc7IAAf$GlXlyj z)YwN~VqlWWZg?H&SY=%^-UkU%lJskc$(q{(nYLvRM`Ay}eOD5uZ(}9Qp8>@cQD9Zs z(8nXJWOBKsBsUQm<~{sE-nN%IJ_+kcwgQ)7#Es|2xexFEtkfp2DBM`UMCWK;RNG-E zM(3A8>BG$3*_}twPaI?Xr$&pAXI6^hF-XyMk#-lpR6)c(Q o8nO zb$UQgb cYVOGa<=3>!+Jr%<_m0kG(dre5^p z((^OKQ}4||pqk&ZO`;eh2tShsshvwT)rw+poeb=7UsFQyRO TV15#S&RK$B2?2qEDS3 Hx`e+W`y7G38uR oU`1Fac*Vq*hQaz 2wu^T2?^Gby!0 zt*)sMsV}JxiPT9vjvr5MY#5rK4L96WM^F1Un0lz2cs3>mC=k2qCF&~(ocC3tS9j&c zsO+h3{sZdDRb6{#4J1YzpE<$}S_an}!Ixq~U8{B=BduyqZ(LLJ>bj-&v%^;V^e~(v zAe4Js``M9d4De&TDR=tm(>*?785pigaK`FWBL}FbLyRB4+7WjTpXiIP#)oOo(q23` zL>qaML*d?DWY6YgaJ!$GX3|S2n)49vx}oX8`Oe|WkFC`h+qU-O(TBaiQQ1v@ATLg} zfbbeTxurLJ(Uxa%?YKi6|2uHVZWn=ow+tTvp8b3zZR2yWEja_=R-}HU68?sRRG2@s zia>f;B}yab#`LIOdSpxPm}bn*WcfAV>@-$T35=^cNwZxSXTuA?bNQP4ebVac z)|rThR(Mv0ao7; &&$%@0%K0q{`<9br1sOKqoqxfTTs9qFziMej!c~IULFcDw`g~ zGPWhW$>M%%Fx>U2H-}wB{p)Fi4p?`F_{NCHGtoa8etPcnjeO`yj%E>PkJTZogEZF~ z?%k-(ap=^@TVHeU_F8e2bRCj8iwkoe0+-Dn4D-6TeJ6xD^^`C;X`z{VwT_iXcR6)a z<>;u-$4eUsP-$`Y%*(r+fNO%hT(8t>@z|;dut>$!Z%lhK;bw*p{PhyaIM2VqOS6md z^#~!P!TY9@m1ySNXPn)wz1;zs=)_};@;x>6n=Yx=rv#g3m&ER`pX{c5ybYxpK2=FF z%V0GH+Q!!p#MO+P(gr19nHDj|m*xl>dVW`MRU!Ky14Hz5ZB=#H8BwkxWLl}_4tnqG zo!?8Dr+d$`ZqNr=G^y=9;g&F}t%px3`3HE2>yRLK{#JUH&n~%}L=yt&`B$EmNx>Z6 zj4!-H5m3Am=C4Ro2r}d+3>H50fl{ufTY>bqA;eeG4{L6kT&P|&MY=tSM^E$wWN$mI z<%x8co=`mdp`t$(nC$I%WbrM9=CgY3G8-O7(17oa4V5e8uE vgCz87*IY*%07n3T+5x^P)2o(LA^AGt~X!MdL&_); ~TUVkj&nT1>Y``{64=1D-A#W *Y3;-6To{jksYZjow2|-W1eka?ESPww3# Q9Mpn dY!ImcQa ZxsnLO10uHlpedLEIPTar?v#?-4XssiFz5u|(oZ&HeiK%W>z@{z!FlB$ z7g-oeha+bdSDWrGg73|BDmjH~NeVe#e67Y6)p `Y3T5yb z)~|HqjAb`}1~n1EbhfBcYafwG!CPMatH<212lo$g=HV@ 3^<754`zp^(A{huC z@%^3*_E*F+2%`P&-Ln^EV}T `doAq^fIx`>3{(>xQ zTb~Lp=;5L6CB1cZU48QZ)z!6O6U^%Ye8DL<=YEx(2zoJ~TVGWByt2XhITs |4Bxf ^c3y=c8t9t>=N**qd| zr}c!+y3qTlw7zx5tri%quzeTL<#bc!DsTwc-9Fm{++E7~qmE;xI+IKh_H^W_i{~<= zG`8|&eYj`ALU%Fg=#>p^ZySpc(?4B`f{U(eH-iF#H)B(yOFUY0Y~=q*a-V#<`mN%A za =l =yx$#8Ny)&)mp~Fqj&6CY4F*A~GtE_8&f{ z{Po(hl+)O@_P*SB{SO~o+Qif?-iGs8HqT>iH5C{BjmtPGT=hE|;~?Cy2tv}#;C0*p z3@1}{ovy>zYtBIQH!?`|E=z*-nFl5F=ju~KHG8}p5a_;{<*ZkYU5d?+lbu&2)0Wos z%D6A+=;{64{Gu(==Fi}84=7xn2yW2nuD8nU`IqE13N#C;8&ZiJNAG=X?FUHImy)zo z(1iDA+bVjT*$6p6^} Gy_?9yn4v(pG zagqcle=^rH5uCe{e8hNi#Pm0WBVa!_o|whgAr4JX*a7Wo1HWm(QO^86a?9%ge)5x1 zj$p`b54>^R5 5+i?@yl*1D2WqN2M0Z57`xR?f1uP1km*b4A9oXI- zHfqb5(D~np$rtk_Ct@;d`5#upOhxz^p&w7pnFTF}8-?^_`4RZMB$OT4WY&uSMMnz1 z%La7JFre+()Eck(UBV0_F?|zlyN>~|$GDZASUrOAzLIUu&ZQ*^E-v8sI)A{?DorPe zatc@k@PW2F(Gh3q7MrsI7W}V$@Xe{Z?}ty+cJe{JK`mWygKK4%aa@8vgV?UnknOoK zkyc=3cD#usnQ*o6^d=sTZ j!78T^xK6|K)GU+ z(#!0WIV2OrsoMC$3`*Rdy4B1-=NNdk@7jDio^%zDxFWEBy6%G!;9bIXuBi+CsiY9# z#}QNH!w9_Y4XVtm4PvU!z#|GmLRaz%+c~CAx~aupoKKzNHKH_@c#(G*Op0CC1{*)m zuC5NT?6h506VgLo@rJ9};IfSFF86R3$N(T2mssQ<$?)>v5GohNkwHGudGzG zRhQ48GF02d7vZ?CcIdsb#AT$-pzM&%4_1hRkBK)5qC>>gwle5 X@Ym*a2mMe8+_du-JnRvD0z@i`EXV*K!EOmanzC*$ zS`RJ;a9e ^Dmf$VM|k PJ-tqQwyF;2{T*DYHNAd> zYC{39FBpmIv-dVGYUsnYicNfmG>GCe)lx~cr5+R_I>(8|2D-@Ta4#NisFlz Czu;VQs2{H()3it6qFXK(%ix~INLAip^9GX9KResh`QFr{zL0C# z6vX_J*Pm_^{ibHpMtL++anyOC={KH!LZ1aMV&}k`_;cb=ErD2X+k4x-hO-0S4!Um% zpg8{EL-3Z3n1loAI+Q8s4-`XXD8N&Do&@8UG%1RM8Q=W=E`g>D;Ho9PpauIe-5XHh z)u=B-e-eEtBF?ISZaDlt92&SAPp;0~RR#U}!5-7}WoQbfonAQ!T57H~EXG?E9 m^ @dmgdE6KXRdx*g z<;z=uaPCf*F-L+PKelEHXnLt*ehF%x_I~MgswF6*L2)mMX1m_|#QaLt%}rGdK%jaI zwX!zrIQ&$`@c|Yv?=UR0q?mUK_tF58i?k (O%1}|GWmg42Vj*aYI@{&mURrmn zP>USfU ABY1koMl{3H0H1aV| wFLPJ!sGQJz9+RPFXW};L;YUoZ_c{B}F!` zMuyd8A->8U=KoYY(tGAGLl$ov(^XNB@+c7Cd?6gX@wLe~TGb3DzGA?6s&VkfPWfG5 zAM7^ZU;x3f-Ne#pql+=VgIt6`PvWPpP+erj%6O8d^$-X2NMV5B zbh|rBzwlZG_|V({Jlulz9TpY2c<6Ri ^%UT6&n+YP3(uyBE!BW zk?UxImxt!4AyQR<8qo5mz;`Jl9{J2v@Gx>QU6vd?9~pRi(G@^cn7_K237R4{HI<{b zAQBLZ5L*@@5m=jn?a5XqOCRkm;yqGTVJWVRM4+3!&ZleW4XVT*)yn6*=0;ePhE+*p zRU}H#KEL#!=MU}U#pbKhR0j0JHKY}Wb@w-h7Ec32IjWbwcXxK!5+8uMr%{%YX#SO9 z$MTK~2%C7?fgw^@=^;jE+*HBAvanc{P@^Ur^{)3(XG$hDiuO)ZPJofCBmbjXdzPt< z$<7a?_=u*~IY|e0he#?ntnRW)8~7DU_2?T417`k{fENpqI1!Zm$iK76etyQh7Q%9^ z)9VfmZnl98*OY}7P@8V^Kc|VGl_HDvPd(I^B#ly6a=ljr^DQ>8HcwHE{t5m(X2i3n z-M?_lgr{yX1BoblPO{Zqn|BlK*2lJS@;kf8!zYX TY=RGD`W+ zsr!3IuLCW`Y}d6cd4NPFDIcMo980GV%K>u`w@p~_qv3@P&>a&)x#QZe<;y@=?@b`E zVUVyc^qYj6Kuct>o~FqTc}b6*L4L1Hw$+(GXNGg`szM|*zCqj7AgNAN3}k#oaT!hB z>+b6P&(!B@#OEz!y&q9fGjUX}?~n#X2X9fmS*@3JKE9Qy+C?$TcKNWDx=H %|++Tc$(d&m%%uaQ*cJukl{`jR8X>nm}(%O_1Fv^QxVC6}~qcon-5yfDBXD z%nYWkQrta6ohYfPgzIH@m5mfgtzP(~+D9M$%iZxTlEt?}@=u`LiDxMNE=CDyU8;{0 zLz=W|(9L@|IuaV|QqnZRvxOmsH5A-jOPsob!(kSCf-Y?{vQEcOtSNirXS})RuuV3w zXO@g})RAL=jDoQ#eKXCuaorVgRWNPT*j2`DBML3zTVF3TrpM#IRY8Xg@JzwR(~i&) z1771`_{3q@P5`mqxSCvEd$pA*nK38%zrp{8UIH-6`uj}6wakqep`=l_V_OAQmHjJj zR0ex~g40Y08RmBDH~bd9%XLShFA@ {-T&EnvZO6Mvr-k4H?v!+@s2{34$C6g;GY5%H!Ub zUsOA{PCgxW=cZV6#t(j%A%-`Z-O-0*HI^fW-CyCPJ|~lLy2$BSmasiNr_rGQ5}p_w zww1I>D8I5|GHXY}q|ZpY>&Hl+`0<~`tvug)ZEMrm?SP)`185(S3w}CBWa)RQg2)Sa zR7{UDbPs*>;$p5%ng7G#tgW?y``tC&giX|S(Koa3G+N|*g(`eTosY-sL6yzc^%GN_ zzH(J~0bpP$9;&*Sm4G^iV8n&o&){GLO8K*?&?@2%=>Fw~&F*mb%6-MtGw*Ar7(}n? zVA?4f>t7HNKC!8XK~J(iiX1uWJsA{G;$~yP<~6Jo{fVgw*`UWPP(%^{FdX&S5%F1c z8B(s9rQ?<_1|!4BgzKNHRsNY>(D6-lxb~M@FF5DpH9NK;c}<&d`-}BEwk2Q1>8`@M za7#F+pH`#;1F{19lR^WFx#w9!iNH?0R8t26IBkYu9eorJMt%$$FK5_M#wb@)@13=^ z#+^Sn>^p2t>z@3)e2+1HygZj)qPbtb!(ul*B!K%_mr? Hlu3CBQ#(t=%vma+Y)8t zT7t8!W85{bs=aqLs?#-UOaFlf&Ow O(prXdQq*TPh5O-&3NXg~^JE zhP%_I@>%?Uvp9j_q)MCDksmUC@~#aic`}lc*r}ucE{lTejKq>x_5LkG1s_aC1?wL+ z1AdCWoh61m%NNiv;ZarX3A(19*2h=L-RYk-$V R+_dMuhcI#{DQf4X$`$qzsHghyew42TNpZCjY?!_}Y#ZT^b+vR2*d5a!7}bQ3 zUG}sem<%5%1dh{*v(s--J?4L)dgfl9Q>Ql79FqfNnW6jzvJB=eS%xQ+pObYJxaSc7 zNIi1on8+I?d|}zoKH*(I)~ql>8~z>5-97b7GULd8BI_K>Kh&rU`^V#Q$CZ9rgps4N z@A63d(7_reHIILy%2YTKkj3f?D*bHg>MZMHWke*?Gc`B1^Q2Acwg-N@y=n37n5nUQ zzEz++P+fKtX5_@A= QnBmLYycQOQIoUa!-k1-r Fsgg<;2cjPlH!AmnYk`y6Oczkuyxs>Y4xZ{S&xUR5g*#Ta+ zO(y{ReOK>Kdt}GM{*gZInAfs+(HWdRegU^OvM%~3Z1e#1lds=_uJsKi7HkSJcP(b^ zfJb#sCL9Bl%y-DB@t+~-xhq^ ENB?nY?}U `!3wTBe{!G@V~%>oYk#z1!XuASMs_5x;!B zNGoMJ{{II|c7hn1Abk&=yZ~rxZ;4G4WgYZYTG{U>61?&w1Y_v}2J29>J0QOPf6qgr z%b8v2KoUR`b+$_JL2V!30bW9rKB_p0eMrrnnv0PCfzL~#=D)$`5z=S+FKo;waIFcq z-t9I-WIy}^(NvUMvjV=?-Y|U;37EPMI}v>%pusMh@nY&)W(YPrtsgL6=q}O?A0ZrC z@+Sby8E38k{o3IPR8EW3=Gx8K(3aG&)d7%u)l_CXw`5*$1q}#(<%<)dXWf_4Ju*`I za&I{qg}KZz4%j4XeJyTwN4%0JUj|+Bl?vSUJQV+!% 3Phk%fXr5;h8T(A$ z%AmI@_Cwk#YJKC@%$blqO66^EdavIK&l}(ZL_*gQb>ESeiW2KYDTEljf{xSVgSW#$ zokucC=wbT3)|bGHxHBOEjq)}hgs_Wj6il95 W}=7x zvb6rwxmJH()2V87`^QXB_ej(9P3}n&UJ*Z_h>cRWkTktF!P#BI zWW_&yT*ymw!5j9(^TSzOkICYG*&nT& #ZBo7nINR9IcL_}@Z>+0-q?!?)diX*KXzJ)o7>PgTQqWhZpDSVUm3 zlX?u(UkGa(QOgvAgQu&u$8PT1pDI{7oEZ>-96jE5j>TAN6=ZTrC8-|%p_4TQR@QWC zbE2NC%1!X!HjD (bkg0@UZZjIyGa&h;3>SD&95wX24#_{Sw=+7F7! zAcsv!j(=g`hgh>qBt=^`ao-18%6HQa*B(WDsAz4Sn|PQT;ROE{*XR+E^*gq78{-#u z1X1y8SCqI6Nxy=P&+lT(=R@RWBs}WGH_IAOpL@gOT;`w3_r9+W$q%!qxw~cPJ+1KG z8UUr$v0dod0Fce1eRP3UwHY%~ugwj8=aIu^mT zm35rMv-9c02zOzq$ydp4kFY7b=2x=d+eqIGo_2p>H+hAcF!8Q$L#*vrx8-oORYdSE z@ZH(Z{MJJELHj+X|Kl7j6?C>{ZG#JB$v|p!v2o#<`q$^!ySf}6nj^FTW2MavO%vNN zVUy^G{|%rv^qV&ZB&VeR$r3f4X%#V3V>@>v+Au$3`3N>E8$g%P5XN~0ID2{c=MeC1 zkwevapOg@g`h7en(Pwu~koas9YpG|KmX#0dSf0{;PTkg>Ts2V}Ol=vkpSK8dXs9XH zqzvu23~o@gED(FK3*b(`eWiy1v?yexcsFUZ?RC&cmOF6$PkS UIpmn7Izn$yU6@&qsewbvuD97KF&f zrB#DyM*ykFzbxqD_AdbX0ul1|8TDcXV2v?N0ML@VYn_`W{gI8DJftSie(pR3!}8Yn zBXM%GR=U<4Sr0}#(o<@|8dy1RYg3`A4_Oa?LIAzSLwSU%7Nk4_!mm|Zl{}|&>BH$l z1kPSus^D?x-{K8KwBEMTbZ!djXrh^F`3VI0^sG8Kh}WTdBBgiH8)+1|E>>@z&$qPo zfcDV|CN0KkzCudU6#7a0jI|n~8;!$JZBux^S7mD&0=R#T^j><9Nud}4(aTzhY?D-L zJ8OEmz>fo-GXuuL8m}o9O$?R}*J?ThMp%~!_lemXO4 m zj!8S4E8?`OqyOS6uJ{THT2bO7odPGliwPZPtZE)QjCKc1B~jLiz}_C|X7;}Qy-EPD zBG&-HO4Gp>nk%;S8|q|kZbTL4bhJM^&8l&`E95q1ZLbiDkn>mfWVdAIW?HK2lrB~4 z%4p9SbS-=BpVJ%4Y^4LND9cQo+$59#NqGcrYDBv9FVx7lwS9kst?YAyEaH*t%CBFT zrhh}p`d9z$0x|U=-$@A m}sv3G^DF0=C54AV+k-+{4?Qstz)(Xa8l)y zjeq~Blq3^x0N@-Je)+VuEmlySt9EHmH&Y+8+!?_fYP1lXdJkfH@IwqMbE~rCau09u z{+TE@RBMGq_-lxn6Q#csW9}(eUWsth*U EaDUwA<7bak?OVW&@a)u1ll2@8R`~XJn4O2(y _N7p>BT5c{u_FIjcThK z;%ZPr*cB>=J&6aFo0G_53_I?}hBu7-*yplmCAXq-Y)b%7YVy7%zRQFD**SQk;rRRH z`cF5(ikuj~spkU5qZhm!NWB8sXl+Ru+S0=KjvBxRGN6`KmDaoWxhrmVc0R0*bp)9@ zZb@8D^ADe$irQT6L&O+ba>bM-3edKq6E0^4dLikyGIiYgRC$heuA(%n-dI1yWM);& z%3^o9 (+-@nyg QA}XH~VD|@S&rcJ}7o;vEb|sD*F5uyOQFl6)uYY6imZV zDq;-jm5LRi`=Fl#k7UGx1-h=Lb=Ti;uuoW)!1Q)8{Zj)V8+nQXNUngWwJ$8AM=*A$ zCeAg$%O>{e?)Dm^X&6{oc(~zZm1k=qr@?b;poaNq+c(?0=mX7v{UJgqPsjh{^YI4M z;&)BmqSoF2d%k9n#g2cwTVJv2ZiR3fW7*tB%xRK(5-4aN){OoK4nM$_r1NjQ|A^cv ztI{a;21EnFlBx%BZL^SCe?T2(8u$fu;^hf5ZpvG1zY3=N0&UblxR`-_su1Vey}Zlm zH%0<7%H0zjR9UN;NYX2ZlOB*=|F?)!nsgpf2dp@MaC>JiTfyGCRgEWkrglvD2KhN) zkKs4G15w4L#sEB9K)`;`?KXY^llR2#$&uH+j_av*=D8EApjeW65f3ll2(*hsql|*5 z!b-_Tq@F`8pazb+1?8GE{pw1o;t)wAIgNkH94O?6(!mE1*?lkKThx7HeE0|^ik1rw zk3K DGr6*6* zNmz)FgLTw4h&Jn|Hjf_+*i-Z?5ySB0qTI8Bc5J@4;k>GlL!0%<3mz>a*1pzwwpl^K zj9FliW!wME~Fzg{Q0|06e`#5U7z4#U0_bZ^{qJwom|m#QBAL0Us!{C=H5m56Z>H z%Skk)ZT_l1Zh=F6WbKSgRI39ZAcABf j2ek+ZE|R&t2q8?$8-qZIPSSWK6*3=O8JziwSrH;ec->8yi6}a>gtg6?2XJ# zNtG)=rYUyk8<_mAn5L!>qA_(kH)N5nl(k^aKct1uraue?(9)Qv!GzS#XQa+ALKPGD zGU%F#c(sB_$2e=Xv7LeQ`dJeq?kk!#W9b92EaMCJ JNN3%AF%v8wp#+saQ2BZ z{+!hp-oaeJfb|8={S9iANdZ6@t}fMm$8 -r~)boF0Yq%oEVV~s^;1He@kRH`fzA;(;Ryjmcl z(fcerfYj-4@t9RU%XXDCB-Pvn#wSN+q#HBR>lHw8=ZVOfT8n1}fk^cF!;exL`+I=g z#wfk2N#K~T?PCHtdSgDT0YXhr+$H`SWNPIm8)y+?aTCkW(hp#)0APq}!2>RKL<9I| z0xW_o$vE^SIKSc?uz=tn0ha`@F`)xGlhNPb85x%IW&e}G;pKd>Pb-=kx#buSTdao6 zBJ`KKQZy_}s(}>xN0j440A7%*AIiL^jmw~Gv-Pb6ASnn;*W3=kw{EnzF>!EX#o!yH z8!!CH<#$Z~+*4)lcw3a~kWPCJ&mwFjnjL7&C5)7{yHe(F^EKo7P4h_`^kW&&`Mau| zeA={eLfHpMuT`m%gw*fzZ{dk0ty=VJ@Nmri){GnF{R8yF3f@9opY)tWN28=mtElN) zEhgVW@6h!Ga45BK-w2s*NCg+gXAt;<()n*ZUP(7|F+Al=4Q+^gE~~E!ObxRmyX)?= zs(~pYS$?3RA;Sbvh~@-~c1rc4;BXgw5ygLI)<2pf3!=|znC|7tMYP5w@3Q~`5BnN5 z5P@UgInUC!04s#*ZhSuK^40$jv446{uQiWdPLwJGEFvRFLu+{o3*xGB>1=lB^d zf;K;A1XhWk$SH~mXq*vAlCT5201gJOQ^z9|-caYFrRm s>(=RJteNyQ}pwXaqI5Y97w3IDXp|3c60O={-%yapUXF}n+kpc_&b;u~3(*e-a( zYbg_1(=A%VlXfz Vdv~|U6l;@}If^kK9+wCKlBbDo??QoM!ANjcW?o4UW=Euhl zbY)sY_6$$s*6tsfrszS&o5ZDTcy>Ix;KGd>ccu9T`0HbPP4R@MzIBJ2!cRtfKQG)6 z ~uQ z>s4L8F*-8hm=(aOL#{fxrF{jZ{G4m$Tccn|)FSUJylJCtD2noaVd-I+fH!Xjb~c2n zsw{#rvV5_l^T@h+%3alxURErCsCyG=I;=ee4%YRa5+=!&OgnT-7cUc#tj%QpR$%3Z zC+g*sapa3$xP (Ji8 z$B%ra>@vv^S6RnQ3vLRe7-!aauyw*DcN$p)>BO4AsjQ88U5X9R{@w=;L?1voOnkT^ z;W;1~oPG(uHm$vH51|BC%RKVq0>cQ2Xwm({+GWKiH+I0x^wAhY)g&b^z9olkzqV?` z)V>9>RMr~Xj!lsxshI~IM$#ROh@#s^6r%n3u<2G=-3}wd1#m%;Wi7JgBz@+qRuAxk zFm)T@0NkOZHPzRFEfkLGe*Bh-K}N1cp@Ptl%LQU!i@2Xz-ozc0Y36@&GKsm0FvuG> zHm>T#Fvm0pZPGj@;pD6`Tpt0f1?wJnH4@{F`9{|v?r~k<#CSt^06ebPYTc~z>$NYc zC(ot`zE3L3ELXhbz}{EM_EIW|BkptWJzh(%y%%n=1VUXmB|VoAElBwktQse3fqcnV zzJ1!%dnW=U-KKrPS)rKIRK$yH;M}id+22+vKLJz7`P^&hm4}+Gp2{?-{mQxnAWn_@ z{ruvR@0P9L#e47Wd(LTy_dXS}#?k=^dNQT?M?u%%8GqLDPGpf`O8rmqeunhmhR-eq zh&yJi^V9e5F-}d0#QmaxngT_8KH)nUT2v?I)sEM %eMz-Lbn6AEg{mvGN0(xdvR$ywy1vw8NYe^ kw7%}zp|H?fWC cEPtQj}F7AyF8*EXkLi#hFSW}2FJuVgiCi(NWn5j zb`9Va67O~Q{z$9w)f)~};gJ8(*{vDBM)98Wt+sV?h0)wJLBzngsKUO;Jf13=m*lcS znq Q%(=<)Az{mJhm$^a72xr>PYzAFe7LjE=&t`N|H0744@KR&8|#q`}=7ZtpgD zb{{?EE3R( >~bWR3%m}yXdQ7 zUF4@60r9FVAX%E{`aW^sCQ@c^c;x<6J_m2un2c~YO@{Ln4Rzf>4NW8!MNxD9m@=IU z0i*t#D#(VPKE4;@p0#SavAY T~kZoVTXp= zJF~>11e 9w#z|kevkM=k_Z5q`-k^zBNe)w$iOEo30B !v@K5bBzFFcn6AGg>Opkj zX-o}$=18=PE@pI1<9<`o!zj+u+ldEYHVj1SO9*5#c;^2Q43%yVn6xr0j%K#1#5;x! zTIb(Qbz6{;trZ+XK?>m~WRT$89wjd1v#3G}YU9xKwnUp@y>RFKbIle5#}ZQC>wozG z3&^bFc0Hop(6ev$qjFnbZ7Fa(wL!U8rig%4`hS`7%LJIaq OsD!bE zA4@*1dwOpZ*V)g)dndo{>gboHH *Pc<#YT~j!D@2Bbzms z0>FE4+TTpQHx+jl5FH7k9%k42idWL;G*3WYj?yP3Jzw#564J%b365bThlvcJB*X9H zzP}IHW=r7zb|k}~n|}DX(-lDLWjw5YxOkv&T_9kLL4Je&q>k;r8G!8iDTA))*A{l< z&u?)_oFF#3Z-e++oZnN}AKz`W%0(>={mQ8hU@fFZeGppYS{U<_OHO=lkZ4`+bz)W4 zVb>_CfM}iY9^T@v?T^~x!!fl2aRU}M(uB^~s2FOn<_I=+4S%_Sb5se1JhWBCp+-c8 zX`TJaLk3MR4`_gS6%|K^X}bsBz_M);T3C5NZkTEv>=}FTh=89V56JG=@w;n>X2H>c zV3}X?+CXRC;bDiZ7-hVYw8U39!n AAZ$nxJA_Lo3H!VB(c##Q`=j`i+9KmaU_`y35F0rg0kSsw z6qgXa04O}+Si c3h4dw1!>9FbDL <}cuSmlWkwcg`lT zp?T5>sVJJT YQIZF{?k79ayfffNC4biv)=uBs ajP8ORoY7vC*0V z-hBEj79Gu1Lc*T>y=#AJ`D?eW(Jna{0$!t?w1F9u{f|q#6jv-J-))tzE+a`X1~z9K zHnYCr^O4${uBIadP+0-)%b235rYGcDQe5AYkDJ#7VNqp7n-1jp;(R>zwme?BGbX#{ zt`EV=8r+l~xw-d?d=rds40xL~_8%+Ezl;$6)>w~vT>rPvpPm z%&KV!Khh}!atWj_j;!90W?awh=v1+ pA`ihG2tJO}Ec_q{ht~Hb|1EdG6S4xz zJCb`q5{OBSaV$y)j?i<_jx{wBI?gNIEqXx=#W_ngC)>r)R)Tr8i@`u_S==95sMx39 zV-h}ek2Et2;H?Kz!mzLljq|L^@ZdVNa=eRN6IioOyez(t>oEi^pOq!q1#6}SJxr$0 zJ25A8MM+%kvv_ICBXOM4BDG2moabkI#&=!FwMb5I&1%MXW;S;%Y1)zvbDBM(3j}L7 zb)|4DJV!7hYs^!Z |+tg;qaVF}vylU3CqJQ43x5KXb)ASG`GH5&TSa zVdpWs>`PAA2W0cmoMcTlY0bWGrd#WA=x?6~1*Jt!FZI7f-D@sAWrh-m^C!ZZ-BaHL zbN0ETCQpdV@r||>6%-(02XmUQmRH*>O3Y#Ik2sbjEtWp8&+Cd?A uhpU;?w}ReF1>`#x8KuNy<`DYjo|;8cQfLDW&uEMF-1&4gi1lAQ|v2=Qf&1#^lIlaX&0aPaU(miwsfLV)Ow%S{Do| z-pj2!PW9da`$@R@uSSohG>jp~bJ;tozPO*32NZz~zgy>`@w(&4(4UBNZ>)0y;|=?% z3*zhw++J{1BeQv9-|iTHHQ=WkWmRzJB1!;mSVrOs8%yVeMGH7U#jhXVN?WintIOW- z_mJ-N*^Q>D)~s7^ZOrHyq-iKWp(t~M yU#95{y zQ4C}z$H?aqbHe;s$~!pm5`5r zmCTi+ugs5LNvK@XZh>)tZN^71c%OzuArH`O@4>&ZXg!{~4@nzdC49NRI6eFpQTqFc z(9?`3^DV*@H+PQ2PehNfN|R%B>z{xQ@rD;{yfn kS~W7ka2r?2yK OVPj_&-MO*9RtL4oH;e%xO{T5<%NL@5GV;aiUoBw^*OK~UB9DPf_J;U(0Z~qF zK-nLOpPB_NT?53YK3RxQ4d~(FI?B@f+gp#A-l(%tv$b@CumNhau;mj>{jDG~PWzz^ zSh1U(Ce-9 SN>ra>w0$sWYQ-v!qrJr>ii&lq!yv6=uZamwrFPi&nP;gW# zGNiF6W&TU!k4-EAJzSjmj?4R^syhHH7L?M04HNHyxB}pytVtgi9uW1WdBpYc_@F8Q zKY12_otxg6t@?i*iu(q(H;6UwXPhAf`urIL+uY8eOTX0ra~5BH`yJ;u?h6(ElLgl| z7j|6-ip|J~mQ?!XugWfId7HXD&E#ZzPSpB4HsJ02w!l?uNZXOyqwV4ijysa@iFEps zpZ2^aDO47iLtwST`o3AD?^+4(fLQXq)@-Xh=tH>a B^lZXfK4vDzNs49dkaFo?IGBx@Vl>Zz_CPd+a=h jfBTqTxK6TCz8nE2Sz{XBp*eX$mZ68?q#xX+6m|C6A4ei^B zQ|4nh25TD%fD3@r;c#)Z|M;Xxnv8oUQ1gVV{b*VURd 3JHdI;Ba~=8=;d< $y%setBr4CT*#7gLIAS*HqJBOVj0t~ zq+!<;@Oi%y72f#fT_zF)E^iWM%ISX}*0NGeAb9%PVY^ptwZ?h5|IB#m{Po+5$>mg; zg?>^8JCIL$4@5<|oWd`A 4;yLiycJ;4V7uMh%ey1i z7jCZ@bzqyDTIm8Py*GAwZ$qlu^aNYw(O0!YBba}0^7H+hgPPL)6qi(^t|mdLPJuVz z>f+OES-olBQAlIT2ykn1p5h?1U8H@&iYZ|y-jFD__Ah7gORXd^`|F2(;eXeKvaV`> zxrj2zk_nJT oX4}_FlD-DK!o5V3-o{UAI`87(;2%mp=E1Tx_r2#sVWf z-sy`N@cQ-|FYai7eLYV5o+UkOc-^Ig W`0HVh1TW@nz$=e zR@iR+hG-%Gne3c|@2#ghJxXx(o6CD{5vTfMMEy36epY2HCx~#P2Eaxqfm2Yka{71- z|3%CeL>QAZ6eJBY!GQK3g>==cGzm*NO?j32P;vD2|HImwM>Tb>{rl~)O05I7sHi|F zwMtv2S_)wbsZxtn0b7Rv0is~xlqmv2Afrk(RSKx6hzyZBAR+`r2t!D;%mRtZ5JG?e zAxsHF<~jLpu=dz wZpX(ZX(X^Uklww@oKx83mnGRqV zMh=m2yZeL&y`@9YU2bF eb>FaUMA%pDQ~Qm+a*JO__~*^Gby}Y{8&D6~~TRBH7OZ z0%anAJjCuUkXBg(ey{(9-c~Hz?%l$ z9>Z|6+M z@eIFt6Qm}Nv(;@#-b_*VQ`mP}$Rhe(>5nXH^=y9P{N%*jAdg=bJx-_pfVqG31uM6O zdM4OQrCYnR(L*BrN_OyE)Q&O)(skxI>xaV5`bn#Tkz#{zBt~i+Qrh4NK0la(jgLKO zkrp+zaO1ID3Y3Gp$$B91aUlcF)Pm&Lhzl4%@08Nxhr*JJWHY6q6`AAc+|_{V55b)c za72hQk3VuPE$hD^h8L&2tgBrmNm{RYRv+z2u>4RQA~@tX5U{NNW1)e;!3X}_AfL+U zKMfAfc?4i+iHtkS5d*t+=EI|Q1KW1v;&*wt3MX wGAIM+@pir2-t;cgCl4uQs%uDg2VT6^uyM_un9+i}Yn32S$2d_7zpBo|PU=PO_k5 zEr=sG3esId92-|}ni2$wc0aip0`KOsZcYKUW!AlJ0{ctL?g`&IA{Fn0M*bb}^=iIp zrXZubTNjiSX8?hVDu~KXmRt*8*8)als$#xRm`T@)+)xDzfcGtB&%&)pG>$^#)oT}v zMhq%*cTeq!%BtjGtcT2>v4>Q!W5#1P8y^-PF^CTH34U%Q<>Y4b`R;;3C+YQ^s|`*w ztl8(VC1o9u>ds~s7{!B~KA9{7y3i(hH^X$_6Emi>Lv@>Sz$GIiy{YU4EtiX3O3bB? zFuS$ei_k+lR1}JSo?uD`qI0N4H4LoWRyE|3qSAtq>%Sjxf#%W?yam&*J?E$J+La{b zucjekeGd54?C3)rV85YMhs{3Ni;&)$9y>zqzD>MB3<4JtYg52Dy7Kby+LYLxjr;=R zvk9G|PK(%!_ RK #A~t5~ x`)!a@c5Sd{7HzW|(+`!EzbzOx-o>6NaDYl;R$#^>6DaYB z{hHiC{Js~&34hct7o7-g+ci`}&q6u5&GNqUbsCE=kHXUju9BmN9iIJEeivcLMIroa zT4$-_GJ~k4Jgz#K5%tq4r;7_7K6NR1iDm0?I|u_HVU>LzWAe6x^OQ76S3qNAj7(n0 z88)BNA?<2sh1*n%{S@@BM&*YZYO()_+V7Qm&$e#pl)@0WWD6uI_g 3m$*uNJNrz1@p|^~;&40U@E+q#-9%$v z(Be+kiWq^k;^*Sb0GhKq1pRK!+xJN!{vsvh^iA*`aJX^jxG3g}BGNhK?EQ83jVg#y zs>y6R-ZY{fZ!RNIMi$q zls8fzv|rX0 D?4~nM{*!^AXGLq?>6^20!DS~wX(xsXJ_QWBvJLKa5UStr z@Tyc+B=BYf-|k|0Tqk-E2uK8+ER<(&o)X;&Y-Z#R__#)APj%I{wA3j2?{;4B_8&LG zyXFzo0Ml>Z)pUVdBu_Z_5@m5G5&z2IKr73pO`)Em P`v}y&EDWZ;(dhr z|4gmQGFCB9d>S|U-Zu2zpw|PQd(t9G`y4KO2{XjrM2C%-7lEr^XXzd^czBwoy&lD{ z3t;S_4)h14m>g@nz&X${-1|s$k$B3qYm%g!Zb+VveL%^WtlexpoBI@7yJQ;&2gXFZ zICPpYN46MR`+N&utGPodO6iH@q^5pHZ}sHL#L*`mzI*T++FY5kRzEoY3sRl`KY-&d z3xq4{+3wz+vXi}5EaOgNj&~@{xJ?5E#NYF&2b91Hq=a6LB{(?Up>6FH_O<0awa#Fp z<9scO{$Tv*-yQ1rdan4v!Qn^nW&j`bpeGN8fYY=9W7?=Y2+O*Xg_s)`PuLT}`T4XB zte}3>tPjqrA!*@&^&7Mx_G1vPv4tEek3*0D5jZcTldNRd@~}fEfIk_f?@RwF8PnEn zdo*MKn_p2WLsTiy#(xGtU2~}zDq9Z57_zAb6_ETAg{&Ew+?->LQkmII0r(=za)sf) zh~a3&SwBVOU)a}i>&0Lmph2xtO{aIe;@08RZcov9k;qHq31_QEA5=w8G{L#EEz)rS zAr#MaD_)pzJI{XQIYsSZZtFj1{hAW;|0|Ps8aP&Xs=w9WV!gSV5cgtov=35JYn|6r zy{i9gDWm+dF%nm5+LLblNYFTxO`&BAwnP+9ne6`~E*S50ORszaTL!PV`wgh28z|ct z9f3rL``LJTGv!`4e00R{Exq-)kImBx0epUzwQB9u=|AX!|7OIKmTvwkbXApK0U>vv zY;CT}#vB(^ivD}rRYmm`cTR2=1=p;+0{8c@s38m#jsbI}6GMLnYb_zllw0g4F7)t) zT45&=nowR|H{tu+{{P7 u$Hqm1} zy=mGE8l5jwIvchTTqogvo{dsyQv1j@l^>>#r41_;7_-$zkj0riYik_q9dV5x^;F|T zz6YLl%X}cny%dX$$FuH7UpVaWsiC(o4Xe2o2*ADp^+_zP+YXu7ak>E@R4p$^w-n9d z{+F9a7Qx_HP5hvTa{6oPslER>QxoS&S}&ek@#*S6OXmra|1*_*AuyNd)Z2;(IpAAS zb1Bq3dA`L959vJu2VQI;(fO5Hwi%qk=sX%7>se<(zqK@W-6U9YES$Z<_^4fa?0syM zZQDmz{vkh~{c*j_S^p*BlFc_uqho@zE}GHb<>$XgG~aB#{cH1!vYFw9ei@{!xz1+C zJF{#%14kJ3ZlSK}VJDtjHs`TbBW_|wP(0%wZl);mkej%f%%3|@B(wL=;9vE+>9Zt^ zPPfT%5Xws4q(v;nGnXd~yAeaOin=G)0Xo(1V{I5RiJ!M*xL#Q5fuQ>T@LF3zeze2F zJB3Seil9%PWZu72Yt^!`n`sTL6HTbgck757tOGNSIm^0>h#q+J_7UnGPi@rw?d8yN zwfGSa*wcc)@1E#?2Y_=jM#ADPOe+&DYTwQRQMSc5Pv45D3^CJ}&^LI~=b|TtE>WW$ zOv~h*+SA)j7hiT)=3^rbPj;@D?@!%_2$oEh%2U@rEK1Dd4ld5Xt@BxX)E&hO@hz7v zr9*BaiyW+2X5wGIur1k_^}kz^f-3(vE4pW`pV`XjIeLTS@6q8`4x*=FTl?PYY%%F9 zZ(~DUDiiqsy`ntiaA$)v>c4TN#|0>UTk52#J#Q(?%XTc0wnMA#Iv@^|of1{^#gYr9 z{^cO