(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"3pNy":function(e,t,n){var r=n("OBhP"),o=n("GDhZ");e.exports=function(e,t){return o(e,r(t,1))}},"67s2":function(e,t,n){e.exports=n("oasZ")},HhVK:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n("i8i4"),o=n.n(r);function i(e,t,n,r){var i=o.a.unstable_batchedUpdates?function(e){o.a.unstable_batchedUpdates(n,e)}:n;return e.addEventListener&&e.addEventListener(t,i,r),{remove:function(){e.removeEventListener&&e.removeEventListener(t,i)}}}},"S+ru":function(e,t,n){},"c+Xe":function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n("TOwV");function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){"function"==typeof e?e(t):"object"===o(e)&&e&&"current"in e&&(e.current=t)}function a(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){t.forEach((function(t){i(t,e)}))}}function s(e){var t,n,o=Object(r.isMemo)(e)?e.type.type:e.type;return!("function"==typeof o&&!(null===(t=o.prototype)||void 0===t?void 0:t.render))&&!("function"==typeof e&&!(null===(n=e.prototype)||void 0===n?void 0:n.render))}},hhGP:function(e,t,n){"use strict";var r=n("k1TG"),o=n("FqMR"),i=n("8o2o"),a=n("duPW"),s=n.n(a),c=n("67s2"),l=n.n(c),f=n("q1tI"),u=n.n(f),d=n("52AM");function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function m(){return(m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function h(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function v(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?h(Object(n),!0).forEach((function(t){p(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):h(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function b(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var y=u.a.createContext({}),O=function(e){return function(t){var n=g(t.components);return u.a.createElement(e,m({},t,{components:n}))}},g=function(e){var t=u.a.useContext(y),n=t;return e&&(n="function"==typeof e?e(t):v(v({},t),e)),n},j=function(e){var t=g(e.components);return u.a.createElement(y.Provider,{value:t},e.children)},x={inlineCode:"code",wrapper:function(e){var t=e.children;return u.a.createElement(u.a.Fragment,{},t)}},_=u.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,a=b(e,["components","mdxType","originalType","parentName"]),s=g(n),c=r,l=s["".concat(i,".").concat(c)]||s[c]||x[c]||o;return n?u.a.createElement(l,v(v({ref:t},a),{},{components:n})):u.a.createElement(l,v({ref:t},a))}));function w(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=_;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,i[1]=a;for(var c=2;c<o;c++)i[c]=n[c];return u.a.createElement.apply(null,i)}return u.a.createElement.apply(null,n)}_.displayName="MDXCreateElement",void 0!==O&&O&&O===Object(O)&&Object.isExtensible(O)&&!O.hasOwnProperty("__filemeta")&&Object.defineProperty(O,"__filemeta",{configurable:!0,value:{name:"withMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==g&&g&&g===Object(g)&&Object.isExtensible(g)&&!g.hasOwnProperty("__filemeta")&&Object.defineProperty(g,"__filemeta",{configurable:!0,value:{name:"useMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==w&&w&&w===Object(w)&&Object.isExtensible(w)&&!w.hasOwnProperty("__filemeta")&&Object.defineProperty(w,"__filemeta",{configurable:!0,value:{name:"createElement",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==j&&j&&j===Object(j)&&Object.isExtensible(j)&&!j.hasOwnProperty("__filemeta")&&Object.defineProperty(j,"__filemeta",{configurable:!0,value:{name:"MDXProvider",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==y&&y&&y===Object(y)&&Object.isExtensible(y)&&!y.hasOwnProperty("__filemeta")&&Object.defineProperty(y,"__filemeta",{configurable:!0,value:{name:"MDXContext",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==O&&O&&O===Object(O)&&Object.isExtensible(O)&&!O.hasOwnProperty("__filemeta")&&Object.defineProperty(O,"__filemeta",{configurable:!0,value:{name:"withMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==g&&g&&g===Object(g)&&Object.isExtensible(g)&&!g.hasOwnProperty("__filemeta")&&Object.defineProperty(g,"__filemeta",{configurable:!0,value:{name:"useMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==w&&w&&w===Object(w)&&Object.isExtensible(w)&&!w.hasOwnProperty("__filemeta")&&Object.defineProperty(w,"__filemeta",{configurable:!0,value:{name:"createElement",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==j&&j&&j===Object(j)&&Object.isExtensible(j)&&!j.hasOwnProperty("__filemeta")&&Object.defineProperty(j,"__filemeta",{configurable:!0,value:{name:"MDXProvider",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==y&&y&&y===Object(y)&&Object.isExtensible(y)&&!y.hasOwnProperty("__filemeta")&&Object.defineProperty(y,"__filemeta",{configurable:!0,value:{name:"MDXContext",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}});var P=n("Wbzz"),k=function(){try{var e=Object(P.useStaticQuery)("1635659820");return JSON.parse(e.doczDb.db)}catch(t){return console.error(t),console.error("Error when parsing docz database"),{}}};void 0!==k&&k&&k===Object(k)&&Object.isExtensible(k)&&!k.hasOwnProperty("__filemeta")&&Object.defineProperty(k,"__filemeta",{configurable:!0,value:{name:"useDbQuery",filename:"node_modules/gatsby-theme-docz/src/hooks/useDbQuery.js"}}),void 0!==k&&k&&k===Object(k)&&Object.isExtensible(k)&&!k.hasOwnProperty("__filemeta")&&Object.defineProperty(k,"__filemeta",{configurable:!0,value:{name:"useDbQuery",filename:"node_modules/gatsby-theme-docz/src/hooks/useDbQuery.js"}});var E=n("qKvR"),C=function(e){var t=e.children;return Object(E.jsx)(f.Fragment,null,t)},T=C;void 0!==C&&C&&C===Object(C)&&Object.isExtensible(C)&&!C.hasOwnProperty("__filemeta")&&Object.defineProperty(C,"__filemeta",{configurable:!0,value:{name:"Wrapper",filename:"node_modules/gatsby-theme-docz/src/wrapper.js"}}),void 0!==C&&C&&C===Object(C)&&Object.isExtensible(C)&&!C.hasOwnProperty("__filemeta")&&Object.defineProperty(C,"__filemeta",{configurable:!0,value:{name:"Wrapper",filename:"node_modules/gatsby-theme-docz/src/wrapper.js"}});var N=n("dCk4"),S=n("vrFN"),D=n("9Dj+"),z=(n("SchZ"),n("S+ru"),n("rSSF"),n("j8BX")),L=n.n(z),M=n("0jh0"),R=n.n(M),A=n("phZJ"),F=n.n(A),U=n("lFqo"),B=n.n(U),H=n("v06X"),X=n.n(H),I=n("IVAY"),W=n.n(I),Q=n("CPqs"),Z=n.n(Q),V=n("i8i4"),q=n("TSYQ"),J=n.n(q),K=n("HhVK"),G=n("cjBy"),Y=n.n(G),$=n("BGR+"),ee=n("t23M"),te=n("H84U"),ne=n("R7tm"),re=n.n(ne),oe=n("xEkU"),ie=n.n(oe);function ae(){return function(e,t,n){var r=n.value,o=!1;return{configurable:!0,get:function(){if(o||this===e.prototype||this.hasOwnProperty(t))return r;var n=function(e){var t,n=function(n){return function(){t=null,e.apply(void 0,re()(n))}},r=function(){if(null==t){for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];t=ie()(n(r))}};return r.cancel=function(){return ie.a.cancel(t)},r}(r.bind(this));return o=!0,Object.defineProperty(this,t,{value:n,configurable:!0,writable:!0}),o=!1,n}}}}function se(e){return e!==window?e.getBoundingClientRect():{top:0,bottom:window.innerHeight}}function ce(e,t,n){if(void 0!==n&&t.top>e.top-n)return n+t.top}function le(e,t,n){if(void 0!==n&&t.bottom<e.bottom+n)return n+(window.innerHeight-t.bottom)}var fe=["resize","scroll","touchstart","touchmove","touchend","pageshow","load"],ue=[];function de(e,t){if(e){var n=ue.find((function(t){return t.target===e}));n?n.affixList.push(t):(n={target:e,affixList:[t],eventHandlers:{}},ue.push(n),fe.forEach((function(t){n.eventHandlers[t]=Object(K.a)(e,t,(function(){n.affixList.forEach((function(e){e.lazyUpdatePosition()}))}))})))}}function pe(e){var t=ue.find((function(t){var n=t.affixList.some((function(t){return t===e}));return n&&(t.affixList=t.affixList.filter((function(t){return t!==e}))),n}));t&&0===t.affixList.length&&(ue=ue.filter((function(e){return e!==t})),fe.forEach((function(e){var n=t.eventHandlers[e];n&&n.remove&&n.remove()})))}var me,he=function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"===("undefined"==typeof Reflect?"undefined":Y()(Reflect))&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};function ve(){return"undefined"!=typeof window?window:null}!function(e){e[e.None=0]="None",e[e.Prepare=1]="Prepare"}(me||(me={}));var be=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).state={status:me.None,lastAffix:!1,prevTarget:null},e.getOffsetTop=function(){var t=e.props.offsetBottom,n=e.props.offsetTop;return void 0===t&&void 0===n&&(n=0),n},e.getOffsetBottom=function(){return e.props.offsetBottom},e.savePlaceholderNode=function(t){e.placeholderNode=t},e.saveFixedNode=function(t){e.fixedNode=t},e.measure=function(){var t=e.state,n=t.status,r=t.lastAffix,o=e.props.onChange,i=e.getTargetFunc();if(n===me.Prepare&&e.fixedNode&&e.placeholderNode&&i){var a=e.getOffsetTop(),s=e.getOffsetBottom(),c=i();if(c){var l={status:me.None},f=se(c),u=se(e.placeholderNode),d=ce(u,f,a),p=le(u,f,s);void 0!==d?(l.affixStyle={position:"fixed",top:d,width:u.width,height:u.height},l.placeholderStyle={width:u.width,height:u.height}):void 0!==p&&(l.affixStyle={position:"fixed",bottom:p,width:u.width,height:u.height},l.placeholderStyle={width:u.width,height:u.height}),l.lastAffix=!!l.affixStyle,o&&r!==l.lastAffix&&o(l.lastAffix),e.setState(l)}}},e.prepareMeasure=function(){e.setState({status:me.Prepare,affixStyle:void 0,placeholderStyle:void 0})},e.render=function(){var t=e.context.getPrefixCls,n=e.state,r=n.affixStyle,o=n.placeholderStyle,i=e.props,a=i.prefixCls,s=i.children,c=J()(R()({},t("affix",a),r)),l=Object($.a)(e.props,["prefixCls","offsetTop","offsetBottom","target","onChange"]);return f.createElement(ee.a,{onResize:function(){e.updatePosition()}},f.createElement("div",L()({},l,{ref:e.savePlaceholderNode}),r&&f.createElement("div",{style:o,"aria-hidden":"true"}),f.createElement("div",{className:c,ref:e.saveFixedNode,style:r},f.createElement(ee.a,{onResize:function(){e.updatePosition()}},s))))},e}return B()(n,[{key:"getTargetFunc",value:function(){var e=this.context.getTargetContainer,t=this.props.target;return void 0!==t?t:e||ve}},{key:"componentDidMount",value:function(){var e=this,t=this.getTargetFunc();t&&(this.timeout=setTimeout((function(){de(t(),e),e.updatePosition()})))}},{key:"componentDidUpdate",value:function(e){var t=this.state.prevTarget,n=this.getTargetFunc(),r=null;n&&(r=n()||null),t!==r&&(pe(this),r&&(de(r,this),this.updatePosition()),this.setState({prevTarget:r})),e.offsetTop===this.props.offsetTop&&e.offsetBottom===this.props.offsetBottom||this.updatePosition(),this.measure()}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timeout),pe(this),this.updatePosition.cancel(),this.lazyUpdatePosition.cancel()}},{key:"updatePosition",value:function(){this.prepareMeasure()}},{key:"lazyUpdatePosition",value:function(){var e=this.getTargetFunc(),t=this.state.affixStyle;if(e&&t){var n=this.getOffsetTop(),r=this.getOffsetBottom(),o=e();if(o&&this.placeholderNode){var i=se(o),a=se(this.placeholderNode),s=ce(a,i,n),c=le(a,i,r);if(void 0!==s&&t.top===s||void 0!==c&&t.bottom===c)return}}this.prepareMeasure()}}]),n}(f.Component);be.contextType=te.b,he([ae()],be.prototype,"updatePosition",null),he([ae()],be.prototype,"lazyUpdatePosition",null);var ye=be;function Oe(e){return null!=e&&e===e.window}function ge(e,t){if("undefined"==typeof window)return 0;var n=t?"scrollTop":"scrollLeft",r=0;return Oe(e)?r=e[t?"pageYOffset":"pageXOffset"]:e instanceof Document?r=e.documentElement[n]:e&&(r=e[n]),e&&!Oe(e)&&"number"!=typeof r&&(r=(e.ownerDocument||e).documentElement[n]),r}function je(e,t,n,r){var o=n-t;return(e/=r/2)<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t}function xe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getContainer,r=void 0===n?function(){return window}:n,o=t.callback,i=t.duration,a=void 0===i?450:i,s=r(),c=ge(s,!0),l=Date.now(),f=function t(){var n=Date.now()-l,r=je(n>a?a:n,c,e,a);Oe(s)?s.scrollTo(window.pageXOffset,r):s instanceof HTMLDocument||"HTMLDocument"===s.constructor.name?s.documentElement.scrollTop=r:s.scrollTop=r,n<a?ie()(t):"function"==typeof o&&o()};ie()(f)}var _e=f.createContext(null);function we(){return window}function Pe(e,t){if(!e.getClientRects().length)return 0;var n=e.getBoundingClientRect();return n.width||n.height?t===window?(t=e.ownerDocument.documentElement,n.top-t.clientTop):n.top-t.getBoundingClientRect().top:n.top}var ke=/#(\S+)$/,Ee=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).state={activeLink:null},e.links=[],e.registerLink=function(t){e.links.includes(t)||e.links.push(t)},e.unregisterLink=function(t){var n=e.links.indexOf(t);-1!==n&&e.links.splice(n,1)},e.getContainer=function(){var t=e.context.getTargetContainer;return(e.props.getContainer||t||we)()},e.handleScrollTo=function(t){var n=e.props,r=n.offsetTop,o=n.targetOffset;e.setCurrentActiveLink(t);var i=e.getContainer(),a=ge(i,!0),s=ke.exec(t);if(s){var c=document.getElementById(s[1]);if(c){var l=a+Pe(c,i);l-=void 0!==o?o:r||0,e.animating=!0,xe(l,{callback:function(){e.animating=!1},getContainer:e.getContainer})}}},e.saveInkNode=function(t){e.inkNode=t},e.setCurrentActiveLink=function(t){var n=e.state.activeLink,r=e.props.onChange;n!==t&&(e.setState({activeLink:t}),r&&r(t))},e.handleScroll=function(){if(!e.animating){var t=e.props,n=t.offsetTop,r=t.bounds,o=t.targetOffset,i=e.getCurrentAnchor(void 0!==o?o:n||0,r);e.setCurrentActiveLink(i)}},e.updateInk=function(){var t=X()(e).prefixCls,n=V.findDOMNode(X()(e)).getElementsByClassName("".concat(t,"-link-title-active"))[0];n&&(e.inkNode.style.top="".concat(n.offsetTop+n.clientHeight/2-4.5,"px"))},e.render=function(){var t=e.context,n=t.getPrefixCls,r=t.direction,o=e.props,i=o.prefixCls,a=o.className,s=void 0===a?"":a,c=o.style,l=o.offsetTop,u=o.affix,d=o.showInkInFixed,p=o.children,m=e.state.activeLink,h=n("anchor",i);e.prefixCls=h;var v=J()("".concat(h,"-ink-ball"),{visible:m}),b=J()("".concat(h,"-wrapper"),R()({},"".concat(h,"-rtl"),"rtl"===r),s),y=J()(h,{fixed:!u&&!d}),O=L()({maxHeight:l?"calc(100vh - ".concat(l,"px)"):"100vh"},c),g=f.createElement("div",{className:b,style:O},f.createElement("div",{className:y},f.createElement("div",{className:"".concat(h,"-ink")},f.createElement("span",{className:v,ref:e.saveInkNode})),p));return f.createElement(_e.Provider,{value:{registerLink:e.registerLink,unregisterLink:e.unregisterLink,activeLink:e.state.activeLink,scrollTo:e.handleScrollTo,onClick:e.props.onClick}},u?f.createElement(ye,{offsetTop:l,target:e.getContainer},g):g)},e}return B()(n,[{key:"componentDidMount",value:function(){this.scrollContainer=this.getContainer(),this.scrollEvent=Object(K.a)(this.scrollContainer,"scroll",this.handleScroll),this.handleScroll()}},{key:"componentDidUpdate",value:function(){if(this.scrollEvent){var e=this.getContainer();this.scrollContainer!==e&&(this.scrollContainer=e,this.scrollEvent.remove(),this.scrollEvent=Object(K.a)(this.scrollContainer,"scroll",this.handleScroll),this.handleScroll())}this.updateInk()}},{key:"componentWillUnmount",value:function(){this.scrollEvent&&this.scrollEvent.remove()}},{key:"getCurrentAnchor",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5,n=this.props.getCurrentAnchor;if("function"==typeof n)return n();var r=[],o=this.getContainer();if(this.links.forEach((function(n){var i=ke.exec(n.toString());if(i){var a=document.getElementById(i[1]);if(a){var s=Pe(a,o);s<e+t&&r.push({link:n,top:s})}}})),r.length){var i=r.reduce((function(e,t){return t.top>e.top?t:e}));return i.link}return""}}]),n}(f.Component);Ee.defaultProps={affix:!0,showInkInFixed:!1},Ee.contextType=te.b;var Ce=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).handleClick=function(t){var n=e.context,r=n.scrollTo,o=n.onClick,i=e.props,a=i.href,s=i.title;o&&o(t,{title:s,href:a}),r(a)},e.renderAnchorLink=function(t){var n=t.getPrefixCls,r=e.props,o=r.prefixCls,i=r.href,a=r.title,s=r.children,c=r.className,l=r.target,u=n("anchor",o),d=e.context.activeLink===i,p=J()("".concat(u,"-link"),R()({},"".concat(u,"-link-active"),d),c),m=J()("".concat(u,"-link-title"),R()({},"".concat(u,"-link-title-active"),d));return f.createElement("div",{className:p},f.createElement("a",{className:m,href:i,title:"string"==typeof a?a:"",target:l,onClick:e.handleClick},a),s)},e}return B()(n,[{key:"componentDidMount",value:function(){this.context.registerLink(this.props.href)}},{key:"componentDidUpdate",value:function(e){var t=e.href,n=this.props.href;t!==n&&(this.context.unregisterLink(t),this.context.registerLink(n))}},{key:"componentWillUnmount",value:function(){this.context.unregisterLink(this.props.href)}},{key:"render",value:function(){return f.createElement(te.a,null,this.renderAnchorLink)}}]),n}(f.Component);Ce.defaultProps={href:"#"},Ce.contextType=_e;var Te=Ce;Ee.Link=Te;var Ne=Ee,Se=n("Al62"),De=Ne.Link,ze=Object(E.css)([Se.d[3]],"{display:none;}position:fixed;top:64px;right:0;width:250px;padding:16px;height:605px;overflow:auto;ul{font-size:12px;li{height:25px;line-height:25px;word-wrap:break-word;}}"),Le=function(){var e=Object(d.e)(),t=Object(Se.a)(e).headings;return Object(E.jsx)("div",{css:ze},Object(E.jsx)(Ne,null,t.map((function(e){return Object(E.jsx)(De,{href:"#"+e.slug,title:e.value})}))))},Me=Le;void 0!==Le&&Le&&Le===Object(Le)&&Object.isExtensible(Le)&&!Le.hasOwnProperty("__filemeta")&&Object.defineProperty(Le,"__filemeta",{configurable:!0,value:{name:"HeaderNav",filename:"src/components/AnchorNavigator.tsx"}});var Re=function(){var e=Object(d.e)(),t=Object(Se.c)(e),n=t[0],r=t[1];return Object(E.jsx)(u.a.Fragment,null,n&&Object(E.jsx)("a",{href:n,className:"ant-btn"},"Prev"),r&&Object(E.jsx)("a",{href:r,className:"ant-btn"},"Next"))},Ae=Re;void 0!==Re&&Re&&Re===Object(Re)&&Object.isExtensible(Re)&&!Re.hasOwnProperty("__filemeta")&&Object.defineProperty(Re,"__filemeta",{configurable:!0,value:{name:"nextButtons",filename:"src/components/next.tsx"}});n("TpwP");var Fe={name:"x3lmjk",styles:"display:flex;flex-direction:row;.doc-content{width:100%;}.try-out,.auth-wrapper,.information-container{display:none;}"},Ue=Object(d.b)()((function(e){var t=e.children,n=Object(d.d)();return Object(E.jsx)(N.a,{theme:n},Object(E.jsx)(D.a,null,Object(E.jsx)(S.a,{title:"Documentation"}),Object(E.jsx)("div",{css:Fe},Object(E.jsx)("div",{className:"doc-content"},t),Object(E.jsx)(Me,null)),Object(E.jsx)("div",null,Object(E.jsx)(Ae,null))))})),Be=Ue;void 0!==Ue&&Ue&&Ue===Object(Ue)&&Object.isExtensible(Ue)&&!Ue.hasOwnProperty("__filemeta")&&Object.defineProperty(Ue,"__filemeta",{configurable:!0,value:{name:"__DOCZ_DUMMY_EXPORT_DEFAULT",filename:"src/gatsby-theme-docz/index.tsx"}});var He=n("rid2"),Xe=function(e){var t=e.description,n=e.lang,r=e.meta,o=e.keywords,i=e.title,a=k(),s=i||a.config.title,c=t||a.config.description;return Object(E.jsx)(He.Helmet,{title:s,titleTemplate:"%s | "+a.config.title,htmlAttributes:{lang:n},meta:[{name:"description",content:c},{property:"og:title",content:s},{property:"og:description",content:c},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary"},{name:"twitter:title",content:s},{name:"twitter:description",content:c}].concat(o.length>0?{name:"keywords",content:o.join(", ")}:[]).concat(r)})};Xe.defaultProps={lang:"en",meta:[],keywords:[]};var Ie=Xe;function We(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Qe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?We(Object(n),!0).forEach((function(t){Object(o.a)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):We(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}void 0!==Xe&&Xe&&Xe===Object(Xe)&&Object.isExtensible(Xe)&&!Xe.hasOwnProperty("__filemeta")&&Object.defineProperty(Xe,"__filemeta",{configurable:!0,value:{name:"SEO",filename:"node_modules/gatsby-theme-docz/src/base/Seo.js"}}),void 0!==Xe&&Xe&&Xe===Object(Xe)&&Object.isExtensible(Xe)&&!Xe.hasOwnProperty("__filemeta")&&Object.defineProperty(Xe,"__filemeta",{configurable:!0,value:{name:"SEO",filename:"node_modules/gatsby-theme-docz/src/base/Seo.js"}});var Ze=function(e){var t=e.children,n=e.entry,r=e.isTransclusion,o=Object(i.a)(e,["children","entry","isTransclusion"]),a=Object(d.c)(),s=a.notFound,c=a.layout,l=Qe(Qe({},o),{},{doc:n});return n||r?r?t:Object(E.jsx)(j,{components:a},Object(E.jsx)(T,null,Object(E.jsx)(c,l,t))):Object(E.jsx)(s,null)},Ve=function(e){var t=e.children,n=Object(i.a)(e,["children"]),o=n.pageContext,a=k(),c=function(e,t){var n=t&&t.frontmatter&&"/"===t.frontmatter.route,r=l()("value.route","/");if(t&&!t.entry&&n)return e.entries.find(r);var o=s()("entry.filepath",t);return e.entries.find(l()("value.filepath",o))}(a,o),u=function(e,t){var n=e.entries,r=s()("_frontmatter.__filemeta.filename",t);return!t.pageContext&&n.includes(n.find(l()("value.filepath",r)))}(a,n);return Object(E.jsx)(f.Fragment,null,c&&Object(E.jsx)(Ie,{title:c.value.name}),Object(E.jsx)(Be,{db:a,currentEntry:c},Object(E.jsx)(Ze,Object(r.a)({},n,{entry:c,isTransclusion:u}),t)))};t.a=Ve;void 0!==Ve&&Ve&&Ve===Object(Ve)&&Object.isExtensible(Ve)&&!Ve.hasOwnProperty("__filemeta")&&Object.defineProperty(Ve,"__filemeta",{configurable:!0,value:{name:"Layout",filename:"node_modules/gatsby-theme-docz/src/base/Layout.js"}}),void 0!==Ve&&Ve&&Ve===Object(Ve)&&Object.isExtensible(Ve)&&!Ve.hasOwnProperty("__filemeta")&&Object.defineProperty(Ve,"__filemeta",{configurable:!0,value:{name:"Layout",filename:"node_modules/gatsby-theme-docz/src/base/Layout.js"}})},oasZ:function(e,t,n){var r=n("sZCt")("matchesProperty",n("3pNy"));r.placeholder=n("wuTn"),e.exports=r},rSSF:function(e,t,n){},t23M:function(e,t,n){"use strict";var r=n("7a9J"),o=n("QDMQ"),i=n("ls4f"),a=n("x364"),s=n("VuTP"),c=n("q1tI"),l=n("i8i4"),f=n.n(l);var u=n("Zm9Q"),d=n("Kwbf"),p=n("c+Xe"),m=n("bdgK"),h=function(e){Object(a.a)(n,e);var t=Object(s.a)(n);function n(){var e;return Object(o.a)(this,n),(e=t.apply(this,arguments)).resizeObserver=null,e.childNode=null,e.currentElement=null,e.state={width:0,height:0,offsetHeight:0,offsetWidth:0},e.onResize=function(t){var n=e.props.onResize,o=t[0].target,i=o.getBoundingClientRect(),a=i.width,s=i.height,c=o.offsetWidth,l=o.offsetHeight,f=Math.floor(a),u=Math.floor(s);if(e.state.width!==f||e.state.height!==u||e.state.offsetWidth!==c||e.state.offsetHeight!==l){var d={width:f,height:u,offsetWidth:c,offsetHeight:l};e.setState(d),n&&Promise.resolve().then((function(){n(Object(r.a)(Object(r.a)({},d),{},{offsetWidth:c,offsetHeight:l}))}))}},e.setChildNode=function(t){e.childNode=t},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){this.onComponentUpdated()}},{key:"componentDidUpdate",value:function(){this.onComponentUpdated()}},{key:"componentWillUnmount",value:function(){this.destroyObserver()}},{key:"onComponentUpdated",value:function(){if(this.props.disabled)this.destroyObserver();else{var e,t=(e=this.childNode||this)instanceof HTMLElement?e:f.a.findDOMNode(e);t!==this.currentElement&&(this.destroyObserver(),this.currentElement=t),!this.resizeObserver&&t&&(this.resizeObserver=new m.default(this.onResize),this.resizeObserver.observe(t))}}},{key:"destroyObserver",value:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},{key:"render",value:function(){var e=this.props.children,t=Object(u.a)(e);if(t.length>1)Object(d.a)(!1,"Find more than one child node with `children` in ResizeObserver. Will only observe first one.");else if(0===t.length)return Object(d.a)(!1,"`children` of ResizeObserver is empty. Nothing is in observe."),null;var n=t[0];if(c.isValidElement(n)&&Object(p.b)(n)){var r=n.ref;t[0]=c.cloneElement(n,{ref:Object(p.a)(r,this.setChildNode)})}return 1===t.length?t[0]:t.map((function(e,t){return!c.isValidElement(e)||"key"in e&&null!==e.key?e:c.cloneElement(e,{key:"".concat("rc-observer-key","-").concat(t)})}))}}]),n}(c.Component);h.displayName="ResizeObserver";t.a=h}}]);
//# sourceMappingURL=394ec4401fae910994907fd09c18cefde00849d2-d83e416c9d8ea7993824.js.map