/*! For license information please see 1273.c177fe37.js.LICENSE.txt */
(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[1273],{3905:(t,e,r)=>{"use strict";r.d(e,{Zo:()=>l,kt:()=>m});var n=r(67294);function s(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function h(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach((function(e){s(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function a(t,e){if(null==t)return{};var r,n,s=function(t,e){if(null==t)return{};var r,n,s={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(s[r]=t[r]);return s}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(s[r]=t[r])}return s}var i=n.createContext({}),c=function(t){var e=n.useContext(i),r=e;return t&&(r="function"==typeof t?t(e):h(h({},e),t)),r},l=function(t){var e=c(t.components);return n.createElement(i.Provider,{value:e},t.children)},u="mdxType",p={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},f=n.forwardRef((function(t,e){var r=t.components,s=t.mdxType,o=t.originalType,i=t.parentName,l=a(t,["components","mdxType","originalType","parentName"]),u=c(r),f=s,m=u["".concat(i,".").concat(f)]||u[f]||p[f]||o;return r?n.createElement(m,h(h({ref:e},l),{},{components:r})):n.createElement(m,h({ref:e},l))}));function m(t,e){var r=arguments,s=e&&e.mdxType;if("string"==typeof t||s){var o=r.length,h=new Array(o);h[0]=f;var a={};for(var i in e)hasOwnProperty.call(e,i)&&(a[i]=e[i]);a.originalType=t,a[u]="string"==typeof t?t:s,h[1]=a;for(var c=2;c<o;c++)h[c]=r[c];return n.createElement.apply(null,h)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},62587:t=>{"use strict";function e(t,e){return Object.prototype.hasOwnProperty.call(t,e)}t.exports=function(t,r,n,s){r=r||"&",n=n||"=";var o={};if("string"!=typeof t||0===t.length)return o;var h=/\+/g;t=t.split(r);var a=1e3;s&&"number"==typeof s.maxKeys&&(a=s.maxKeys);var i=t.length;a>0&&i>a&&(i=a);for(var c=0;c<i;++c){var l,u,p,f,m=t[c].replace(h,"%20"),v=m.indexOf(n);v>=0?(l=m.substr(0,v),u=m.substr(v+1)):(l=m,u=""),p=decodeURIComponent(l),f=decodeURIComponent(u),e(o,p)?Array.isArray(o[p])?o[p].push(f):o[p]=[o[p],f]:o[p]=f}return o}},12361:t=>{"use strict";var e=function(t){switch(typeof t){case"string":return t;case"boolean":return t?"true":"false";case"number":return isFinite(t)?t:"";default:return""}};t.exports=function(t,r,n,s){return r=r||"&",n=n||"=",null===t&&(t=void 0),"object"==typeof t?Object.keys(t).map((function(s){var o=encodeURIComponent(e(s))+n;return Array.isArray(t[s])?t[s].map((function(t){return o+encodeURIComponent(e(t))})).join(r):o+encodeURIComponent(e(t[s]))})).join(r):s?encodeURIComponent(e(s))+n+encodeURIComponent(e(t)):""}},17673:(t,e,r)=>{"use strict";e.decode=e.parse=r(62587),e.encode=e.stringify=r(12361)},52511:function(t,e,r){var n;t=r.nmd(t),function(s){e&&e.nodeType,t&&t.nodeType;var o="object"==typeof r.g&&r.g;o.global!==o&&o.window!==o&&o.self;var h,a=2147483647,i=36,c=1,l=26,u=38,p=700,f=72,m=128,v="-",y=/^xn--/,d=/[^\x20-\x7E]/,g=/[\x2E\u3002\uFF0E\uFF61]/g,b={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},O=i-c,j=Math.floor,x=String.fromCharCode;function w(t){throw RangeError(b[t])}function C(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function A(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+C((t=t.replace(g,".")).split("."),e).join(".")}function I(t){for(var e,r,n=[],s=0,o=t.length;s<o;)(e=t.charCodeAt(s++))>=55296&&e<=56319&&s<o?56320==(64512&(r=t.charCodeAt(s++)))?n.push(((1023&e)<<10)+(1023&r)+65536):(n.push(e),s--):n.push(e);return n}function q(t){return C(t,(function(t){var e="";return t>65535&&(e+=x((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=x(t)})).join("")}function E(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function P(t,e,r){var n=0;for(t=r?j(t/p):t>>1,t+=j(t/e);t>O*l>>1;n+=i)t=j(t/O);return j(n+(O+1)*t/(t+u))}function U(t){var e,r,n,s,o,h,u,p,y,d,g,b=[],O=t.length,x=0,C=m,A=f;for((r=t.lastIndexOf(v))<0&&(r=0),n=0;n<r;++n)t.charCodeAt(n)>=128&&w("not-basic"),b.push(t.charCodeAt(n));for(s=r>0?r+1:0;s<O;){for(o=x,h=1,u=i;s>=O&&w("invalid-input"),((p=(g=t.charCodeAt(s++))-48<10?g-22:g-65<26?g-65:g-97<26?g-97:i)>=i||p>j((a-x)/h))&&w("overflow"),x+=p*h,!(p<(y=u<=A?c:u>=A+l?l:u-A));u+=i)h>j(a/(d=i-y))&&w("overflow"),h*=d;A=P(x-o,e=b.length+1,0==o),j(x/e)>a-C&&w("overflow"),C+=j(x/e),x%=e,b.splice(x++,0,C)}return q(b)}function k(t){var e,r,n,s,o,h,u,p,y,d,g,b,O,C,A,q=[];for(b=(t=I(t)).length,e=m,r=0,o=f,h=0;h<b;++h)(g=t[h])<128&&q.push(x(g));for(n=s=q.length,s&&q.push(v);n<b;){for(u=a,h=0;h<b;++h)(g=t[h])>=e&&g<u&&(u=g);for(u-e>j((a-r)/(O=n+1))&&w("overflow"),r+=(u-e)*O,e=u,h=0;h<b;++h)if((g=t[h])<e&&++r>a&&w("overflow"),g==e){for(p=r,y=i;!(p<(d=y<=o?c:y>=o+l?l:y-o));y+=i)A=p-d,C=i-d,q.push(x(E(d+A%C,0))),p=j(A/C);q.push(x(E(p,0))),o=P(r,O,n==s),r=0,++n}++r,++e}return q.join("")}h={version:"1.3.2",ucs2:{decode:I,encode:q},decode:U,encode:k,toASCII:function(t){return A(t,(function(t){return d.test(t)?"xn--"+k(t):t}))},toUnicode:function(t){return A(t,(function(t){return y.test(t)?U(t.slice(4).toLowerCase()):t}))}},void 0===(n=function(){return h}.call(e,r,e,t))||(t.exports=n)}()},8575:(t,e,r)=>{"use strict";var n=r(52511),s=r(62502);function o(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}e.parse=b,e.resolve=function(t,e){return b(t,!1,!0).resolve(e)},e.resolveObject=function(t,e){return t?b(t,!1,!0).resolveObject(e):e},e.format=function(t){s.isString(t)&&(t=b(t));return t instanceof o?t.format():o.prototype.format.call(t)},e.Url=o;var h=/^([a-z0-9.+-]+:)/i,a=/:[0-9]*$/,i=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(c),u=["%","/","?",";","#"].concat(l),p=["/","?","#"],f=/^[+a-z0-9A-Z_-]{0,63}$/,m=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,v={javascript:!0,"javascript:":!0},y={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},g=r(17673);function b(t,e,r){if(t&&s.isObject(t)&&t instanceof o)return t;var n=new o;return n.parse(t,e,r),n}o.prototype.parse=function(t,e,r){if(!s.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var o=t.indexOf("?"),a=-1!==o&&o<t.indexOf("#")?"?":"#",c=t.split(a);c[0]=c[0].replace(/\\/g,"/");var b=t=c.join(a);if(b=b.trim(),!r&&1===t.split("#").length){var O=i.exec(b);if(O)return this.path=b,this.href=b,this.pathname=O[1],O[2]?(this.search=O[2],this.query=e?g.parse(this.search.substr(1)):this.search.substr(1)):e&&(this.search="",this.query={}),this}var j=h.exec(b);if(j){var x=(j=j[0]).toLowerCase();this.protocol=x,b=b.substr(j.length)}if(r||j||b.match(/^\/\/[^@\/]+@[^@\/]+/)){var w="//"===b.substr(0,2);!w||j&&y[j]||(b=b.substr(2),this.slashes=!0)}if(!y[j]&&(w||j&&!d[j])){for(var C,A,I=-1,q=0;q<p.length;q++){-1!==(E=b.indexOf(p[q]))&&(-1===I||E<I)&&(I=E)}-1!==(A=-1===I?b.lastIndexOf("@"):b.lastIndexOf("@",I))&&(C=b.slice(0,A),b=b.slice(A+1),this.auth=decodeURIComponent(C)),I=-1;for(q=0;q<u.length;q++){var E;-1!==(E=b.indexOf(u[q]))&&(-1===I||E<I)&&(I=E)}-1===I&&(I=b.length),this.host=b.slice(0,I),b=b.slice(I),this.parseHost(),this.hostname=this.hostname||"";var P="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!P)for(var U=this.hostname.split(/\./),k=(q=0,U.length);q<k;q++){var R=U[q];if(R&&!R.match(f)){for(var S="",N=0,T=R.length;N<T;N++)R.charCodeAt(N)>127?S+="x":S+=R[N];if(!S.match(f)){var F=U.slice(0,q),_=U.slice(q+1),D=R.match(m);D&&(F.push(D[1]),_.unshift(D[2])),_.length&&(b="/"+_.join(".")+b),this.hostname=F.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),P||(this.hostname=n.toASCII(this.hostname));var $=this.port?":"+this.port:"",z=this.hostname||"";this.host=z+$,this.href+=this.host,P&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!v[x])for(q=0,k=l.length;q<k;q++){var L=l[q];if(-1!==b.indexOf(L)){var Z=encodeURIComponent(L);Z===L&&(Z=escape(L)),b=b.split(L).join(Z)}}var H=b.indexOf("#");-1!==H&&(this.hash=b.substr(H),b=b.slice(0,H));var K=b.indexOf("?");if(-1!==K?(this.search=b.substr(K),this.query=b.substr(K+1),e&&(this.query=g.parse(this.query)),b=b.slice(0,K)):e&&(this.search="",this.query={}),b&&(this.pathname=b),d[x]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){$=this.pathname||"";var M=this.search||"";this.path=$+M}return this.href=this.format(),this},o.prototype.format=function(){var t=this.auth||"";t&&(t=(t=encodeURIComponent(t)).replace(/%3A/i,":"),t+="@");var e=this.protocol||"",r=this.pathname||"",n=this.hash||"",o=!1,h="";this.host?o=t+this.host:this.hostname&&(o=t+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(o+=":"+this.port)),this.query&&s.isObject(this.query)&&Object.keys(this.query).length&&(h=g.stringify(this.query));var a=this.search||h&&"?"+h||"";return e&&":"!==e.substr(-1)&&(e+=":"),this.slashes||(!e||d[e])&&!1!==o?(o="//"+(o||""),r&&"/"!==r.charAt(0)&&(r="/"+r)):o||(o=""),n&&"#"!==n.charAt(0)&&(n="#"+n),a&&"?"!==a.charAt(0)&&(a="?"+a),e+o+(r=r.replace(/[?#]/g,(function(t){return encodeURIComponent(t)})))+(a=a.replace("#","%23"))+n},o.prototype.resolve=function(t){return this.resolveObject(b(t,!1,!0)).format()},o.prototype.resolveObject=function(t){if(s.isString(t)){var e=new o;e.parse(t,!1,!0),t=e}for(var r=new o,n=Object.keys(this),h=0;h<n.length;h++){var a=n[h];r[a]=this[a]}if(r.hash=t.hash,""===t.href)return r.href=r.format(),r;if(t.slashes&&!t.protocol){for(var i=Object.keys(t),c=0;c<i.length;c++){var l=i[c];"protocol"!==l&&(r[l]=t[l])}return d[r.protocol]&&r.hostname&&!r.pathname&&(r.path=r.pathname="/"),r.href=r.format(),r}if(t.protocol&&t.protocol!==r.protocol){if(!d[t.protocol]){for(var u=Object.keys(t),p=0;p<u.length;p++){var f=u[p];r[f]=t[f]}return r.href=r.format(),r}if(r.protocol=t.protocol,t.host||y[t.protocol])r.pathname=t.pathname;else{for(var m=(t.pathname||"").split("/");m.length&&!(t.host=m.shift()););t.host||(t.host=""),t.hostname||(t.hostname=""),""!==m[0]&&m.unshift(""),m.length<2&&m.unshift(""),r.pathname=m.join("/")}if(r.search=t.search,r.query=t.query,r.host=t.host||"",r.auth=t.auth,r.hostname=t.hostname||t.host,r.port=t.port,r.pathname||r.search){var v=r.pathname||"",g=r.search||"";r.path=v+g}return r.slashes=r.slashes||t.slashes,r.href=r.format(),r}var b=r.pathname&&"/"===r.pathname.charAt(0),O=t.host||t.pathname&&"/"===t.pathname.charAt(0),j=O||b||r.host&&t.pathname,x=j,w=r.pathname&&r.pathname.split("/")||[],C=(m=t.pathname&&t.pathname.split("/")||[],r.protocol&&!d[r.protocol]);if(C&&(r.hostname="",r.port=null,r.host&&(""===w[0]?w[0]=r.host:w.unshift(r.host)),r.host="",t.protocol&&(t.hostname=null,t.port=null,t.host&&(""===m[0]?m[0]=t.host:m.unshift(t.host)),t.host=null),j=j&&(""===m[0]||""===w[0])),O)r.host=t.host||""===t.host?t.host:r.host,r.hostname=t.hostname||""===t.hostname?t.hostname:r.hostname,r.search=t.search,r.query=t.query,w=m;else if(m.length)w||(w=[]),w.pop(),w=w.concat(m),r.search=t.search,r.query=t.query;else if(!s.isNullOrUndefined(t.search)){if(C)r.hostname=r.host=w.shift(),(P=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=P.shift(),r.host=r.hostname=P.shift());return r.search=t.search,r.query=t.query,s.isNull(r.pathname)&&s.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!w.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var A=w.slice(-1)[0],I=(r.host||t.host||w.length>1)&&("."===A||".."===A)||""===A,q=0,E=w.length;E>=0;E--)"."===(A=w[E])?w.splice(E,1):".."===A?(w.splice(E,1),q++):q&&(w.splice(E,1),q--);if(!j&&!x)for(;q--;q)w.unshift("..");!j||""===w[0]||w[0]&&"/"===w[0].charAt(0)||w.unshift(""),I&&"/"!==w.join("/").substr(-1)&&w.push("");var P,U=""===w[0]||w[0]&&"/"===w[0].charAt(0);C&&(r.hostname=r.host=U?"":w.length?w.shift():"",(P=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=P.shift(),r.host=r.hostname=P.shift()));return(j=j||r.host&&w.length)&&!U&&w.unshift(""),w.length?r.pathname=w.join("/"):(r.pathname=null,r.path=null),s.isNull(r.pathname)&&s.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},o.prototype.parseHost=function(){var t=this.host,e=a.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},62502:t=>{"use strict";t.exports={isString:function(t){return"string"==typeof t},isObject:function(t){return"object"==typeof t&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}}}]);