"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4013,0],{2896:function(e,t,r){r.d(t,{Z:function(){return b}});var a=r(3366),n=r(7294),l=r(6010),s=r(2051),c=r(2511),o="sidebar_2ahu",i="sidebarItemTitle_2hhb",m="sidebarItemList_2xAf",u="sidebarItem_2UVv",f="sidebarItemLink_1RT6",d="sidebarItemLinkActive_12pM",v=r(7130);function g(e){var t=e.sidebar;return 0===t.items.length?null:n.createElement("nav",{className:(0,l.Z)(o,"thin-scrollbar"),"aria-label":(0,v.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},n.createElement("div",{className:(0,l.Z)(i,"margin-bottom--md")},t.title),n.createElement("ul",{className:m},t.items.map((function(e){return n.createElement("li",{key:e.permalink,className:u},n.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:f,activeClassName:d},e.title))}))))}var h=r(5389),E=["sidebar","toc","children"];var b=function(e){var t=e.sidebar,r=e.toc,c=e.children,o=(0,a.Z)(e,E),i=t&&t.items.length>0;return n.createElement(s.Z,o,n.createElement("div",{className:"container margin-vert--lg"},n.createElement("div",{className:"row"},i&&n.createElement("aside",{className:"col col--3"},n.createElement(g,{sidebar:t})),n.createElement("main",{className:(0,l.Z)("col",{"col--7":i,"col--9 col--offset-1":!i})},c),r&&n.createElement("div",{className:"col col--2"},n.createElement(h.Z,{toc:r})))))}},9488:function(e,t,r){r.r(t);var a=r(7294),n=r(2511),l=r(2896),s=r(7130),c=r(8626);t.default=function(e){var t=e.tags,r=e.sidebar,o=(0,s.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"}),i={};Object.keys(t).forEach((function(e){var t=function(e){return e[0].toUpperCase()}(e);i[t]=i[t]||[],i[t].push(e)}));var m=Object.entries(i).sort((function(e,t){var r=e[0],a=t[0];return r.localeCompare(a)})).map((function(e){var r=e[0],l=e[1];return a.createElement("article",{key:r},a.createElement("h2",null,r),l.map((function(e){return a.createElement(n.Z,{className:"padding-right--md",href:t[e].permalink,key:e},t[e].name," (",t[e].count,")")})),a.createElement("hr",null))})).filter((function(e){return null!=e}));return a.createElement(l.Z,{title:o,wrapperClassName:c.kM.wrapper.blogPages,pageClassName:c.kM.page.blogTagsListPage,searchMetadatas:{tag:"blog_tags_list"},sidebar:r},a.createElement("h1",null,o),a.createElement("section",{className:"margin-vert--lg"},m))}},5389:function(e,t,r){r.d(t,{r:function(){return o},Z:function(){return i}});var a=r(7294),n=r(6010);var l=function(e,t,r){var n=(0,a.useState)(void 0),l=n[0],s=n[1];(0,a.useEffect)((function(){function a(){var a=function(){var e=Array.from(document.getElementsByClassName("anchor")),t=e.find((function(e){return e.getBoundingClientRect().top>=r}));if(t){if(t.getBoundingClientRect().top>=r){var a=e[e.indexOf(t)-1];return null!=a?a:t}return t}return e[e.length-1]}();if(a)for(var n=0,c=!1,o=document.getElementsByClassName(e);n<o.length&&!c;){var i=o[n],m=i.href,u=decodeURIComponent(m.substring(m.indexOf("#")+1));a.id===u&&(l&&l.classList.remove(t),i.classList.add(t),s(i),c=!0),n+=1}}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),function(){document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}}))},s="tableOfContents_35-E",c="table-of-contents__link";function o(e){var t=e.toc,r=e.isChild;return t.length?a.createElement("ul",{className:r?"":"table-of-contents table-of-contents__left-border"},t.map((function(e){return a.createElement("li",{key:e.id},a.createElement("a",{href:"#"+e.id,className:c,dangerouslySetInnerHTML:{__html:e.value}}),a.createElement(o,{isChild:!0,toc:e.children}))}))):null}var i=function(e){var t=e.toc;return l(c,"table-of-contents__link--active",100),a.createElement("div",{className:(0,n.Z)(s,"thin-scrollbar")},a.createElement(o,{toc:t}))}},283:function(e,t,r){r.d(t,{Z:function(){return h}});var a=r(7462),n=r(3366),l=r(7294),s=r(6010),c=r(2511),o=r(8626),i=r(9524),m="footerLogoLink_qW4Z",u="footerCopyright_2yvt",f=r(4087),d=["to","href","label","prependBaseUrlToHref"];function v(e){var t=e.to,r=e.href,s=e.label,o=e.prependBaseUrlToHref,m=(0,n.Z)(e,d),u=(0,i.Z)(t),f=(0,i.Z)(r,{forcePrependBaseUrl:!0});return l.createElement(c.Z,(0,a.Z)({className:"footer__link-item"},r?{href:o?f:r}:{to:u},m),s)}var g=function(e){var t=e.sources,r=e.alt;return l.createElement(f.Z,{className:"footer__logo",alt:r,sources:t})};var h=function(){var e=(0,o.LU)().footer,t=e||{},r=t.copyright,a=t.links,n=void 0===a?[]:a,f=t.logo,d=void 0===f?{}:f,h={light:(0,i.Z)(d.src),dark:(0,i.Z)(d.srcDark||d.src)};return e?l.createElement("footer",{className:(0,s.Z)("footer",{"footer--dark":"dark"===e.style})},l.createElement("div",{className:"container"},n&&n.length>0&&l.createElement("div",{className:"row footer__links"},n.map((function(e,t){return l.createElement("div",{key:t,className:"col footer__col"},null!=e.title?l.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?l.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?l.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):l.createElement("li",{key:e.href||e.to,className:"footer__item"},l.createElement(v,e))}))):null)}))),(d||r)&&l.createElement("div",{className:"footer__bottom text--center"},d&&(d.src||d.srcDark)&&l.createElement("div",{className:"margin-bottom--sm"},d.href?l.createElement(c.Z,{href:d.href,className:m},l.createElement(g,{alt:d.alt,sources:h})):l.createElement(g,{alt:d.alt,sources:h})),r?l.createElement("div",{className:u,dangerouslySetInnerHTML:{__html:r}}):null))):null}}}]);