/*
  @license
	Rollup.js v1.23.1
	Sat, 05 Oct 2019 06:08:56 GMT - commit 53266e6b971fff985b273800d808b17084d5c41b


	https://github.com/rollup/rollup

	Released under the MIT License.
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function e(e,t,n,i){return new(n||(n=Promise))((function(r,s){function o(e){try{h(i.next(e))}catch(e){s(e)}}function a(e){try{h(i.throw(e))}catch(e){s(e)}}function h(e){e.done?r(e.value):new n((function(t){t(e.value)})).then(o,a)}h((i=i.apply(e,t||[])).next())}))}var t="1.23.1",n=i;function i(e,t){if(!e)throw new Error(t||"Assertion failed")}function r(e,t){return 55296==(64512&e.charCodeAt(t))&&(!(t<0||t+1>=e.length)&&56320==(64512&e.charCodeAt(t+1)))}function s(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function o(e){return 1===e.length?"0"+e:e}function a(e){return 7===e.length?"0"+e:6===e.length?"00"+e:5===e.length?"000"+e:4===e.length?"0000"+e:3===e.length?"00000"+e:2===e.length?"000000"+e:1===e.length?"0000000"+e:e}i.equal=function(e,t,n){if(e!=t)throw new Error(n||"Assertion failed: "+e+" != "+t)};var h={inherits:function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}})),toArray:function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var n=[];if("string"==typeof e)if(t){if("hex"===t)for((e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e),s=0;s<e.length;s+=2)n.push(parseInt(e[s]+e[s+1],16))}else for(var i=0,s=0;s<e.length;s++){var o=e.charCodeAt(s);o<128?n[i++]=o:o<2048?(n[i++]=o>>6|192,n[i++]=63&o|128):r(e,s)?(o=65536+((1023&o)<<10)+(1023&e.charCodeAt(++s)),n[i++]=o>>18|240,n[i++]=o>>12&63|128,n[i++]=o>>6&63|128,n[i++]=63&o|128):(n[i++]=o>>12|224,n[i++]=o>>6&63|128,n[i++]=63&o|128)}else for(s=0;s<e.length;s++)n[s]=0|e[s];return n},toHex:function(e){for(var t="",n=0;n<e.length;n++)t+=o(e[n].toString(16));return t},htonl:s,toHex32:function(e,t){for(var n="",i=0;i<e.length;i++){var r=e[i];"little"===t&&(r=s(r)),n+=a(r.toString(16))}return n},zero2:o,zero8:a,join32:function(e,t,i,r){var s=i-t;n(s%4==0);for(var o=new Array(s/4),a=0,h=t;a<o.length;a++,h+=4){var u;u="big"===r?e[h]<<24|e[h+1]<<16|e[h+2]<<8|e[h+3]:e[h+3]<<24|e[h+2]<<16|e[h+1]<<8|e[h],o[a]=u>>>0}return o},split32:function(e,t){for(var n=new Array(4*e.length),i=0,r=0;i<e.length;i++,r+=4){var s=e[i];"big"===t?(n[r]=s>>>24,n[r+1]=s>>>16&255,n[r+2]=s>>>8&255,n[r+3]=255&s):(n[r+3]=s>>>24,n[r+2]=s>>>16&255,n[r+1]=s>>>8&255,n[r]=255&s)}return n},rotr32:function(e,t){return e>>>t|e<<32-t},rotl32:function(e,t){return e<<t|e>>>32-t},sum32:function(e,t){return e+t>>>0},sum32_3:function(e,t,n){return e+t+n>>>0},sum32_4:function(e,t,n,i){return e+t+n+i>>>0},sum32_5:function(e,t,n,i,r){return e+t+n+i+r>>>0},sum64:function(e,t,n,i){var r=e[t],s=i+e[t+1]>>>0,o=(s<i?1:0)+n+r;e[t]=o>>>0,e[t+1]=s},sum64_hi:function(e,t,n,i){return(t+i>>>0<t?1:0)+e+n>>>0},sum64_lo:function(e,t,n,i){return t+i>>>0},sum64_4_hi:function(e,t,n,i,r,s,o,a){var h=0,u=t;return h+=(u=u+i>>>0)<t?1:0,h+=(u=u+s>>>0)<s?1:0,e+n+r+o+(h+=(u=u+a>>>0)<a?1:0)>>>0},sum64_4_lo:function(e,t,n,i,r,s,o,a){return t+i+s+a>>>0},sum64_5_hi:function(e,t,n,i,r,s,o,a,h,u){var c=0,l=t;return c+=(l=l+i>>>0)<t?1:0,c+=(l=l+s>>>0)<s?1:0,c+=(l=l+a>>>0)<a?1:0,e+n+r+o+h+(c+=(l=l+u>>>0)<u?1:0)>>>0},sum64_5_lo:function(e,t,n,i,r,s,o,a,h,u){return t+i+s+a+u>>>0},rotr64_hi:function(e,t,n){return(t<<32-n|e>>>n)>>>0},rotr64_lo:function(e,t,n){return(e<<32-n|t>>>n)>>>0},shr64_hi:function(e,t,n){return e>>>n},shr64_lo:function(e,t,n){return(e<<32-n|t>>>n)>>>0}};function u(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}var c=u;u.prototype.update=function(e,t){if(e=h.toArray(e,t),this.pending?this.pending=this.pending.concat(e):this.pending=e,this.pendingTotal+=e.length,this.pending.length>=this._delta8){var n=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-n,e.length),0===this.pending.length&&(this.pending=null),e=h.join32(e,0,e.length-n,this.endian);for(var i=0;i<e.length;i+=this._delta32)this._update(e,i,i+this._delta32)}return this},u.prototype.digest=function(e){return this.update(this._pad()),n(null===this.pending),this._digest(e)},u.prototype._pad=function(){var e=this.pendingTotal,t=this._delta8,n=t-(e+this.padLength)%t,i=new Array(n+this.padLength);i[0]=128;for(var r=1;r<n;r++)i[r]=0;if(e<<=3,"big"===this.endian){for(var s=8;s<this.padLength;s++)i[r++]=0;i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=e>>>24&255,i[r++]=e>>>16&255,i[r++]=e>>>8&255,i[r++]=255&e}else for(i[r++]=255&e,i[r++]=e>>>8&255,i[r++]=e>>>16&255,i[r++]=e>>>24&255,i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=0,s=8;s<this.padLength;s++)i[r++]=0;return i};var l={BlockHash:c},p=h.rotr32;function d(e,t,n){return e&t^~e&n}function f(e,t,n){return e&t^e&n^t&n}function m(e,t,n){return e^t^n}var g={ft_1:function(e,t,n,i){return 0===e?d(t,n,i):1===e||3===e?m(t,n,i):2===e?f(t,n,i):void 0},ch32:d,maj32:f,p32:m,s0_256:function(e){return p(e,2)^p(e,13)^p(e,22)},s1_256:function(e){return p(e,6)^p(e,11)^p(e,25)},g0_256:function(e){return p(e,7)^p(e,18)^e>>>3},g1_256:function(e){return p(e,17)^p(e,19)^e>>>10}},y=h.sum32,v=h.sum32_4,x=h.sum32_5,E=g.ch32,_=g.maj32,b=g.s0_256,S=g.s1_256,A=g.g0_256,C=g.g1_256,I=l.BlockHash,w=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function P(){if(!(this instanceof P))return new P;I.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=w,this.W=new Array(64)}h.inherits(P,I);var k=P;P.blockSize=512,P.outSize=256,P.hmacStrength=192,P.padLength=64,P.prototype._update=function(e,t){for(var i=this.W,r=0;r<16;r++)i[r]=e[t+r];for(;r<i.length;r++)i[r]=v(C(i[r-2]),i[r-7],A(i[r-15]),i[r-16]);var s=this.h[0],o=this.h[1],a=this.h[2],h=this.h[3],u=this.h[4],c=this.h[5],l=this.h[6],p=this.h[7];for(n(this.k.length===i.length),r=0;r<i.length;r++){var d=x(p,S(u),E(u,c,l),this.k[r],i[r]),f=y(b(s),_(s,o,a));p=l,l=c,c=u,u=y(h,d),h=a,a=o,o=s,s=y(d,f)}this.h[0]=y(this.h[0],s),this.h[1]=y(this.h[1],o),this.h[2]=y(this.h[2],a),this.h[3]=y(this.h[3],h),this.h[4]=y(this.h[4],u),this.h[5]=y(this.h[5],c),this.h[6]=y(this.h[6],l),this.h[7]=y(this.h[7],p)},P.prototype._digest=function(e){return"hex"===e?h.toHex32(this.h,"big"):h.split32(this.h,"big")};for(var N={},$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",R=0;R<$.length;R++)N[$.charCodeAt(R)]=R;function T(e){var t="";e=e<0?-e<<1|1:e<<1;do{var n=31&e;(e>>>=5)>0&&(n|=32),t+=$[n]}while(e>0);return t}var O=function(e,t,n){this.start=e,this.end=t,this.original=n,this.intro="",this.outro="",this.content=n,this.storeName=!1,this.edited=!1,Object.defineProperties(this,{previous:{writable:!0,value:null},next:{writable:!0,value:null}})};O.prototype.appendLeft=function(e){this.outro+=e},O.prototype.appendRight=function(e){this.intro=this.intro+e},O.prototype.clone=function(){var e=new O(this.start,this.end,this.original);return e.intro=this.intro,e.outro=this.outro,e.content=this.content,e.storeName=this.storeName,e.edited=this.edited,e},O.prototype.contains=function(e){return this.start<e&&e<this.end},O.prototype.eachNext=function(e){for(var t=this;t;)e(t),t=t.next},O.prototype.eachPrevious=function(e){for(var t=this;t;)e(t),t=t.previous},O.prototype.edit=function(e,t,n){return this.content=e,n||(this.intro="",this.outro=""),this.storeName=t,this.edited=!0,this},O.prototype.prependLeft=function(e){this.outro=e+this.outro},O.prototype.prependRight=function(e){this.intro=e+this.intro},O.prototype.split=function(e){var t=e-this.start,n=this.original.slice(0,t),i=this.original.slice(t);this.original=n;var r=new O(e,this.end,i);return r.outro=this.outro,this.outro="",this.end=e,this.edited?(r.edit("",!1),this.content=""):this.content=n,r.next=this.next,r.next&&(r.next.previous=r),r.previous=this,this.next=r,r},O.prototype.toString=function(){return this.intro+this.content+this.outro},O.prototype.trimEnd=function(e){if(this.outro=this.outro.replace(e,""),this.outro.length)return!0;var t=this.content.replace(e,"");return t.length?(t!==this.content&&this.split(this.start+t.length).edit("",void 0,!0),!0):(this.edit("",void 0,!0),this.intro=this.intro.replace(e,""),!!this.intro.length||void 0)},O.prototype.trimStart=function(e){if(this.intro=this.intro.replace(e,""),this.intro.length)return!0;var t=this.content.replace(e,"");return t.length?(t!==this.content&&(this.split(this.end-t.length),this.edit("",void 0,!0)),!0):(this.edit("",void 0,!0),this.outro=this.outro.replace(e,""),!!this.outro.length||void 0)};var M=function(){throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.")};"undefined"!=typeof window&&"function"==typeof window.btoa?M=function(e){return window.btoa(unescape(encodeURIComponent(e)))}:"function"==typeof Buffer&&(M=function(e){return Buffer.from(e,"utf-8").toString("base64")});var L=function(e){this.version=3,this.file=e.file,this.sources=e.sources,this.sourcesContent=e.sourcesContent,this.names=e.names,this.mappings=function(e){for(var t=0,n=0,i=0,r=0,s="",o=0;o<e.length;o++){var a=e[o];if(o>0&&(s+=";"),0!==a.length){for(var h=0,u=[],c=0,l=a;c<l.length;c++){var p=l[c],d=T(p[0]-h);h=p[0],p.length>1&&(d+=T(p[1]-t)+T(p[2]-n)+T(p[3]-i),t=p[1],n=p[2],i=p[3]),5===p.length&&(d+=T(p[4]-r),r=p[4]),u.push(d)}s+=u.join(",")}}return s}(e.mappings)};function D(e){var t=e.split("\n"),n=t.filter((function(e){return/^\t+/.test(e)})),i=t.filter((function(e){return/^ {2,}/.test(e)}));if(0===n.length&&0===i.length)return null;if(n.length>=i.length)return"\t";var r=i.reduce((function(e,t){var n=/^ +/.exec(t)[0].length;return Math.min(n,e)}),1/0);return new Array(r+1).join(" ")}function V(e,t){var n=e.split(/[/\\]/),i=t.split(/[/\\]/);for(n.pop();n[0]===i[0];)n.shift(),i.shift();if(n.length)for(var r=n.length;r--;)n[r]="..";return n.concat(i).join("/")}L.prototype.toString=function(){return JSON.stringify(this)},L.prototype.toUrl=function(){return"data:application/json;charset=utf-8;base64,"+M(this.toString())};var B=Object.prototype.toString;function z(e){return"[object Object]"===B.call(e)}function W(e){for(var t=e.split("\n"),n=[],i=0,r=0;i<t.length;i++)n.push(r),r+=t[i].length+1;return function(e){for(var t=0,i=n.length;t<i;){var r=t+i>>1;e<n[r]?i=r:t=r+1}var s=t-1;return{line:s,column:e-n[s]}}}var j=function(e){this.hires=e,this.generatedCodeLine=0,this.generatedCodeColumn=0,this.raw=[],this.rawSegments=this.raw[this.generatedCodeLine]=[],this.pending=null};j.prototype.addEdit=function(e,t,n,i){if(t.length){var r=[this.generatedCodeColumn,e,n.line,n.column];i>=0&&r.push(i),this.rawSegments.push(r)}else this.pending&&this.rawSegments.push(this.pending);this.advance(t),this.pending=null},j.prototype.addUneditedChunk=function(e,t,n,i,r){for(var s=t.start,o=!0;s<t.end;)(this.hires||o||r[s])&&this.rawSegments.push([this.generatedCodeColumn,e,i.line,i.column]),"\n"===n[s]?(i.line+=1,i.column=0,this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0):(i.column+=1,this.generatedCodeColumn+=1),s+=1,o=!1;this.pending=[this.generatedCodeColumn,e,i.line,i.column]},j.prototype.advance=function(e){if(e){var t=e.split("\n");if(t.length>1){for(var n=0;n<t.length-1;n++)this.generatedCodeLine++,this.raw[this.generatedCodeLine]=this.rawSegments=[];this.generatedCodeColumn=0}this.generatedCodeColumn+=t[t.length-1].length}};var F="\n",U={insertLeft:!1,insertRight:!1,storeName:!1},G=function(e,t){void 0===t&&(t={});var n=new O(0,e.length,e);Object.defineProperties(this,{original:{writable:!0,value:e},outro:{writable:!0,value:""},intro:{writable:!0,value:""},firstChunk:{writable:!0,value:n},lastChunk:{writable:!0,value:n},lastSearchedChunk:{writable:!0,value:n},byStart:{writable:!0,value:{}},byEnd:{writable:!0,value:{}},filename:{writable:!0,value:t.filename},indentExclusionRanges:{writable:!0,value:t.indentExclusionRanges},sourcemapLocations:{writable:!0,value:{}},storedNames:{writable:!0,value:{}},indentStr:{writable:!0,value:D(e)}}),this.byStart[0]=n,this.byEnd[e.length]=n};G.prototype.addSourcemapLocation=function(e){this.sourcemapLocations[e]=!0},G.prototype.append=function(e){if("string"!=typeof e)throw new TypeError("outro content must be a string");return this.outro+=e,this},G.prototype.appendLeft=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byEnd[e];return n?n.appendLeft(t):this.intro+=t,this},G.prototype.appendRight=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byStart[e];return n?n.appendRight(t):this.outro+=t,this},G.prototype.clone=function(){for(var e=new G(this.original,{filename:this.filename}),t=this.firstChunk,n=e.firstChunk=e.lastSearchedChunk=t.clone();t;){e.byStart[n.start]=n,e.byEnd[n.end]=n;var i=t.next,r=i&&i.clone();r&&(n.next=r,r.previous=n,n=r),t=i}return e.lastChunk=n,this.indentExclusionRanges&&(e.indentExclusionRanges=this.indentExclusionRanges.slice()),Object.keys(this.sourcemapLocations).forEach((function(t){e.sourcemapLocations[t]=!0})),e.intro=this.intro,e.outro=this.outro,e},G.prototype.generateDecodedMap=function(e){var t=this;e=e||{};var n=Object.keys(this.storedNames),i=new j(e.hires),r=W(this.original);return this.intro&&i.advance(this.intro),this.firstChunk.eachNext((function(e){var s=r(e.start);e.intro.length&&i.advance(e.intro),e.edited?i.addEdit(0,e.content,s,e.storeName?n.indexOf(e.original):-1):i.addUneditedChunk(0,e,t.original,s,t.sourcemapLocations),e.outro.length&&i.advance(e.outro)})),{file:e.file?e.file.split(/[/\\]/).pop():null,sources:[e.source?V(e.file||"",e.source):null],sourcesContent:e.includeContent?[this.original]:[null],names:n,mappings:i.raw}},G.prototype.generateMap=function(e){return new L(this.generateDecodedMap(e))},G.prototype.getIndentString=function(){return null===this.indentStr?"\t":this.indentStr},G.prototype.indent=function(e,t){var n=/^[^\r\n]/gm;if(z(e)&&(t=e,e=void 0),""===(e=void 0!==e?e:this.indentStr||"\t"))return this;var i={};(t=t||{}).exclude&&("number"==typeof t.exclude[0]?[t.exclude]:t.exclude).forEach((function(e){for(var t=e[0];t<e[1];t+=1)i[t]=!0}));var r=!1!==t.indentStart,s=function(t){return r?""+e+t:(r=!0,t)};this.intro=this.intro.replace(n,s);for(var o=0,a=this.firstChunk;a;){var h=a.end;if(a.edited)i[o]||(a.content=a.content.replace(n,s),a.content.length&&(r="\n"===a.content[a.content.length-1]));else for(o=a.start;o<h;){if(!i[o]){var u=this.original[o];"\n"===u?r=!0:"\r"!==u&&r&&(r=!1,o===a.start?a.prependRight(e):(this._splitChunk(a,o),(a=a.next).prependRight(e)))}o+=1}o=a.end,a=a.next}return this.outro=this.outro.replace(n,s),this},G.prototype.insert=function(){throw new Error("magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)")},G.prototype.insertLeft=function(e,t){return U.insertLeft||(console.warn("magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead"),U.insertLeft=!0),this.appendLeft(e,t)},G.prototype.insertRight=function(e,t){return U.insertRight||(console.warn("magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead"),U.insertRight=!0),this.prependRight(e,t)},G.prototype.move=function(e,t,n){if(n>=e&&n<=t)throw new Error("Cannot move a selection inside itself");this._split(e),this._split(t),this._split(n);var i=this.byStart[e],r=this.byEnd[t],s=i.previous,o=r.next,a=this.byStart[n];if(!a&&r===this.lastChunk)return this;var h=a?a.previous:this.lastChunk;return s&&(s.next=o),o&&(o.previous=s),h&&(h.next=i),a&&(a.previous=r),i.previous||(this.firstChunk=r.next),r.next||(this.lastChunk=i.previous,this.lastChunk.next=null),i.previous=h,r.next=a||null,h||(this.firstChunk=i),a||(this.lastChunk=r),this},G.prototype.overwrite=function(e,t,n,i){if("string"!=typeof n)throw new TypeError("replacement content must be a string");for(;e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;if(t>this.original.length)throw new Error("end is out of bounds");if(e===t)throw new Error("Cannot overwrite a zero-length range – use appendLeft or prependRight instead");this._split(e),this._split(t),!0===i&&(U.storeName||(console.warn("The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string"),U.storeName=!0),i={storeName:!0});var r=void 0!==i&&i.storeName,s=void 0!==i&&i.contentOnly;if(r){var o=this.original.slice(e,t);this.storedNames[o]=!0}var a=this.byStart[e],h=this.byEnd[t];if(a){if(t>a.end&&a.next!==this.byStart[a.end])throw new Error("Cannot overwrite across a split point");if(a.edit(n,r,s),a!==h){for(var u=a.next;u!==h;)u.edit("",!1),u=u.next;u.edit("",!1)}}else{var c=new O(e,t,"").edit(n,r);h.next=c,c.previous=h}return this},G.prototype.prepend=function(e){if("string"!=typeof e)throw new TypeError("outro content must be a string");return this.intro=e+this.intro,this},G.prototype.prependLeft=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byEnd[e];return n?n.prependLeft(t):this.intro=t+this.intro,this},G.prototype.prependRight=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byStart[e];return n?n.prependRight(t):this.outro=t+this.outro,this},G.prototype.remove=function(e,t){for(;e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;if(e===t)return this;if(e<0||t>this.original.length)throw new Error("Character is out of bounds");if(e>t)throw new Error("end must be greater than start");this._split(e),this._split(t);for(var n=this.byStart[e];n;)n.intro="",n.outro="",n.edit(""),n=t>n.end?this.byStart[n.end]:null;return this},G.prototype.lastChar=function(){if(this.outro.length)return this.outro[this.outro.length-1];var e=this.lastChunk;do{if(e.outro.length)return e.outro[e.outro.length-1];if(e.content.length)return e.content[e.content.length-1];if(e.intro.length)return e.intro[e.intro.length-1]}while(e=e.previous);return this.intro.length?this.intro[this.intro.length-1]:""},G.prototype.lastLine=function(){var e=this.outro.lastIndexOf(F);if(-1!==e)return this.outro.substr(e+1);var t=this.outro,n=this.lastChunk;do{if(n.outro.length>0){if(-1!==(e=n.outro.lastIndexOf(F)))return n.outro.substr(e+1)+t;t=n.outro+t}if(n.content.length>0){if(-1!==(e=n.content.lastIndexOf(F)))return n.content.substr(e+1)+t;t=n.content+t}if(n.intro.length>0){if(-1!==(e=n.intro.lastIndexOf(F)))return n.intro.substr(e+1)+t;t=n.intro+t}}while(n=n.previous);return-1!==(e=this.intro.lastIndexOf(F))?this.intro.substr(e+1)+t:this.intro+t},G.prototype.slice=function(e,t){for(void 0===e&&(e=0),void 0===t&&(t=this.original.length);e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;for(var n="",i=this.firstChunk;i&&(i.start>e||i.end<=e);){if(i.start<t&&i.end>=t)return n;i=i.next}if(i&&i.edited&&i.start!==e)throw new Error("Cannot use replaced character "+e+" as slice start anchor.");for(var r=i;i;){!i.intro||r===i&&i.start!==e||(n+=i.intro);var s=i.start<t&&i.end>=t;if(s&&i.edited&&i.end!==t)throw new Error("Cannot use replaced character "+t+" as slice end anchor.");var o=r===i?e-i.start:0,a=s?i.content.length+t-i.end:i.content.length;if(n+=i.content.slice(o,a),!i.outro||s&&i.end!==t||(n+=i.outro),s)break;i=i.next}return n},G.prototype.snip=function(e,t){var n=this.clone();return n.remove(0,e),n.remove(t,n.original.length),n},G.prototype._split=function(e){if(!this.byStart[e]&&!this.byEnd[e])for(var t=this.lastSearchedChunk,n=e>t.end;t;){if(t.contains(e))return this._splitChunk(t,e);t=n?this.byStart[t.end]:this.byEnd[t.start]}},G.prototype._splitChunk=function(e,t){if(e.edited&&e.content.length){var n=W(this.original)(t);throw new Error("Cannot split a chunk that has already been edited ("+n.line+":"+n.column+' – "'+e.original+'")')}var i=e.split(t);return this.byEnd[t]=e,this.byStart[t]=i,this.byEnd[i.end]=i,e===this.lastChunk&&(this.lastChunk=i),this.lastSearchedChunk=e,!0},G.prototype.toString=function(){for(var e=this.intro,t=this.firstChunk;t;)e+=t.toString(),t=t.next;return e+this.outro},G.prototype.isEmpty=function(){var e=this.firstChunk;do{if(e.intro.length&&e.intro.trim()||e.content.length&&e.content.trim()||e.outro.length&&e.outro.trim())return!1}while(e=e.next);return!0},G.prototype.length=function(){var e=this.firstChunk,t=0;do{t+=e.intro.length+e.content.length+e.outro.length}while(e=e.next);return t},G.prototype.trimLines=function(){return this.trim("[\\r\\n]")},G.prototype.trim=function(e){return this.trimStart(e).trimEnd(e)},G.prototype.trimEndAborted=function(e){var t=new RegExp((e||"\\s")+"+$");if(this.outro=this.outro.replace(t,""),this.outro.length)return!0;var n=this.lastChunk;do{var i=n.end,r=n.trimEnd(t);if(n.end!==i&&(this.lastChunk===n&&(this.lastChunk=n.next),this.byEnd[n.end]=n,this.byStart[n.next.start]=n.next,this.byEnd[n.next.end]=n.next),r)return!0;n=n.previous}while(n);return!1},G.prototype.trimEnd=function(e){return this.trimEndAborted(e),this},G.prototype.trimStartAborted=function(e){var t=new RegExp("^"+(e||"\\s")+"+");if(this.intro=this.intro.replace(t,""),this.intro.length)return!0;var n=this.firstChunk;do{var i=n.end,r=n.trimStart(t);if(n.end!==i&&(n===this.lastChunk&&(this.lastChunk=n.next),this.byEnd[n.end]=n,this.byStart[n.next.start]=n.next,this.byEnd[n.next.end]=n.next),r)return!0;n=n.next}while(n);return!1},G.prototype.trimStart=function(e){return this.trimStartAborted(e),this};var H=Object.prototype.hasOwnProperty,q=function(e){void 0===e&&(e={}),this.intro=e.intro||"",this.separator=void 0!==e.separator?e.separator:"\n",this.sources=[],this.uniqueSources=[],this.uniqueSourceIndexByFilename={}};function K(e,t){const n=e.split(/[/\\]/).filter(Boolean),i=t.split(/[/\\]/).filter(Boolean);for("."===n[0]&&n.shift(),"."===i[0]&&i.shift();n[0]&&i[0]&&n[0]===i[0];)n.shift(),i.shift();for(;".."===i[0]&&n.length>0;)i.shift(),n.pop();for(;n.pop();)i.unshift("..");return i.join("/")}q.prototype.addSource=function(e){if(e instanceof G)return this.addSource({content:e,filename:e.filename,separator:this.separator});if(!z(e)||!e.content)throw new Error("bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`");if(["filename","indentExclusionRanges","separator"].forEach((function(t){H.call(e,t)||(e[t]=e.content[t])})),void 0===e.separator&&(e.separator=this.separator),e.filename)if(H.call(this.uniqueSourceIndexByFilename,e.filename)){var t=this.uniqueSources[this.uniqueSourceIndexByFilename[e.filename]];if(e.content.original!==t.content)throw new Error("Illegal source: same filename ("+e.filename+"), different contents")}else this.uniqueSourceIndexByFilename[e.filename]=this.uniqueSources.length,this.uniqueSources.push({filename:e.filename,content:e.content.original});return this.sources.push(e),this},q.prototype.append=function(e,t){return this.addSource({content:new G(e),separator:t&&t.separator||""}),this},q.prototype.clone=function(){var e=new q({intro:this.intro,separator:this.separator});return this.sources.forEach((function(t){e.addSource({filename:t.filename,content:t.content.clone(),separator:t.separator})})),e},q.prototype.generateDecodedMap=function(e){var t=this;void 0===e&&(e={});var n=[];this.sources.forEach((function(e){Object.keys(e.content.storedNames).forEach((function(e){~n.indexOf(e)||n.push(e)}))}));var i=new j(e.hires);return this.intro&&i.advance(this.intro),this.sources.forEach((function(e,r){r>0&&i.advance(t.separator);var s=e.filename?t.uniqueSourceIndexByFilename[e.filename]:-1,o=e.content,a=W(o.original);o.intro&&i.advance(o.intro),o.firstChunk.eachNext((function(t){var r=a(t.start);t.intro.length&&i.advance(t.intro),e.filename?t.edited?i.addEdit(s,t.content,r,t.storeName?n.indexOf(t.original):-1):i.addUneditedChunk(s,t,o.original,r,o.sourcemapLocations):i.advance(t.content),t.outro.length&&i.advance(t.outro)})),o.outro&&i.advance(o.outro)})),{file:e.file?e.file.split(/[/\\]/).pop():null,sources:this.uniqueSources.map((function(t){return e.file?V(e.file,t.filename):t.filename})),sourcesContent:this.uniqueSources.map((function(t){return e.includeContent?t.content:null})),names:n,mappings:i.raw}},q.prototype.generateMap=function(e){return new L(this.generateDecodedMap(e))},q.prototype.getIndentString=function(){var e={};return this.sources.forEach((function(t){var n=t.content.indentStr;null!==n&&(e[n]||(e[n]=0),e[n]+=1)})),Object.keys(e).sort((function(t,n){return e[t]-e[n]}))[0]||"\t"},q.prototype.indent=function(e){var t=this;if(arguments.length||(e=this.getIndentString()),""===e)return this;var n=!this.intro||"\n"===this.intro.slice(-1);return this.sources.forEach((function(i,r){var s=void 0!==i.separator?i.separator:t.separator,o=n||r>0&&/\r?\n$/.test(s);i.content.indent(e,{exclude:i.indentExclusionRanges,indentStart:o}),n="\n"===i.content.lastChar()})),this.intro&&(this.intro=e+this.intro.replace(/^[^\n]/gm,(function(t,n){return n>0?e+t:t}))),this},q.prototype.prepend=function(e){return this.intro=e+this.intro,this},q.prototype.toString=function(){var e=this,t=this.sources.map((function(t,n){var i=void 0!==t.separator?t.separator:e.separator;return(n>0?i:"")+t.content.toString()})).join("");return this.intro+t},q.prototype.isEmpty=function(){return(!this.intro.length||!this.intro.trim())&&!this.sources.some((function(e){return!e.content.isEmpty()}))},q.prototype.length=function(){return this.sources.reduce((function(e,t){return e+t.content.length()}),this.intro.length)},q.prototype.trimLines=function(){return this.trim("[\\r\\n]")},q.prototype.trim=function(e){return this.trimStart(e).trimEnd(e)},q.prototype.trimStart=function(e){var t=new RegExp("^"+(e||"\\s")+"+");if(this.intro=this.intro.replace(t,""),!this.intro){var n,i=0;do{if(!(n=this.sources[i++]))break}while(!n.content.trimStartAborted(e))}return this},q.prototype.trimEnd=function(e){var t,n=new RegExp((e||"\\s")+"+$"),i=this.sources.length-1;do{if(!(t=this.sources[i--])){this.intro=this.intro.replace(n,"");break}}while(!t.content.trimEndAborted(e));return this};const Y=Object.create(null),X="BlockStatement",Q="CallExpression",J="ExportAllDeclaration",Z="ExpressionStatement",ee="FunctionExpression",te="Identifier",ne="ImportDefaultSpecifier",ie="ImportNamespaceSpecifier",re="Program",se="Property",oe="ReturnStatement",ae="VariableDeclaration";function he(e,t,n,i){if(t.remove(n,i),e.annotations)for(const i of e.annotations){if(!(i.start<n))return;t.remove(i.start,i.end)}}function ue(e,t){if(e.annotations||e.parent.type!==Z||(e=e.parent),e.annotations)for(const n of e.annotations)t.remove(n.start,n.end)}const ce={isNoStatement:!0};function le(e,t,n=0){let i,r;for(i=e.indexOf(t,n);;){if(-1===(n=e.indexOf("/",n))||n>i)return i;r=e.charCodeAt(++n),++n,(n=47===r?e.indexOf("\n",n)+1:e.indexOf("*/",n)+2)>i&&(i=e.indexOf(t,n))}}function pe(e){let t,n,i=0;for(t=e.indexOf("\n",i);;){if(-1===(i=e.indexOf("/",i))||i>t)return t;if(47===(n=e.charCodeAt(++i)))return t;(i=e.indexOf("*/",i+2)+2)>t&&(t=e.indexOf("\n",i))}}function de(e,t,n,i,r){let s,o,a,h,u=e[0],c=!u.included||u.needsBoundaries;c&&(h=n+pe(t.original.slice(n,u.start))+1);for(let n=1;n<=e.length;n++)s=u,o=h,a=c,c=void 0!==(u=e[n])&&(!u.included||u.needsBoundaries),a||c?(h=s.end+pe(t.original.slice(s.end,void 0===u?i:u.start))+1,s.included?a?s.render(t,r,{end:h,start:o}):s.render(t,r):he(s,t,o,h)):s.render(t,r)}function fe(e,t,n,i){const r=[];let s,o,a,h,u,c=n-1;for(let i=0;i<e.length;i++){for(o=e[i],void 0!==s&&(c=s.end+le(t.original.slice(s.end,o.start),",")),a=h=c+2+pe(t.original.slice(c+1,o.start));32===(u=t.original.charCodeAt(a))||9===u||10===u||13===u;)a++;void 0!==s&&r.push({contentEnd:h,end:a,node:s,separator:c,start:n}),s=o,n=a}return r.push({contentEnd:i,end:i,node:s,separator:null,start:n}),r}function me(e,t,n){for(;;){const i=pe(e.original.slice(t,n));if(-1===i)break;t=t+i+1,e.remove(t-1,t)}}const ge="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$",ye=64;function ve(e){let t="";do{const n=e%ye;e=Math.floor(e/ye),t=ge[n]+t}while(0!==e);return t}const xe=Object.assign(Object.create(null),{await:!0,break:!0,case:!0,catch:!0,class:!0,const:!0,continue:!0,debugger:!0,default:!0,delete:!0,do:!0,else:!0,enum:!0,eval:!0,export:!0,extends:!0,false:!0,finally:!0,for:!0,function:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,interface:!0,let:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,static:!0,super:!0,switch:!0,this:!0,throw:!0,true:!0,try:!0,typeof:!0,undefined:!0,var:!0,void:!0,while:!0,with:!0,yield:!0});function Ee(e,t){let n=e,i=1;for(;t.has(n)||xe[n];)n=`${e}$${ve(i++)}`;return t.add(n),n}class _e{constructor({withNew:e=!1,args:t=[],callIdentifier:n}={}){this.withNew=e,this.args=t,this.callIdentifier=n}static create(e){return new this(e)}equals(e){return e&&this.callIdentifier===e.callIdentifier}}const be={UNKNOWN_KEY:!0},Se=[],Ae=[be];function Ce(e,t=null){return Object.create(t,e)}const Ie={UNKNOWN_VALUE:!0},we={deoptimizePath:()=>{},getLiteralValueAtPath:()=>Ie,getReturnExpressionWhenCalledAtPath:()=>we,hasEffectsWhenAccessedAtPath:e=>e.length>0,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:()=>!0,include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN]]"},Pe={deoptimizePath:()=>{},getLiteralValueAtPath:()=>void 0,getReturnExpressionWhenCalledAtPath:()=>we,hasEffectsWhenAccessedAtPath:e=>e.length>0,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:()=>!0,include:()=>{},includeCallArguments(){},included:!0,toString:()=>"undefined"},ke={value:{returns:null,returnsPrimitive:we,callsArgs:null,mutatesSelf:!0}},Ne={value:{returns:null,returnsPrimitive:we,callsArgs:[0],mutatesSelf:!1}};class $e{constructor(){this.included=!1}deoptimizePath(){}getLiteralValueAtPath(){return Ie}getReturnExpressionWhenCalledAtPath(e){return 1===e.length?Je(qe,e[0]):we}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Qe(qe,e[0],this.included,t,n)}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}toString(){return"[[UNKNOWN ARRAY]]"}}const Re={value:{callsArgs:null,mutatesSelf:!1,returns:$e,returnsPrimitive:null}},Te={value:{callsArgs:null,mutatesSelf:!0,returns:$e,returnsPrimitive:null}},Oe={value:{callsArgs:[0],mutatesSelf:!1,returns:$e,returnsPrimitive:null}},Me={value:{callsArgs:[0],mutatesSelf:!0,returns:$e,returnsPrimitive:null}},Le={deoptimizePath:()=>{},getLiteralValueAtPath:()=>Ie,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Je(Ke,e[0]):we,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:e=>{if(1===e.length){const t=e[0];return"string"!=typeof t||!Ke[t]}return!0},include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN BOOLEAN]]"},De={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:Le}},Ve={value:{callsArgs:[0],mutatesSelf:!1,returns:null,returnsPrimitive:Le}},Be={deoptimizePath:()=>{},getLiteralValueAtPath:()=>Ie,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Je(Ye,e[0]):we,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:e=>{if(1===e.length){const t=e[0];return"string"!=typeof t||!Ye[t]}return!0},include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN NUMBER]]"},ze={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:Be}},We={value:{callsArgs:null,mutatesSelf:!0,returns:null,returnsPrimitive:Be}},je={value:{callsArgs:[0],mutatesSelf:!1,returns:null,returnsPrimitive:Be}},Fe={deoptimizePath:()=>{},getLiteralValueAtPath:()=>Ie,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Je(Xe,e[0]):we,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:(e,t,n)=>1!==e.length||Qe(Xe,e[0],!0,t,n),include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN STRING]]"},Ue={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:Fe}};class Ge{constructor(){this.included=!1}deoptimizePath(){}getLiteralValueAtPath(){return Ie}getReturnExpressionWhenCalledAtPath(e){return 1===e.length?Je(He,e[0]):we}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Qe(He,e[0],this.included,t,n)}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}toString(){return"[[UNKNOWN OBJECT]]"}}const He=Ce({hasOwnProperty:De,isPrototypeOf:De,propertyIsEnumerable:De,toLocaleString:Ue,toString:Ue,valueOf:{value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:we}}}),qe=Ce({concat:Re,copyWithin:Te,every:Ve,fill:Te,filter:Oe,find:Ne,findIndex:je,forEach:Ne,includes:De,indexOf:ze,join:Ue,lastIndexOf:ze,map:Oe,pop:ke,push:We,reduce:Ne,reduceRight:Ne,reverse:Te,shift:ke,slice:Re,some:Ve,sort:Me,splice:Te,unshift:We},He),Ke=Ce({valueOf:De},He),Ye=Ce({toExponential:Ue,toFixed:Ue,toLocaleString:Ue,toPrecision:Ue,valueOf:ze},He),Xe=Ce({charAt:Ue,charCodeAt:ze,codePointAt:ze,concat:Ue,endsWith:De,includes:De,indexOf:ze,lastIndexOf:ze,localeCompare:ze,match:De,normalize:Ue,padEnd:Ue,padStart:Ue,repeat:Ue,replace:{value:{callsArgs:[1],mutatesSelf:!1,returns:null,returnsPrimitive:Fe}},search:ze,slice:Ue,split:Re,startsWith:De,substr:Ue,substring:Ue,toLocaleLowerCase:Ue,toLocaleUpperCase:Ue,toLowerCase:Ue,toUpperCase:Ue,trim:Ue,valueOf:Ue},He);function Qe(e,t,n,i,r){if("string"!=typeof t||!e[t])return!0;if(e[t].mutatesSelf&&n)return!0;if(!e[t].callsArgs)return!1;for(const n of e[t].callsArgs)if(i.args[n]&&i.args[n].hasEffectsWhenCalledAtPath(Se,_e.create({args:[],callIdentifier:{},withNew:!1}),r.getHasEffectsWhenCalledOptions()))return!0;return!1}function Je(e,t){return"string"==typeof t&&e[t]?null!==e[t].returnsPrimitive?e[t].returnsPrimitive:new e[t].returns:we}class Ze{constructor(e){this.alwaysRendered=!1,this.exportName=null,this.included=!1,this.isId=!1,this.isReassigned=!1,this.renderBaseName=null,this.renderName=null,this.safeExportName=null,this.name=e}addReference(e){}deoptimizePath(e){}getBaseVariableName(){return this.renderBaseName||this.renderName||this.name}getLiteralValueAtPath(e,t,n){return Ie}getName(){const e=this.renderName||this.name;return this.renderBaseName?`${this.renderBaseName}.${e}`:e}getReturnExpressionWhenCalledAtPath(e,t,n){return we}hasEffectsWhenAccessedAtPath(e,t){return e.length>0}hasEffectsWhenAssignedAtPath(e,t){return!0}hasEffectsWhenCalledAtPath(e,t,n){return!0}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}markCalledFromTryStatement(){}setRenderNames(e,t){this.renderBaseName=e,this.renderName=t}setSafeName(e){this.renderName=e}toString(){return this.name}}class et extends Ze{constructor(e,t){super(t),this.module=e,this.isNamespace="*"===t,this.referenced=!1}addReference(e){this.referenced=!0,"default"!==this.name&&"*"!==this.name||this.module.suggestName(e.name)}include(){this.included||(this.included=!0,this.module.used=!0)}}const tt="break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public".split(" "),nt="Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl".split(" "),it=Object.create(null);tt.concat(nt).forEach(e=>it[e]=!0);const rt=/[^$_a-zA-Z0-9]/g,st=e=>/\d/.test(e[0]);function ot(e){return e=e.replace(/-(\w)/g,(e,t)=>t.toUpperCase()).replace(rt,"_"),(st(e)||it[e])&&(e=`_${e}`),e||"_"}const at=/^(?:\/|(?:[A-Za-z]:)?[\\|/])/,ht=/^\.?\.\//;function ut(e){return at.test(e)}function ct(e){return ht.test(e)}function lt(e){return e.replace(/\\/g,"/")}function pt(e){return e.split(/(\/|\\)/).pop()}function dt(e){const t=/(\/|\\)[^/\\]*$/.exec(e);if(!t)return".";const n=e.slice(0,-t[0].length);return n||"/"}function ft(e){const t=/\.[^.]+$/.exec(pt(e));return t?t[0]:""}function mt(e,t){const n=e.split(/[/\\]/).filter(Boolean),i=t.split(/[/\\]/).filter(Boolean);for("."===n[0]&&n.shift(),"."===i[0]&&i.shift();n[0]&&i[0]&&n[0]===i[0];)n.shift(),i.shift();for(;".."===i[0]&&n.length>0;)i.shift(),n.pop();for(;n.pop();)i.unshift("..");return i.join("/")}function gt(...e){let t=e.shift().split(/[/\\]/);return e.forEach(e=>{if(ut(e))t=e.split(/[/\\]/);else{const n=e.split(/[/\\]/);for(;"."===n[0]||".."===n[0];){".."===n.shift()&&t.pop()}t.push.apply(t,n)}}),t.join("/")}class yt{constructor(e,t,n){this.exportsNames=!1,this.exportsNamespace=!1,this.mostCommonSuggestion=0,this.reexported=!1,this.renderPath=void 0,this.renormalizeRenderPath=!1,this.used=!1,this.graph=e,this.id=t,this.execIndex=1/0,this.moduleSideEffects=n;const i=t.split(/[\\/]/);this.variableName=ot(i.pop()),this.nameSuggestions=Object.create(null),this.declarations=Object.create(null),this.exportedVariables=new Map}getVariableForExportName(e,t){"*"===e?this.exportsNamespace=!0:"default"!==e&&(this.exportsNames=!0);let n=this.declarations[e];return n||(this.declarations[e]=n=new et(this,e),this.exportedVariables.set(n,e),n)}setRenderPath(e,t){return this.renderPath="",e.paths&&(this.renderPath="function"==typeof e.paths?e.paths(this.id):e.paths[this.id]),this.renderPath||(ut(this.id)?(this.renderPath=lt(mt(t,this.id)),this.renormalizeRenderPath=!0):this.renderPath=this.id),this.renderPath}suggestName(e){this.nameSuggestions[e]||(this.nameSuggestions[e]=0),this.nameSuggestions[e]+=1,this.nameSuggestions[e]>this.mostCommonSuggestion&&(this.mostCommonSuggestion=this.nameSuggestions[e],this.variableName=e)}warnUnusedImports(){const e=Object.keys(this.declarations).filter(e=>{if("*"===e)return!1;const t=this.declarations[e];return!t.included&&!this.reexported&&!t.referenced});if(0===e.length)return;const t=1===e.length?`'${e[0]}' is`:`${e.slice(0,-1).map(e=>`'${e}'`).join(", ")} and '${e.slice(-1)}' are`;this.graph.warn({code:"UNUSED_EXTERNAL_IMPORT",message:`${t} imported from external module '${this.id}' but never used`,names:e,source:this.id})}}function vt(e){e.isExecuted=!0;const t=[e],n=new Set;for(const e of t)for(const i of e.dependencies)i instanceof yt||i.isExecuted||!i.moduleSideEffects||n.has(i.id)||(i.isExecuted=!0,n.add(i.id),t.push(i))}const xt=7;class Et extends Ze{constructor(e,t,n,i){super(e),this.additionalInitializers=null,this.calledFromTryStatement=!1,this.expressionsToBeDeoptimized=[],this.declarations=t?[t]:[],this.init=n,this.deoptimizationTracker=i.deoptimizationTracker,this.module=i.module}addDeclaration(e,t){this.declarations.push(e),null===this.additionalInitializers&&(this.additionalInitializers=null===this.init?[]:[this.init],this.init=we,this.isReassigned=!0),null!==t&&this.additionalInitializers.push(t)}consolidateInitializers(){if(null!==this.additionalInitializers){for(const e of this.additionalInitializers)e.deoptimizePath(Ae);this.additionalInitializers=null}}deoptimizePath(e){if(!(e.length>xt||this.isReassigned||this.deoptimizationTracker.track(this,e)))if(0===e.length){if(!this.isReassigned){this.isReassigned=!0;for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache();this.init&&this.init.deoptimizePath(Ae)}}else this.init&&this.init.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.isReassigned||!this.init||e.length>xt||t.isTracked(this.init,e)?Ie:(this.expressionsToBeDeoptimized.push(n),this.init.getLiteralValueAtPath(e,t.track(this.init,e),n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isReassigned||!this.init||e.length>xt||t.isTracked(this.init,e)?we:(this.expressionsToBeDeoptimized.push(n),this.init.getReturnExpressionWhenCalledAtPath(e,t.track(this.init,e),n))}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(this.isReassigned||e.length>xt||this.init&&!t.hasNodeBeenAccessedAtPath(e,this.init)&&this.init.hasEffectsWhenAccessedAtPath(e,t.addAccessedNodeAtPath(e,this.init)))}hasEffectsWhenAssignedAtPath(e,t){return!!(this.included||e.length>xt)||0!==e.length&&(this.isReassigned||this.init&&!t.hasNodeBeenAssignedAtPath(e,this.init)&&this.init.hasEffectsWhenAssignedAtPath(e,t.addAssignedNodeAtPath(e,this.init)))}hasEffectsWhenCalledAtPath(e,t,n){return e.length>xt||(this.isReassigned||this.init&&!n.hasNodeBeenCalledAtPathWithOptions(e,this.init,t)&&this.init.hasEffectsWhenCalledAtPath(e,t,n.addCalledNodeAtPathWithOptions(e,this.init,t)))}include(){if(!this.included){this.included=!0,this.module.isExecuted||vt(this.module);for(const e of this.declarations){e.included||e.include(!1);let t=e.parent;for(;!t.included&&(t.included=!0,t.type!==re);)t=t.parent}}}includeCallArguments(e){if(this.isReassigned)for(const t of e)t.include(!1);else this.init&&this.init.includeCallArguments(e)}markCalledFromTryStatement(){this.calledFromTryStatement=!0}}class _t{constructor(){this.children=[],this.variables=new Map}addDeclaration(e,t,n=null,i){const r=e.name;let s=this.variables.get(r);return s?s.addDeclaration(e,n):(s=new Et(e.name,e,n||Pe,t),this.variables.set(r,s)),s}contains(e){return this.variables.has(e)}findVariable(e){throw new Error("Internal Error: findVariable needs to be implemented by a subclass")}}class bt extends _t{constructor(e){super(),this.accessedOutsideVariables=new Map,this.parent=e,e.children.push(this)}addAccessedGlobalsByFormat(e){let t=this.accessedGlobalVariablesByFormat;t||(t=this.accessedGlobalVariablesByFormat=new Map);for(const n of Object.keys(e)){let i=t.get(n);i||(i=new Set,t.set(n,i));for(const t of e[n])i.add(t)}this.parent instanceof bt&&this.parent.addAccessedGlobalsByFormat(e)}addNamespaceMemberAccess(e,t){this.accessedOutsideVariables.set(e,t),this.parent instanceof bt&&this.parent.addNamespaceMemberAccess(e,t)}addReturnExpression(e){this.parent instanceof bt&&this.parent.addReturnExpression(e)}contains(e){return this.variables.has(e)||this.parent.contains(e)}deconflict(e){const t=new Set;for(const n of this.accessedOutsideVariables.values())n.included&&(t.add(n.getBaseVariableName()),n.exportName&&"system"===e&&t.add("exports"));const n=this.accessedGlobalVariablesByFormat&&this.accessedGlobalVariablesByFormat.get(e);if(n)for(const e of n)t.add(e);for(const[e,n]of this.variables)(n.included||n.alwaysRendered)&&n.setSafeName(Ee(e,t));for(const t of this.children)t.deconflict(e)}findLexicalBoundary(){return this.parent instanceof bt?this.parent.findLexicalBoundary():this}findVariable(e){const t=this.variables.get(e)||this.accessedOutsideVariables.get(e);if(t)return t;const n=this.parent.findVariable(e);return this.accessedOutsideVariables.set(e,n),n}}function St(e,t,n){if("number"==typeof n)throw new Error("locate takes a { startIndex, offsetLine, offsetColumn } object as the third argument");return function(e,t){void 0===t&&(t={});var n=t.offsetLine||0,i=t.offsetColumn||0,r=e.split("\n"),s=0,o=r.map((function(e,t){var n=s+e.length+1,i={start:s,end:n,line:t};return s=n,i})),a=0;function h(e,t){return e.start<=t&&t<e.end}function u(e,t){return{line:n+e.line,column:i+t-e.start,character:t}}return function(t,n){"string"==typeof t&&(t=e.indexOf(t,n||0));for(var i=o[a],r=t>=i.end?1:-1;i;){if(h(i,t))return u(i,t);i=o[a+=r]}}}(e,n)(t,n&&n.startIndex)}var At=5,Ct=1<<At,It=Ct-1,wt={};function Pt(e){e&&(e.value=!0)}function kt(){}function Nt(e){return void 0===e.size&&(e.size=e.__iterate(Rt)),e.size}function $t(e,t){if("number"!=typeof t){var n=t>>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?Nt(e)+t:t}function Rt(){return!0}function Tt(e,t,n){return(0===e&&!Dt(e)||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function Ot(e,t){return Lt(e,t,0)}function Mt(e,t){return Lt(e,t,t)}function Lt(e,t,n){return void 0===e?n:Dt(e)?t===1/0?t:0|Math.max(0,t+e):void 0===t||t===e?e:0|Math.min(t,e)}function Dt(e){return e<0||0===e&&1/e==-1/0}var Vt="@@__IMMUTABLE_ITERABLE__@@";function Bt(e){return Boolean(e&&e[Vt])}var zt="@@__IMMUTABLE_KEYED__@@";function Wt(e){return Boolean(e&&e[zt])}var jt="@@__IMMUTABLE_INDEXED__@@";function Ft(e){return Boolean(e&&e[jt])}function Ut(e){return Wt(e)||Ft(e)}var Gt=function(e){return Bt(e)?e:vn(e)},Ht=function(e){function t(e){return Wt(e)?e:xn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Gt),qt=function(e){function t(e){return Ft(e)?e:En(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Gt),Kt=function(e){function t(e){return Bt(e)&&!Ut(e)?e:_n(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Gt);Gt.Keyed=Ht,Gt.Indexed=qt,Gt.Set=Kt;var Yt="@@__IMMUTABLE_SEQ__@@";function Xt(e){return Boolean(e&&e[Yt])}var Qt="@@__IMMUTABLE_RECORD__@@";function Jt(e){return Boolean(e&&e[Qt])}function Zt(e){return Bt(e)||Jt(e)}var en="@@__IMMUTABLE_ORDERED__@@";function tn(e){return Boolean(e&&e[en])}var nn=0,rn=1,sn=2,on="function"==typeof Symbol&&Symbol.iterator,an="@@iterator",hn=on||an,un=function(e){this.next=e};function cn(e,t,n,i){var r=0===e?t:1===e?n:[t,n];return i?i.value=r:i={value:r,done:!1},i}function ln(){return{value:void 0,done:!0}}function pn(e){return!!mn(e)}function dn(e){return e&&"function"==typeof e.next}function fn(e){var t=mn(e);return t&&t.call(e)}function mn(e){var t=e&&(on&&e[on]||e[an]);if("function"==typeof t)return t}un.prototype.toString=function(){return"[Iterator]"},un.KEYS=nn,un.VALUES=rn,un.ENTRIES=sn,un.prototype.inspect=un.prototype.toSource=function(){return this.toString()},un.prototype[hn]=function(){return this};var gn=Object.prototype.hasOwnProperty;function yn(e){return!(!Array.isArray(e)&&"string"!=typeof e)||e&&"object"==typeof e&&Number.isInteger(e.length)&&e.length>=0&&(0===e.length?1===Object.keys(e).length:e.hasOwnProperty(e.length-1))}var vn=function(e){function t(e){return null==e?In():Zt(e)?e.toSeq():function(e){var t=kn(e);if(t)return t;if("object"==typeof e)return new Sn(e);throw new TypeError("Expected Array or collection object of values, or keyed object: "+e)}(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq {","}")},t.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},t.prototype.__iterate=function(e,t){var n=this._cache;if(n){for(var i=n.length,r=0;r!==i;){var s=n[t?i-++r:r++];if(!1===e(s[1],s[0],this))break}return r}return this.__iterateUncached(e,t)},t.prototype.__iterator=function(e,t){var n=this._cache;if(n){var i=n.length,r=0;return new un((function(){if(r===i)return{value:void 0,done:!0};var s=n[t?i-++r:r++];return cn(e,s[0],s[1])}))}return this.__iteratorUncached(e,t)},t}(Gt),xn=function(e){function t(e){return null==e?In().toKeyedSeq():Bt(e)?Wt(e)?e.toSeq():e.fromEntrySeq():Jt(e)?e.toSeq():wn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toKeyedSeq=function(){return this},t}(vn),En=function(e){function t(e){return null==e?In():Bt(e)?Wt(e)?e.entrySeq():e.toIndexedSeq():Jt(e)?e.toSeq().entrySeq():Pn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toIndexedSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq [","]")},t}(vn),_n=function(e){function t(e){return(Bt(e)&&!Ut(e)?e:En(e)).toSetSeq()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toSetSeq=function(){return this},t}(vn);vn.isSeq=Xt,vn.Keyed=xn,vn.Set=_n,vn.Indexed=En,vn.prototype[Yt]=!0;var bn=function(e){function t(e){this._array=e,this.size=e.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return this.has(e)?this._array[$t(this,e)]:t},t.prototype.__iterate=function(e,t){for(var n=this._array,i=n.length,r=0;r!==i;){var s=t?i-++r:r++;if(!1===e(n[s],s,this))break}return r},t.prototype.__iterator=function(e,t){var n=this._array,i=n.length,r=0;return new un((function(){if(r===i)return{value:void 0,done:!0};var s=t?i-++r:r++;return cn(e,s,n[s])}))},t}(En),Sn=function(e){function t(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},t.prototype.has=function(e){return gn.call(this._object,e)},t.prototype.__iterate=function(e,t){for(var n=this._object,i=this._keys,r=i.length,s=0;s!==r;){var o=i[t?r-++s:s++];if(!1===e(n[o],o,this))break}return s},t.prototype.__iterator=function(e,t){var n=this._object,i=this._keys,r=i.length,s=0;return new un((function(){if(s===r)return{value:void 0,done:!0};var o=i[t?r-++s:s++];return cn(e,o,n[o])}))},t}(xn);Sn.prototype[en]=!0;var An,Cn=function(e){function t(e){this._collection=e,this.size=e.length||e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=fn(this._collection),i=0;if(dn(n))for(var r;!(r=n.next()).done&&!1!==e(r.value,i++,this););return i},t.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=fn(this._collection);if(!dn(n))return new un(ln);var i=0;return new un((function(){var t=n.next();return t.done?t:cn(e,i++,t.value)}))},t}(En);function In(){return An||(An=new bn([]))}function wn(e){var t=Array.isArray(e)?new bn(e):pn(e)?new Cn(e):void 0;if(t)return t.fromEntrySeq();if("object"==typeof e)return new Sn(e);throw new TypeError("Expected Array or collection object of [k, v] entries, or keyed object: "+e)}function Pn(e){var t=kn(e);if(t)return t;throw new TypeError("Expected Array or collection object of values: "+e)}function kn(e){return yn(e)?new bn(e):pn(e)?new Cn(e):void 0}var Nn="@@__IMMUTABLE_MAP__@@";function $n(e){return Boolean(e&&e[Nn])}function Rn(e){return $n(e)&&tn(e)}function Tn(e){return Boolean(e&&"function"==typeof e.equals&&"function"==typeof e.hashCode)}function On(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!!(Tn(e)&&Tn(t)&&e.equals(t))}var Mn="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),i=65535&(t|=0);return n*i+((e>>>16)*i+n*(t>>>16)<<16>>>0)|0};function Ln(e){return e>>>1&1073741824|3221225471&e}var Dn=Object.prototype.valueOf;function Vn(e){switch(typeof e){case"boolean":return e?1108378657:1108378656;case"number":return function(e){if(e!=e||e===1/0)return 0;var t=0|e;t!==e&&(t^=4294967295*e);for(;e>4294967295;)t^=e/=4294967295;return Ln(t)}(e);case"string":return e.length>Hn?function(e){var t=Yn[e];void 0===t&&(t=Bn(e),Kn===qn&&(Kn=0,Yn={}),Kn++,Yn[e]=t);return t}(e):Bn(e);case"object":case"function":return null===e?1108378658:"function"==typeof e.hashCode?Ln(e.hashCode(e)):(e.valueOf!==Dn&&"function"==typeof e.valueOf&&(e=e.valueOf(e)),function(e){var t;if(Fn&&void 0!==(t=jn.get(e)))return t;if(void 0!==(t=e[Gn]))return t;if(!Wn){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Gn]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}t=++Un,1073741824&Un&&(Un=0);if(Fn)jn.set(e,t);else{if(void 0!==zn&&!1===zn(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Wn)Object.defineProperty(e,Gn,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Gn]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Gn]=t}}return t}(e));case"undefined":return 1108378659;default:if("function"==typeof e.toString)return Bn(e.toString());throw new Error("Value type "+typeof e+" cannot be hashed.")}}function Bn(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return Ln(t)}var zn=Object.isExtensible,Wn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(e){return!1}}();var jn,Fn="function"==typeof WeakMap;Fn&&(jn=new WeakMap);var Un=0,Gn="__immutablehash__";"function"==typeof Symbol&&(Gn=Symbol(Gn));var Hn=16,qn=255,Kn=0,Yn={},Xn=function(e){function t(e,t){this._iter=e,this._useKeys=t,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return this._iter.get(e,t)},t.prototype.has=function(e){return this._iter.has(e)},t.prototype.valueSeq=function(){return this._iter.valueSeq()},t.prototype.reverse=function(){var e=this,t=ni(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},t.prototype.map=function(e,t){var n=this,i=ti(this,e,t);return this._useKeys||(i.valueSeq=function(){return n._iter.toSeq().map(e,t)}),i},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t,i){return e(t,i,n)}),t)},t.prototype.__iterator=function(e,t){return this._iter.__iterator(e,t)},t}(xn);Xn.prototype[en]=!0;var Qn=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.includes=function(e){return this._iter.includes(e)},t.prototype.__iterate=function(e,t){var n=this,i=0;return t&&Nt(this),this._iter.__iterate((function(r){return e(r,t?n.size-++i:i++,n)}),t)},t.prototype.__iterator=function(e,t){var n=this,i=this._iter.__iterator(rn,t),r=0;return t&&Nt(this),new un((function(){var s=i.next();return s.done?s:cn(e,t?n.size-++r:r++,s.value,s)}))},t}(En),Jn=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.has=function(e){return this._iter.includes(e)},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){return e(t,t,n)}),t)},t.prototype.__iterator=function(e,t){var n=this._iter.__iterator(rn,t);return new un((function(){var t=n.next();return t.done?t:cn(e,t.value,t.value,t)}))},t}(_n),Zn=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.entrySeq=function(){return this._iter.toSeq()},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){if(t){di(t);var i=Bt(t);return e(i?t.get(1):t[1],i?t.get(0):t[0],n)}}),t)},t.prototype.__iterator=function(e,t){var n=this._iter.__iterator(rn,t);return new un((function(){for(;;){var t=n.next();if(t.done)return t;var i=t.value;if(i){di(i);var r=Bt(i);return cn(e,r?i.get(0):i[0],r?i.get(1):i[1],t)}}}))},t}(xn);function ei(e){var t=mi(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=gi,t.__iterateUncached=function(t,n){var i=this;return e.__iterate((function(e,n){return!1!==t(n,e,i)}),n)},t.__iteratorUncached=function(t,n){if(t===sn){var i=e.__iterator(t,n);return new un((function(){var e=i.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===rn?nn:rn,n)},t}function ti(e,t,n){var i=mi(e);return i.size=e.size,i.has=function(t){return e.has(t)},i.get=function(i,r){var s=e.get(i,wt);return s===wt?r:t.call(n,s,i,e)},i.__iterateUncached=function(i,r){var s=this;return e.__iterate((function(e,r,o){return!1!==i(t.call(n,e,r,o),r,s)}),r)},i.__iteratorUncached=function(i,r){var s=e.__iterator(sn,r);return new un((function(){var r=s.next();if(r.done)return r;var o=r.value,a=o[0];return cn(i,a,t.call(n,o[1],a,e),r)}))},i}function ni(e,t){var n=this,i=mi(e);return i._iter=e,i.size=e.size,i.reverse=function(){return e},e.flip&&(i.flip=function(){var t=ei(e);return t.reverse=function(){return e.flip()},t}),i.get=function(n,i){return e.get(t?n:-1-n,i)},i.has=function(n){return e.has(t?n:-1-n)},i.includes=function(t){return e.includes(t)},i.cacheResult=gi,i.__iterate=function(n,i){var r=this,s=0;return i&&Nt(e),e.__iterate((function(e,o){return n(e,t?o:i?r.size-++s:s++,r)}),!i)},i.__iterator=function(i,r){var s=0;r&&Nt(e);var o=e.__iterator(sn,!r);return new un((function(){var e=o.next();if(e.done)return e;var a=e.value;return cn(i,t?a[0]:r?n.size-++s:s++,a[1],e)}))},i}function ii(e,t,n,i){var r=mi(e);return i&&(r.has=function(i){var r=e.get(i,wt);return r!==wt&&!!t.call(n,r,i,e)},r.get=function(i,r){var s=e.get(i,wt);return s!==wt&&t.call(n,s,i,e)?s:r}),r.__iterateUncached=function(r,s){var o=this,a=0;return e.__iterate((function(e,s,h){if(t.call(n,e,s,h))return a++,r(e,i?s:a-1,o)}),s),a},r.__iteratorUncached=function(r,s){var o=e.__iterator(sn,s),a=0;return new un((function(){for(;;){var s=o.next();if(s.done)return s;var h=s.value,u=h[0],c=h[1];if(t.call(n,c,u,e))return cn(r,i?u:a++,c,s)}}))},r}function ri(e,t,n,i){var r=e.size;if(Tt(t,n,r))return e;var s=Ot(t,r),o=Mt(n,r);if(s!=s||o!=o)return ri(e.toSeq().cacheResult(),t,n,i);var a,h=o-s;h==h&&(a=h<0?0:h);var u=mi(e);return u.size=0===a?a:e.size&&a||void 0,!i&&Xt(e)&&a>=0&&(u.get=function(t,n){return(t=$t(this,t))>=0&&t<a?e.get(t+s,n):n}),u.__iterateUncached=function(t,n){var r=this;if(0===a)return 0;if(n)return this.cacheResult().__iterate(t,n);var o=0,h=!0,u=0;return e.__iterate((function(e,n){if(!h||!(h=o++<s))return u++,!1!==t(e,i?n:u-1,r)&&u!==a})),u},u.__iteratorUncached=function(t,n){if(0!==a&&n)return this.cacheResult().__iterator(t,n);if(0===a)return new un(ln);var r=e.__iterator(t,n),o=0,h=0;return new un((function(){for(;o++<s;)r.next();if(++h>a)return{value:void 0,done:!0};var e=r.next();return i||t===rn||e.done?e:cn(t,h-1,t===nn?void 0:e.value[1],e)}))},u}function si(e,t,n,i){var r=mi(e);return r.__iterateUncached=function(r,s){var o=this;if(s)return this.cacheResult().__iterate(r,s);var a=!0,h=0;return e.__iterate((function(e,s,u){if(!a||!(a=t.call(n,e,s,u)))return h++,r(e,i?s:h-1,o)})),h},r.__iteratorUncached=function(r,s){var o=this;if(s)return this.cacheResult().__iterator(r,s);var a=e.__iterator(sn,s),h=!0,u=0;return new un((function(){var e,s,c;do{if((e=a.next()).done)return i||r===rn?e:cn(r,u++,r===nn?void 0:e.value[1],e);var l=e.value;s=l[0],c=l[1],h&&(h=t.call(n,c,s,o))}while(h);return r===sn?e:cn(r,s,c,e)}))},r}function oi(e,t){var n=Wt(e),i=[e].concat(t).map((function(e){return Bt(e)?n&&(e=Ht(e)):e=n?wn(e):Pn(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===i.length)return e;if(1===i.length){var r=i[0];if(r===e||n&&Wt(r)||Ft(e)&&Ft(r))return r}var s=new bn(i);return n?s=s.toKeyedSeq():Ft(e)||(s=s.toSetSeq()),(s=s.flatten(!0)).size=i.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),s}function ai(e,t,n){var i=mi(e);return i.__iterateUncached=function(r,s){if(s)return this.cacheResult().__iterate(r,s);var o=0,a=!1;return function e(h,u){h.__iterate((function(s,h){return(!t||u<t)&&Bt(s)?e(s,u+1):(o++,!1===r(s,n?h:o-1,i)&&(a=!0)),!a}),s)}(e,0),o},i.__iteratorUncached=function(i,r){if(r)return this.cacheResult().__iterator(i,r);var s=e.__iterator(i,r),o=[],a=0;return new un((function(){for(;s;){var e=s.next();if(!1===e.done){var h=e.value;if(i===sn&&(h=h[1]),t&&!(o.length<t)||!Bt(h))return n?e:cn(i,a++,h,e);o.push(s),s=h.__iterator(i,r)}else s=o.pop()}return{value:void 0,done:!0}}))},i}function hi(e,t,n){t||(t=yi);var i=Wt(e),r=0,s=e.toSeq().map((function(t,i){return[i,t,r++,n?n(t,i,e):t]})).valueSeq().toArray();return s.sort((function(e,n){return t(e[3],n[3])||e[2]-n[2]})).forEach(i?function(e,t){s[t].length=2}:function(e,t){s[t]=e[1]}),i?xn(s):Ft(e)?En(s):_n(s)}function ui(e,t,n){if(t||(t=yi),n){var i=e.toSeq().map((function(t,i){return[t,n(t,i,e)]})).reduce((function(e,n){return ci(t,e[1],n[1])?n:e}));return i&&i[0]}return e.reduce((function(e,n){return ci(t,e,n)?n:e}))}function ci(e,t,n){var i=e(n,t);return 0===i&&n!==t&&(null==n||n!=n)||i>0}function li(e,t,n,i){var r=mi(e),s=new bn(n).map((function(e){return e.size}));return r.size=i?s.max():s.min(),r.__iterate=function(e,t){for(var n,i=this.__iterator(rn,t),r=0;!(n=i.next()).done&&!1!==e(n.value,r++,this););return r},r.__iteratorUncached=function(e,r){var s=n.map((function(e){return e=Gt(e),fn(r?e.reverse():e)})),o=0,a=!1;return new un((function(){var n;return a||(n=s.map((function(e){return e.next()})),a=i?n.every((function(e){return e.done})):n.some((function(e){return e.done}))),a?{value:void 0,done:!0}:cn(e,o++,t.apply(null,n.map((function(e){return e.value}))))}))},r}function pi(e,t){return e===t?e:Xt(e)?t:e.constructor(t)}function di(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function fi(e){return Wt(e)?Ht:Ft(e)?qt:Kt}function mi(e){return Object.create((Wt(e)?xn:Ft(e)?En:_n).prototype)}function gi(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):vn.prototype.cacheResult.call(this)}function yi(e,t){return void 0===e&&void 0===t?0:void 0===e?1:void 0===t?-1:e>t?1:e<t?-1:0}function vi(e,t){t=t||0;for(var n=Math.max(0,e.length-t),i=new Array(n),r=0;r<n;r++)i[r]=e[r+t];return i}function xi(e,t){if(!e)throw new Error(t)}function Ei(e){xi(e!==1/0,"Cannot perform this action with an infinite size.")}function _i(e){if(yn(e)&&"string"!=typeof e)return e;if(tn(e))return e.toArray();throw new TypeError("Invalid keyPath: expected Ordered Collection or Array: "+e)}function bi(e){return e&&("function"!=typeof e.constructor||"Object"===e.constructor.name)}function Si(e){return"object"==typeof e&&(Zt(e)||Array.isArray(e)||bi(e))}function Ai(e){try{return"string"==typeof e?JSON.stringify(e):String(e)}catch(t){return JSON.stringify(e)}}function Ci(e,t){return Zt(e)?e.has(t):Si(e)&&gn.call(e,t)}function Ii(e,t,n){return Zt(e)?e.get(t,n):Ci(e,t)?"function"==typeof e.get?e.get(t):e[t]:n}function wi(e){if(Array.isArray(e))return vi(e);var t={};for(var n in e)gn.call(e,n)&&(t[n]=e[n]);return t}function Pi(e,t){if(!Si(e))throw new TypeError("Cannot update non-data-structure value: "+e);if(Zt(e)){if(!e.remove)throw new TypeError("Cannot update immutable value without .remove() method: "+e);return e.remove(t)}if(!gn.call(e,t))return e;var n=wi(e);return Array.isArray(n)?n.splice(t,1):delete n[t],n}function ki(e,t,n){if(!Si(e))throw new TypeError("Cannot update non-data-structure value: "+e);if(Zt(e)){if(!e.set)throw new TypeError("Cannot update immutable value without .set() method: "+e);return e.set(t,n)}if(gn.call(e,t)&&n===e[t])return e;var i=wi(e);return i[t]=n,i}function Ni(e,t,n,i){i||(i=n,n=void 0);var r=function e(t,n,i,r,s,o){var a=n===wt;if(r===i.length){var h=a?s:n,u=o(h);return u===h?n:u}if(!a&&!Si(n))throw new TypeError("Cannot update within non-data-structure value in path ["+i.slice(0,r).map(Ai)+"]: "+n);var c=i[r];var l=a?wt:Ii(n,c,wt);var p=e(l===wt?t:Zt(l),l,i,r+1,s,o);return p===l?n:p===wt?Pi(n,c):ki(a?t?ur():{}:n,c,p)}(Zt(e),e,_i(t),0,n,i);return r===wt?n:r}function $i(e,t,n){return Ni(e,t,wt,(function(){return n}))}function Ri(e,t){return $i(this,e,t)}function Ti(e,t){return Ni(e,t,(function(){return wt}))}function Oi(e){return Ti(this,e)}function Mi(e,t,n,i){return Ni(e,[t],n,i)}function Li(e,t,n){return 1===arguments.length?e(this):Mi(this,e,t,n)}function Di(e,t,n){return Ni(this,e,t,n)}function Vi(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return zi(this,e)}function Bi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];if("function"!=typeof e)throw new TypeError("Invalid merger function: "+e);return zi(this,t,e)}function zi(e,t,n){for(var i=[],r=0;r<t.length;r++){var s=Ht(t[r]);0!==s.size&&i.push(s)}return 0===i.length?e:0!==e.toSeq().size||e.__ownerID||1!==i.length?e.withMutations((function(e){for(var t=n?function(t,i){Mi(e,i,wt,(function(e){return e===wt?t:n(e,t,i)}))}:function(t,n){e.set(n,t)},r=0;r<i.length;r++)i[r].forEach(t)})):e.constructor(i[0])}function Wi(e,t,n){return ji(e,t,function(e){return function t(n,i,r){return Si(n)&&Si(i)?ji(n,[i],t):e?e(n,i,r):i}}(n))}function ji(e,t,n){if(!Si(e))throw new TypeError("Cannot merge into non-data-structure value: "+e);if(Zt(e))return"function"==typeof n&&e.mergeWith?e.mergeWith.apply(e,[n].concat(t)):e.merge?e.merge.apply(e,t):e.concat.apply(e,t);for(var i=Array.isArray(e),r=e,s=i?qt:Ht,o=i?function(t){r===e&&(r=wi(r)),r.push(t)}:function(t,i){var s=gn.call(r,i),o=s&&n?n(r[i],t,i):t;s&&o===r[i]||(r===e&&(r=wi(r)),r[i]=o)},a=0;a<t.length;a++)s(t[a]).forEach(o);return r}function Fi(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return Wi(this,e)}function Ui(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Wi(this,t,e)}function Gi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Ni(this,e,ur(),(function(e){return ji(e,t)}))}function Hi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Ni(this,e,ur(),(function(e){return Wi(e,t)}))}function qi(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this}function Ki(){return this.__ownerID?this:this.__ensureOwner(new kt)}function Yi(){return this.__ensureOwner()}function Xi(){return this.__altered}Qn.prototype.cacheResult=Xn.prototype.cacheResult=Jn.prototype.cacheResult=Zn.prototype.cacheResult=gi;var Qi=function(e){function t(t){return null==t?ur():$n(t)&&!tn(t)?t:ur().withMutations((function(n){var i=e(t);Ei(i.size),i.forEach((function(e,t){return n.set(t,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return ur().withMutations((function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error("Missing value for key: "+e[n]);t.set(e[n],e[n+1])}}))},t.prototype.toString=function(){return this.__toString("Map {","}")},t.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},t.prototype.set=function(e,t){return cr(this,e,t)},t.prototype.remove=function(e){return cr(this,e,wt)},t.prototype.deleteAll=function(e){var t=Gt(e);return 0===t.size?this:this.withMutations((function(e){t.forEach((function(t){return e.remove(t)}))}))},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ur()},t.prototype.sort=function(e){return Mr(hi(this,e))},t.prototype.sortBy=function(e,t){return Mr(hi(this,t,e))},t.prototype.map=function(e,t){return this.withMutations((function(n){n.forEach((function(i,r){n.set(r,e.call(t,i,r,n))}))}))},t.prototype.__iterator=function(e,t){return new sr(this,e,t)},t.prototype.__iterate=function(e,t){var n=this,i=0;return this._root&&this._root.iterate((function(t){return i++,e(t[1],t[0],n)}),t),i},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?hr(this.size,this._root,e,this.__hash):0===this.size?ur():(this.__ownerID=e,this.__altered=!1,this)},t}(Ht);Qi.isMap=$n;var Ji=Qi.prototype;Ji[Nn]=!0,Ji.delete=Ji.remove,Ji.removeAll=Ji.deleteAll,Ji.setIn=Ri,Ji.removeIn=Ji.deleteIn=Oi,Ji.update=Li,Ji.updateIn=Di,Ji.merge=Ji.concat=Vi,Ji.mergeWith=Bi,Ji.mergeDeep=Fi,Ji.mergeDeepWith=Ui,Ji.mergeIn=Gi,Ji.mergeDeepIn=Hi,Ji.withMutations=qi,Ji.wasAltered=Xi,Ji.asImmutable=Yi,Ji["@@transducer/init"]=Ji.asMutable=Ki,Ji["@@transducer/step"]=function(e,t){return e.set(t[0],t[1])},Ji["@@transducer/result"]=function(e){return e.asImmutable()};var Zi=function(e,t){this.ownerID=e,this.entries=t};Zi.prototype.get=function(e,t,n,i){for(var r=this.entries,s=0,o=r.length;s<o;s++)if(On(n,r[s][0]))return r[s][1];return i},Zi.prototype.update=function(e,t,n,i,r,s,o){for(var a=r===wt,h=this.entries,u=0,c=h.length;u<c&&!On(i,h[u][0]);u++);var l=u<c;if(l?h[u][1]===r:a)return this;if(Pt(o),(a||!l)&&Pt(s),!a||1!==h.length){if(!l&&!a&&h.length>=gr)return function(e,t,n,i){e||(e=new kt);for(var r=new ir(e,Vn(n),[n,i]),s=0;s<t.length;s++){var o=t[s];r=r.update(e,0,void 0,o[0],o[1])}return r}(e,h,i,r);var p=e&&e===this.ownerID,d=p?h:vi(h);return l?a?u===c-1?d.pop():d[u]=d.pop():d[u]=[i,r]:d.push([i,r]),p?(this.entries=d,this):new Zi(e,d)}};var er=function(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n};er.prototype.get=function(e,t,n,i){void 0===t&&(t=Vn(n));var r=1<<((0===e?t:t>>>e)&It),s=this.bitmap;return 0==(s&r)?i:this.nodes[fr(s&r-1)].get(e+At,t,n,i)},er.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Vn(i));var a=(0===t?n:n>>>t)&It,h=1<<a,u=this.bitmap,c=0!=(u&h);if(!c&&r===wt)return this;var l=fr(u&h-1),p=this.nodes,d=c?p[l]:void 0,f=lr(d,e,t+At,n,i,r,s,o);if(f===d)return this;if(!c&&f&&p.length>=yr)return function(e,t,n,i,r){for(var s=0,o=new Array(Ct),a=0;0!==n;a++,n>>>=1)o[a]=1&n?t[s++]:void 0;return o[i]=r,new tr(e,s+1,o)}(e,p,u,a,f);if(c&&!f&&2===p.length&&pr(p[1^l]))return p[1^l];if(c&&f&&1===p.length&&pr(f))return f;var m=e&&e===this.ownerID,g=c?f?u:u^h:u|h,y=c?f?mr(p,l,f,m):function(e,t,n){var i=e.length-1;if(n&&t===i)return e.pop(),e;for(var r=new Array(i),s=0,o=0;o<i;o++)o===t&&(s=1),r[o]=e[o+s];return r}(p,l,m):function(e,t,n,i){var r=e.length+1;if(i&&t+1===r)return e[t]=n,e;for(var s=new Array(r),o=0,a=0;a<r;a++)a===t?(s[a]=n,o=-1):s[a]=e[a+o];return s}(p,l,f,m);return m?(this.bitmap=g,this.nodes=y,this):new er(e,g,y)};var tr=function(e,t,n){this.ownerID=e,this.count=t,this.nodes=n};tr.prototype.get=function(e,t,n,i){void 0===t&&(t=Vn(n));var r=(0===e?t:t>>>e)&It,s=this.nodes[r];return s?s.get(e+At,t,n,i):i},tr.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Vn(i));var a=(0===t?n:n>>>t)&It,h=r===wt,u=this.nodes,c=u[a];if(h&&!c)return this;var l=lr(c,e,t+At,n,i,r,s,o);if(l===c)return this;var p=this.count;if(c){if(!l&&--p<vr)return function(e,t,n,i){for(var r=0,s=0,o=new Array(n),a=0,h=1,u=t.length;a<u;a++,h<<=1){var c=t[a];void 0!==c&&a!==i&&(r|=h,o[s++]=c)}return new er(e,r,o)}(e,u,p,a)}else p++;var d=e&&e===this.ownerID,f=mr(u,a,l,d);return d?(this.count=p,this.nodes=f,this):new tr(e,p,f)};var nr=function(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n};nr.prototype.get=function(e,t,n,i){for(var r=this.entries,s=0,o=r.length;s<o;s++)if(On(n,r[s][0]))return r[s][1];return i},nr.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Vn(i));var a=r===wt;if(n!==this.keyHash)return a?this:(Pt(o),Pt(s),dr(this,e,t,n,[i,r]));for(var h=this.entries,u=0,c=h.length;u<c&&!On(i,h[u][0]);u++);var l=u<c;if(l?h[u][1]===r:a)return this;if(Pt(o),(a||!l)&&Pt(s),a&&2===c)return new ir(e,this.keyHash,h[1^u]);var p=e&&e===this.ownerID,d=p?h:vi(h);return l?a?u===c-1?d.pop():d[u]=d.pop():d[u]=[i,r]:d.push([i,r]),p?(this.entries=d,this):new nr(e,this.keyHash,d)};var ir=function(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n};ir.prototype.get=function(e,t,n,i){return On(n,this.entry[0])?this.entry[1]:i},ir.prototype.update=function(e,t,n,i,r,s,o){var a=r===wt,h=On(i,this.entry[0]);return(h?r===this.entry[1]:a)?this:(Pt(o),a?void Pt(s):h?e&&e===this.ownerID?(this.entry[1]=r,this):new ir(e,this.keyHash,[i,r]):(Pt(s),dr(this,e,t,Vn(i),[i,r])))},Zi.prototype.iterate=nr.prototype.iterate=function(e,t){for(var n=this.entries,i=0,r=n.length-1;i<=r;i++)if(!1===e(n[t?r-i:i]))return!1},er.prototype.iterate=tr.prototype.iterate=function(e,t){for(var n=this.nodes,i=0,r=n.length-1;i<=r;i++){var s=n[t?r-i:i];if(s&&!1===s.iterate(e,t))return!1}},ir.prototype.iterate=function(e,t){return e(this.entry)};var rr,sr=function(e){function t(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&ar(e._root)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n=t.node,i=t.index++,r=void 0;if(n.entry){if(0===i)return or(e,n.entry)}else if(n.entries){if(i<=(r=n.entries.length-1))return or(e,n.entries[this._reverse?r-i:i])}else if(i<=(r=n.nodes.length-1)){var s=n.nodes[this._reverse?r-i:i];if(s){if(s.entry)return or(e,s.entry);t=this._stack=ar(s,t)}continue}t=this._stack=this._stack.__prev}return{value:void 0,done:!0}},t}(un);function or(e,t){return cn(e,t[0],t[1])}function ar(e,t){return{node:e,index:0,__prev:t}}function hr(e,t,n,i){var r=Object.create(Ji);return r.size=e,r._root=t,r.__ownerID=n,r.__hash=i,r.__altered=!1,r}function ur(){return rr||(rr=hr(0))}function cr(e,t,n){var i,r;if(e._root){var s={value:!1},o={value:!1};if(i=lr(e._root,e.__ownerID,0,void 0,t,n,s,o),!o.value)return e;r=e.size+(s.value?n===wt?-1:1:0)}else{if(n===wt)return e;r=1,i=new Zi(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=r,e._root=i,e.__hash=void 0,e.__altered=!0,e):i?hr(r,i):ur()}function lr(e,t,n,i,r,s,o,a){return e?e.update(t,n,i,r,s,o,a):s===wt?e:(Pt(a),Pt(o),new ir(t,i,[r,s]))}function pr(e){return e.constructor===ir||e.constructor===nr}function dr(e,t,n,i,r){if(e.keyHash===i)return new nr(t,i,[e.entry,r]);var s,o=(0===n?e.keyHash:e.keyHash>>>n)&It,a=(0===n?i:i>>>n)&It,h=o===a?[dr(e,t,n+At,i,r)]:(s=new ir(t,i,r),o<a?[e,s]:[s,e]);return new er(t,1<<o|1<<a,h)}function fr(e){return e=(e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function mr(e,t,n,i){var r=i?e:vi(e);return r[t]=n,r}var gr=Ct/4,yr=Ct/2,vr=Ct/4,xr="@@__IMMUTABLE_LIST__@@";function Er(e){return Boolean(e&&e[xr])}var _r=function(e){function t(t){var n=Pr();if(null==t)return n;if(Er(t))return t;var i=e(t),r=i.size;return 0===r?n:(Ei(r),r>0&&r<Ct?wr(0,r,At,null,new Sr(i.toArray())):n.withMutations((function(e){e.setSize(r),i.forEach((function(t,n){return e.set(n,t)}))})))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("List [","]")},t.prototype.get=function(e,t){if((e=$t(this,e))>=0&&e<this.size){var n=$r(this,e+=this._origin);return n&&n.array[e&It]}return t},t.prototype.set=function(e,t){return function(e,t,n){if((t=$t(e,t))!=t)return e;if(t>=e.size||t<0)return e.withMutations((function(e){t<0?Rr(e,t).set(0,n):Rr(e,0,t+1).set(t,n)}));t+=e._origin;var i=e._tail,r=e._root,s={value:!1};t>=Tr(e._capacity)?i=kr(i,e.__ownerID,0,t,n,s):r=kr(r,e.__ownerID,e._level,t,n,s);if(!s.value)return e;if(e.__ownerID)return e._root=r,e._tail=i,e.__hash=void 0,e.__altered=!0,e;return wr(e._origin,e._capacity,e._level,r,i)}(this,e,t)},t.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},t.prototype.insert=function(e,t){return this.splice(e,0,t)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=At,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Pr()},t.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations((function(n){Rr(n,0,t+e.length);for(var i=0;i<e.length;i++)n.set(t+i,e[i])}))},t.prototype.pop=function(){return Rr(this,0,-1)},t.prototype.unshift=function(){var e=arguments;return this.withMutations((function(t){Rr(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])}))},t.prototype.shift=function(){return Rr(this,1)},t.prototype.concat=function(){for(var t=arguments,n=[],i=0;i<arguments.length;i++){var r=t[i],s=e("string"!=typeof r&&pn(r)?r:[r]);0!==s.size&&n.push(s)}return 0===n.length?this:0!==this.size||this.__ownerID||1!==n.length?this.withMutations((function(e){n.forEach((function(t){return t.forEach((function(t){return e.push(t)}))}))})):this.constructor(n[0])},t.prototype.setSize=function(e){return Rr(this,0,e)},t.prototype.map=function(e,t){var n=this;return this.withMutations((function(i){for(var r=0;r<n.size;r++)i.set(r,e.call(t,i.get(r),r,i))}))},t.prototype.slice=function(e,t){var n=this.size;return Tt(e,t,n)?this:Rr(this,Ot(e,n),Mt(t,n))},t.prototype.__iterator=function(e,t){var n=t?this.size:0,i=Ir(this,t);return new un((function(){var r=i();return r===Cr?{value:void 0,done:!0}:cn(e,t?--n:n++,r)}))},t.prototype.__iterate=function(e,t){for(var n,i=t?this.size:0,r=Ir(this,t);(n=r())!==Cr&&!1!==e(n,t?--i:i++,this););return i},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?wr(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):0===this.size?Pr():(this.__ownerID=e,this.__altered=!1,this)},t}(qt);_r.isList=Er;var br=_r.prototype;br[xr]=!0,br.delete=br.remove,br.merge=br.concat,br.setIn=Ri,br.deleteIn=br.removeIn=Oi,br.update=Li,br.updateIn=Di,br.mergeIn=Gi,br.mergeDeepIn=Hi,br.withMutations=qi,br.wasAltered=Xi,br.asImmutable=Yi,br["@@transducer/init"]=br.asMutable=Ki,br["@@transducer/step"]=function(e,t){return e.push(t)},br["@@transducer/result"]=function(e){return e.asImmutable()};var Sr=function(e,t){this.array=e,this.ownerID=t};Sr.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var i=n>>>t&It;if(i>=this.array.length)return new Sr([],e);var r,s=0===i;if(t>0){var o=this.array[i];if((r=o&&o.removeBefore(e,t-At,n))===o&&s)return this}if(s&&!r)return this;var a=Nr(this,e);if(!s)for(var h=0;h<i;h++)a.array[h]=void 0;return r&&(a.array[i]=r),a},Sr.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var i,r=n-1>>>t&It;if(r>=this.array.length)return this;if(t>0){var s=this.array[r];if((i=s&&s.removeAfter(e,t-At,n))===s&&r===this.array.length-1)return this}var o=Nr(this,e);return o.array.splice(r+1),i&&(o.array[r]=i),o};var Ar,Cr={};function Ir(e,t){var n=e._origin,i=e._capacity,r=Tr(i),s=e._tail;return o(e._root,e._level,0);function o(e,a,h){return 0===a?function(e,o){var a=o===r?s&&s.array:e&&e.array,h=o>n?0:n-o,u=i-o;u>Ct&&(u=Ct);return function(){if(h===u)return Cr;var e=t?--u:h++;return a&&a[e]}}(e,h):function(e,r,s){var a,h=e&&e.array,u=s>n?0:n-s>>r,c=1+(i-s>>r);c>Ct&&(c=Ct);return function(){for(;;){if(a){var e=a();if(e!==Cr)return e;a=null}if(u===c)return Cr;var n=t?--c:u++;a=o(h&&h[n],r-At,s+(n<<r))}}}(e,a,h)}}function wr(e,t,n,i,r,s,o){var a=Object.create(br);return a.size=t-e,a._origin=e,a._capacity=t,a._level=n,a._root=i,a._tail=r,a.__ownerID=s,a.__hash=o,a.__altered=!1,a}function Pr(){return Ar||(Ar=wr(0,0,At))}function kr(e,t,n,i,r,s){var o,a=i>>>n&It,h=e&&a<e.array.length;if(!h&&void 0===r)return e;if(n>0){var u=e&&e.array[a],c=kr(u,t,n-At,i,r,s);return c===u?e:((o=Nr(e,t)).array[a]=c,o)}return h&&e.array[a]===r?e:(s&&Pt(s),o=Nr(e,t),void 0===r&&a===o.array.length-1?o.array.pop():o.array[a]=r,o)}function Nr(e,t){return t&&e&&t===e.ownerID?e:new Sr(e?e.array.slice():[],t)}function $r(e,t){if(t>=Tr(e._capacity))return e._tail;if(t<1<<e._level+At){for(var n=e._root,i=e._level;n&&i>0;)n=n.array[t>>>i&It],i-=At;return n}}function Rr(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var i=e.__ownerID||new kt,r=e._origin,s=e._capacity,o=r+t,a=void 0===n?s:n<0?s+n:r+n;if(o===r&&a===s)return e;if(o>=a)return e.clear();for(var h=e._level,u=e._root,c=0;o+c<0;)u=new Sr(u&&u.array.length?[void 0,u]:[],i),c+=1<<(h+=At);c&&(o+=c,r+=c,a+=c,s+=c);for(var l=Tr(s),p=Tr(a);p>=1<<h+At;)u=new Sr(u&&u.array.length?[u]:[],i),h+=At;var d=e._tail,f=p<l?$r(e,a-1):p>l?new Sr([],i):d;if(d&&p>l&&o<s&&d.array.length){for(var m=u=Nr(u,i),g=h;g>At;g-=At){var y=l>>>g&It;m=m.array[y]=Nr(m.array[y],i)}m.array[l>>>At&It]=d}if(a<s&&(f=f&&f.removeAfter(i,0,a)),o>=p)o-=p,a-=p,h=At,u=null,f=f&&f.removeBefore(i,0,o);else if(o>r||p<l){for(c=0;u;){var v=o>>>h&It;if(v!==p>>>h&It)break;v&&(c+=(1<<h)*v),h-=At,u=u.array[v]}u&&o>r&&(u=u.removeBefore(i,h,o-c)),u&&p<l&&(u=u.removeAfter(i,h,p-c)),c&&(o-=c,a-=c)}return e.__ownerID?(e.size=a-o,e._origin=o,e._capacity=a,e._level=h,e._root=u,e._tail=f,e.__hash=void 0,e.__altered=!0,e):wr(o,a,h,u,f)}function Tr(e){return e<Ct?0:e-1>>>At<<At}var Or,Mr=function(e){function t(e){return null==e?Dr():Rn(e)?e:Dr().withMutations((function(t){var n=Ht(e);Ei(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("OrderedMap {","}")},t.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Dr()},t.prototype.set=function(e,t){return Vr(this,e,t)},t.prototype.remove=function(e){return Vr(this,e,wt)},t.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},t.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate((function(t){return t&&e(t[1],t[0],n)}),t)},t.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},t.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?Lr(t,n,e,this.__hash):0===this.size?Dr():(this.__ownerID=e,this._map=t,this._list=n,this)},t}(Qi);function Lr(e,t,n,i){var r=Object.create(Mr.prototype);return r.size=e?e.size:0,r._map=e,r._list=t,r.__ownerID=n,r.__hash=i,r}function Dr(){return Or||(Or=Lr(ur(),Pr()))}function Vr(e,t,n){var i,r,s=e._map,o=e._list,a=s.get(t),h=void 0!==a;if(n===wt){if(!h)return e;o.size>=Ct&&o.size>=2*s.size?(i=(r=o.filter((function(e,t){return void 0!==e&&a!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(i.__ownerID=r.__ownerID=e.__ownerID)):(i=s.remove(t),r=a===o.size-1?o.pop():o.set(a,void 0))}else if(h){if(n===o.get(a)[1])return e;i=s,r=o.set(a,[t,n])}else i=s.set(t,o.size),r=o.set(o.size,[t,n]);return e.__ownerID?(e.size=i.size,e._map=i,e._list=r,e.__hash=void 0,e):Lr(i,r)}Mr.isOrderedMap=Rn,Mr.prototype[en]=!0,Mr.prototype.delete=Mr.prototype.remove;var Br="@@__IMMUTABLE_STACK__@@";function zr(e){return Boolean(e&&e[Br])}var Wr=function(e){function t(e){return null==e?Gr():zr(e)?e:Gr().pushAll(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("Stack [","]")},t.prototype.get=function(e,t){var n=this._head;for(e=$t(this,e);n&&e--;)n=n.next;return n?n.value:t},t.prototype.peek=function(){return this._head&&this._head.value},t.prototype.push=function(){var e=arguments;if(0===arguments.length)return this;for(var t=this.size+arguments.length,n=this._head,i=arguments.length-1;i>=0;i--)n={value:e[i],next:n};return this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Ur(t,n)},t.prototype.pushAll=function(t){if(0===(t=e(t)).size)return this;if(0===this.size&&zr(t))return t;Ei(t.size);var n=this.size,i=this._head;return t.__iterate((function(e){n++,i={value:e,next:i}}),!0),this.__ownerID?(this.size=n,this._head=i,this.__hash=void 0,this.__altered=!0,this):Ur(n,i)},t.prototype.pop=function(){return this.slice(1)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Gr()},t.prototype.slice=function(t,n){if(Tt(t,n,this.size))return this;var i=Ot(t,this.size);if(Mt(n,this.size)!==this.size)return e.prototype.slice.call(this,t,n);for(var r=this.size-i,s=this._head;i--;)s=s.next;return this.__ownerID?(this.size=r,this._head=s,this.__hash=void 0,this.__altered=!0,this):Ur(r,s)},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ur(this.size,this._head,e,this.__hash):0===this.size?Gr():(this.__ownerID=e,this.__altered=!1,this)},t.prototype.__iterate=function(e,t){var n=this;if(t)return new bn(this.toArray()).__iterate((function(t,i){return e(t,i,n)}),t);for(var i=0,r=this._head;r&&!1!==e(r.value,i++,this);)r=r.next;return i},t.prototype.__iterator=function(e,t){if(t)return new bn(this.toArray()).__iterator(e,t);var n=0,i=this._head;return new un((function(){if(i){var t=i.value;return i=i.next,cn(e,n++,t)}return{value:void 0,done:!0}}))},t}(qt);Wr.isStack=zr;var jr,Fr=Wr.prototype;function Ur(e,t,n,i){var r=Object.create(Fr);return r.size=e,r._head=t,r.__ownerID=n,r.__hash=i,r.__altered=!1,r}function Gr(){return jr||(jr=Ur(0))}Fr[Br]=!0,Fr.shift=Fr.pop,Fr.unshift=Fr.push,Fr.unshiftAll=Fr.pushAll,Fr.withMutations=qi,Fr.wasAltered=Xi,Fr.asImmutable=Yi,Fr["@@transducer/init"]=Fr.asMutable=Ki,Fr["@@transducer/step"]=function(e,t){return e.unshift(t)},Fr["@@transducer/result"]=function(e){return e.asImmutable()};var Hr="@@__IMMUTABLE_SET__@@";function qr(e){return Boolean(e&&e[Hr])}function Kr(e){return qr(e)&&tn(e)}function Yr(e,t){if(e===t)return!0;if(!Bt(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||Wt(e)!==Wt(t)||Ft(e)!==Ft(t)||tn(e)!==tn(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!Ut(e);if(tn(e)){var i=e.entries();return t.every((function(e,t){var r=i.next().value;return r&&On(r[1],e)&&(n||On(r[0],t))}))&&i.next().done}var r=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{r=!0;var s=e;e=t,t=s}var o=!0,a=t.__iterate((function(t,i){if(n?!e.has(t):r?!On(t,e.get(i,wt)):!On(e.get(i,wt),t))return o=!1,!1}));return o&&e.size===a}function Xr(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function Qr(e){if(!e||"object"!=typeof e)return e;if(!Bt(e)){if(!Si(e))return e;e=vn(e)}if(Wt(e)){var t={};return e.__iterate((function(e,n){t[n]=Qr(e)})),t}var n=[];return e.__iterate((function(e){n.push(Qr(e))})),n}var Jr=function(e){function t(t){return null==t?is():qr(t)&&!tn(t)?t:is().withMutations((function(n){var i=e(t);Ei(i.size),i.forEach((function(e){return n.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(Ht(e).keySeq())},t.intersect=function(e){return(e=Gt(e).toArray()).length?es.intersect.apply(t(e.pop()),e):is()},t.union=function(e){return(e=Gt(e).toArray()).length?es.union.apply(t(e.pop()),e):is()},t.prototype.toString=function(){return this.__toString("Set {","}")},t.prototype.has=function(e){return this._map.has(e)},t.prototype.add=function(e){return ts(this,this._map.set(e,e))},t.prototype.remove=function(e){return ts(this,this._map.remove(e))},t.prototype.clear=function(){return ts(this,this._map.clear())},t.prototype.map=function(e,t){var n=this,i=[],r=[];return this.forEach((function(s){var o=e.call(t,s,s,n);o!==s&&(i.push(s),r.push(o))})),this.withMutations((function(e){i.forEach((function(t){return e.remove(t)})),r.forEach((function(t){return e.add(t)}))}))},t.prototype.union=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return 0===(t=t.filter((function(e){return 0!==e.size}))).length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(n){for(var i=0;i<t.length;i++)e(t[i]).forEach((function(e){return n.add(e)}))})):this.constructor(t[0])},t.prototype.intersect=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];if(0===t.length)return this;t=t.map((function(t){return e(t)}));var i=[];return this.forEach((function(e){t.every((function(t){return t.includes(e)}))||i.push(e)})),this.withMutations((function(e){i.forEach((function(t){e.remove(t)}))}))},t.prototype.subtract=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];if(0===t.length)return this;t=t.map((function(t){return e(t)}));var i=[];return this.forEach((function(e){t.some((function(t){return t.includes(e)}))&&i.push(e)})),this.withMutations((function(e){i.forEach((function(t){e.remove(t)}))}))},t.prototype.sort=function(e){return _s(hi(this,e))},t.prototype.sortBy=function(e,t){return _s(hi(this,t,e))},t.prototype.wasAltered=function(){return this._map.wasAltered()},t.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate((function(t){return e(t,t,n)}),t)},t.prototype.__iterator=function(e,t){return this._map.__iterator(e,t)},t.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):0===this.size?this.__empty():(this.__ownerID=e,this._map=t,this)},t}(Kt);Jr.isSet=qr;var Zr,es=Jr.prototype;function ts(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function ns(e,t){var n=Object.create(es);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function is(){return Zr||(Zr=ns(ur()))}es[Hr]=!0,es.delete=es.remove,es.merge=es.concat=es.union,es.withMutations=qi,es.asImmutable=Yi,es["@@transducer/init"]=es.asMutable=Ki,es["@@transducer/step"]=function(e,t){return e.add(t)},es["@@transducer/result"]=function(e){return e.asImmutable()},es.__empty=is,es.__make=ns;var rs,ss=function(e){function t(e,n,i){if(!(this instanceof t))return new t(e,n,i);if(xi(0!==i,"Cannot step a Range by 0"),e=e||0,void 0===n&&(n=1/0),i=void 0===i?1:Math.abs(i),n<e&&(i=-i),this._start=e,this._end=n,this._step=i,this.size=Math.max(0,Math.ceil((n-e)/i-1)+1),0===this.size){if(rs)return rs;rs=this}}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},t.prototype.get=function(e,t){return this.has(e)?this._start+$t(this,e)*this._step:t},t.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},t.prototype.slice=function(e,n){return Tt(e,n,this.size)?this:(e=Ot(e,this.size),(n=Mt(n,this.size))<=e?new t(0,0):new t(this.get(e,this._end),this.get(n,this._end),this._step))},t.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},t.prototype.lastIndexOf=function(e){return this.indexOf(e)},t.prototype.__iterate=function(e,t){for(var n=this.size,i=this._step,r=t?this._start+(n-1)*i:this._start,s=0;s!==n&&!1!==e(r,t?n-++s:s++,this);)r+=t?-i:i;return s},t.prototype.__iterator=function(e,t){var n=this.size,i=this._step,r=t?this._start+(n-1)*i:this._start,s=0;return new un((function(){if(s===n)return{value:void 0,done:!0};var o=r;return r+=t?-i:i,cn(e,t?n-++s:s++,o)}))},t.prototype.equals=function(e){return e instanceof t?this._start===e._start&&this._end===e._end&&this._step===e._step:Yr(this,e)},t}(En);function os(e,t,n){for(var i=_i(t),r=0;r!==i.length;)if((e=Ii(e,i[r++],wt))===wt)return n;return e}function as(e,t){return os(this,e,t)}function hs(e,t){return os(e,t,wt)!==wt}function us(){Ei(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e}Gt.isIterable=Bt,Gt.isKeyed=Wt,Gt.isIndexed=Ft,Gt.isAssociative=Ut,Gt.isOrdered=tn,Gt.Iterator=un,Xr(Gt,{toArray:function(){Ei(this.size);var e=new Array(this.size||0),t=Wt(this),n=0;return this.__iterate((function(i,r){e[n++]=t?[r,i]:i})),e},toIndexedSeq:function(){return new Qn(this)},toJS:function(){return Qr(this)},toKeyedSeq:function(){return new Xn(this,!0)},toMap:function(){return Qi(this.toKeyedSeq())},toObject:us,toOrderedMap:function(){return Mr(this.toKeyedSeq())},toOrderedSet:function(){return _s(Wt(this)?this.valueSeq():this)},toSet:function(){return Jr(Wt(this)?this.valueSeq():this)},toSetSeq:function(){return new Jn(this)},toSeq:function(){return Ft(this)?this.toIndexedSeq():Wt(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Wr(Wt(this)?this.valueSeq():this)},toList:function(){return _r(Wt(this)?this.valueSeq():this)},toString:function(){return"[Collection]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return pi(this,oi(this,e))},includes:function(e){return this.some((function(t){return On(t,e)}))},entries:function(){return this.__iterator(sn)},every:function(e,t){Ei(this.size);var n=!0;return this.__iterate((function(i,r,s){if(!e.call(t,i,r,s))return n=!1,!1})),n},filter:function(e,t){return pi(this,ii(this,e,t,!0))},find:function(e,t,n){var i=this.findEntry(e,t);return i?i[1]:n},forEach:function(e,t){return Ei(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ei(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(i){n?n=!1:t+=e,t+=null!=i?i.toString():""})),t},keys:function(){return this.__iterator(nn)},map:function(e,t){return pi(this,ti(this,e,t))},reduce:function(e,t,n){return ds(this,e,t,n,arguments.length<2,!1)},reduceRight:function(e,t,n){return ds(this,e,t,n,arguments.length<2,!0)},reverse:function(){return pi(this,ni(this,!0))},slice:function(e,t){return pi(this,ri(this,e,t,!0))},some:function(e,t){return!this.every(gs(e),t)},sort:function(e){return pi(this,hi(this,e))},values:function(){return this.__iterator(rn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return Nt(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var i=Qi().asMutable();return e.__iterate((function(r,s){i.update(t.call(n,r,s,e),0,(function(e){return e+1}))})),i.asImmutable()}(this,e,t)},equals:function(e){return Yr(this,e)},entrySeq:function(){var e=this;if(e._cache)return new bn(e._cache);var t=e.toSeq().map(ms).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(gs(e),t)},findEntry:function(e,t,n){var i=n;return this.__iterate((function(n,r,s){if(e.call(t,n,r,s))return i=[r,n],!1})),i},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(e){return this.find(Rt,null,e)},flatMap:function(e,t){return pi(this,function(e,t,n){var i=fi(e);return e.toSeq().map((function(r,s){return i(t.call(n,r,s,e))})).flatten(!0)}(this,e,t))},flatten:function(e){return pi(this,ai(this,e,!0))},fromEntrySeq:function(){return new Zn(this)},get:function(e,t){return this.find((function(t,n){return On(n,e)}),void 0,t)},getIn:as,groupBy:function(e,t){return function(e,t,n){var i=Wt(e),r=(tn(e)?Mr():Qi()).asMutable();e.__iterate((function(s,o){r.update(t.call(n,s,o,e),(function(e){return(e=e||[]).push(i?[o,s]:s),e}))}));var s=fi(e);return r.map((function(t){return pi(e,s(t))})).asImmutable()}(this,e,t)},has:function(e){return this.get(e,wt)!==wt},hasIn:function(e){return hs(this,e)},isSubset:function(e){return e="function"==typeof e.includes?e:Gt(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:Gt(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return On(t,e)}))},keySeq:function(){return this.toSeq().map(fs).toIndexedSeq()},last:function(e){return this.toSeq().reverse().first(e)},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return ui(this,e)},maxBy:function(e,t){return ui(this,t,e)},min:function(e){return ui(this,e?ys(e):xs)},minBy:function(e,t){return ui(this,t?ys(t):xs,e)},rest:function(){return this.slice(1)},skip:function(e){return 0===e?this:this.slice(Math.max(0,e))},skipLast:function(e){return 0===e?this:this.slice(0,-Math.max(0,e))},skipWhile:function(e,t){return pi(this,si(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(gs(e),t)},sortBy:function(e,t){return pi(this,hi(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return this.slice(-Math.max(0,e))},takeWhile:function(e,t){return pi(this,function(e,t,n){var i=mi(e);return i.__iterateUncached=function(i,r){var s=this;if(r)return this.cacheResult().__iterate(i,r);var o=0;return e.__iterate((function(e,r,a){return t.call(n,e,r,a)&&++o&&i(e,r,s)})),o},i.__iteratorUncached=function(i,r){var s=this;if(r)return this.cacheResult().__iterator(i,r);var o=e.__iterator(sn,r),a=!0;return new un((function(){if(!a)return{value:void 0,done:!0};var e=o.next();if(e.done)return e;var r=e.value,h=r[0],u=r[1];return t.call(n,u,h,s)?i===sn?e:cn(i,h,u,e):(a=!1,{value:void 0,done:!0})}))},i}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(gs(e),t)},update:function(e){return e(this)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=tn(e),n=Wt(e),i=t?1:0;return function(e,t){return t=Mn(t,3432918353),t=Mn(t<<15|t>>>-15,461845907),t=Mn(t<<13|t>>>-13,5),t=Mn((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Ln((t=Mn(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){i=31*i+Es(Vn(e),Vn(t))|0}:function(e,t){i=i+Es(Vn(e),Vn(t))|0}:t?function(e){i=31*i+Vn(e)|0}:function(e){i=i+Vn(e)|0}),i)}(this))}});var cs=Gt.prototype;cs[Vt]=!0,cs[hn]=cs.values,cs.toJSON=cs.toArray,cs.__toStringMapper=Ai,cs.inspect=cs.toSource=function(){return this.toString()},cs.chain=cs.flatMap,cs.contains=cs.includes,Xr(Ht,{flip:function(){return pi(this,ei(this))},mapEntries:function(e,t){var n=this,i=0;return pi(this,this.toSeq().map((function(r,s){return e.call(t,[s,r],i++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return pi(this,this.toSeq().flip().map((function(i,r){return e.call(t,i,r,n)})).flip())}});var ls=Ht.prototype;ls[zt]=!0,ls[hn]=cs.entries,ls.toJSON=us,ls.__toStringMapper=function(e,t){return Ai(t)+": "+Ai(e)},Xr(qt,{toKeyedSeq:function(){return new Xn(this,!1)},filter:function(e,t){return pi(this,ii(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return pi(this,ni(this,!1))},slice:function(e,t){return pi(this,ri(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(t||0,0),0===n||2===n&&!t)return this;e=Ot(e,e<0?this.count():this.size);var i=this.slice(0,e);return pi(this,1===n?i:i.concat(vi(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(e){return this.get(0,e)},flatten:function(e){return pi(this,ai(this,e,!1))},get:function(e,t){return(e=$t(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=$t(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return pi(this,function(e,t){var n=mi(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,i){var r=this,s=0;return e.__iterate((function(e){return(!s||!1!==n(t,s++,r))&&!1!==n(e,s++,r)}),i),s},n.__iteratorUncached=function(n,i){var r,s=e.__iterator(rn,i),o=0;return new un((function(){return(!r||o%2)&&(r=s.next()).done?r:o%2?cn(n,o++,t):cn(n,o++,r.value,r)}))},n}(this,e))},interleave:function(){var e=[this].concat(vi(arguments)),t=li(this.toSeq(),En.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),pi(this,n)},keySeq:function(){return ss(0,this.size)},last:function(e){return this.get(-1,e)},skipWhile:function(e,t){return pi(this,si(this,e,t,!1))},zip:function(){var e=[this].concat(vi(arguments));return pi(this,li(this,vs,e))},zipAll:function(){var e=[this].concat(vi(arguments));return pi(this,li(this,vs,e,!0))},zipWith:function(e){var t=vi(arguments);return t[0]=this,pi(this,li(this,e,t))}});var ps=qt.prototype;function ds(e,t,n,i,r,s){return Ei(e.size),e.__iterate((function(e,s,o){r?(r=!1,n=e):n=t.call(i,n,e,s,o)}),s),n}function fs(e,t){return t}function ms(e,t){return[t,e]}function gs(e){return function(){return!e.apply(this,arguments)}}function ys(e){return function(){return-e.apply(this,arguments)}}function vs(){return vi(arguments)}function xs(e,t){return e<t?1:e>t?-1:0}function Es(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}ps[jt]=!0,ps[en]=!0,Xr(Kt,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),Kt.prototype.has=cs.includes,Kt.prototype.contains=Kt.prototype.includes,Xr(xn,Ht.prototype),Xr(En,qt.prototype),Xr(_n,Kt.prototype);var _s=function(e){function t(e){return null==e?Cs():Kr(e)?e:Cs().withMutations((function(t){var n=Kt(e);Ei(n.size),n.forEach((function(e){return t.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(Ht(e).keySeq())},t.prototype.toString=function(){return this.__toString("OrderedSet {","}")},t}(Jr);_s.isOrderedSet=Kr;var bs,Ss=_s.prototype;function As(e,t){var n=Object.create(Ss);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Cs(){return bs||(bs=As(Dr()))}Ss[en]=!0,Ss.zip=ps.zip,Ss.zipWith=ps.zipWith,Ss.__empty=Cs,Ss.__make=As;var Is=function(e,t){var n,i=function(s){var o=this;if(s instanceof i)return s;if(!(this instanceof i))return new i(s);if(!n){n=!0;var a=Object.keys(e),h=r._indices={};r._name=t,r._keys=a,r._defaultValues=e;for(var u=0;u<a.length;u++){var c=a[u];h[c]=u,r[c]?"object"==typeof console&&console.warn&&console.warn("Cannot define "+Ns(this)+' with property "'+c+'" since that property name is part of the Record API.'):Rs(r,c)}}this.__ownerID=void 0,this._values=_r().withMutations((function(e){e.setSize(o._keys.length),Ht(s).forEach((function(t,n){e.set(o._indices[n],t===o._defaultValues[n]?void 0:t)}))}))},r=i.prototype=Object.create(Ps);return r.constructor=i,t&&(i.displayName=t),i};Is.prototype.toString=function(){for(var e,t=Ns(this)+" { ",n=this._keys,i=0,r=n.length;i!==r;i++)t+=(i?", ":"")+(e=n[i])+": "+Ai(this.get(e));return t+" }"},Is.prototype.equals=function(e){return this===e||e&&this._keys===e._keys&&$s(this).equals($s(e))},Is.prototype.hashCode=function(){return $s(this).hashCode()},Is.prototype.has=function(e){return this._indices.hasOwnProperty(e)},Is.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._indices[e],i=this._values.get(n);return void 0===i?this._defaultValues[e]:i},Is.prototype.set=function(e,t){if(this.has(e)){var n=this._values.set(this._indices[e],t===this._defaultValues[e]?void 0:t);if(n!==this._values&&!this.__ownerID)return ks(this,n)}return this},Is.prototype.remove=function(e){return this.set(e)},Is.prototype.clear=function(){var e=this._values.clear().setSize(this._keys.length);return this.__ownerID?this:ks(this,e)},Is.prototype.wasAltered=function(){return this._values.wasAltered()},Is.prototype.toSeq=function(){return $s(this)},Is.prototype.toJS=function(){return Qr(this)},Is.prototype.entries=function(){return this.__iterator(sn)},Is.prototype.__iterator=function(e,t){return $s(this).__iterator(e,t)},Is.prototype.__iterate=function(e,t){return $s(this).__iterate(e,t)},Is.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._values.__ensureOwner(e);return e?ks(this,t,e):(this.__ownerID=e,this._values=t,this)},Is.isRecord=Jt,Is.getDescriptiveName=Ns;var ws,Ps=Is.prototype;function ks(e,t,n){var i=Object.create(Object.getPrototypeOf(e));return i._values=t,i.__ownerID=n,i}function Ns(e){return e.constructor.displayName||e.constructor.name||"Record"}function $s(e){return wn(e._keys.map((function(t){return[t,e.get(t)]})))}function Rs(e,t){try{Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){xi(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})}catch(e){}}function Ts(e,t){return Wt(t)?t.toMap():t.toList()}Ps[Qt]=!0,Ps.delete=Ps.remove,Ps.deleteIn=Ps.removeIn=Oi,Ps.getIn=as,Ps.hasIn=cs.hasIn,Ps.merge=Vi,Ps.mergeWith=Bi,Ps.mergeIn=Gi,Ps.mergeDeep=Fi,Ps.mergeDeepWith=Ui,Ps.mergeDeepIn=Hi,Ps.setIn=Ri,Ps.update=Li,Ps.updateIn=Di,Ps.withMutations=qi,Ps.asMutable=Ki,Ps.asImmutable=Yi,Ps[hn]=Ps.entries,Ps.toJSON=Ps.toObject=cs.toObject,Ps.inspect=Ps.toSource=function(){return this.toString()};var Os,Ms={version:"4.0.0-rc.11",Collection:Gt,Iterable:Gt,Seq:vn,Map:Qi,OrderedMap:Mr,List:_r,Stack:Wr,Set:Jr,OrderedSet:_s,Record:Is,Range:ss,Repeat:function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);if(this._value=e,this.size=void 0===n?1/0:Math.max(0,n),0===this.size){if(ws)return ws;ws=this}}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},t.prototype.get=function(e,t){return this.has(e)?this._value:t},t.prototype.includes=function(e){return On(this._value,e)},t.prototype.slice=function(e,n){var i=this.size;return Tt(e,n,i)?this:new t(this._value,Mt(n,i)-Ot(e,i))},t.prototype.reverse=function(){return this},t.prototype.indexOf=function(e){return On(this._value,e)?0:-1},t.prototype.lastIndexOf=function(e){return On(this._value,e)?this.size:-1},t.prototype.__iterate=function(e,t){for(var n=this.size,i=0;i!==n&&!1!==e(this._value,t?n-++i:i++,this););return i},t.prototype.__iterator=function(e,t){var n=this,i=this.size,r=0;return new un((function(){return r===i?{value:void 0,done:!0}:cn(e,t?i-++r:r++,n._value)}))},t.prototype.equals=function(e){return e instanceof t?On(this._value,e._value):Yr(e)},t}(En),is:On,fromJS:function(e,t){return function e(t,n,i,r,s,o){var a=Array.isArray(i)?En:bi(i)?xn:null;if(a){if(~t.indexOf(i))throw new TypeError("Cannot convert circular structure to Immutable");t.push(i),s&&""!==r&&s.push(r);var h=n.call(o,r,a(i).map((function(r,o){return e(t,n,r,o,s,i)})),s&&s.slice());return t.pop(),s&&s.pop(),h}return i}([],t||Ts,e,"",t&&t.length>2?[]:void 0,{"":e})},hash:Vn,isImmutable:Zt,isCollection:Bt,isKeyed:Wt,isIndexed:Ft,isAssociative:Ut,isOrdered:tn,isValueObject:Tn,isSeq:Xt,isList:Er,isMap:$n,isOrderedMap:Rn,isStack:zr,isSet:qr,isOrderedSet:Kr,isRecord:Jt,get:Ii,getIn:os,has:Ci,hasIn:hs,merge:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return ji(e,t)},mergeDeep:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Wi(e,t)},mergeWith:function(e,t){for(var n=[],i=arguments.length-2;i-- >0;)n[i]=arguments[i+2];return ji(t,n,e)},mergeDeepWith:function(e,t){for(var n=[],i=arguments.length-2;i-- >0;)n[i]=arguments[i+2];return Wi(t,n,e)},remove:Pi,removeIn:Ti,set:ki,setIn:$i,update:Mi,updateIn:Ni};!function(e){e[e.IGNORED_LABELS=0]="IGNORED_LABELS",e[e.ACCESSED_NODES=1]="ACCESSED_NODES",e[e.ASSIGNED_NODES=2]="ASSIGNED_NODES",e[e.IGNORE_BREAK_STATEMENTS=3]="IGNORE_BREAK_STATEMENTS",e[e.IGNORE_RETURN_AWAIT_YIELD=4]="IGNORE_RETURN_AWAIT_YIELD",e[e.NODES_CALLED_AT_PATH_WITH_OPTIONS=5]="NODES_CALLED_AT_PATH_WITH_OPTIONS",e[e.REPLACED_VARIABLE_INITS=6]="REPLACED_VARIABLE_INITS",e[e.RETURN_EXPRESSIONS_ACCESSED_AT_PATH=7]="RETURN_EXPRESSIONS_ACCESSED_AT_PATH",e[e.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH=8]="RETURN_EXPRESSIONS_ASSIGNED_AT_PATH",e[e.RETURN_EXPRESSIONS_CALLED_AT_PATH=9]="RETURN_EXPRESSIONS_CALLED_AT_PATH"}(Os||(Os={}));const Ls={};class Ds{constructor(e){this.optionValues=e}static create(){return new this(Ms.Map())}addAccessedNodeAtPath(e,t){return this.setIn([Os.ACCESSED_NODES,t,...e,Ls],!0)}addAccessedReturnExpressionAtPath(e,t){return this.setIn([Os.RETURN_EXPRESSIONS_ACCESSED_AT_PATH,t,...e,Ls],!0)}addAssignedNodeAtPath(e,t){return this.setIn([Os.ASSIGNED_NODES,t,...e,Ls],!0)}addAssignedReturnExpressionAtPath(e,t){return this.setIn([Os.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH,t,...e,Ls],!0)}addCalledNodeAtPathWithOptions(e,t,n){return this.setIn([Os.NODES_CALLED_AT_PATH_WITH_OPTIONS,t,...e,Ls,n],!0)}addCalledReturnExpressionAtPath(e,t){return this.setIn([Os.RETURN_EXPRESSIONS_CALLED_AT_PATH,t,...e,Ls],!0)}getHasEffectsWhenCalledOptions(){return this.setIgnoreReturnAwaitYield().setIgnoreBreakStatements(!1).setIgnoreNoLabels()}getReplacedVariableInit(e){return this.optionValues.getIn([Os.REPLACED_VARIABLE_INITS,e])}hasNodeBeenAccessedAtPath(e,t){return this.optionValues.getIn([Os.ACCESSED_NODES,t,...e,Ls])}hasNodeBeenAssignedAtPath(e,t){return this.optionValues.getIn([Os.ASSIGNED_NODES,t,...e,Ls])}hasNodeBeenCalledAtPathWithOptions(e,t,n){const i=this.optionValues.getIn([Os.NODES_CALLED_AT_PATH_WITH_OPTIONS,t,...e,Ls]);return i&&i.find((e,t)=>t.equals(n))}hasReturnExpressionBeenAccessedAtPath(e,t){return this.optionValues.getIn([Os.RETURN_EXPRESSIONS_ACCESSED_AT_PATH,t,...e,Ls])}hasReturnExpressionBeenAssignedAtPath(e,t){return this.optionValues.getIn([Os.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH,t,...e,Ls])}hasReturnExpressionBeenCalledAtPath(e,t){return this.optionValues.getIn([Os.RETURN_EXPRESSIONS_CALLED_AT_PATH,t,...e,Ls])}ignoreBreakStatements(){return this.get(Os.IGNORE_BREAK_STATEMENTS)}ignoreLabel(e){return this.optionValues.getIn([Os.IGNORED_LABELS,e])}ignoreReturnAwaitYield(){return this.get(Os.IGNORE_RETURN_AWAIT_YIELD)}replaceVariableInit(e,t){return this.setIn([Os.REPLACED_VARIABLE_INITS,e],t)}setIgnoreBreakStatements(e=!0){return this.set(Os.IGNORE_BREAK_STATEMENTS,e)}setIgnoreLabel(e){return this.setIn([Os.IGNORED_LABELS,e],!0)}setIgnoreNoLabels(){return this.remove(Os.IGNORED_LABELS)}setIgnoreReturnAwaitYield(e=!0){return this.set(Os.IGNORE_RETURN_AWAIT_YIELD,e)}get(e){return this.optionValues.get(e)}remove(e){return new Ds(this.optionValues.remove(e))}set(e,t){return new Ds(this.optionValues.set(e,t))}setIn(e,t){return new Ds(this.optionValues.setIn(e,t))}}const Vs={Literal:[],Program:["body"]};const Bs="variables",zs=Ds.create();class Ws{constructor(e,t,n){this.included=!1,this.keys=Vs[e.type]||function(e){return Vs[e.type]=Object.keys(e).filter(t=>"object"==typeof e[t]),Vs[e.type]}(e),this.parent=t,this.context=t.context,this.createScope(n),this.parseNode(e),this.initialise(),this.context.magicString.addSourcemapLocation(this.start),this.context.magicString.addSourcemapLocation(this.end)}bind(){for(const e of this.keys){const t=this[e];if(null!==t&&"annotations"!==e)if(Array.isArray(t))for(const e of t)null!==e&&e.bind();else t.bind()}}createScope(e){this.scope=e}declare(e,t){return[]}deoptimizePath(e){}getLiteralValueAtPath(e,t,n){return Ie}getReturnExpressionWhenCalledAtPath(e,t,n){return we}hasEffects(e){for(const t of this.keys){const n=this[t];if(null!==n&&"annotations"!==t)if(Array.isArray(n)){for(const t of n)if(null!==t&&t.hasEffects(e))return!0}else if(n.hasEffects(e))return!0}return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>0}hasEffectsWhenAssignedAtPath(e,t){return!0}hasEffectsWhenCalledAtPath(e,t,n){return!0}include(e){this.included=!0;for(const t of this.keys){const n=this[t];if(null!==n&&"annotations"!==t)if(Array.isArray(n))for(const t of n)null!==t&&t.include(e);else n.include(e)}}includeCallArguments(e){for(const t of e)t.include(!1)}includeWithAllDeclaredVariables(e){this.include(e)}initialise(){}insertSemicolon(e){";"!==e.original[this.end-1]&&e.appendLeft(this.end,";")}locate(){const e=St(this.context.code,this.start,{offsetLine:1});return e.file=this.context.fileName,e.toString=()=>JSON.stringify(e),e}parseNode(e){for(const t of Object.keys(e)){if(this.hasOwnProperty(t))continue;const n=e[t];if("object"!=typeof n||null===n||"annotations"===t)this[t]=n;else if(Array.isArray(n)){this[t]=[];for(const e of n)this[t].push(null===e?null:new(this.context.nodeConstructors[e.type]||this.context.nodeConstructors.UnknownNode)(e,this,this.scope))}else this[t]=new(this.context.nodeConstructors[n.type]||this.context.nodeConstructors.UnknownNode)(n,this,this.scope)}}render(e,t){for(const n of this.keys){const i=this[n];if(null!==i&&"annotations"!==n)if(Array.isArray(i))for(const n of i)null!==n&&n.render(e,t);else i.render(e,t)}}shouldBeIncluded(){return this.included||this.hasEffects(zs)}toString(){return this.context.code.slice(this.start,this.end)}}class js extends Ws{createScope(e){this.scope=new bt(e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}hasEffectsWhenAssignedAtPath(e,t){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return this.body.hasEffectsWhenCalledAtPath(e,t,n)||null!==this.superClass&&this.superClass.hasEffectsWhenCalledAtPath(e,t,n)}initialise(){null!==this.id&&this.id.declare("class",this)}}class Fs extends js{initialise(){super.initialise(),null!==this.id&&(this.id.variable.isId=!0)}parseNode(e){null!==e.id&&(this.id=new this.context.nodeConstructors.Identifier(e.id,this,this.scope.parent)),super.parseNode(e)}render(e,t){"system"===t.format&&this.id&&this.id.variable.exportName&&e.appendLeft(this.end,` exports('${this.id.variable.exportName}', ${this.id.variable.getName()});`),super.render(e,t)}}class Us extends Et{constructor(e){super("arguments",null,we,e)}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(){return!0}hasEffectsWhenCalledAtPath(){return!0}}class Gs extends Et{constructor(e){super("this",null,null,e)}_getInit(e){return e.getReplacedVariableInit(this)||we}getLiteralValueAtPath(){return Ie}hasEffectsWhenAccessedAtPath(e,t){return this._getInit(t).hasEffectsWhenAccessedAtPath(e,t)||super.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return this._getInit(t).hasEffectsWhenAssignedAtPath(e,t)||super.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return this._getInit(n).hasEffectsWhenCalledAtPath(e,t,n)||super.hasEffectsWhenCalledAtPath(e,t,n)}}class Hs extends bt{constructor(e,t){super(e),this.parameters=[],this.hasRest=!1,this.context=t,this.hoistedBodyVarScope=new bt(this)}addParameterDeclaration(e){const t=e.name;let n=this.hoistedBodyVarScope.variables.get(t);return n?n.addDeclaration(e,null):n=new Et(t,e,we,this.context),this.variables.set(t,n),n}addParameterVariables(e,t){this.parameters=e;for(const t of e)for(const e of t)e.alwaysRendered=!0;this.hasRest=t}includeCallArguments(e){let t=!1,n=!1;const i=this.hasRest&&this.parameters[this.parameters.length-1];for(let r=e.length-1;r>=0;r--){const s=this.parameters[r]||i,o=e[r];if(s){t=!1;for(const e of s)e.included&&(n=!0),e.calledFromTryStatement&&(t=!0)}!n&&o.shouldBeIncluded()&&(n=!0),n&&o.include(t)}}}class qs extends Hs{constructor(){super(...arguments),this.returnExpression=null,this.returnExpressions=[]}addReturnExpression(e){this.returnExpressions.push(e)}getReturnExpression(){return null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression}updateReturnExpression(){if(1===this.returnExpressions.length)this.returnExpression=this.returnExpressions[0];else{this.returnExpression=we;for(const e of this.returnExpressions)e.deoptimizePath(Ae)}}}class Ks extends qs{constructor(e,t){super(e,t),this.variables.set("arguments",this.argumentsVariable=new Us(t)),this.variables.set("this",this.thisVariable=new Gs(t))}findLexicalBoundary(){return this}getOptionsWhenCalledWith({withNew:e},t){return t.replaceVariableInit(this.thisVariable,e?new Ge:we)}includeCallArguments(e){if(super.includeCallArguments(e),this.argumentsVariable.included)for(const t of e)t.included||t.include(!1)}}const Ys=Symbol("Value Properties"),Xs={pure:!0},Qs={pure:!1},Js={__proto__:null,[Ys]:Qs},Zs={__proto__:null,[Ys]:Xs},eo={__proto__:null,[Ys]:Qs,prototype:Js},to={__proto__:null,[Ys]:Xs,prototype:Js},no={__proto__:null,[Ys]:Xs,from:Zs,of:Zs,prototype:Js},io={__proto__:null,[Ys]:Xs,supportedLocalesOf:to},ro={global:Js,globalThis:Js,self:Js,window:Js,__proto__:null,[Ys]:Qs,Array:{__proto__:null,[Ys]:Qs,from:Zs,isArray:Zs,of:Zs,prototype:Js},ArrayBuffer:{__proto__:null,[Ys]:Xs,isView:Zs,prototype:Js},Atomics:Js,BigInt:eo,BigInt64Array:eo,BigUint64Array:eo,Boolean:to,constructor:eo,DataView:to,Date:{__proto__:null,[Ys]:Xs,now:Zs,parse:Zs,prototype:Js,UTC:Zs},decodeURI:Zs,decodeURIComponent:Zs,encodeURI:Zs,encodeURIComponent:Zs,Error:to,escape:Zs,eval:Js,EvalError:to,Float32Array:no,Float64Array:no,Function:eo,hasOwnProperty:Js,Infinity:Js,Int16Array:no,Int32Array:no,Int8Array:no,isFinite:Zs,isNaN:Zs,isPrototypeOf:Js,JSON:Js,Map:to,Math:{__proto__:null,[Ys]:Qs,abs:Zs,acos:Zs,acosh:Zs,asin:Zs,asinh:Zs,atan:Zs,atan2:Zs,atanh:Zs,cbrt:Zs,ceil:Zs,clz32:Zs,cos:Zs,cosh:Zs,exp:Zs,expm1:Zs,floor:Zs,fround:Zs,hypot:Zs,imul:Zs,log:Zs,log10:Zs,log1p:Zs,log2:Zs,max:Zs,min:Zs,pow:Zs,random:Zs,round:Zs,sign:Zs,sin:Zs,sinh:Zs,sqrt:Zs,tan:Zs,tanh:Zs,trunc:Zs},NaN:Js,Number:{__proto__:null,[Ys]:Xs,isFinite:Zs,isInteger:Zs,isNaN:Zs,isSafeInteger:Zs,parseFloat:Zs,parseInt:Zs,prototype:Js},Object:{__proto__:null,[Ys]:Xs,create:Zs,getNotifier:Zs,getOwn:Zs,getOwnPropertyDescriptor:Zs,getOwnPropertyNames:Zs,getOwnPropertySymbols:Zs,getPrototypeOf:Zs,is:Zs,isExtensible:Zs,isFrozen:Zs,isSealed:Zs,keys:Zs,prototype:Js},parseFloat:Zs,parseInt:Zs,Promise:{__proto__:null,[Ys]:Qs,all:Zs,prototype:Js,race:Zs,resolve:Zs},propertyIsEnumerable:Js,Proxy:Js,RangeError:to,ReferenceError:to,Reflect:Js,RegExp:to,Set:to,SharedArrayBuffer:eo,String:{__proto__:null,[Ys]:Xs,fromCharCode:Zs,fromCodePoint:Zs,prototype:Js,raw:Zs},Symbol:{__proto__:null,[Ys]:Xs,for:Zs,keyFor:Zs,prototype:Js},SyntaxError:to,toLocaleString:Js,toString:Js,TypeError:to,Uint16Array:no,Uint32Array:no,Uint8Array:no,Uint8ClampedArray:no,unescape:Zs,URIError:to,valueOf:Js,WeakMap:to,WeakSet:to,clearInterval:eo,clearTimeout:eo,console:Js,Intl:{__proto__:null,[Ys]:Qs,Collator:io,DateTimeFormat:io,ListFormat:io,NumberFormat:io,PluralRules:io,RelativeTimeFormat:io},setInterval:eo,setTimeout:eo,TextDecoder:eo,TextEncoder:eo,URL:eo,URLSearchParams:eo,AbortController:eo,AbortSignal:eo,addEventListener:Js,alert:Js,AnalyserNode:eo,Animation:eo,AnimationEvent:eo,applicationCache:Js,ApplicationCache:eo,ApplicationCacheErrorEvent:eo,atob:Js,Attr:eo,Audio:eo,AudioBuffer:eo,AudioBufferSourceNode:eo,AudioContext:eo,AudioDestinationNode:eo,AudioListener:eo,AudioNode:eo,AudioParam:eo,AudioProcessingEvent:eo,AudioScheduledSourceNode:eo,AudioWorkletNode:eo,BarProp:eo,BaseAudioContext:eo,BatteryManager:eo,BeforeUnloadEvent:eo,BiquadFilterNode:eo,Blob:eo,BlobEvent:eo,blur:Js,BroadcastChannel:eo,btoa:Js,ByteLengthQueuingStrategy:eo,Cache:eo,caches:Js,CacheStorage:eo,cancelAnimationFrame:Js,cancelIdleCallback:Js,CanvasCaptureMediaStreamTrack:eo,CanvasGradient:eo,CanvasPattern:eo,CanvasRenderingContext2D:eo,ChannelMergerNode:eo,ChannelSplitterNode:eo,CharacterData:eo,clientInformation:Js,ClipboardEvent:eo,close:Js,closed:Js,CloseEvent:eo,Comment:eo,CompositionEvent:eo,confirm:Js,ConstantSourceNode:eo,ConvolverNode:eo,CountQueuingStrategy:eo,createImageBitmap:Js,Credential:eo,CredentialsContainer:eo,crypto:Js,Crypto:eo,CryptoKey:eo,CSS:eo,CSSConditionRule:eo,CSSFontFaceRule:eo,CSSGroupingRule:eo,CSSImportRule:eo,CSSKeyframeRule:eo,CSSKeyframesRule:eo,CSSMediaRule:eo,CSSNamespaceRule:eo,CSSPageRule:eo,CSSRule:eo,CSSRuleList:eo,CSSStyleDeclaration:eo,CSSStyleRule:eo,CSSStyleSheet:eo,CSSSupportsRule:eo,CustomElementRegistry:eo,customElements:Js,CustomEvent:eo,DataTransfer:eo,DataTransferItem:eo,DataTransferItemList:eo,defaultstatus:Js,defaultStatus:Js,DelayNode:eo,DeviceMotionEvent:eo,DeviceOrientationEvent:eo,devicePixelRatio:Js,dispatchEvent:Js,document:Js,Document:eo,DocumentFragment:eo,DocumentType:eo,DOMError:eo,DOMException:eo,DOMImplementation:eo,DOMMatrix:eo,DOMMatrixReadOnly:eo,DOMParser:eo,DOMPoint:eo,DOMPointReadOnly:eo,DOMQuad:eo,DOMRect:eo,DOMRectReadOnly:eo,DOMStringList:eo,DOMStringMap:eo,DOMTokenList:eo,DragEvent:eo,DynamicsCompressorNode:eo,Element:eo,ErrorEvent:eo,Event:eo,EventSource:eo,EventTarget:eo,external:Js,fetch:Js,File:eo,FileList:eo,FileReader:eo,find:Js,focus:Js,FocusEvent:eo,FontFace:eo,FontFaceSetLoadEvent:eo,FormData:eo,frames:Js,GainNode:eo,Gamepad:eo,GamepadButton:eo,GamepadEvent:eo,getComputedStyle:Js,getSelection:Js,HashChangeEvent:eo,Headers:eo,history:Js,History:eo,HTMLAllCollection:eo,HTMLAnchorElement:eo,HTMLAreaElement:eo,HTMLAudioElement:eo,HTMLBaseElement:eo,HTMLBodyElement:eo,HTMLBRElement:eo,HTMLButtonElement:eo,HTMLCanvasElement:eo,HTMLCollection:eo,HTMLContentElement:eo,HTMLDataElement:eo,HTMLDataListElement:eo,HTMLDetailsElement:eo,HTMLDialogElement:eo,HTMLDirectoryElement:eo,HTMLDivElement:eo,HTMLDListElement:eo,HTMLDocument:eo,HTMLElement:eo,HTMLEmbedElement:eo,HTMLFieldSetElement:eo,HTMLFontElement:eo,HTMLFormControlsCollection:eo,HTMLFormElement:eo,HTMLFrameElement:eo,HTMLFrameSetElement:eo,HTMLHeadElement:eo,HTMLHeadingElement:eo,HTMLHRElement:eo,HTMLHtmlElement:eo,HTMLIFrameElement:eo,HTMLImageElement:eo,HTMLInputElement:eo,HTMLLabelElement:eo,HTMLLegendElement:eo,HTMLLIElement:eo,HTMLLinkElement:eo,HTMLMapElement:eo,HTMLMarqueeElement:eo,HTMLMediaElement:eo,HTMLMenuElement:eo,HTMLMetaElement:eo,HTMLMeterElement:eo,HTMLModElement:eo,HTMLObjectElement:eo,HTMLOListElement:eo,HTMLOptGroupElement:eo,HTMLOptionElement:eo,HTMLOptionsCollection:eo,HTMLOutputElement:eo,HTMLParagraphElement:eo,HTMLParamElement:eo,HTMLPictureElement:eo,HTMLPreElement:eo,HTMLProgressElement:eo,HTMLQuoteElement:eo,HTMLScriptElement:eo,HTMLSelectElement:eo,HTMLShadowElement:eo,HTMLSlotElement:eo,HTMLSourceElement:eo,HTMLSpanElement:eo,HTMLStyleElement:eo,HTMLTableCaptionElement:eo,HTMLTableCellElement:eo,HTMLTableColElement:eo,HTMLTableElement:eo,HTMLTableRowElement:eo,HTMLTableSectionElement:eo,HTMLTemplateElement:eo,HTMLTextAreaElement:eo,HTMLTimeElement:eo,HTMLTitleElement:eo,HTMLTrackElement:eo,HTMLUListElement:eo,HTMLUnknownElement:eo,HTMLVideoElement:eo,IDBCursor:eo,IDBCursorWithValue:eo,IDBDatabase:eo,IDBFactory:eo,IDBIndex:eo,IDBKeyRange:eo,IDBObjectStore:eo,IDBOpenDBRequest:eo,IDBRequest:eo,IDBTransaction:eo,IDBVersionChangeEvent:eo,IdleDeadline:eo,IIRFilterNode:eo,Image:eo,ImageBitmap:eo,ImageBitmapRenderingContext:eo,ImageCapture:eo,ImageData:eo,indexedDB:Js,innerHeight:Js,innerWidth:Js,InputEvent:eo,IntersectionObserver:eo,IntersectionObserverEntry:eo,isSecureContext:Js,KeyboardEvent:eo,KeyframeEffect:eo,length:Js,localStorage:Js,location:Js,Location:eo,locationbar:Js,matchMedia:Js,MediaDeviceInfo:eo,MediaDevices:eo,MediaElementAudioSourceNode:eo,MediaEncryptedEvent:eo,MediaError:eo,MediaKeyMessageEvent:eo,MediaKeySession:eo,MediaKeyStatusMap:eo,MediaKeySystemAccess:eo,MediaList:eo,MediaQueryList:eo,MediaQueryListEvent:eo,MediaRecorder:eo,MediaSettingsRange:eo,MediaSource:eo,MediaStream:eo,MediaStreamAudioDestinationNode:eo,MediaStreamAudioSourceNode:eo,MediaStreamEvent:eo,MediaStreamTrack:eo,MediaStreamTrackEvent:eo,menubar:Js,MessageChannel:eo,MessageEvent:eo,MessagePort:eo,MIDIAccess:eo,MIDIConnectionEvent:eo,MIDIInput:eo,MIDIInputMap:eo,MIDIMessageEvent:eo,MIDIOutput:eo,MIDIOutputMap:eo,MIDIPort:eo,MimeType:eo,MimeTypeArray:eo,MouseEvent:eo,moveBy:Js,moveTo:Js,MutationEvent:eo,MutationObserver:eo,MutationRecord:eo,name:Js,NamedNodeMap:eo,NavigationPreloadManager:eo,navigator:Js,Navigator:eo,NetworkInformation:eo,Node:eo,NodeFilter:Js,NodeIterator:eo,NodeList:eo,Notification:eo,OfflineAudioCompletionEvent:eo,OfflineAudioContext:eo,offscreenBuffering:Js,OffscreenCanvas:eo,open:Js,openDatabase:Js,Option:eo,origin:Js,OscillatorNode:eo,outerHeight:Js,outerWidth:Js,PageTransitionEvent:eo,pageXOffset:Js,pageYOffset:Js,PannerNode:eo,parent:Js,Path2D:eo,PaymentAddress:eo,PaymentRequest:eo,PaymentRequestUpdateEvent:eo,PaymentResponse:eo,performance:Js,Performance:eo,PerformanceEntry:eo,PerformanceLongTaskTiming:eo,PerformanceMark:eo,PerformanceMeasure:eo,PerformanceNavigation:eo,PerformanceNavigationTiming:eo,PerformanceObserver:eo,PerformanceObserverEntryList:eo,PerformancePaintTiming:eo,PerformanceResourceTiming:eo,PerformanceTiming:eo,PeriodicWave:eo,Permissions:eo,PermissionStatus:eo,personalbar:Js,PhotoCapabilities:eo,Plugin:eo,PluginArray:eo,PointerEvent:eo,PopStateEvent:eo,postMessage:Js,Presentation:eo,PresentationAvailability:eo,PresentationConnection:eo,PresentationConnectionAvailableEvent:eo,PresentationConnectionCloseEvent:eo,PresentationConnectionList:eo,PresentationReceiver:eo,PresentationRequest:eo,print:Js,ProcessingInstruction:eo,ProgressEvent:eo,PromiseRejectionEvent:eo,prompt:Js,PushManager:eo,PushSubscription:eo,PushSubscriptionOptions:eo,queueMicrotask:Js,RadioNodeList:eo,Range:eo,ReadableStream:eo,RemotePlayback:eo,removeEventListener:Js,Request:eo,requestAnimationFrame:Js,requestIdleCallback:Js,resizeBy:Js,ResizeObserver:eo,ResizeObserverEntry:eo,resizeTo:Js,Response:eo,RTCCertificate:eo,RTCDataChannel:eo,RTCDataChannelEvent:eo,RTCDtlsTransport:eo,RTCIceCandidate:eo,RTCIceTransport:eo,RTCPeerConnection:eo,RTCPeerConnectionIceEvent:eo,RTCRtpReceiver:eo,RTCRtpSender:eo,RTCSctpTransport:eo,RTCSessionDescription:eo,RTCStatsReport:eo,RTCTrackEvent:eo,screen:Js,Screen:eo,screenLeft:Js,ScreenOrientation:eo,screenTop:Js,screenX:Js,screenY:Js,ScriptProcessorNode:eo,scroll:Js,scrollbars:Js,scrollBy:Js,scrollTo:Js,scrollX:Js,scrollY:Js,SecurityPolicyViolationEvent:eo,Selection:eo,ServiceWorker:eo,ServiceWorkerContainer:eo,ServiceWorkerRegistration:eo,sessionStorage:Js,ShadowRoot:eo,SharedWorker:eo,SourceBuffer:eo,SourceBufferList:eo,speechSynthesis:Js,SpeechSynthesisEvent:eo,SpeechSynthesisUtterance:eo,StaticRange:eo,status:Js,statusbar:Js,StereoPannerNode:eo,stop:Js,Storage:eo,StorageEvent:eo,StorageManager:eo,styleMedia:Js,StyleSheet:eo,StyleSheetList:eo,SubtleCrypto:eo,SVGAElement:eo,SVGAngle:eo,SVGAnimatedAngle:eo,SVGAnimatedBoolean:eo,SVGAnimatedEnumeration:eo,SVGAnimatedInteger:eo,SVGAnimatedLength:eo,SVGAnimatedLengthList:eo,SVGAnimatedNumber:eo,SVGAnimatedNumberList:eo,SVGAnimatedPreserveAspectRatio:eo,SVGAnimatedRect:eo,SVGAnimatedString:eo,SVGAnimatedTransformList:eo,SVGAnimateElement:eo,SVGAnimateMotionElement:eo,SVGAnimateTransformElement:eo,SVGAnimationElement:eo,SVGCircleElement:eo,SVGClipPathElement:eo,SVGComponentTransferFunctionElement:eo,SVGDefsElement:eo,SVGDescElement:eo,SVGDiscardElement:eo,SVGElement:eo,SVGEllipseElement:eo,SVGFEBlendElement:eo,SVGFEColorMatrixElement:eo,SVGFEComponentTransferElement:eo,SVGFECompositeElement:eo,SVGFEConvolveMatrixElement:eo,SVGFEDiffuseLightingElement:eo,SVGFEDisplacementMapElement:eo,SVGFEDistantLightElement:eo,SVGFEDropShadowElement:eo,SVGFEFloodElement:eo,SVGFEFuncAElement:eo,SVGFEFuncBElement:eo,SVGFEFuncGElement:eo,SVGFEFuncRElement:eo,SVGFEGaussianBlurElement:eo,SVGFEImageElement:eo,SVGFEMergeElement:eo,SVGFEMergeNodeElement:eo,SVGFEMorphologyElement:eo,SVGFEOffsetElement:eo,SVGFEPointLightElement:eo,SVGFESpecularLightingElement:eo,SVGFESpotLightElement:eo,SVGFETileElement:eo,SVGFETurbulenceElement:eo,SVGFilterElement:eo,SVGForeignObjectElement:eo,SVGGElement:eo,SVGGeometryElement:eo,SVGGradientElement:eo,SVGGraphicsElement:eo,SVGImageElement:eo,SVGLength:eo,SVGLengthList:eo,SVGLinearGradientElement:eo,SVGLineElement:eo,SVGMarkerElement:eo,SVGMaskElement:eo,SVGMatrix:eo,SVGMetadataElement:eo,SVGMPathElement:eo,SVGNumber:eo,SVGNumberList:eo,SVGPathElement:eo,SVGPatternElement:eo,SVGPoint:eo,SVGPointList:eo,SVGPolygonElement:eo,SVGPolylineElement:eo,SVGPreserveAspectRatio:eo,SVGRadialGradientElement:eo,SVGRect:eo,SVGRectElement:eo,SVGScriptElement:eo,SVGSetElement:eo,SVGStopElement:eo,SVGStringList:eo,SVGStyleElement:eo,SVGSVGElement:eo,SVGSwitchElement:eo,SVGSymbolElement:eo,SVGTextContentElement:eo,SVGTextElement:eo,SVGTextPathElement:eo,SVGTextPositioningElement:eo,SVGTitleElement:eo,SVGTransform:eo,SVGTransformList:eo,SVGTSpanElement:eo,SVGUnitTypes:eo,SVGUseElement:eo,SVGViewElement:eo,TaskAttributionTiming:eo,Text:eo,TextEvent:eo,TextMetrics:eo,TextTrack:eo,TextTrackCue:eo,TextTrackCueList:eo,TextTrackList:eo,TimeRanges:eo,toolbar:Js,top:Js,Touch:eo,TouchEvent:eo,TouchList:eo,TrackEvent:eo,TransitionEvent:eo,TreeWalker:eo,UIEvent:eo,ValidityState:eo,visualViewport:Js,VisualViewport:eo,VTTCue:eo,WaveShaperNode:eo,WebAssembly:Js,WebGL2RenderingContext:eo,WebGLActiveInfo:eo,WebGLBuffer:eo,WebGLContextEvent:eo,WebGLFramebuffer:eo,WebGLProgram:eo,WebGLQuery:eo,WebGLRenderbuffer:eo,WebGLRenderingContext:eo,WebGLSampler:eo,WebGLShader:eo,WebGLShaderPrecisionFormat:eo,WebGLSync:eo,WebGLTexture:eo,WebGLTransformFeedback:eo,WebGLUniformLocation:eo,WebGLVertexArrayObject:eo,WebSocket:eo,WheelEvent:eo,Window:eo,Worker:eo,WritableStream:eo,XMLDocument:eo,XMLHttpRequest:eo,XMLHttpRequestEventTarget:eo,XMLHttpRequestUpload:eo,XMLSerializer:eo,XPathEvaluator:eo,XPathExpression:eo,XPathResult:eo,XSLTProcessor:eo};for(const e of["window","global","self","globalThis"])ro[e]=ro;function so(e){let t=ro;for(const n of e){if("string"!=typeof n)return null;if(!(t=t[n]))return null}return t[Ys]}class oo extends Ze{hasEffectsWhenAccessedAtPath(e){return!function(e){return 1===e.length?"undefined"===e[0]||null!==so(e):null!==so(e.slice(0,-1))}([this.name,...e])}hasEffectsWhenCalledAtPath(e){return!function(e){const t=so(e);return null!==t&&t.pure}([this.name,...e])}}class ao extends Ws{constructor(){super(...arguments),this.variable=null,this.bound=!1}addExportedVariables(e){null!==this.variable&&this.variable.exportName&&e.push(this.variable)}bind(){this.bound||(this.bound=!0,null===this.variable&&function e(t,n){if("MemberExpression"===t.type)return!t.computed&&e(t.object,t);if("Identifier"===t.type){if(!n)return!0;switch(n.type){case"MemberExpression":return n.computed||t===n.object;case"MethodDefinition":return n.computed;case"Property":return n.computed||t===n.value;case"ExportSpecifier":case"ImportSpecifier":return t===n.local;case"LabeledStatement":case"BreakStatement":case"ContinueStatement":return!1;default:return!0}}return!1}(this,this.parent)&&(this.variable=this.scope.findVariable(this.name),this.variable.addReference(this)),null!==this.variable&&this.variable instanceof Et&&null!==this.variable.additionalInitializers&&this.variable.consolidateInitializers())}declare(e,t){let n;switch(e){case"var":case"function":n=this.scope.addDeclaration(this,this.context,t,!0);break;case"let":case"const":case"class":n=this.scope.addDeclaration(this,this.context,t,!1);break;case"parameter":n=this.scope.addParameterDeclaration(this);break;default:throw new Error(`Internal Error: Unexpected identifier kind ${e}.`)}return[this.variable=n]}deoptimizePath(e){this.bound||this.bind(),0!==e.length||this.scope.contains(this.name)||this.disallowImportReassignment(),this.variable.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.bound||this.bind(),this.variable.getLiteralValueAtPath(e,t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){return this.bound||this.bind(),this.variable.getReturnExpressionWhenCalledAtPath(e,t,n)}hasEffects(){return this.context.unknownGlobalSideEffects&&this.variable instanceof oo&&this.variable.hasEffectsWhenAccessedAtPath(Se)}hasEffectsWhenAccessedAtPath(e,t){return null!==this.variable&&this.variable.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return!this.variable||this.variable.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return!this.variable||this.variable.hasEffectsWhenCalledAtPath(e,t,n)}include(){this.included||(this.included=!0,null!==this.variable&&this.context.includeVariable(this.variable))}includeCallArguments(e){this.variable.includeCallArguments(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,isShorthandProperty:r}=Y){if(this.variable){const t=this.variable.getName();t!==this.name&&(e.overwrite(this.start,this.end,t,{contentOnly:!0,storeName:!0}),r&&e.prependRight(this.start,`${this.name}: `)),"eval"===t&&n===Q&&i&&e.appendRight(this.start,"0, ")}}disallowImportReassignment(){this.context.error({code:"ILLEGAL_REASSIGNMENT",message:`Illegal reassignment to import '${this.name}'`},this.start)}}class ho extends Ws{constructor(){super(...arguments),this.declarationInit=null}addExportedVariables(e){this.argument.addExportedVariables(e)}bind(){super.bind(),null!==this.declarationInit&&this.declarationInit.deoptimizePath([be,be])}declare(e,t){return this.declarationInit=t,this.argument.declare(e,we)}deoptimizePath(e){0===e.length&&this.argument.deoptimizePath(Se)}hasEffectsWhenAssignedAtPath(e,t){return e.length>0||this.argument.hasEffectsWhenAssignedAtPath(Se,t)}}class uo extends Ws{constructor(){super(...arguments),this.isPrototypeDeoptimized=!1}createScope(e){this.scope=new Ks(e,this.context)}deoptimizePath(e){1===e.length&&("prototype"===e[0]?this.isPrototypeDeoptimized=!0:e[0]===be&&(this.isPrototypeDeoptimized=!0,this.scope.getReturnExpression().deoptimizePath(Ae)))}getReturnExpressionWhenCalledAtPath(e){return 0===e.length?this.scope.getReturnExpression():we}hasEffects(){return null!==this.id&&this.id.hasEffects()}hasEffectsWhenAccessedAtPath(e){return!(e.length<=1)&&(e.length>2||"prototype"!==e[0]||this.isPrototypeDeoptimized)}hasEffectsWhenAssignedAtPath(e){return!(e.length<=1)&&(e.length>2||"prototype"!==e[0]||this.isPrototypeDeoptimized)}hasEffectsWhenCalledAtPath(e,t,n){if(e.length>0)return!0;const i=this.scope.getOptionsWhenCalledWith(t,n);for(const e of this.params)if(e.hasEffects(i))return!0;return this.body.hasEffects(i)}include(e){this.included=!0,this.body.include(e),this.id&&this.id.include();const t=this.scope.argumentsVariable.included;for(const n of this.params)n instanceof ao&&!t||n.include(e)}includeCallArguments(e){this.scope.includeCallArguments(e)}initialise(){null!==this.id&&this.id.declare("function",this),this.scope.addParameterVariables(this.params.map(e=>e.declare("parameter",we)),this.params[this.params.length-1]instanceof ho),this.body.addImplicitReturnExpressionToScope()}parseNode(e){this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope.hoistedBodyVarScope),super.parseNode(e)}}uo.prototype.preventChildBlockScope=!0;class co extends uo{initialise(){super.initialise(),null!==this.id&&(this.id.variable.isId=!0)}parseNode(e){null!==e.id&&(this.id=new this.context.nodeConstructors.Identifier(e.id,this,this.scope.parent)),super.parseNode(e)}}const lo=/\s/;class po extends Ws{include(e){super.include(e),e&&this.context.includeVariable(this.variable)}initialise(){const e=this.declaration;this.declarationName=e.id&&e.id.name||this.declaration.name,this.variable=this.scope.addExportDefaultDeclaration(this.declarationName||this.context.getModuleName(),this,this.context),this.context.addExport(this)}render(e,t,{start:n,end:i}=Y){const r=function(e,t=0){for(t=le(e,"default",t)+7;lo.test(e[t]);)t++;return t}(e.original,this.start);if(this.declaration instanceof co)this.renderNamedDeclaration(e,r,"function",null===this.declaration.id,t);else if(this.declaration instanceof Fs)this.renderNamedDeclaration(e,r,"class",null===this.declaration.id,t);else{if(this.variable.getOriginalVariable()!==this.variable)return void("system"===t.format&&this.variable.exportName?e.overwrite(n,i,`exports('${this.variable.exportName}', ${this.variable.getName()});`):he(this,e,n,i));if(!this.variable.included)return e.remove(this.start,r),this.declaration.render(e,t,{isCalleeOfRenderedParent:!1,renderedParentType:Z}),void(";"!==e.original[this.end-1]&&e.appendLeft(this.end,";"));this.renderVariableDeclaration(e,r,t)}this.declaration.render(e,t)}renderNamedDeclaration(e,t,n,i,r){const s=this.variable.getName();e.remove(this.start,t),i&&e.appendLeft(function(e,t,n=0){const i=le(e,t,n)+t.length;e=e.slice(i,le(e,"{",i));const r=le(e,"*");return-1===r?i:i+r+1}(e.original,n,t),` ${s}`),"system"===r.format&&this.declaration instanceof Fs&&this.variable.exportName&&e.appendLeft(this.end,` exports('${this.variable.exportName}', ${s});`)}renderVariableDeclaration(e,t,n){const i="system"===n.format&&this.variable.exportName?`exports('${this.variable.exportName}', `:"";e.overwrite(this.start,t,`${n.varOrConst} ${this.variable.getName()} = ${i}`);const r=59===e.original.charCodeAt(this.end-1);i?e.appendRight(r?this.end-1:this.end,")"+(r?"":";")):r||e.appendLeft(this.end,";")}}po.prototype.needsBoundaries=!0;class fo extends Et{constructor(e,t,n){super(e,t,t.declaration,n),this.hasId=!1,this.originalId=null,this.originalVariable=null;const i=t.declaration;(i instanceof co||i instanceof Fs)&&i.id?(this.hasId=!0,this.originalId=i.id):i instanceof ao&&(this.originalId=i)}addReference(e){this.hasId||(this.name=e.name)}getAssignedVariableName(){return this.originalId&&this.originalId.name||null}getBaseVariableName(){const e=this.getOriginalVariable();return e===this?super.getBaseVariableName():e.getBaseVariableName()}getName(){const e=this.getOriginalVariable();return e===this?super.getName():e.getName()}getOriginalVariable(){if(null===this.originalVariable)if(!this.originalId||!this.hasId&&this.originalId.variable.isReassigned)this.originalVariable=this;else{const e=this.originalId.variable;this.originalVariable=e instanceof fo?e.getOriginalVariable():e}return this.originalVariable}setRenderNames(e,t){const n=this.getOriginalVariable();n===this?super.setRenderNames(e,t):n.setRenderNames(e,t)}setSafeName(e){const t=this.getOriginalVariable();t===this?super.setSafeName(e):t.setSafeName(e)}}const mo="_missingExportShim",go="_interopDefault",yo="_interopNamespace";class vo extends Ze{constructor(e){super(mo),this.module=e}}class xo extends Ze{constructor(e){super(e.getModuleName()),this.memberVariables=Object.create(null),this.containsExternalNamespace=!1,this.referencedEarly=!1,this.references=[],this.context=e,this.module=e.module}addReference(e){this.references.push(e),this.name=e.name}deoptimizePath(){for(const e in this.memberVariables)this.memberVariables[e].deoptimizePath(Ae)}include(){if(!this.included){this.containsExternalNamespace&&this.context.error({code:"NAMESPACE_CANNOT_CONTAIN_EXTERNAL",id:this.module.id,message:`Cannot create an explicit namespace object for module "${this.context.getModuleName()}" because it contains a reexported external namespace`},void 0),this.included=!0;for(const e of this.references)if(e.context.getModuleExecIndex()<=this.context.getModuleExecIndex()){this.referencedEarly=!0;break}if(this.context.preserveModules)for(const e of Object.keys(this.memberVariables))this.memberVariables[e].include();else for(const e of Object.keys(this.memberVariables))this.context.includeVariable(this.memberVariables[e])}}initialise(){for(const e of this.context.getExports().concat(this.context.getReexports()))"*"===e[0]&&e.length>1&&(this.containsExternalNamespace=!0),this.memberVariables[e]=this.context.traceExport(e)}renderBlock(e){const t=e.compact?"":" ",n=e.compact?"":"\n",i=e.indent,r=Object.keys(this.memberVariables).map(n=>{const r=this.memberVariables[n];if(this.referencedEarly||r.isReassigned)return`${i}get ${n}${t}()${t}{${t}return ${r.getName()}${e.compact?"":";"}${t}}`;const s=xe[n]?`'${n}'`:n;return`${i}${s}: ${r.getName()}`});r.unshift(`${i}__proto__:${t}null`),e.namespaceToStringTag&&r.unshift(`${i}[Symbol.toStringTag]:${t}'Module'`);const s=this.getName(),o=e.freeze?"/*#__PURE__*/Object.freeze":"",a=r.join(`,${n}`);let h=`${e.varOrConst} ${s}${t}=${t}${o}({${n}${a}${n}});`;return"system"===e.format&&this.exportName&&(h+=`${n}exports('${this.exportName}',${t}${s});`),h}renderFirst(){return this.referencedEarly}}xo.prototype.isNamespace=!0;const Eo="Object.defineProperty(exports, '__esModule', { value: true });",_o="Object.defineProperty(exports,'__esModule',{value:true});";function bo(e,t,n,i,r,s,o="return "){const a=r?"":" ",h=r?"":"\n";if(!n){let n;if(e.length>0)n=e[0].local;else for(const e of t)if(e.reexports){const t=e.reexports[0];n=e.namedExportsMode&&"*"!==t.imported&&"default"!==t.imported?`${e.name}.${t.imported}`:e.name}return`${o}${n};`}let u="";t.forEach(({name:e,reexports:t})=>{t&&n&&t.forEach(t=>{"*"===t.reexported&&(u&&(u+=h),t.needsLiveBinding?u+=`Object.keys(${e}).forEach(function${a}(k)${a}{${h}`+`${s}if${a}(k${a}!==${a}'default')${a}Object.defineProperty(exports,${a}k,${a}{${h}`+`${s}${s}enumerable:${a}true,${h}`+`${s}${s}get:${a}function${a}()${a}{${h}`+`${s}${s}${s}return ${e}[k];${h}`+`${s}${s}}${h}${s}});${h}});`:u+=`Object.keys(${e}).forEach(function${a}(k)${a}{${h}`+`${s}if${a}(k${a}!==${a}'default')${a}exports[k]${a}=${a}${e}[k];${h}});`)})});for(const{name:e,imports:r,reexports:o,isChunk:c,namedExportsMode:l,exportsNames:p}of t)if(o&&n)for(const t of o)if("default"!==t.imported||c)if("*"!==t.imported){u&&(u+=h);const n="default"!==t.imported||l?`${e}.${t.imported}`:e;u+=t.needsLiveBinding?`Object.defineProperty(exports,${a}'${t.reexported}',${a}{${h}`+`${s}enumerable:${a}true,${h}`+`${s}get:${a}function${a}()${a}{${h}`+`${s}${s}return ${n};${h}${s}}${h}});`:`exports.${t.reexported}${a}=${a}${n};`}else"*"!==t.reexported&&(u&&(u+=h),u+=`exports.${t.reexported}${a}=${a}${e};`);else u&&(u+=h),p&&(o.some(e=>"default"===e.imported?"default"===e.reexported:"*"!==e.imported)||r&&r.some(e=>"default"!==e.imported))?u+=`exports.${t.reexported}${a}=${a}${e}${!1!==i?"__default":".default"};`:u+=`exports.${t.reexported}${a}=${a}${e};`;for(const t of e){const e=`exports.${t.exported}`,n=t.local;e!==n&&(u&&(u+=h),u+=`${e}${a}=${a}${n};`)}return u}function So(e,t,n){const i=t.compact?"":" ";return e.map(({name:e,exportsNames:r,exportsDefault:s,namedExportsMode:o})=>o&&s&&!1!==t.interop?r?`${n} ${e}__default${i}=${i}'default'${i}in ${e}${i}?`+`${i}${e}['default']${i}:${i}${e};`:`${e}${i}=${i}${e}${i}&&${i}${e}.hasOwnProperty('default')${i}?`+`${i}${e}['default']${i}:${i}${e};`:null).filter(Boolean).join(t.compact?"":"\n")}function Ao(e,t,n,i){return`${i}var d${e}=${e}Object.getOwnPropertyDescriptor(e,${e}k);${t}`+`${i}Object.defineProperty(n,${e}k,${e}d.get${e}?${e}d${e}:${e}{${t}`+`${i}${n}enumerable:${e}true,${t}`+`${i}${n}get:${e}function${e}()${e}{${t}`+`${i}${n}${n}return e[k];${t}`+`${i}${n}}${t}`+`${i}});${t}`}function Co(e,t,n,i){return`${i}n[k]${e}=e${e}[k];${t}`}function Io(e,t,n,i){return`function ${yo}(e)${e}{${t}`+`${n}if${e}(e${e}&&${e}e.__esModule)${e}{${e}return e;${e}}${e}else${e}{${t}`+`${n}${n}var n${e}=${e}{};${t}`+`${n}${n}if${e}(e)${e}{${t}`+`${n}${n}${n}Object.keys(e).forEach(function${e}(k)${e}{${t}`+(i?Ao:Co)(e,t,n,n+n+n+n)+`${n}${n}${n}});${t}`+`${n}${n}}${t}`+`${n}${n}n['default']${e}=${e}e;${t}`+`${n}${n}return n;${t}`+`${n}}${t}`+`}${t}${t}`}const wo={assert:!0,buffer:!0,console:!0,constants:!0,domain:!0,events:!0,http:!0,https:!0,os:!0,path:!0,process:!0,punycode:!0,querystring:!0,stream:!0,string_decoder:!0,timers:!0,tty:!0,url:!0,util:!0,vm:!0,zlib:!0};function Po(e,t){const n=t.map(({id:e})=>e).filter(e=>e in wo);n.length&&e({code:"MISSING_NODE_BUILTINS",message:`Creating a browser bundle that depends on Node.js built-in ${1===n.length?`module ('${n[0]}')`:`modules (${n.slice(0,-1).map(e=>`'${e}'`).join(", ")} and '${n.slice(-1)}')`}. You might need to include https://www.npmjs.com/package/rollup-plugin-node-builtins`,modules:n})}function ko(e){return e.replace(/^\t+/,e=>e.split("\t").join("  "))}function No(e,t,n){let i=e.split("\n");const r=Math.max(0,t-3);let s=Math.min(t+2,i.length);for(i=i.slice(r,s);!/\S/.test(i[i.length-1]);)i.pop(),s-=1;const o=String(s).length;return i.map((e,i)=>{const s=r+i+1===t;let a=String(i+r+1);for(;a.length<o;)a=` ${a}`;if(s){const t=function(e){let t="";for(;e--;)t+=" ";return t}(o+2+ko(e.slice(0,n)).length)+"^";return`${a}: ${ko(e)}\n${t}`}return`${a}: ${ko(e)}`}).join("\n")}function $o(e){return e.replace(/[\0?*]/g,"_")}function Ro(e){const t=pt(e);return t.substr(0,t.length-ft(e).length)}function To(e){return"undefined"!=typeof process&&ut(e)?mt(process.cwd(),e):e}function Oo(e){return"/"!==e[0]&&!("."===e[0]&&("/"===e[1]||"."===e[1]))&&$o(e)===e}function Mo(e,t){throw e instanceof Error||(e=Object.assign(new Error(e.message),e)),t&&Object.assign(e,t),e}function Lo(e,t,n,i){if("object"==typeof t){const{line:n,column:r}=t;e.loc={file:i,line:n,column:r}}else{e.pos=t;const{line:r,column:s}=St(n,t,{offsetLine:1});e.loc={file:i,line:r,column:s}}if(void 0===e.frame){const{line:t,column:i}=e.loc;e.frame=No(n,t,i)}}var Do;function Vo(e){return Object.assign({code:Do.DEPRECATED_FEATURE},"string"==typeof e?{message:e}:e)}function Bo(e,t,n){return{code:Do.NAMESPACE_CONFLICT,message:`Conflicting namespaces: ${To(t.id)} re-exports '${e}' from both ${To(t.exportsAll[e])} and ${To(n.exportsAll[e])} (will be ignored)`,name:e,reexporter:t.id,sources:[t.exportsAll[e],n.exportsAll[e]]}}function zo(e){return{code:Do.VALIDATION_ERROR,message:e}}!function(e){e.ASSET_NOT_FINALISED="ASSET_NOT_FINALISED",e.ASSET_NOT_FOUND="ASSET_NOT_FOUND",e.ASSET_SOURCE_ALREADY_SET="ASSET_SOURCE_ALREADY_SET",e.ASSET_SOURCE_MISSING="ASSET_SOURCE_MISSING",e.BAD_LOADER="BAD_LOADER",e.CANNOT_EMIT_FROM_OPTIONS_HOOK="CANNOT_EMIT_FROM_OPTIONS_HOOK",e.CHUNK_NOT_GENERATED="CHUNK_NOT_GENERATED",e.DEPRECATED_FEATURE="DEPRECATED_FEATURE",e.FILE_NOT_FOUND="FILE_NOT_FOUND",e.FILE_NAME_CONFLICT="FILE_NAME_CONFLICT",e.INVALID_CHUNK="INVALID_CHUNK",e.INVALID_EXTERNAL_ID="INVALID_EXTERNAL_ID",e.INVALID_OPTION="INVALID_OPTION",e.INVALID_PLUGIN_HOOK="INVALID_PLUGIN_HOOK",e.INVALID_ROLLUP_PHASE="INVALID_ROLLUP_PHASE",e.NAMESPACE_CONFLICT="NAMESPACE_CONFLICT",e.PLUGIN_ERROR="PLUGIN_ERROR",e.UNRESOLVED_ENTRY="UNRESOLVED_ENTRY",e.UNRESOLVED_IMPORT="UNRESOLVED_IMPORT",e.VALIDATION_ERROR="VALIDATION_ERROR"}(Do||(Do={}));const Wo=/^[a-zA-Z$_][a-zA-Z0-9$_]*$/;function jo(e){return Wo.test(e)?`.${e}`:`['${e}']`}function Fo(e){return e.split(".").map(jo).join("")}function Uo(e,t,n,i,r){const s=i?"":" ",o=e.split(".");n&&(o[0]=("function"==typeof n?n(o[0]):n[o[0]])||o[0]);const a=o.pop();let h=t,u=o.map(e=>(h+=jo(e),`${h}${s}=${s}${h}${s}||${s}{}`)).concat(`${h}${jo(a)}`).join(`,${s}`).concat(`${s}=${s}${r}`);return o.length>0&&(u=`(${u})`),u}function Go(e){let t=e.length;for(;t--;){const n=e[t];if(n.exportsDefault||n.exportsNames)return e.slice(0,t+1)}return[]}const Ho=e=>`this${Fo(e)}`;const qo=(e,t,n,i,r)=>e?`${r}${i}${t} _starExcludes${n}=${n}{${n}${Array.from(e).join(`:${n}1,${n}`)}${e.size?`:${n}1`:""}${n}};`:"",Ko=(e,t,n,i)=>e.length?`${i}${n}var ${e.join(`,${t}`)};`:"";function Yo(e,t,n,i){return 0===e.length?"":1===e.length?`${n}${n}${n}exports('${e[0].name}',${t}${e[0].value});${i}${i}`:`${n}${n}${n}exports({${i}`+e.map(({name:e,value:i})=>`${n}${n}${n}${n}${e}:${t}${i}`).join(`,${i}`)+`${i}${n}${n}${n}});${i}${i}`}const Xo=(e,t,n,i)=>Yo(e.filter(e=>e.hoisted||e.uninitialized).map(e=>({name:e.exported,value:e.uninitialized?"void 0":e.local})),t,n,i),Qo=(e,t,n,i)=>Yo(e.filter(e=>e.local===mo).map(e=>({name:e.exported,value:mo})),t,n,i);function Jo(e,t){return e?`${t}${Fo(e)}`:"null"}var Zo={system:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,outro:a,usesTopLevelAwait:h,varOrConst:u},c){const l=c.compact?"":"\n",p=c.compact?"":" ",d=n.map(e=>`'${e.id}'`),f=[];let m;const g=[];n.forEach(({imports:e,reexports:t})=>{const r=[];if(e&&e.forEach(e=>{f.push(e.local),"*"===e.imported?r.push(`${e.local}${p}=${p}module;`):r.push(`${e.local}${p}=${p}module.${e.imported};`)}),t){let e=!1;t.length>1||1===t.length&&("*"===t[0].reexported||"*"===t[0].imported)?(t.forEach(t=>{"*"===t.reexported&&(m||(m=function({dependencies:e,exports:t}){const n=new Set(t.map(e=>e.exported));return n.has("default")||n.add("default"),e.forEach(({reexports:e})=>{e&&e.forEach(e=>{"*"===e.imported||n.has(e.reexported)||n.add(e.reexported)})}),n}({dependencies:n,exports:i})),e||(r.push(`${u} _setter${p}=${p}{};`),e=!0),r.push(`for${p}(var _$p${p}in${p}module)${p}{`),r.push(`${s}if${p}(!_starExcludes[_$p])${p}_setter[_$p]${p}=${p}module[_$p];`),r.push("}"))}),t.forEach(e=>{"*"===e.imported&&"*"!==e.reexported&&r.push(`exports('${e.reexported}',${p}module);`)}),t.forEach(t=>{"*"!==t.reexported&&"*"!==t.imported&&(e||(r.push(`${u} _setter${p}=${p}{};`),e=!0),r.push(`_setter.${t.reexported}${p}=${p}module.${t.imported};`))}),e&&r.push("exports(_setter);")):t.forEach(e=>{r.push(`exports('${e.reexported}',${p}module.${e.imported});`)})}g.push(r.join(`${l}${s}${s}${s}`))});const y=c.name?`'${c.name}',${p}`:"",v=t.has("module")?`exports,${p}module`:r?"exports":"";let x=`System.register(${y}[`+d.join(`,${p}`)+`],${p}function${p}(${v})${p}{${l}${s}${c.strict?"'use strict';":""}`+qo(m,u,p,s,l)+Ko(f,p,s,l)+`${l}${s}return${p}{${g.length?`${l}${s}${s}setters:${p}[${g.map(e=>e?`function${p}(module)${p}{${l}${s}${s}${s}${e}${l}${s}${s}}`:`function${p}()${p}{}`).join(`,${p}`)}],`:""}${l}`;x+=`${s}${s}execute:${p}${h?`async${p}`:""}function${p}()${p}{${l}${l}`+Xo(i,p,s,l);const E=`${l}${l}`+Qo(i,p,s,l)+`${s}${s}}${l}${s}}${c.compact?"":";"}${l}});`;return o&&e.prepend(o),a&&e.append(a),e.indent(`${s}${s}${s}`).append(E).prepend(x)},amd:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,isEntryModuleFacade:a,namedExportsMode:h,outro:u,varOrConst:c,warn:l},p){Po(l,n);const d=n.map(e=>`'${function(e){return"."===e[0]&&e.endsWith(".js")?e.slice(0,-3):e}(e.id)}'`),f=n.map(e=>e.name),m=p.compact?"":"\n",g=p.compact?"":" ";h&&r&&(f.unshift("exports"),d.unshift("'exports'")),t.has("require")&&(f.unshift("require"),d.unshift("'require'")),t.has("module")&&(f.unshift("module"),d.unshift("'module'"));const y=p.amd||{},v=(y.id?`'${y.id}',${g}`:"")+(d.length?`[${d.join(`,${g}`)}],${g}`:""),x=!1!==p.strict?`${g}'use strict';`:"",E=`${y.define||"define"}(${v}function${g}(${f.join(`,${g}`)})${g}{${x}${m}${m}`,_=So(n,p,c);_&&e.prepend(_+m+m),t.has(yo)&&e.prepend(Io(g,m,s,!1!==p.externalLiveBindings)),o&&e.prepend(o);const b=bo(i,n,h,p.interop,p.compact,s);return b&&e.append(m+m+b),h&&r&&a&&p.esModule&&e.append(`${m}${m}${p.compact?_o:Eo}`),u&&e.append(u),e.indent(s).append(m+m+"});").prepend(E)},cjs:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,isEntryModuleFacade:a,namedExportsMode:h,outro:u,varOrConst:c},l){const p=l.compact?"":"\n",d=l.compact?"":" ";o=(!1===l.strict?o:`'use strict';${p}${p}${o}`)+(h&&r&&a&&l.esModule?`${l.compact?_o:Eo}${p}${p}`:"");let f=!1;const m=!1!==l.interop;let g,y=!1;g="";for(const{id:e,namedExportsMode:t,isChunk:i,name:r,reexports:s,imports:o,exportsNames:a,exportsDefault:h}of n)s||o?(g+=l.compact&&y?",":`${g?`;${p}`:""}${c} `,y=!0,m&&!i&&h&&t?(f=!0,g+=a?`${r}${d}=${d}require('${e}')${l.compact?",":`;\n${c} `}${r}__default${d}=${d}${go}(${r})`:`${r}${d}=${d}${go}(require('${e}'))`):g+=`${r}${d}=${d}require('${e}')`):(g&&(g+=!l.compact||y?`;${p}`:","),y=!1,g+=`require('${e}')`);if(g&&(g+=";"),f){const e=l.compact?"e":"ex";o+=`function ${go}${d}(${e})${d}{${d}return${d}`+`(${e}${d}&&${d}(typeof ${e}${d}===${d}'object')${d}&&${d}'default'${d}in ${e})${d}`+`?${d}${e}['default']${d}:${d}${e}${l.compact?"":"; "}}${p}${p}`}t.has(yo)&&(o+=Io(d,p,s,!1!==l.externalLiveBindings)),g&&(o+=g+p+p);const v=bo(i,n,h,l.interop,l.compact,s,`module.exports${d}=${d}`);return e.prepend(o),v&&e.append(p+p+v),u&&e.append(u),e},es:function(e,{intro:t,outro:n,dependencies:i,exports:r},s){const o=s.compact?"":" ",a=s.compact?"":"\n",h=i.map(({id:e,reexports:t,imports:n,name:i})=>{if(!t&&!n)return`import${o}'${e}';`;let r="";if(n){const t=n.find(e=>"default"===e.imported),i=n.find(e=>"*"===e.imported);i&&(r+=`import${o}*${o}as ${i.local} from${o}'${e}';`,n.length>1&&(r+=a)),t&&1===n.length?r+=`import ${t.local} from${o}'${e}';`:(!i||n.length>1)&&(r+=`import ${t?`${t.local},${o}`:""}{${o}${n.filter(e=>e!==t&&e!==i).map(e=>e.imported===e.local?e.imported:`${e.imported} as ${e.local}`).join(`,${o}`)}${o}}${o}from${o}'${e}';`)}if(t){n&&(r+=a);const s=t.find(e=>"*"===e.reexported),h=t.find(e=>"*"===e.imported&&"*"!==e.reexported);if(s){if(r+=`export${o}*${o}from${o}'${e}';`,1===t.length)return r;r+=a}if(h){if(n&&n.some(e=>"*"===e.imported&&e.local===i)||(r+=`import${o}*${o}as ${i} from${o}'${e}';${a}`),r+=`export${o}{${o}${i===h.reexported?i:`${i} as ${h.reexported}`} };`,t.length===(s?2:1))return r;r+=a}r+=`export${o}{${o}${t.filter(e=>e!==s&&e!==h).map(e=>e.imported===e.reexported?e.imported:`${e.imported} as ${e.reexported}`).join(`,${o}`)}${o}}${o}from${o}'${e}';`}return r}).join(a);h&&(t+=h+a+a),t&&e.prepend(t);const u=[],c=[];return r.forEach(e=>{"default"===e.exported?u.push(`export default ${e.local};`):c.push(e.exported===e.local?e.local:`${e.local} as ${e.exported}`)}),c.length&&u.push(`export${o}{${o}${c.join(`,${o}`)}${o}};`),u.length&&e.append(a+a+u.join(a).trim()),n&&e.append(n),e.trim()},iife:function(e,{dependencies:t,exports:n,hasExports:i,indentString:r,intro:s,namedExportsMode:o,outro:a,varOrConst:h,warn:u},c){const l=c.compact?"":" ",p=c.compact?"":"\n",{extend:d,name:f}=c,m=f&&-1!==f.indexOf("."),g=!d&&!m;var y;f&&g&&(st(y=f)||it[y]||rt.test(y))&&Mo({code:"ILLEGAL_IDENTIFIER_AS_NAME",message:`Given name (${f}) is not legal JS identifier. If you need this you can try --extend option`}),Po(u,t);const v=Go(t),x=v.map(e=>e.globalName||"null"),E=v.map(e=>e.name);i&&!f&&Mo({code:"INVALID_OPTION",message:'You must supply "output.name" for IIFE bundles.'}),o&&i&&(d?(x.unshift(`${Ho(f)}${l}=${l}${Ho(f)}${l}||${l}{}`),E.unshift("exports")):(x.unshift("{}"),E.unshift("exports")));const _=!1!==c.strict?`${r}'use strict';${p}${p}`:"";let b=`(function${l}(${E.join(`,${l}`)})${l}{${p}${_}`;!i||d&&o||(b=(g?`${h} ${f}`:Ho(f))+`${l}=${l}${b}`),m&&i&&(b=function(e,t,n,i){const r=e.split(".");n&&(r[0]=("function"==typeof n?n(r[0]):n[r[0]])||r[0]);const s=i?"":" ";r.pop();let o=t;return r.map(e=>(o+=jo(e),`${o}${s}=${s}${o}${s}||${s}{}${i?"":";"}`)).join(i?",":"\n")+(i&&r.length?";":"\n")}(f,"this",c.globals,c.compact)+b);let S=`${p}${p}}(${x.join(`,${l}`)}));`;!d&&o&&i&&(S=`${p}${p}${r}return exports;${S}`);const A=So(t,c,h);A&&e.prepend(A+p+p),s&&e.prepend(s);const C=bo(n,t,o,c.interop,c.compact,r);return C&&e.append(p+p+C),a&&e.append(a),e.indent(r).prepend(b).append(S)},umd:function(e,{dependencies:t,exports:n,hasExports:i,indentString:r,intro:s,namedExportsMode:o,outro:a,varOrConst:h,warn:u},c){const l=c.compact?"":" ",p=c.compact?"":"\n",d=c.compact?"f":"factory",f=c.compact?"g":"global";i&&!c.name&&Mo({code:"INVALID_OPTION",message:'You must supply "output.name" for UMD bundles.'}),Po(u,t);const m=t.map(e=>`'${e.id}'`),g=t.map(e=>`require('${e.id}')`),y=Go(t),v=y.map(e=>Jo(e.globalName,f)),x=y.map(e=>e.name);o&&(i||!0===c.noConflict)&&(m.unshift("'exports'"),g.unshift("exports"),v.unshift(Uo(c.name,f,c.globals,c.compact,`${c.extend?`${Jo(c.name,f)}${l}||${l}`:""}{}`)),x.unshift("exports"));const E=c.amd||{},_=(E.id?`'${E.id}',${l}`:"")+(m.length?`[${m.join(`,${l}`)}],${l}`:""),b=E.define||"define",S=!o&&i?`module.exports${l}=${l}`:"",A=!1!==c.strict?`${l}'use strict';${p}`:"";let C;if(!0===c.noConflict){const e=c.compact?"e":"exports";let t;if(!o&&i)t=`var ${e}${l}=${l}${Uo(c.name,f,c.globals,c.compact,`${d}(${v.join(`,${l}`)})`)};`;else if(o){t=`var ${e}${l}=${l}${v.shift()};${p}`+`${r}${r}${d}(${[e].concat(v).join(`,${l}`)});`}C=`(function${l}()${l}{${p}`+`${r}${r}var current${l}=${l}${function(e,t,n){const i=e.split(".");let r=t;return i.map(e=>(r+=jo(e),r)).join(`${n}&&${n}`)}(c.name,f,l)};${p}`+`${r}${r}${t}${p}`+`${r}${r}${e}.noConflict${l}=${l}function${l}()${l}{${l}`+`${Jo(c.name,f)}${l}=${l}current;${l}return ${e}${c.compact?"":"; "}};${p}`+`${r}}())`}else C=`${d}(${v.join(`,${l}`)})`,!o&&i&&(C=Uo(c.name,f,c.globals,c.compact,C));const I=i||!0===c.noConflict&&o||v.length>0,w=I?`this,${l}`:"",P=I?`(${f}${l}=${l}${f}${l}||${l}self,${l}`:"",k=I?")":"",N=`(function${l}(${I?`${f},${l}`:""}${d})${l}{${p}`+(I?`${r}typeof exports${l}===${l}'object'${l}&&${l}typeof module${l}!==${l}'undefined'${l}?`+`${l}${S}${d}(${g.join(`,${l}`)})${l}:${p}`:"")+`${r}typeof ${b}${l}===${l}'function'${l}&&${l}${b}.amd${l}?${l}${b}(${_}${d})${l}:${p}`+`${r}${P}${C}${k};${p}`+`}(${w}function${l}(${x.join(", ")})${l}{${A}${p}`,$=p+p+"}));",R=So(t,c,h);R&&e.prepend(R+p+p),s&&e.prepend(s);const T=bo(n,t,o,c.interop,c.compact,r);return T&&e.append(p+p+T),o&&i&&c.esModule&&e.append(p+p+(c.compact?_o:Eo)),a&&e.append(a),e.trim().indent(r).append($).prepend(N)}};const ea={ArrayPattern(e,t){for(const n of t.elements)n&&ea[n.type](e,n)},AssignmentPattern(e,t){ea[t.left.type](e,t.left)},Identifier(e,t){e.push(t.name)},MemberExpression(){},ObjectPattern(e,t){for(const n of t.properties)"RestElement"===n.type?ea.RestElement(e,n):ea[n.value.type](e,n.value)},RestElement(e,t){ea[t.argument.type](e,t.argument)}},ta=function(e){const t=[];return ea[e.type](t,e),t};class na extends bt{addDeclaration(e,t,n=null,i=!1){return i?this.parent.addDeclaration(e,t,we,!0):super.addDeclaration(e,t,n,!1)}}class ia extends Ws{addImplicitReturnExpressionToScope(){const e=this.body[this.body.length-1];e&&e.type===oe||this.scope.addReturnExpression(we)}createScope(e){this.scope=this.parent.preventChildBlockScope?e:new na(e)}hasEffects(e){for(const t of this.body)if(t.hasEffects(e))return!0;return!1}include(e){this.included=!0;for(const t of this.body)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){this.body.length?de(this.body,e,this.start+1,this.end-1,t):super.render(e,t)}}class ra extends Ws{createScope(e){this.scope=new qs(e,this.context)}deoptimizePath(e){1===e.length&&e[0]===be&&this.scope.getReturnExpression().deoptimizePath(Ae)}getReturnExpressionWhenCalledAtPath(e){return 0===e.length?this.scope.getReturnExpression():we}hasEffects(e){return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}hasEffectsWhenAssignedAtPath(e,t){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){if(e.length>0)return!0;for(const e of this.params)if(e.hasEffects(n))return!0;return this.body.hasEffects(n)}include(e){this.included=!0,this.body.include(e);for(const t of this.params)t instanceof ao||t.include(e)}includeCallArguments(e){this.scope.includeCallArguments(e)}initialise(){this.scope.addParameterVariables(this.params.map(e=>e.declare("parameter",we)),this.params[this.params.length-1]instanceof ho),this.body instanceof ia?this.body.addImplicitReturnExpressionToScope():this.scope.addReturnExpression(this.body)}parseNode(e){e.body.type===X&&(this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope.hoistedBodyVarScope)),super.parseNode(e)}}function sa(e){return 1===e.length?`exports('${e[0].safeExportName||e[0].exportName}', ${e[0].getName()});`:`exports({${e.map(e=>`${e.safeExportName||e.exportName}: ${e.getName()}`).join(", ")}});`}ra.prototype.preventChildBlockScope=!0;const oa={};class aa{constructor(e=Ms.Map()){this.entityPaths=e}isTracked(e,t){return this.entityPaths.getIn([e,...t,oa])}track(e,t){return new aa(this.entityPaths.setIn([e,...t,oa],!0))}}const ha=new aa;class ua extends Ws{initialise(){this.directive&&"use strict"!==this.directive&&this.parent.type===re&&this.context.warn({code:"MODULE_LEVEL_DIRECTIVE",message:`Module level directives cause errors when bundled, '${this.directive}' was ignored.`},this.start)}render(e,t){super.render(e,t),this.included&&this.insertSemicolon(e)}shouldBeIncluded(){return this.directive&&"use strict"!==this.directive?this.parent.type!==re:super.shouldBeIncluded()}}const ca={"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,"%":(e,t)=>e%t,"&":(e,t)=>e&t,"*":(e,t)=>e*t,"**":(e,t)=>Math.pow(e,t),"+":(e,t)=>e+t,"-":(e,t)=>e-t,"/":(e,t)=>e/t,"<":(e,t)=>e<t,"<<":(e,t)=>e<<t,"<=":(e,t)=>e<=t,"==":(e,t)=>e==t,"===":(e,t)=>e===t,">":(e,t)=>e>t,">=":(e,t)=>e>=t,">>":(e,t)=>e>>t,">>>":(e,t)=>e>>>t,"^":(e,t)=>e^t,in:()=>Ie,instanceof:()=>Ie,"|":(e,t)=>e|t};class la extends Hs{addDeclaration(e,t,n=null,i=!1){return i?this.parent.addDeclaration(e,t,n,!0):super.addDeclaration(e,t,n,!1)}}class pa extends Ws{createScope(e){this.scope=new la(e,this.context)}initialise(){this.param&&this.param.declare("parameter",we)}parseNode(e){this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope),super.parseNode(e)}}pa.prototype.preventChildBlockScope=!0;class da{constructor(e){this.included=!1,this.expressions=e}deoptimizePath(e){for(const t of this.expressions)t.deoptimizePath(e)}getLiteralValueAtPath(){return Ie}getReturnExpressionWhenCalledAtPath(e,t,n){return new da(this.expressions.map(i=>i.getReturnExpressionWhenCalledAtPath(e,t,n)))}hasEffectsWhenAccessedAtPath(e,t){for(const n of this.expressions)if(n.hasEffectsWhenAccessedAtPath(e,t))return!0;return!1}hasEffectsWhenAssignedAtPath(e,t){for(const n of this.expressions)if(n.hasEffectsWhenAssignedAtPath(e,t))return!0;return!1}hasEffectsWhenCalledAtPath(e,t,n){for(const i of this.expressions)if(i.hasEffectsWhenCalledAtPath(e,t,n))return!0;return!1}include(){}includeCallArguments(e){for(const t of this.expressions)t.includeCallArguments(e)}}class fa extends Ws{hasEffects(){return!1}initialise(){this.context.addExport(this)}render(e,t,{start:n,end:i}=Y){e.remove(n,i)}}fa.prototype.needsBoundaries=!0;class ma extends Ws{bind(){null!==this.declaration&&this.declaration.bind()}hasEffects(e){return null!==this.declaration&&this.declaration.hasEffects(e)}initialise(){this.context.addExport(this)}render(e,t,{start:n,end:i}=Y){null===this.declaration?e.remove(n,i):(e.remove(this.start,this.declaration.start),this.declaration.render(e,t,{start:n,end:i}))}}ma.prototype.needsBoundaries=!0;class ga extends Ws{bind(){}hasEffects(){return!1}initialise(){this.context.addImport(this)}render(e,t,{start:n,end:i}=Y){e.remove(n,i)}}ga.prototype.needsBoundaries=!0;class ya extends Ws{getLiteralValueAtPath(e){return e.length>0||null===this.value&&110!==this.context.code.charCodeAt(this.start)||"bigint"==typeof this.value||47===this.context.code.charCodeAt(this.start)?Ie:this.value}getReturnExpressionWhenCalledAtPath(e){return 1!==e.length?we:Je(this.members,e[0])}hasEffectsWhenAccessedAtPath(e){return null===this.value?e.length>0:e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>0}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Qe(this.members,e[0],this.included,t,n)}initialise(){this.members=function(e){switch(typeof e){case"boolean":return Ke;case"number":return Ye;case"string":return Xe;default:return Object.create(null)}}(this.value)}render(e,t){"string"==typeof this.value&&e.indentExclusionRanges.push([this.start+1,this.end-1])}}function va(e){return e.computed?function(e){if(e instanceof ya)return String(e.value);return null}(e.property):e.property.name}class xa extends Ws{constructor(){super(...arguments),this.variable=null,this.bound=!1,this.expressionsToBeDeoptimized=[],this.replacement=null}addExportedVariables(){}bind(){if(this.bound)return;this.bound=!0;const e=function e(t){const n=t.propertyKey,i=t.object;if("string"==typeof n){if(i instanceof ao)return[{key:i.name,pos:i.start},{key:n,pos:t.property.start}];if(i instanceof xa){const r=e(i);return r&&[...r,{key:n,pos:t.property.start}]}}return null}(this),t=e&&this.scope.findVariable(e[0].key);if(t&&t.isNamespace){const n=this.resolveNamespaceVariables(t,e.slice(1));n?"string"==typeof n?this.replacement=n:(n instanceof et&&n.module&&n.module.suggestName(e[0].key),this.variable=n,this.scope.addNamespaceMemberAccess(function(e){let t=e[0].key;for(let n=1;n<e.length;n++)t+="."+e[n].key;return t}(e),n)):super.bind()}else super.bind(),null===this.propertyKey&&this.analysePropertyKey()}deoptimizeCache(){for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}deoptimizePath(e){this.bound||this.bind(),0===e.length&&this.disallowNamespaceReassignment(),this.variable?this.variable.deoptimizePath(e):(null===this.propertyKey&&this.analysePropertyKey(),this.object.deoptimizePath([this.propertyKey,...e]))}getLiteralValueAtPath(e,t,n){return this.bound||this.bind(),null!==this.variable?this.variable.getLiteralValueAtPath(e,t,n):(null===this.propertyKey&&this.analysePropertyKey(),this.expressionsToBeDeoptimized.push(n),this.object.getLiteralValueAtPath([this.propertyKey,...e],t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.bound||this.bind(),null!==this.variable?this.variable.getReturnExpressionWhenCalledAtPath(e,t,n):(null===this.propertyKey&&this.analysePropertyKey(),this.expressionsToBeDeoptimized.push(n),this.object.getReturnExpressionWhenCalledAtPath([this.propertyKey,...e],t,n))}hasEffects(e){return this.property.hasEffects(e)||this.object.hasEffects(e)||this.context.propertyReadSideEffects&&this.object.hasEffectsWhenAccessedAtPath([this.propertyKey],e)}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null!==this.variable?this.variable.hasEffectsWhenAccessedAtPath(e,t):this.object.hasEffectsWhenAccessedAtPath([this.propertyKey,...e],t))}hasEffectsWhenAssignedAtPath(e,t){return null!==this.variable?this.variable.hasEffectsWhenAssignedAtPath(e,t):this.object.hasEffectsWhenAssignedAtPath([this.propertyKey,...e],t)}hasEffectsWhenCalledAtPath(e,t,n){return null!==this.variable?this.variable.hasEffectsWhenCalledAtPath(e,t,n):this.object.hasEffectsWhenCalledAtPath([this.propertyKey,...e],t,n)}include(e){this.included||(this.included=!0,null!==this.variable&&this.context.includeVariable(this.variable)),this.object.include(e),this.property.include(e)}includeCallArguments(e){this.variable?this.variable.includeCallArguments(e):super.includeCallArguments(e)}initialise(){this.propertyKey=va(this)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i}=Y){const r=n===Q&&i;if(this.variable||this.replacement){let t=this.variable?this.variable.getName():this.replacement;r&&(t="0, "+t),e.overwrite(this.start,this.end,t,{contentOnly:!0,storeName:!0})}else r&&e.appendRight(this.start,"0, "),super.render(e,t)}analysePropertyKey(){this.propertyKey=be;const e=this.property.getLiteralValueAtPath(Se,ha,this);this.propertyKey=e===Ie?be:String(e)}disallowNamespaceReassignment(){this.object instanceof ao&&this.scope.findVariable(this.object.name).isNamespace&&this.context.error({code:"ILLEGAL_NAMESPACE_REASSIGNMENT",message:`Illegal reassignment to import '${this.object.name}'`},this.start)}resolveNamespaceVariables(e,t){if(0===t.length)return e;if(!e.isNamespace)return null;const n=t[0].key,i=e instanceof et?e.module.getVariableForExportName(n):e.context.traceExport(n);if(!i){const i=e instanceof et?e.module.id:e.context.fileName;return this.context.warn({code:"MISSING_EXPORT",exporter:To(i),importer:To(this.context.fileName),message:`'${n}' is not exported by '${To(i)}'`,missing:n,url:"https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module"},t[0].pos),"undefined"}return this.resolveNamespaceVariables(i,t.slice(1))}}const Ea=e=>(...t)=>{throw new Error(`Cannot use fs.${e} inside browser`)},_a=Ea("lstatSync"),ba=Ea("readdirSync"),Sa=Ea("readFile"),Aa=Ea("realpathSync"),Ca=Ea("writeFile");function Ia(e,t){try{const n=_a(e);if(!t&&n.isSymbolicLink())return Ia(Aa(e),t);if(t&&n.isSymbolicLink()||n.isFile()){const t=pt(e);if(-1!==ba(dt(e)).indexOf(t))return e}}catch(e){}}function wa(e){return function(t,n){return"undefined"==typeof process&&Mo({code:"MISSING_PROCESS",message:"It looks like you're using Rollup in a non-Node.js environment. This means you must supply a plugin with custom resolveId and load functions",url:"https://rollupjs.org/guide/en/#a-simple-example"}),void 0===n||ut(t)||"."===t[0]?function(e,t){let n=Ia(e,t);return n||((n=Ia(e+".mjs",t))?n:n=Ia(e+".js",t))}(gt(n?dt(n):gt(),t),e):null}}const Pa=(e,t="URL")=>`new ${t}(${e}).href`,ka=e=>`(document.currentScript && document.currentScript.src || new URL('${e}', document.baseURI).href)`,Na=e=>(t,n)=>{const i=e(n);return null===t?`({ url: ${i} })`:"url"===t?i:"undefined"},$a={amd:Na(()=>Pa("module.uri, document.baseURI")),cjs:Na(e=>`(typeof document === 'undefined' ? ${Pa("'file:' + __filename","(require('u' + 'rl').URL)")} : ${ka(e)})`),iife:Na(e=>ka(e)),system:e=>null===e?"module.meta":`module.meta.${e}`,umd:Na(e=>`(typeof document === 'undefined' ? ${Pa("'file:' + __filename","(require('u' + 'rl').URL)")} : ${ka(e)})`)},Ra=e=>Pa(`'${e}', document.currentScript && document.currentScript.src || document.baseURI`),Ta={amd:e=>("."!==e[0]&&(e="./"+e),Pa(`require.toUrl('${e}'), document.baseURI`)),cjs:e=>`(typeof document === 'undefined' ? ${Pa(`'file:' + __dirname + '/${e}'`,"(require('u' + 'rl').URL)")} : ${Ra(e)})`,es:e=>Pa(`'${e}', import.meta.url`),iife:e=>Ra(e),system:e=>Pa(`'${e}', module.meta.url`),umd:e=>`(typeof document === 'undefined' ? ${Pa(`'file:' + __dirname + '/${e}'`,"(require('u' + 'rl').URL)")} : ${Ra(e)})`},Oa={amd:["document","module","URL"],cjs:["document","require","URL"],iife:["document","URL"],system:["module"],umd:["document","require","URL"]},Ma={amd:["document","require","URL"],cjs:["document","require","URL"],iife:["document","URL"],system:["module","URL"],umd:["document","require","URL"]},La="ROLLUP_ASSET_URL_",Da="ROLLUP_CHUNK_URL_",Va="ROLLUP_FILE_URL_";class Ba extends Ws{bind(){super.bind(),this.argument.deoptimizePath([be,be])}}class za extends Ws{hasEffects(e){for(const t of this.body)if(t.hasEffects(e))return!0;return!1}include(e){this.included=!0;for(const t of this.body)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){this.body.length?de(this.body,e,this.start,this.end,t):super.render(e,t)}}class Wa extends Ws{getLiteralValueAtPath(e){return e.length>0||1!==this.quasis.length?Ie:this.quasis[0].value.cooked}render(e,t){e.indentExclusionRanges.push([this.start,this.end]),super.render(e,t)}}class ja extends bt{constructor(e,t){super(e),this.context=t,this.variables.set("this",new Et("this",null,Pe,t))}addExportDefaultDeclaration(e,t,n){const i=new fo(e,t,n);return this.variables.set("default",i),i}addNamespaceMemberAccess(e,t){t instanceof oo&&this.accessedOutsideVariables.set(t.name,t)}deconflict(e){for(const t of this.children)t.deconflict(e)}findLexicalBoundary(){return this}findVariable(e){const t=this.variables.get(e)||this.accessedOutsideVariables.get(e);if(t)return t;const n=this.context.traceVariable(e)||this.parent.findVariable(e);return n instanceof oo&&this.accessedOutsideVariables.set(e,n),n}}const Fa={"!":e=>!e,"+":e=>+e,"-":e=>-e,delete:()=>Ie,typeof:e=>typeof e,void:()=>void 0,"~":e=>~e};function Ua(e){return null!==e.renderBaseName&&null!==e.exportName&&e.isReassigned}const Ga={ArrayExpression:class extends Ws{bind(){super.bind();for(const e of this.elements)null!==e&&e.deoptimizePath(Ae)}getReturnExpressionWhenCalledAtPath(e){return 1!==e.length?we:Je(qe,e[0])}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Qe(qe,e[0],this.included,t,n)}},ArrayPattern:class extends Ws{addExportedVariables(e){for(const t of this.elements)null!==t&&t.addExportedVariables(e)}declare(e,t){const n=[];for(const t of this.elements)null!==t&&n.push(...t.declare(e,we));return n}deoptimizePath(e){if(0===e.length)for(const t of this.elements)null!==t&&t.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){if(e.length>0)return!0;for(const e of this.elements)if(null!==e&&e.hasEffectsWhenAssignedAtPath(Se,t))return!0;return!1}},ArrowFunctionExpression:ra,AssignmentExpression:class extends Ws{bind(){super.bind(),this.left.deoptimizePath(Se),this.right.deoptimizePath(Ae)}hasEffects(e){return this.right.hasEffects(e)||this.left.hasEffects(e)||this.left.hasEffectsWhenAssignedAtPath(Se,e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.right.hasEffectsWhenAccessedAtPath(e,t)}render(e,t){if(this.left.render(e,t),this.right.render(e,t),"system"===t.format)if(this.left.variable&&this.left.variable.exportName)e.prependLeft(e.original.indexOf("=",this.left.end)+1,` exports('${this.left.variable.exportName}',`),e.appendLeft(this.right.end,")");else if("addExportedVariables"in this.left){const t=[];this.left.addExportedVariables(t),t.length>0&&(e.prependRight(this.start,`function (v) {${sa(t)} return v;} (`),e.appendLeft(this.end,")"))}}},AssignmentPattern:class extends Ws{addExportedVariables(e){this.left.addExportedVariables(e)}bind(){super.bind(),this.left.deoptimizePath(Se),this.right.deoptimizePath(Ae)}declare(e,t){return this.left.declare(e,t)}deoptimizePath(e){0===e.length&&this.left.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){return e.length>0||this.left.hasEffectsWhenAssignedAtPath(Se,t)}render(e,t,{isShorthandProperty:n}=Y){this.left.render(e,t,{isShorthandProperty:n}),this.right.render(e,t)}},AwaitExpression:class extends Ws{hasEffects(e){return super.hasEffects(e)||!e.ignoreReturnAwaitYield()}include(e){e:if(!this.included&&!this.context.usesTopLevelAwait){let e=this.parent;do{if(e instanceof uo||e instanceof ra)break e}while(e=e.parent);this.context.usesTopLevelAwait=!0}super.include(e)}render(e,t){super.render(e,t)}},BinaryExpression:class extends Ws{deoptimizeCache(){}getLiteralValueAtPath(e,t,n){if(e.length>0)return Ie;const i=this.left.getLiteralValueAtPath(Se,t,n);if(i===Ie)return Ie;const r=this.right.getLiteralValueAtPath(Se,t,n);if(r===Ie)return Ie;const s=ca[this.operator];return s?s(i,r):Ie}hasEffects(e){return"+"===this.operator&&this.parent instanceof ua&&""===this.left.getLiteralValueAtPath(Se,ha,this)||super.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}},BlockStatement:ia,BreakStatement:class extends Ws{hasEffects(e){return super.hasEffects(e)||!e.ignoreBreakStatements()||null!==this.label&&!e.ignoreLabel(this.label.name)}},CallExpression:class extends Ws{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.returnExpression=null}bind(){if(super.bind(),this.callee instanceof ao){this.scope.findVariable(this.callee.name).isNamespace&&this.context.error({code:"CANNOT_CALL_NAMESPACE",message:`Cannot call a namespace ('${this.callee.name}')`},this.start),"eval"===this.callee.name&&this.context.warn({code:"EVAL",message:"Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification",url:"https://rollupjs.org/guide/en/#avoiding-eval"},this.start)}null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Se,ha,this));for(const e of this.arguments)e.deoptimizePath(Ae)}deoptimizeCache(){if(this.returnExpression!==we){this.returnExpression=we;for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&!this.context.deoptimizationTracker.track(this,e)&&(null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Se,ha,this)),this.returnExpression.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Se,t,this)),this.returnExpression===we||t.isTracked(this.returnExpression,e)?Ie:(this.expressionsToBeDeoptimized.push(n),this.returnExpression.getLiteralValueAtPath(e,t.track(this.returnExpression,e),n))}getReturnExpressionWhenCalledAtPath(e,t,n){return null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Se,t,this)),this.returnExpression===we||t.isTracked(this.returnExpression,e)?we:(this.expressionsToBeDeoptimized.push(n),this.returnExpression.getReturnExpressionWhenCalledAtPath(e,t.track(this.returnExpression,e),n))}hasEffects(e){for(const t of this.arguments)if(t.hasEffects(e))return!0;return(!this.context.annotations||!this.annotatedPure)&&(this.callee.hasEffects(e)||this.callee.hasEffectsWhenCalledAtPath(Se,this.callOptions,e.getHasEffectsWhenCalledOptions()))}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&!t.hasReturnExpressionBeenAccessedAtPath(e,this)&&this.returnExpression.hasEffectsWhenAccessedAtPath(e,t.addAccessedReturnExpressionAtPath(e,this))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||!t.hasReturnExpressionBeenAssignedAtPath(e,this)&&this.returnExpression.hasEffectsWhenAssignedAtPath(e,t.addAssignedReturnExpressionAtPath(e,this))}hasEffectsWhenCalledAtPath(e,t,n){return!n.hasReturnExpressionBeenCalledAtPath(e,this)&&this.returnExpression.hasEffectsWhenCalledAtPath(e,t,n.addCalledReturnExpressionAtPath(e,this))}include(e){e?(super.include(e),e===Bs&&this.callee instanceof ao&&this.callee.variable&&this.callee.variable.markCalledFromTryStatement()):(this.included=!0,this.callee.include(!1)),this.callee.includeCallArguments(this.arguments),this.returnExpression.included||this.returnExpression.include(!1)}initialise(){this.callOptions=_e.create({args:this.arguments,callIdentifier:this,withNew:!1})}render(e,t,{renderedParentType:n}=Y){if(this.callee.render(e,t),this.arguments.length>0)if(this.arguments[this.arguments.length-1].included)for(const n of this.arguments)n.render(e,t);else{let n=this.arguments.length-2;for(;n>=0&&!this.arguments[n].included;)n--;if(n>=0){for(let i=0;i<=n;i++)this.arguments[i].render(e,t);e.remove(le(e.original,",",this.arguments[n].end),this.end-1)}else e.remove(le(e.original,"(",this.callee.end)+1,this.end-1)}n===Z&&this.callee.type===ee&&(e.appendRight(this.start,"("),e.prependLeft(this.end,")"))}},CatchClause:pa,ClassBody:class extends Ws{hasEffectsWhenCalledAtPath(e,t,n){return e.length>0||null!==this.classConstructor&&this.classConstructor.hasEffectsWhenCalledAtPath(Se,t,n)}initialise(){for(const e of this.body)if("constructor"===e.kind)return void(this.classConstructor=e);this.classConstructor=null}},ClassDeclaration:Fs,ClassExpression:class extends js{},ConditionalExpression:class extends Ws{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.isBranchResolutionAnalysed=!1,this.unusedBranch=null,this.usedBranch=null}bind(){super.bind(),this.isBranchResolutionAnalysed||this.analyseBranchResolution()}deoptimizeCache(){if(null!==this.usedBranch){this.usedBranch=null,this.unusedBranch.deoptimizePath(Ae);for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&(this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?(this.consequent.deoptimizePath(e),this.alternate.deoptimizePath(e)):this.usedBranch.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?Ie:(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getLiteralValueAtPath(e,t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?new da([this.consequent.getReturnExpressionWhenCalledAtPath(e,t,n),this.alternate.getReturnExpressionWhenCalledAtPath(e,t,n)]):(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getReturnExpressionWhenCalledAtPath(e,t,n))}hasEffects(e){return!!this.test.hasEffects(e)||(null===this.usedBranch?this.consequent.hasEffects(e)||this.alternate.hasEffects(e):this.usedBranch.hasEffects(e))}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null===this.usedBranch?this.consequent.hasEffectsWhenAccessedAtPath(e,t)||this.alternate.hasEffectsWhenAccessedAtPath(e,t):this.usedBranch.hasEffectsWhenAccessedAtPath(e,t))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||(null===this.usedBranch?this.consequent.hasEffectsWhenAssignedAtPath(e,t)||this.alternate.hasEffectsWhenAssignedAtPath(e,t):this.usedBranch.hasEffectsWhenAssignedAtPath(e,t))}hasEffectsWhenCalledAtPath(e,t,n){return null===this.usedBranch?this.consequent.hasEffectsWhenCalledAtPath(e,t,n)||this.alternate.hasEffectsWhenCalledAtPath(e,t,n):this.usedBranch.hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0,e||null===this.usedBranch||this.test.shouldBeIncluded()?(this.test.include(e),this.consequent.include(e),this.alternate.include(e)):this.usedBranch.include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=Y){if(this.test.included)super.render(e,t);else{const s=le(e.original,":",this.consequent.end),o=(this.consequent.included?le(e.original,"?",this.test.end):s)+1;r&&me(e,o,this.usedBranch.start),e.remove(this.start,o),this.consequent.included&&e.remove(s,this.end),ue(this,e),this.usedBranch.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type})}}analyseBranchResolution(){this.isBranchResolutionAnalysed=!0;const e=this.test.getLiteralValueAtPath(Se,ha,this);e!==Ie&&(e?(this.usedBranch=this.consequent,this.unusedBranch=this.alternate):(this.usedBranch=this.alternate,this.unusedBranch=this.consequent))}},DoWhileStatement:class extends Ws{hasEffects(e){return this.test.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}},EmptyStatement:class extends Ws{hasEffects(){return!1}},ExportAllDeclaration:fa,ExportDefaultDeclaration:po,ExportNamedDeclaration:ma,ExpressionStatement:ua,ForInStatement:class extends Ws{bind(){this.left.bind(),this.left.deoptimizePath(Se),this.right.bind(),this.body.bind()}createScope(e){this.scope=new na(e)}hasEffects(e){return this.left&&(this.left.hasEffects(e)||this.left.hasEffectsWhenAssignedAtPath(Se,e))||this.right&&this.right.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}include(e){this.included=!0,this.left.includeWithAllDeclaredVariables(e),this.left.deoptimizePath(Se),this.right.include(e),this.body.include(e)}render(e,t){this.left.render(e,t,ce),this.right.render(e,t,ce),this.body.render(e,t)}},ForOfStatement:class extends Ws{bind(){this.left.bind(),this.left.deoptimizePath(Se),this.right.bind(),this.body.bind()}createScope(e){this.scope=new na(e)}hasEffects(){return!0}include(e){this.included=!0,this.left.includeWithAllDeclaredVariables(e),this.left.deoptimizePath(Se),this.right.include(e),this.body.include(e)}render(e,t){this.left.render(e,t,ce),this.right.render(e,t,ce),this.body.render(e,t)}},ForStatement:class extends Ws{createScope(e){this.scope=new na(e)}hasEffects(e){return this.init&&this.init.hasEffects(e)||this.test&&this.test.hasEffects(e)||this.update&&this.update.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}render(e,t){this.init&&this.init.render(e,t,ce),this.test&&this.test.render(e,t,ce),this.update&&this.update.render(e,t,ce),this.body.render(e,t)}},FunctionDeclaration:co,FunctionExpression:class extends uo{},Identifier:ao,IfStatement:class extends Ws{constructor(){super(...arguments),this.isTestValueAnalysed=!1}bind(){super.bind(),this.isTestValueAnalysed||(this.testValue=Ie,this.isTestValueAnalysed=!0,this.testValue=this.test.getLiteralValueAtPath(Se,ha,this))}deoptimizeCache(){this.testValue=Ie}hasEffects(e){return!!this.test.hasEffects(e)||(this.testValue===Ie?this.consequent.hasEffects(e)||null!==this.alternate&&this.alternate.hasEffects(e):this.testValue?this.consequent.hasEffects(e):null!==this.alternate&&this.alternate.hasEffects(e))}include(e){if(this.included=!0,e)return this.test.include(e),this.consequent.include(e),void(null!==this.alternate&&this.alternate.include(e));const t=this.testValue===Ie;(t||this.test.shouldBeIncluded())&&this.test.include(!1),(t||this.testValue)&&this.consequent.shouldBeIncluded()&&this.consequent.include(!1),null===this.alternate||!t&&this.testValue||!this.alternate.shouldBeIncluded()||this.alternate.include(!1)}render(e,t){if(this.test.included||(this.testValue?null!==this.alternate&&this.alternate.included:this.consequent.included))this.test.included?this.test.render(e,t):e.overwrite(this.test.start,this.test.end,this.testValue?"true":"false"),this.consequent.included?this.consequent.render(e,t):e.overwrite(this.consequent.start,this.consequent.end,";"),null!==this.alternate&&(this.alternate.included?this.alternate.render(e,t):e.remove(this.consequent.end,this.alternate.end));else{const n=this.testValue?this.consequent:this.alternate;e.remove(this.start,n.start),e.remove(n.end,this.end),ue(this,e),n.render(e,t)}}},ImportDeclaration:ga,ImportExpression:class extends Ws{constructor(){super(...arguments),this.exportMode="auto"}hasEffects(){return!0}include(e){this.included||(this.included=!0,this.context.includeDynamicImport(this)),this.source.include(e)}initialise(){this.context.addDynamicImport(this)}render(e,t){if(this.inlineNamespace){const n=t.compact?"":" ",i=t.compact?"":";";return void e.overwrite(this.start,this.end,`Promise.resolve().then(function${n}()${n}{${n}return ${this.inlineNamespace.getName()}${i}${n}})`)}const n=this.getDynamicImportMechanism(t);n&&(e.overwrite(this.start,le(e.original,"(",this.start+6)+1,n.left),e.overwrite(this.end-1,this.end,n.right)),this.source.render(e,t)}renderFinalResolution(e,t,n){this.included&&("amd"===n&&t.startsWith("'.")&&t.endsWith(".js'")&&(t=t.slice(0,-4)+"'"),e.overwrite(this.source.start,this.source.end,t))}setResolution(e,t){this.exportMode=e,t?this.inlineNamespace=t:(this.scope.addAccessedGlobalsByFormat({amd:["require"],cjs:["require"],system:["module"]}),"auto"===e&&this.scope.addAccessedGlobalsByFormat({amd:[yo],cjs:[yo]}))}getDynamicImportMechanism(e){switch(e.format){case"cjs":{const t=e.compact?"":" ",n=e.compact?"c":"resolve";switch(this.exportMode){case"default":return{left:`new Promise(function${t}(${n})${t}{${t}${n}({${t}'default':${t}require(`,right:`)${t}});${t}})`};case"auto":return{left:`new Promise(function${t}(${n})${t}{${t}${n}(${yo}(require(`,right:`)));${t}})`};default:return{left:`new Promise(function${t}(${n})${t}{${t}${n}(require(`,right:`));${t}})`}}}case"amd":{const t=e.compact?"":" ",n=e.compact?"c":"resolve",i=e.compact?"e":"reject";return{left:`new Promise(function${t}(${n},${t}${i})${t}{${t}require([`,right:`],${t}${"default"===this.exportMode?`function${t}(m)${t}{${t}${n}({${t}'default':${t}m${t}});${t}}`:"auto"===this.exportMode?`function${t}(m)${t}{${t}${n}(${yo}(m));${t}}`:n},${t}${i})${t}})`}}case"system":return{left:"module.import(",right:")"};case"es":if(e.dynamicImportFunction)return{left:`${e.dynamicImportFunction}(`,right:")"}}return null}},LabeledStatement:class extends Ws{hasEffects(e){return this.body.hasEffects(e.setIgnoreLabel(this.label.name).setIgnoreBreakStatements())}},Literal:ya,LogicalExpression:class extends Ws{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.isBranchResolutionAnalysed=!1,this.unusedBranch=null,this.usedBranch=null}bind(){super.bind(),this.isBranchResolutionAnalysed||this.analyseBranchResolution()}deoptimizeCache(){if(null!==this.usedBranch){this.usedBranch=null,this.unusedBranch.deoptimizePath(Ae);for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&(this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?(this.left.deoptimizePath(e),this.right.deoptimizePath(e)):this.usedBranch.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?Ie:(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getLiteralValueAtPath(e,t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?new da([this.left.getReturnExpressionWhenCalledAtPath(e,t,n),this.right.getReturnExpressionWhenCalledAtPath(e,t,n)]):(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getReturnExpressionWhenCalledAtPath(e,t,n))}hasEffects(e){return null===this.usedBranch?this.left.hasEffects(e)||this.right.hasEffects(e):this.usedBranch.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null===this.usedBranch?this.left.hasEffectsWhenAccessedAtPath(e,t)||this.right.hasEffectsWhenAccessedAtPath(e,t):this.usedBranch.hasEffectsWhenAccessedAtPath(e,t))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||(null===this.usedBranch?this.left.hasEffectsWhenAssignedAtPath(e,t)||this.right.hasEffectsWhenAssignedAtPath(e,t):this.usedBranch.hasEffectsWhenAssignedAtPath(e,t))}hasEffectsWhenCalledAtPath(e,t,n){return null===this.usedBranch?this.left.hasEffectsWhenCalledAtPath(e,t,n)||this.right.hasEffectsWhenCalledAtPath(e,t,n):this.usedBranch.hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0,e||null===this.usedBranch||this.unusedBranch.shouldBeIncluded()?(this.left.include(e),this.right.include(e)):this.usedBranch.include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=Y){if(this.left.included&&this.right.included)super.render(e,t);else{const s=le(e.original,this.operator,this.left.end);this.right.included?(e.remove(this.start,s+2),r&&me(e,s+2,this.right.start)):e.remove(s,this.end),ue(this,e),this.usedBranch.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type})}}analyseBranchResolution(){this.isBranchResolutionAnalysed=!0;const e=this.left.getLiteralValueAtPath(Se,ha,this);e!==Ie&&(("||"===this.operator?e:!e)?(this.usedBranch=this.left,this.unusedBranch=this.right):(this.usedBranch=this.right,this.unusedBranch=this.left))}},MemberExpression:xa,MetaProperty:class extends Ws{hasEffects(){return!1}hasEffectsWhenAccessedAtPath(e){return e.length>1}include(){if(!this.included){this.included=!0;const e=this.parent,t=this.metaProperty=e instanceof xa&&"string"==typeof e.propertyKey?e.propertyKey:null;t&&("url"===t?this.scope.addAccessedGlobalsByFormat(Oa):(t.startsWith(Va)||t.startsWith(La)||t.startsWith(Da))&&this.scope.addAccessedGlobalsByFormat(Ma))}}initialise(){"import"===this.meta.name&&this.context.addImportMeta(this)}renderFinalMechanism(e,t,n,i){if(!this.included)return;const r=this.parent,s=this.metaProperty;if(s&&(s.startsWith(Va)||s.startsWith(La)||s.startsWith(Da))){let o,a=null,h=null,u=null;s.startsWith(Va)?(a=s.substr(Va.length),o=this.context.getFileName(a)):s.startsWith(La)?(this.context.warnDeprecation(`Using the "${La}" prefix to reference files is deprecated. Use the "${Va}" prefix instead.`,!1),h=s.substr(La.length),o=this.context.getFileName(h)):(this.context.warnDeprecation(`Using the "${Da}" prefix to reference files is deprecated. Use the "${Va}" prefix instead.`,!1),u=s.substr(Da.length),o=this.context.getFileName(u));const c=lt(mt(dt(t),o));let l;return null!==h&&(l=i.hookFirstSync("resolveAssetUrl",[{assetFileName:o,chunkId:t,format:n,moduleId:this.context.module.id,relativeAssetPath:c}])),l||(l=i.hookFirstSync("resolveFileUrl",[{assetReferenceId:h,chunkId:t,chunkReferenceId:u,fileName:o,format:n,moduleId:this.context.module.id,referenceId:a||h||u,relativePath:c}])),void e.overwrite(r.start,r.end,l,{contentOnly:!0})}const o=i.hookFirstSync("resolveImportMeta",[s,{chunkId:t,format:n,moduleId:this.context.module.id}]);"string"==typeof o&&(r instanceof xa?e.overwrite(r.start,r.end,o,{contentOnly:!0}):e.overwrite(this.start,this.end,o,{contentOnly:!0}))}},MethodDefinition:class extends Ws{hasEffects(e){return this.key.hasEffects(e)}hasEffectsWhenCalledAtPath(e,t,n){return e.length>0||this.value.hasEffectsWhenCalledAtPath(Se,t,n)}},NewExpression:class extends Ws{bind(){super.bind();for(const e of this.arguments)e.deoptimizePath(Ae)}hasEffects(e){for(const t of this.arguments)if(t.hasEffects(e))return!0;return!this.annotatedPure&&this.callee.hasEffectsWhenCalledAtPath(Se,this.callOptions,e.getHasEffectsWhenCalledOptions())}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}initialise(){this.callOptions=_e.create({args:this.arguments,callIdentifier:this,withNew:!0})}},ObjectExpression:class extends Ws{constructor(){super(...arguments),this.deoptimizedPaths=new Set,this.expressionsToBeDeoptimized=new Map,this.hasUnknownDeoptimizedProperty=!1,this.propertyMap=null,this.unmatchablePropertiesRead=[],this.unmatchablePropertiesWrite=[]}bind(){super.bind(),null===this.propertyMap&&this.buildPropertyMap()}deoptimizeCache(){this.hasUnknownDeoptimizedProperty||this.deoptimizeAllProperties()}deoptimizePath(e){if(this.hasUnknownDeoptimizedProperty)return;if(null===this.propertyMap&&this.buildPropertyMap(),0===e.length)return void this.deoptimizeAllProperties();const t=e[0];if(1===e.length){if("string"!=typeof t)return void this.deoptimizeAllProperties();if(!this.deoptimizedPaths.has(t)){this.deoptimizedPaths.add(t);const e=this.expressionsToBeDeoptimized.get(t);if(e)for(const t of e)t.deoptimizeCache()}}const n=1===e.length?Ae:e.slice(1);for(const e of"string"==typeof t?this.propertyMap[t]?this.propertyMap[t].propertiesRead:[]:this.properties)e.deoptimizePath(n)}getLiteralValueAtPath(e,t,n){null===this.propertyMap&&this.buildPropertyMap();const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i))return Ie;if(1===e.length&&!this.propertyMap[i]&&!He[i]&&0===this.unmatchablePropertiesRead.length){const e=this.expressionsToBeDeoptimized.get(i);return void(e?e.push(n):this.expressionsToBeDeoptimized.set(i,[n]))}if(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead||this.propertyMap[i].propertiesRead.length>1)return Ie;const r=this.expressionsToBeDeoptimized.get(i);return r?r.push(n):this.expressionsToBeDeoptimized.set(i,[n]),this.propertyMap[i].exactMatchRead.getLiteralValueAtPath(e.slice(1),t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){null===this.propertyMap&&this.buildPropertyMap();const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i))return we;if(1===e.length&&He[i]&&0===this.unmatchablePropertiesRead.length&&(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead))return Je(He,i);if(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead||this.propertyMap[i].propertiesRead.length>1)return we;const r=this.expressionsToBeDeoptimized.get(i);return r?r.push(n):this.expressionsToBeDeoptimized.set(i,[n]),this.propertyMap[i].exactMatchRead.getReturnExpressionWhenCalledAtPath(e.slice(1),t,n)}hasEffectsWhenAccessedAtPath(e,t){if(0===e.length)return!1;const n=e[0];if(e.length>1&&(this.hasUnknownDeoptimizedProperty||"string"!=typeof n||this.deoptimizedPaths.has(n)||!this.propertyMap[n]||null===this.propertyMap[n].exactMatchRead))return!0;const i=e.slice(1);for(const e of"string"!=typeof n?this.properties:this.propertyMap[n]?this.propertyMap[n].propertiesRead:[])if(e.hasEffectsWhenAccessedAtPath(i,t))return!0;return!1}hasEffectsWhenAssignedAtPath(e,t){if(0===e.length)return!1;const n=e[0];if(e.length>1&&(this.hasUnknownDeoptimizedProperty||"string"!=typeof n||this.deoptimizedPaths.has(n)||!this.propertyMap[n]||null===this.propertyMap[n].exactMatchRead))return!0;const i=e.slice(1);for(const r of"string"!=typeof n?this.properties:e.length>1?this.propertyMap[n].propertiesRead:this.propertyMap[n]?this.propertyMap[n].propertiesSet:[])if(r.hasEffectsWhenAssignedAtPath(i,t))return!0;return!1}hasEffectsWhenCalledAtPath(e,t,n){const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i)||(this.propertyMap[i]?!this.propertyMap[i].exactMatchRead:e.length>1||!He[i]))return!0;const r=e.slice(1);for(const e of this.propertyMap[i]?this.propertyMap[i].propertiesRead:[])if(e.hasEffectsWhenCalledAtPath(r,t,n))return!0;return!(1!==e.length||!He[i])&&Qe(He,i,this.included,t,n)}render(e,t,{renderedParentType:n}=Y){super.render(e,t),n===Z&&(e.appendRight(this.start,"("),e.prependLeft(this.end,")"))}buildPropertyMap(){this.propertyMap=Object.create(null);for(let e=this.properties.length-1;e>=0;e--){const t=this.properties[e];if(t instanceof Ba){this.unmatchablePropertiesRead.push(t);continue}const n="get"!==t.kind,i="set"!==t.kind;let r;if(t.computed){const e=t.key.getLiteralValueAtPath(Se,ha,this);if(e===Ie){i?this.unmatchablePropertiesRead.push(t):this.unmatchablePropertiesWrite.push(t);continue}r=String(e)}else r=t.key instanceof ao?t.key.name:String(t.key.value);const s=this.propertyMap[r];s?(i&&null===s.exactMatchRead&&(s.exactMatchRead=t,s.propertiesRead.push(t,...this.unmatchablePropertiesRead)),n&&!i&&null===s.exactMatchWrite&&(s.exactMatchWrite=t,s.propertiesSet.push(t,...this.unmatchablePropertiesWrite))):this.propertyMap[r]={exactMatchRead:i?t:null,exactMatchWrite:n?t:null,propertiesRead:i?[t,...this.unmatchablePropertiesRead]:[],propertiesSet:n&&!i?[t,...this.unmatchablePropertiesWrite]:[]}}}deoptimizeAllProperties(){this.hasUnknownDeoptimizedProperty=!0;for(const e of this.properties)e.deoptimizePath(Ae);for(const e of this.expressionsToBeDeoptimized.values())for(const t of e)t.deoptimizeCache()}},ObjectPattern:class extends Ws{addExportedVariables(e){for(const t of this.properties)t.type===se?t.value.addExportedVariables(e):t.argument.addExportedVariables(e)}declare(e,t){const n=[];for(const i of this.properties)n.push(...i.declare(e,t));return n}deoptimizePath(e){if(0===e.length)for(const t of this.properties)t.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){if(e.length>0)return!0;for(const e of this.properties)if(e.hasEffectsWhenAssignedAtPath(Se,t))return!0;return!1}},Program:za,Property:class extends Ws{constructor(){super(...arguments),this.declarationInit=null,this.returnExpression=null}bind(){super.bind(),"get"===this.kind&&null===this.returnExpression&&this.updateReturnExpression(),null!==this.declarationInit&&this.declarationInit.deoptimizePath([be,be])}declare(e,t){return this.declarationInit=t,this.value.declare(e,we)}deoptimizeCache(){throw new Error("Unexpected deoptimization")}deoptimizePath(e){"get"===this.kind?e.length>0&&(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.deoptimizePath(e)):"set"!==this.kind&&this.value.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return"set"===this.kind?Ie:"get"===this.kind?(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.getLiteralValueAtPath(e,t,n)):this.value.getLiteralValueAtPath(e,t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){return"set"===this.kind?we:"get"===this.kind?(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.getReturnExpressionWhenCalledAtPath(e,t,n)):this.value.getReturnExpressionWhenCalledAtPath(e,t,n)}hasEffects(e){return this.key.hasEffects(e)||this.value.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return"get"===this.kind?this.value.hasEffectsWhenCalledAtPath(Se,this.accessorCallOptions,t.getHasEffectsWhenCalledOptions())||e.length>0&&this.returnExpression.hasEffectsWhenAccessedAtPath(e,t):this.value.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return"get"===this.kind?0===e.length||this.returnExpression.hasEffectsWhenAssignedAtPath(e,t):"set"===this.kind?e.length>0||this.value.hasEffectsWhenCalledAtPath(Se,this.accessorCallOptions,t.getHasEffectsWhenCalledOptions()):this.value.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return"get"===this.kind?this.returnExpression.hasEffectsWhenCalledAtPath(e,t,n):this.value.hasEffectsWhenCalledAtPath(e,t,n)}initialise(){this.accessorCallOptions=_e.create({callIdentifier:this,withNew:!1})}render(e,t){this.shorthand||this.key.render(e,t),this.value.render(e,t,{isShorthandProperty:this.shorthand})}updateReturnExpression(){this.returnExpression=we,this.returnExpression=this.value.getReturnExpressionWhenCalledAtPath(Se,ha,this)}},RestElement:ho,ReturnStatement:class extends Ws{hasEffects(e){return!e.ignoreReturnAwaitYield()||null!==this.argument&&this.argument.hasEffects(e)}initialise(){this.scope.addReturnExpression(this.argument||we)}render(e,t){this.argument&&(this.argument.render(e,t,{preventASI:!0}),this.argument.start===this.start+6&&e.prependLeft(this.start+6," "))}},SequenceExpression:class extends Ws{deoptimizePath(e){e.length>0&&this.expressions[this.expressions.length-1].deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.expressions[this.expressions.length-1].getLiteralValueAtPath(e,t,n)}hasEffects(e){for(const t of this.expressions)if(t.hasEffects(e))return!0;return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.expressions[this.expressions.length-1].hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||this.expressions[this.expressions.length-1].hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return this.expressions[this.expressions.length-1].hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0;for(let t=0;t<this.expressions.length-1;t++){const n=this.expressions[t];(e||n.shouldBeIncluded())&&n.include(e)}this.expressions[this.expressions.length-1].include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=Y){let s=0;for(const{node:o,start:a,end:h}of fe(this.expressions,e,this.start,this.end))o.included?(1===++s&&r&&me(e,a,o.start),o===this.expressions[this.expressions.length-1]&&1===s?o.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type}):o.render(e,t)):he(o,e,a,h)}},SpreadElement:Ba,SwitchCase:class extends Ws{include(e){this.included=!0,this.test&&this.test.include(e);for(const t of this.consequent)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){if(this.consequent.length){this.test&&this.test.render(e,t);const n=this.test?this.test.end:le(e.original,"default",this.start)+7,i=le(e.original,":",n)+1;de(this.consequent,e,i,this.end,t)}else super.render(e,t)}},SwitchStatement:class extends Ws{createScope(e){this.scope=new na(e)}hasEffects(e){return super.hasEffects(e.setIgnoreBreakStatements())}},TaggedTemplateExpression:class extends Ws{bind(){if(super.bind(),this.tag.type===te){this.scope.findVariable(this.tag.name).isNamespace&&this.context.error({code:"CANNOT_CALL_NAMESPACE",message:`Cannot call a namespace ('${this.tag.name}')`},this.start),"eval"===this.tag.name&&this.context.warn({code:"EVAL",message:"Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification",url:"https://rollupjs.org/guide/en/#avoiding-eval"},this.start)}}hasEffects(e){return super.hasEffects(e)||this.tag.hasEffectsWhenCalledAtPath(Se,this.callOptions,e.getHasEffectsWhenCalledOptions())}initialise(){this.callOptions=_e.create({callIdentifier:this,withNew:!1})}},TemplateElement:class extends Ws{hasEffects(e){return!1}},TemplateLiteral:Wa,ThisExpression:class extends Ws{bind(){super.bind(),this.variable=this.scope.findVariable("this")}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.variable.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return this.variable.hasEffectsWhenAssignedAtPath(e,t)}initialise(){this.alias=this.scope.findLexicalBoundary()instanceof ja?this.context.moduleContext:null,"undefined"===this.alias&&this.context.warn({code:"THIS_IS_UNDEFINED",message:"The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten",url:"https://rollupjs.org/guide/en/#error-this-is-undefined"},this.start)}render(e,t){null!==this.alias&&e.overwrite(this.start,this.end,this.alias,{contentOnly:!1,storeName:!0})}},ThrowStatement:class extends Ws{hasEffects(e){return!0}render(e,t){this.argument.render(e,t,{preventASI:!0})}},TryStatement:class extends Ws{constructor(){super(...arguments),this.directlyIncluded=!1}hasEffects(e){return this.block.body.length>0||null!==this.handler&&this.handler.hasEffects(e)||null!==this.finalizer&&this.finalizer.hasEffects(e)}include(e){this.directlyIncluded&&this.context.tryCatchDeoptimization||(this.included=!0,this.directlyIncluded=!0,this.block.include(this.context.tryCatchDeoptimization?Bs:e)),null!==this.handler&&this.handler.include(e),null!==this.finalizer&&this.finalizer.include(e)}},UnaryExpression:class extends Ws{bind(){super.bind(),"delete"===this.operator&&this.argument.deoptimizePath(Se)}getLiteralValueAtPath(e,t,n){if(e.length>0)return Ie;const i=this.argument.getLiteralValueAtPath(Se,t,n);return i===Ie?Ie:Fa[this.operator](i)}hasEffects(e){return!("typeof"===this.operator&&this.argument instanceof ao)&&(this.argument.hasEffects(e)||"delete"===this.operator&&this.argument.hasEffectsWhenAssignedAtPath(Se,e))}hasEffectsWhenAccessedAtPath(e,t){return"void"===this.operator?e.length>0:e.length>1}},UnknownNode:class extends Ws{hasEffects(e){return!0}include(){super.include(!0)}},UpdateExpression:class extends Ws{bind(){if(super.bind(),this.argument.deoptimizePath(Se),this.argument instanceof ao){this.scope.findVariable(this.argument.name).isReassigned=!0}}hasEffects(e){return this.argument.hasEffects(e)||this.argument.hasEffectsWhenAssignedAtPath(Se,e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}render(e,t){this.argument.render(e,t);const n=this.argument.variable;if("system"===t.format&&n&&n.exportName){const t=n.getName();if(this.prefix)e.overwrite(this.start,this.end,`exports('${n.exportName}', ${this.operator}${t})`);else{let i;switch(this.operator){case"++":i=`${t} + 1`;break;case"--":i=`${t} - 1`}e.overwrite(this.start,this.end,`(exports('${n.exportName}', ${i}), ${t}${this.operator})`)}}}},VariableDeclaration:class extends Ws{deoptimizePath(e){for(const e of this.declarations)e.deoptimizePath(Se)}hasEffectsWhenAssignedAtPath(e,t){return!1}include(e){this.included=!0;for(const t of this.declarations)(e||t.shouldBeIncluded())&&t.include(e)}includeWithAllDeclaredVariables(e){this.included=!0;for(const t of this.declarations)t.include(e)}initialise(){for(const e of this.declarations)e.declareDeclarator(this.kind)}render(e,t,n=Y){if(function(e){for(const t of e){if(!t.included)return!1;if(t.id.type===te){if(t.id.variable.exportName)return!1}else{const e=[];if(t.id.addExportedVariables(e),e.length>0)return!1}}return!0}(this.declarations)){for(const n of this.declarations)n.render(e,t);n.isNoStatement||59===e.original.charCodeAt(this.end-1)||e.appendLeft(this.end,";")}else this.renderReplacedDeclarations(e,t,n)}renderDeclarationEnd(e,t,n,i,r,s,o){59===e.original.charCodeAt(this.end-1)&&e.remove(this.end-1,this.end),s&&(t+=";"),null!==n?(10!==e.original.charCodeAt(i-1)||10!==e.original.charCodeAt(this.end)&&13!==e.original.charCodeAt(this.end)||(i--,13===e.original.charCodeAt(i)&&i--),i===n+1?e.overwrite(n,r,t):(e.overwrite(n,n+1,t),e.remove(i,r))):e.appendLeft(r,t),o.length>0&&e.appendLeft(r," "+sa(o))}renderReplacedDeclarations(e,t,{start:n=this.start,end:i=this.end,isNoStatement:r}){const s=fe(this.declarations,e,this.start+this.kind.length,this.end-(59===e.original.charCodeAt(this.end-1)?1:0));let o,a,h=(a=/\n\s*$/.test(e.slice(this.start,s[0].start))?this.start+this.kind.length:s[0].start)-1;e.remove(this.start,h);let u,c,l=!1,p=!1,d="";const f=[];for(const{node:n,start:i,separator:r,contentEnd:m,end:g}of s)!n.included||n.id instanceof ao&&Ua(n.id.variable)&&null===n.init?e.remove(i,g):(u="",c="",n.id instanceof ao&&Ua(n.id.variable)?(p&&(d+=";"),l=!1):("system"===t.format&&null!==n.init&&(n.id.type!==te?n.id.addExportedVariables(f):n.id.variable.exportName&&(e.prependLeft(e.original.indexOf("=",n.id.end)+1,` exports('${n.id.variable.safeExportName||n.id.variable.exportName}',`),c+=")")),l?d+=",":(p&&(d+=";"),u+=`${this.kind} `,l=!0)),a===h+1?e.overwrite(h,a,d+u):(e.overwrite(h,h+1,d),e.appendLeft(a,u)),n.render(e,t),o=m,a=g,p=!0,h=r,d=c);p?this.renderDeclarationEnd(e,d,h,o,a,!r,f):e.remove(n,i)}},VariableDeclarator:class extends Ws{declareDeclarator(e){this.id.declare(e,this.init||Pe)}deoptimizePath(e){this.id.deoptimizePath(e)}render(e,t){null===this.init||this.init.included?super.render(e,t):(e.remove(this.id.end,this.end),this.id.render(e,t))}},WhileStatement:class extends Ws{hasEffects(e){return this.test.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}},YieldExpression:class extends Ws{bind(){super.bind(),null!==this.argument&&this.argument.deoptimizePath(Ae)}hasEffects(e){return!e.ignoreReturnAwaitYield()||null!==this.argument&&this.argument.hasEffects(e)}render(e,t){this.argument&&(this.argument.render(e,t),this.argument.start===this.start+5&&e.prependLeft(this.start+5," "))}}};function Ha(e,t,n){n(e,t)}function qa(e,t,n){}var Ka={};function Ya(e,t,n=e.type){let i=t.commentNodes[t.commentIndex];for(;i&&e.start>=i.end;)Xa(e,i),i=t.commentNodes[++t.commentIndex];i&&i.end<=e.end&&Ka[n](e,t,Ya)}function Xa(e,t){e.annotations?e.annotations.push(t):e.annotations=[t],"ExpressionStatement"===e.type&&(e=e.expression),"CallExpression"!==e.type&&"NewExpression"!==e.type||(e.annotatedPure=!0)}Ka.Program=Ka.BlockStatement=function(e,t,n){for(var i=0,r=e.body;i<r.length;i+=1){n(r[i],t,"Statement")}},Ka.Statement=Ha,Ka.EmptyStatement=qa,Ka.ExpressionStatement=Ka.ParenthesizedExpression=function(e,t,n){return n(e.expression,t,"Expression")},Ka.IfStatement=function(e,t,n){n(e.test,t,"Expression"),n(e.consequent,t,"Statement"),e.alternate&&n(e.alternate,t,"Statement")},Ka.LabeledStatement=function(e,t,n){return n(e.body,t,"Statement")},Ka.BreakStatement=Ka.ContinueStatement=qa,Ka.WithStatement=function(e,t,n){n(e.object,t,"Expression"),n(e.body,t,"Statement")},Ka.SwitchStatement=function(e,t,n){n(e.discriminant,t,"Expression");for(var i=0,r=e.cases;i<r.length;i+=1){var s=r[i];s.test&&n(s.test,t,"Expression");for(var o=0,a=s.consequent;o<a.length;o+=1){n(a[o],t,"Statement")}}},Ka.SwitchCase=function(e,t,n){e.test&&n(e.test,t,"Expression");for(var i=0,r=e.consequent;i<r.length;i+=1){n(r[i],t,"Statement")}},Ka.ReturnStatement=Ka.YieldExpression=Ka.AwaitExpression=function(e,t,n){e.argument&&n(e.argument,t,"Expression")},Ka.ThrowStatement=Ka.SpreadElement=function(e,t,n){return n(e.argument,t,"Expression")},Ka.TryStatement=function(e,t,n){n(e.block,t,"Statement"),e.handler&&n(e.handler,t),e.finalizer&&n(e.finalizer,t,"Statement")},Ka.CatchClause=function(e,t,n){e.param&&n(e.param,t,"Pattern"),n(e.body,t,"Statement")},Ka.WhileStatement=Ka.DoWhileStatement=function(e,t,n){n(e.test,t,"Expression"),n(e.body,t,"Statement")},Ka.ForStatement=function(e,t,n){e.init&&n(e.init,t,"ForInit"),e.test&&n(e.test,t,"Expression"),e.update&&n(e.update,t,"Expression"),n(e.body,t,"Statement")},Ka.ForInStatement=Ka.ForOfStatement=function(e,t,n){n(e.left,t,"ForInit"),n(e.right,t,"Expression"),n(e.body,t,"Statement")},Ka.ForInit=function(e,t,n){"VariableDeclaration"===e.type?n(e,t):n(e,t,"Expression")},Ka.DebuggerStatement=qa,Ka.FunctionDeclaration=function(e,t,n){return n(e,t,"Function")},Ka.VariableDeclaration=function(e,t,n){for(var i=0,r=e.declarations;i<r.length;i+=1){n(r[i],t)}},Ka.VariableDeclarator=function(e,t,n){n(e.id,t,"Pattern"),e.init&&n(e.init,t,"Expression")},Ka.Function=function(e,t,n){e.id&&n(e.id,t,"Pattern");for(var i=0,r=e.params;i<r.length;i+=1){n(r[i],t,"Pattern")}n(e.body,t,e.expression?"Expression":"Statement")},Ka.Pattern=function(e,t,n){"Identifier"===e.type?n(e,t,"VariablePattern"):"MemberExpression"===e.type?n(e,t,"MemberPattern"):n(e,t)},Ka.VariablePattern=qa,Ka.MemberPattern=Ha,Ka.RestElement=function(e,t,n){return n(e.argument,t,"Pattern")},Ka.ArrayPattern=function(e,t,n){for(var i=0,r=e.elements;i<r.length;i+=1){var s=r[i];s&&n(s,t,"Pattern")}},Ka.ObjectPattern=function(e,t,n){for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];"Property"===s.type?(s.computed&&n(s.key,t,"Expression"),n(s.value,t,"Pattern")):"RestElement"===s.type&&n(s.argument,t,"Pattern")}},Ka.Expression=Ha,Ka.ThisExpression=Ka.Super=Ka.MetaProperty=qa,Ka.ArrayExpression=function(e,t,n){for(var i=0,r=e.elements;i<r.length;i+=1){var s=r[i];s&&n(s,t,"Expression")}},Ka.ObjectExpression=function(e,t,n){for(var i=0,r=e.properties;i<r.length;i+=1){n(r[i],t)}},Ka.FunctionExpression=Ka.ArrowFunctionExpression=Ka.FunctionDeclaration,Ka.SequenceExpression=function(e,t,n){for(var i=0,r=e.expressions;i<r.length;i+=1){n(r[i],t,"Expression")}},Ka.TemplateLiteral=function(e,t,n){for(var i=0,r=e.quasis;i<r.length;i+=1){n(r[i],t)}for(var s=0,o=e.expressions;s<o.length;s+=1){n(o[s],t,"Expression")}},Ka.TemplateElement=qa,Ka.UnaryExpression=Ka.UpdateExpression=function(e,t,n){n(e.argument,t,"Expression")},Ka.BinaryExpression=Ka.LogicalExpression=function(e,t,n){n(e.left,t,"Expression"),n(e.right,t,"Expression")},Ka.AssignmentExpression=Ka.AssignmentPattern=function(e,t,n){n(e.left,t,"Pattern"),n(e.right,t,"Expression")},Ka.ConditionalExpression=function(e,t,n){n(e.test,t,"Expression"),n(e.consequent,t,"Expression"),n(e.alternate,t,"Expression")},Ka.NewExpression=Ka.CallExpression=function(e,t,n){if(n(e.callee,t,"Expression"),e.arguments)for(var i=0,r=e.arguments;i<r.length;i+=1){n(r[i],t,"Expression")}},Ka.MemberExpression=function(e,t,n){n(e.object,t,"Expression"),e.computed&&n(e.property,t,"Expression")},Ka.ExportNamedDeclaration=Ka.ExportDefaultDeclaration=function(e,t,n){e.declaration&&n(e.declaration,t,"ExportNamedDeclaration"===e.type||e.declaration.id?"Statement":"Expression"),e.source&&n(e.source,t,"Expression")},Ka.ExportAllDeclaration=function(e,t,n){n(e.source,t,"Expression")},Ka.ImportDeclaration=function(e,t,n){for(var i=0,r=e.specifiers;i<r.length;i+=1){n(r[i],t)}n(e.source,t,"Expression")},Ka.ImportExpression=function(e,t,n){n(e.source,t,"Expression")},Ka.ImportSpecifier=Ka.ImportDefaultSpecifier=Ka.ImportNamespaceSpecifier=Ka.Identifier=Ka.Literal=qa,Ka.TaggedTemplateExpression=function(e,t,n){n(e.tag,t,"Expression"),n(e.quasi,t,"Expression")},Ka.ClassDeclaration=Ka.ClassExpression=function(e,t,n){return n(e,t,"Class")},Ka.Class=function(e,t,n){e.id&&n(e.id,t,"Pattern"),e.superClass&&n(e.superClass,t,"Expression"),n(e.body,t)},Ka.ClassBody=function(e,t,n){for(var i=0,r=e.body;i<r.length;i+=1){n(r[i],t)}},Ka.MethodDefinition=Ka.Property=function(e,t,n){e.computed&&n(e.key,t,"Expression"),n(e.value,t,"Expression")};const Qa=/[@#]__PURE__/,Ja=e=>Qa.test(e.text);let Za="sourceMa";Za+="ppingURL";const eh=new RegExp(`^#\\s+${Za}=.+\\n?`),th=()=>{};let nh=()=>[0,0],ih=()=>0,rh=()=>0,sh={};const oh=e=>1e3*e[0]+e[1]/1e6;function ah(e,t){switch(t){case 1:return`# ${e}`;case 2:return`## ${e}`;case 3:return e;default:return`${"  ".repeat(t-4)}- ${e}`}}function hh(e,t=3){e=ah(e,t),sh.hasOwnProperty(e)||(sh[e]={memory:0,startMemory:void 0,startTime:void 0,time:0,totalMemory:0});const n=rh();sh[e].startTime=nh(),sh[e].startMemory=n}function uh(e,t=3){if(e=ah(e,t),sh.hasOwnProperty(e)){const t=rh();sh[e].time+=ih(sh[e].startTime),sh[e].totalMemory=Math.max(sh[e].totalMemory,t),sh[e].memory+=t-sh[e].startMemory}}function ch(){const e={};return Object.keys(sh).forEach(t=>{e[t]=[sh[t].time,sh[t].memory,sh[t].totalMemory]}),e}let lh=th,ph=th;const dh={load:!0,ongenerate:!0,onwrite:!0,resolveDynamicImport:!0,resolveId:!0,transform:!0,transformBundle:!0};function fh(e,t){const n={};for(const i of Object.keys(e))if(!0===dh[i]){let r=`plugin ${t}`;e.name&&(r+=` (${e.name})`),r+=` - ${i}`,n[i]=function(){lh(r,4);const t=e[i].apply(this===n?e:this,arguments);return ph(r,4),t&&"function"==typeof t.then&&(lh(`${r} (async)`,4),t.then(()=>ph(`${r} (async)`,4))),t}}else n[i]=e[i];return n}function mh(e){e.perf?(sh={},"undefined"!=typeof process&&"function"==typeof process.hrtime?(nh=process.hrtime.bind(process),ih=e=>oh(process.hrtime(e))):"undefined"!=typeof performance&&"function"==typeof performance.now&&(nh=()=>[performance.now(),0],ih=e=>performance.now()-e[0]),"undefined"!=typeof process&&"function"==typeof process.memoryUsage&&(rh=()=>process.memoryUsage().heapUsed),lh=hh,ph=uh,e.plugins=e.plugins.map(fh)):(lh=th,ph=th)}const gh={ecmaVersion:2020,preserveParens:!1,sourceType:"module"};function yh(e,t,n,i){t.error({code:"MISSING_EXPORT",message:`'${e}' is not exported by ${To(n)}`,url:"https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module"},i)}const vh={identifier:null,localName:mo};class xh{constructor(e,t,n,i){this.chunkFileNames=new Set,this.chunkName=null,this.comments=[],this.dependencies=[],this.dynamicallyImportedBy=[],this.dynamicDependencies=[],this.dynamicImports=[],this.entryPointsHash=new Uint8Array(10),this.execIndex=1/0,this.exportAllModules=null,this.exportAllSources=[],this.exports=Object.create(null),this.exportsAll=Object.create(null),this.exportShimVariable=new vo(this),this.facadeChunk=null,this.importDescriptions=Object.create(null),this.importMetas=[],this.imports=new Set,this.isExecuted=!1,this.isUserDefinedEntryPoint=!1,this.manualChunkAlias=null,this.reexports=Object.create(null),this.sources=[],this.userChunkNames=new Set,this.usesTopLevelAwait=!1,this.namespaceVariable=void 0,this.transformDependencies=[],this.id=t,this.graph=e,this.excludeFromSourcemap=/\0/.test(t),this.context=e.getModuleContext(t),this.moduleSideEffects=n,this.isEntryPoint=i}basename(){const e=pt(this.id),t=ft(this.id);return ot(t?e.slice(0,-t.length):e)}bindReferences(){this.ast.bind()}error(e,t){if(void 0!==t){e.pos=t;let n=St(this.code,t,{offsetLine:1});try{n=function(e,t){const n=e.filter(e=>e.mappings);for(;n.length>0;){const e=n.pop(),i=e.mappings[t.line-1];let r=!1;if(void 0!==i)for(const n of i)if(n[0]>=t.column){if(1===n.length)break;t={column:n[3],line:n[2]+1,name:5===n.length?e.names[n[4]]:void 0,source:e.sources[n[1]]},r=!0;break}if(!r)throw new Error("Can't resolve original location of error.")}return t}(this.sourcemapChain,n)}catch(e){this.warn({code:"SOURCEMAP_ERROR",loc:{column:n.column,file:this.id,line:n.line},message:`Error when using sourcemap for reporting an error: ${e.message}`,pos:t},void 0)}e.loc={column:n.column,file:this.id,line:n.line},e.frame=No(this.originalCode,n.line,n.column)}e.watchFiles=Object.keys(this.graph.watchFiles),Mo(e)}getAllExportNames(){if(this.allExportNames)return this.allExportNames;const e=this.allExportNames=new Set;for(const t of Object.keys(this.exports))e.add(t);for(const t of Object.keys(this.reexports))e.add(t);for(const t of this.exportAllModules)if(t instanceof yt)e.add(`*${t.id}`);else for(const n of t.getAllExportNames())"default"!==n&&e.add(n);return e}getDynamicImportExpressions(){return this.dynamicImports.map(({node:e})=>{const t=e.source;return t instanceof Wa&&1===t.quasis.length&&t.quasis[0].value.cooked?t.quasis[0].value.cooked:t instanceof ya&&"string"==typeof t.value?t.value:t})}getExportNamesByVariable(){const e=new Map;for(const t of this.getAllExportNames()){const n=this.getVariableForExportName(t);if(!n||!(n.included||n instanceof et))continue;const i=e.get(n);i?i.push(t):e.set(n,[t])}return e}getExports(){return Object.keys(this.exports)}getOrCreateNamespace(){return this.namespaceVariable||(this.namespaceVariable=new xo(this.astContext),this.namespaceVariable.initialise()),this.namespaceVariable}getReexports(){if(this.transitiveReexports)return this.transitiveReexports;this.transitiveReexports=[];const e=new Set;for(const t in this.reexports)e.add(t);for(const t of this.exportAllModules)if(t instanceof yt)e.add(`*${t.id}`);else for(const n of t.getExports().concat(t.getReexports()))"default"!==n&&e.add(n);return this.transitiveReexports=Array.from(e)}getRenderedExports(){const e=[],t=[];for(const n in this.exports){const i=this.getVariableForExportName(n);(i&&i.included?e:t).push(n)}return{renderedExports:e,removedExports:t}}getTransitiveDependencies(){return this.dependencies.concat(this.getReexports().map(e=>this.getVariableForExportName(e).module))}getVariableForExportName(e,t){if("*"===e[0]){if(1===e.length)return this.getOrCreateNamespace();return this.graph.moduleById.get(e.slice(1)).getVariableForExportName("*")}const n=this.reexports[e];if(n){const e=n.module.getVariableForExportName(n.localName);return e||yh(n.localName,this,n.module.id,n.start),e}const i=this.exports[e];if(i){if(i===vh)return this.exportShimVariable;const e=i.localName;return this.traceVariable(e)||this.graph.scope.findVariable(e)}if("default"!==e)for(const t of this.exportAllModules){const n=t.getVariableForExportName(e,!0);if(n)return n}if(this.graph.shimMissingExports&&!t)return this.shimMissingExport(e),this.exportShimVariable}include(){this.ast.shouldBeIncluded()&&this.ast.include(!1)}includeAllExports(){this.isExecuted||(this.graph.needsTreeshakingPass=!0,vt(this));for(const e of this.getExports()){const t=this.getVariableForExportName(e);t.deoptimizePath(Ae),t.included||(t.include(),this.graph.needsTreeshakingPass=!0)}for(const e of this.getReexports()){const t=this.getVariableForExportName(e);t.deoptimizePath(Ae),t.included||(t.include(),this.graph.needsTreeshakingPass=!0),t instanceof et&&(t.module.reexported=!0)}}includeAllInBundle(){this.ast.include(!0)}isIncluded(){return this.ast.included||this.namespaceVariable&&this.namespaceVariable.included}linkDependencies(){for(const e of this.sources){const t=this.resolvedIds[e].id;if(t){const e=this.graph.moduleById.get(t);this.dependencies.push(e)}}for(const{resolution:e}of this.dynamicImports)(e instanceof xh||e instanceof yt)&&this.dynamicDependencies.push(e);this.addModulesToSpecifiers(this.importDescriptions),this.addModulesToSpecifiers(this.reexports),this.exportAllModules=this.exportAllSources.map(e=>{const t=this.resolvedIds[e].id;return this.graph.moduleById.get(t)}).sort((e,t)=>{const n=e instanceof yt;return n===t instanceof yt?0:n?1:-1})}render(e){const t=this.magicString.clone();return this.ast.render(t,e),this.usesTopLevelAwait=this.astContext.usesTopLevelAwait,t}setSource({ast:e,code:t,customTransformCache:n,moduleSideEffects:i,originalCode:r,originalSourcemap:s,resolvedIds:o,sourcemapChain:a,transformDependencies:h,transformFiles:u}){var c;this.code=t,this.originalCode=r,this.originalSourcemap=s,this.sourcemapChain=a,u&&(this.transformFiles=u),this.transformDependencies=h,this.customTransformCache=n,"boolean"==typeof i&&(this.moduleSideEffects=i),lh("generate ast",3),this.esTreeAst=e||function(e,t,n){try{return t.parse(e.code,Object.assign(Object.assign(Object.assign({},gh),n),{onComment:(t,n,i,r)=>e.comments.push({block:t,text:n,start:i,end:r})}))}catch(t){let n=t.message.replace(/ \(\d+:\d+\)$/,"");e.id.endsWith(".json")?n+=" (Note that you need rollup-plugin-json to import JSON files)":e.id.endsWith(".js")||(n+=" (Note that you need plugins to import files that are not JavaScript)"),e.error({code:"PARSE_ERROR",message:n},t.pos)}}(this,this.graph.acornParser,this.graph.acornOptions),c=this.comments,Ya(this.esTreeAst,{commentIndex:0,commentNodes:c.filter(Ja)}),ph("generate ast",3),this.resolvedIds=o||Object.create(null);const l=this.id;this.magicString=new G(t,{filename:this.excludeFromSourcemap?null:l,indentExclusionRanges:[]}),this.removeExistingSourceMap(),lh("analyse ast",3),this.astContext={addDynamicImport:this.addDynamicImport.bind(this),addExport:this.addExport.bind(this),addImport:this.addImport.bind(this),addImportMeta:this.addImportMeta.bind(this),annotations:this.graph.treeshakingOptions&&this.graph.treeshakingOptions.annotations,code:t,deoptimizationTracker:this.graph.deoptimizationTracker,error:this.error.bind(this),fileName:l,getExports:this.getExports.bind(this),getFileName:this.graph.pluginDriver.getFileName,getModuleExecIndex:()=>this.execIndex,getModuleName:this.basename.bind(this),getReexports:this.getReexports.bind(this),importDescriptions:this.importDescriptions,includeDynamicImport:this.includeDynamicImport.bind(this),includeVariable:this.includeVariable.bind(this),isCrossChunkImport:e=>e.module.chunk!==this.chunk,magicString:this.magicString,module:this,moduleContext:this.context,nodeConstructors:Ga,preserveModules:this.graph.preserveModules,propertyReadSideEffects:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.propertyReadSideEffects,traceExport:this.getVariableForExportName.bind(this),traceVariable:this.traceVariable.bind(this),treeshake:!!this.graph.treeshakingOptions,tryCatchDeoptimization:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.tryCatchDeoptimization,unknownGlobalSideEffects:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.unknownGlobalSideEffects,usesTopLevelAwait:!1,warn:this.warn.bind(this),warnDeprecation:this.graph.warnDeprecation.bind(this.graph)},this.scope=new ja(this.graph.scope,this.astContext),this.ast=new za(this.esTreeAst,{type:"Module",context:this.astContext},this.scope),ph("analyse ast",3)}toJSON(){return{ast:this.esTreeAst,code:this.code,customTransformCache:this.customTransformCache,dependencies:this.dependencies.map(e=>e.id),id:this.id,moduleSideEffects:this.moduleSideEffects,originalCode:this.originalCode,originalSourcemap:this.originalSourcemap,resolvedIds:this.resolvedIds,sourcemapChain:this.sourcemapChain,transformDependencies:this.transformDependencies,transformFiles:this.transformFiles}}traceVariable(e){const t=this.scope.variables.get(e);if(t)return t;if(e in this.importDescriptions){const t=this.importDescriptions[e],n=t.module;if(n instanceof xh&&"*"===t.name)return n.getOrCreateNamespace();const i=n.getVariableForExportName(t.name);return i||yh(t.name,this,n.id,t.start),i}return null}warn(e,t){if(void 0!==t){e.pos=t;const{line:n,column:i}=St(this.code,t,{offsetLine:1});e.loc={file:this.id,line:n,column:i},e.frame=No(this.code,n,i)}e.id=this.id,this.graph.warn(e)}addDynamicImport(e){this.dynamicImports.push({node:e,resolution:null})}addExport(e){const t=e.source&&e.source.value;if(t)if(-1===this.sources.indexOf(t)&&this.sources.push(t),e.type===J)this.exportAllSources.push(t);else for(const n of e.specifiers){const e=n.exported.name;(this.exports[e]||this.reexports[e])&&this.error({code:"DUPLICATE_EXPORT",message:`A module cannot have multiple exports with the same name ('${e}')`},n.start),this.reexports[e]={localName:n.local.name,module:null,source:t,start:n.start}}else if(e instanceof po)this.exports.default&&this.error({code:"DUPLICATE_EXPORT",message:"A module can only have one default export"},e.start),this.exports.default={identifier:e.variable.getAssignedVariableName(),localName:"default"};else if(e.declaration){const t=e.declaration;if(t.type===ae)for(const e of t.declarations)for(const t of ta(e.id))this.exports[t]={identifier:null,localName:t};else{const e=t.id.name;this.exports[e]={identifier:null,localName:e}}}else for(const t of e.specifiers){const e=t.local.name,n=t.exported.name;(this.exports[n]||this.reexports[n])&&this.error({code:"DUPLICATE_EXPORT",message:`A module cannot have multiple exports with the same name ('${n}')`},t.start),this.exports[n]={identifier:null,localName:e}}}addImport(e){const t=e.source.value;-1===this.sources.indexOf(t)&&this.sources.push(t);for(const n of e.specifiers){const e=n.local.name;this.importDescriptions[e]&&this.error({code:"DUPLICATE_IMPORT",message:`Duplicated import '${e}'`},n.start);const i=n.type===ne,r=n.type===ie,s=i?"default":r?"*":n.imported.name;this.importDescriptions[e]={source:t,start:n.start,name:s,module:null}}}addImportMeta(e){this.importMetas.push(e)}addModulesToSpecifiers(e){for(const t of Object.keys(e)){const n=e[t],i=this.resolvedIds[n.source].id;n.module=this.graph.moduleById.get(i)}}includeDynamicImport(e){const t=this.dynamicImports.find(t=>t.node===e).resolution;t instanceof xh&&(t.dynamicallyImportedBy.push(this),t.includeAllExports())}includeVariable(e){const t=e.module;e.included||(e.include(),this.graph.needsTreeshakingPass=!0),t&&t!==this&&this.imports.add(e)}removeExistingSourceMap(){for(const e of this.comments)!e.block&&eh.test(e.text)&&this.magicString.remove(e.start,e.end)}shimMissingExport(e){this.exports[e]||(this.graph.warn({code:"SHIMMED_EXPORT",exporter:To(this.id),exportName:e,message:`Missing export "${e}" has been shimmed in module ${To(this.id)}.`}),this.exports[e]=vh)}}class Eh{constructor(e,t){this.isOriginal=!0,this.filename=e,this.content=t}traceSegment(e,t,n){return{line:e,column:t,name:n,source:this}}}class _h{constructor(e,t){this.sources=t,this.names=e.names,this.mappings=e.mappings}traceMappings(){const e=[],t=[],n=[],i=[];for(const r of this.mappings){const s=[];for(const i of r){if(1==i.length)continue;const r=this.sources[i[1]];if(!r)continue;const o=r.traceSegment(i[2],i[3],5===i.length?this.names[i[4]]:"");if(o){let r=e.lastIndexOf(o.source.filename);-1===r?(r=e.length,e.push(o.source.filename),t[r]=o.source.content):null==t[r]?t[r]=o.source.content:null!=o.source.content&&t[r]!==o.source.content&&Mo({message:`Multiple conflicting contents for sourcemap source ${o.source.filename}`});const a=[i[0],r,o.line,o.column];if(o.name){let e=n.indexOf(o.name);-1===e&&(e=n.length,n.push(o.name)),a[4]=e}s.push(a)}}i.push(s)}return{sources:e,sourcesContent:t,names:n,mappings:i}}traceSegment(e,t,n){const i=this.mappings[e];if(!i)return null;let r=0,s=i.length-1;for(;r<=s;){const e=r+s>>1,o=i[e];if(o[0]===t){if(1==o.length)return null;const e=this.sources[o[1]];return e?e.traceSegment(o[2],o[3],5===o.length?this.names[o[4]]:n):null}o[0]>t?s=e-1:r=e+1}return null}}function bh(e){return function(t,n){return n.mappings?new _h(n,[t]):(e.warn({code:"SOURCEMAP_BROKEN",message:`Sourcemap is likely to be incorrect: a plugin${n.plugin?` ('${n.plugin}')`:""} was used to transform files, but didn't generate a sourcemap for the transformation. Consult the plugin documentation for help`,plugin:n.plugin,url:"https://rollupjs.org/guide/en/#warning-sourcemap-is-likely-to-be-incorrect"}),new _h({mappings:[],names:[]},[t]))}}function Sh(e,t,n,i,r){let s;if(n){const t=n.sources,i=n.sourcesContent||[],r=dt(e)||".",o=n.sourceRoot||".",a=t.map((e,t)=>new Eh(gt(r,o,e),i[t]));s=new _h(n,a)}else s=new Eh(e,t);return i.reduce(r,s)}const Ah={amd:wh,cjs:wh,es:Ih,iife:wh,system:Ih,umd:wh};function Ch(e,t,n,i,r,s,o){!function(e,t,n){for(const i of t){const t=i.scope;for(const[n,i]of t.accessedOutsideVariables)i.included&&e.add(n);const r=t.accessedGlobalVariablesByFormat&&t.accessedGlobalVariablesByFormat.get(n);if(r)for(const t of r)e.add(t)}}(i,e,r),function(e,t){for(const n of t){for(const t of n.scope.variables.values())t.included&&!(t.renderBaseName||t instanceof fo&&t.getOriginalVariable()!==t)&&t.setRenderNames(null,Ee(t.name,e));const t=n.getOrCreateNamespace();t.included&&t.setRenderNames(null,Ee(t.name,e))}}(i,e),Ah[r](i,n,t,s,o);for(const t of e)t.scope.deconflict(r)}function Ih(e,t,n,i){for(const n of t){const t=n.module,r=n.name;let s;s=t instanceof yt&&("*"===r||"default"===r)?"default"===r&&i&&t.exportsNamespace?t.variableName+"__default":t.variableName:r,n.setRenderNames(null,Ee(s,e))}}function wh(e,t,n,i,r){for(const t of n)t.variableName=Ee(t.variableName,e);for(const e of t){const t=e.module;if(t instanceof yt){const n=e.name;"default"===n&&i&&(t.exportsNamespace||t.exportsNames)?e.setRenderNames(null,t.variableName+"__default"):"*"===n||"default"===n?e.setRenderNames(null,t.variableName):e.setRenderNames(t.variableName,null)}else{const n=t.chunk;"default"===n.exportMode||r&&e.isNamespace?e.setRenderNames(null,n.variableName):e.setRenderNames(n.variableName,n.getVariableExportName(e))}}}const Ph=(e,t)=>e.execIndex>t.execIndex?1:-1;function kh(e){e.sort(Ph)}function Nh(e,t,n){const i=[To(e)];let r=t;for(;r!==e&&(i.push(To(r)),r=n[r]););return i.push(i[0]),i.reverse(),i}function $h(e){const t=e.split("\n"),n=t.filter(e=>/^\t+/.test(e)),i=t.filter(e=>/^ {2,}/.test(e));if(0===n.length&&0===i.length)return null;if(n.length>=i.length)return"\t";const r=i.reduce((e,t)=>{const n=/^ +/.exec(t)[0].length;return Math.min(n,e)},1/0);return new Array(r+1).join(" ")}function Rh(e){if(!e)return null;if("string"==typeof e&&(e=JSON.parse(e)),""===e.mappings)return{mappings:[],names:[],sources:[],version:3};let t;return t="string"==typeof e.mappings?function(e){for(var t=0,n=0,i=0,r=0,s=0,o=[],a=[],h=[],u=0,c=0,l=0,p=0,d=e.length;u<d;u++){var f=e.charCodeAt(u);if(44===f)h.length&&a.push(h),h=[],c=0;else if(59===f)h.length&&a.push(h),h=[],c=0,o.push(a),a=[],t=0;else{var m=N[f];if(void 0===m)throw new Error("Invalid character ("+String.fromCharCode(f)+")");var g=32&m;if(p+=(m&=31)<<l,g)l+=5;else{var y=1&p;p>>>=1,y&&0===(p=-p)&&(p=-2147483648),0==c?(t+=p,h.push(t)):1===c?(n+=p,h.push(n)):2===c?(i+=p,h.push(i)):3===c?(r+=p,h.push(r)):4===c&&(s+=p,h.push(s)),c++,p=l=0}}}return h.length&&a.push(h),o.push(a),o}(e.mappings):e.mappings,Object.assign(Object.assign({},e),{mappings:t})}function Th(e,t,n){return Oo(e)?e.replace(/\[(\w+)\]/g,(e,i)=>{if(!n.hasOwnProperty(i))return Mo(zo(`"[${i}]" is not a valid placeholder in "${t}" pattern.`));const r=n[i]();return Oo(r)?r:Mo(zo(`Invalid substitution "${r}" for placeholder "[${i}]" in "${t}" pattern, can be neither absolute nor relative path.`))}):Mo(zo(`Invalid pattern "${e}" for "${t}", patterns can be neither absolute nor relative paths and must not contain invalid characters.`))}function Oh(e,t){if(e in t==!1)return e;const n=ft(e);e=e.substr(0,e.length-n.length);let i,r=1;for(;t[i=e+ ++r+n];);return i}const Mh=[".js",".jsx",".ts",".tsx"];function Lh(e,t,n,i){let r;return"function"==typeof t?r=t(e.id):t&&(r=t[e.id]),r||(i?(n.warn({code:"MISSING_GLOBAL_NAME",guess:e.variableName,message:`No name was provided for external module '${e.id}' in output.globals – guessing '${e.variableName}'`,source:e.id}),e.variableName):void 0)}function Dh(e){return!e.isEmpty||e.entryModules.length>0||null!==e.manualChunkAlias}class Vh{constructor(e,t){this.entryModules=[],this.exportMode="named",this.facadeModule=null,this.id=null,this.indentString=void 0,this.manualChunkAlias=null,this.usedModules=void 0,this.variableName="chunk",this.dependencies=void 0,this.dynamicDependencies=void 0,this.exportNames=Object.create(null),this.exports=new Set,this.fileName=null,this.imports=new Set,this.name=null,this.needsExportsShim=!1,this.renderedDeclarations=void 0,this.renderedHash=void 0,this.renderedModuleSources=new Map,this.renderedSource=null,this.renderedSourceLength=void 0,this.sortedExportNames=null,this.graph=e,this.orderedModules=t,this.execIndex=t.length>0?t[0].execIndex:1/0,this.isEmpty=!0;for(const e of t)this.isEmpty&&e.isIncluded()&&(this.isEmpty=!1),e.manualChunkAlias&&(this.manualChunkAlias=e.manualChunkAlias),e.chunk=this,(e.isEntryPoint||e.dynamicallyImportedBy.some(e=>-1===t.indexOf(e)))&&this.entryModules.push(e);const n=this.entryModules[0]||this.orderedModules[this.orderedModules.length-1];n&&(this.variableName=ot(pt(n.chunkName||n.manualChunkAlias||Ro(n.id))))}static generateFacade(e,t,n){const i=new Vh(e,[]);i.assignFacadeName(n,t),t.facadeChunk||(t.facadeChunk=i),i.dependencies=[t.chunk],i.dynamicDependencies=[],i.facadeModule=t;for(const e of t.getAllExportNames()){const n=t.getVariableForExportName(e);i.exports.add(n),i.exportNames[e]=n}return i}canModuleBeFacade(e){for(const t of this.exports)if(!e.has(t))return!1;return!0}generateFacades(){const e=[];for(const t of this.entryModules){const n=Array.from(t.userChunkNames).map(e=>({name:e}));if(0===n.length&&t.isUserDefinedEntryPoint&&n.push({}),n.push(...Array.from(t.chunkFileNames).map(e=>({fileName:e}))),0===n.length&&n.push({}),!this.facadeModule){const e=t.getExportNamesByVariable();if(this.graph.preserveModules||this.canModuleBeFacade(e)){this.facadeModule=t,t.facadeChunk=this;for(const[t,n]of e)for(const e of n)this.exportNames[e]=t;this.assignFacadeName(n.shift(),t)}}for(const i of n)e.push(Vh.generateFacade(this.graph,t,i))}return e}generateId(e,t,n,i){if(null!==this.fileName)return this.fileName;const[r,s]=this.facadeModule&&this.facadeModule.isUserDefinedEntryPoint?[t.entryFileNames||"[name].js","output.entryFileNames"]:[t.chunkFileNames||"[name]-[hash].js","output.chunkFileNames"];return Oh(Th(r,s,{format:()=>"es"===t.format?"esm":t.format,hash:()=>i?this.computeContentHashWithDependencies(e,t,n):"[hash]",name:()=>this.getChunkName()}),n)}generateIdPreserveModules(e,t,n){const i=this.orderedModules[0].id,r=$o(i);let s;if(ut(i)){const n=ft(i),o=Th(t.entryFileNames||(Mh.includes(n)?"[name].js":"[name][extname].js"),"output.entryFileNames",{ext:()=>n.substr(1),extname:()=>n,format:()=>"es"===t.format?"esm":t.format,name:()=>this.getChunkName()});s=K(e,`${dt(r)}/${o}`)}else s=`_virtual/${pt(r)}`;return Oh(lt(s),n)}generateInternalExports(e){if(null!==this.facadeModule)return;const t="system"===e.format||"es"===e.format||e.compact;let n,i=0;if(this.exportNames=Object.create(null),this.sortedExportNames=null,t)for(const e of this.exports){const t=e.name[0];if(this.exportNames[t]){do{49===(n=ve(++i)).charCodeAt(0)&&(n=ve(i+=9*Math.pow(64,n.length-1)))}while(xe[n]||this.exportNames[n]);this.exportNames[n]=e}else this.exportNames[t]=e}else for(const e of this.exports){for(i=0,n=e.name;this.exportNames[n];)n=e.name+"$"+ ++i;this.exportNames[n]=e}}getChunkName(){return this.name||(this.name=$o(this.getFallbackChunkName()))}getDynamicImportIds(){return this.dynamicDependencies.map(e=>e.id).filter(Boolean)}getExportNames(){return this.sortedExportNames||(this.sortedExportNames=Object.keys(this.exportNames).sort())}getImportIds(){return this.dependencies.map(e=>e.id).filter(Boolean)}getRenderedHash(){if(this.renderedHash)return this.renderedHash;if(!this.renderedSource)return"";const e=k(),t=this.calculateHashAugmentation();return e.update(t),e.update(this.renderedSource.toString()),e.update(this.getExportNames().map(e=>{const t=this.exportNames[e];return`${To(t.module.id).replace(/\\/g,"/")}:${t.name}:${e}`}).join(",")),this.renderedHash=e.digest("hex")}getRenderedSourceLength(){return void 0!==this.renderedSourceLength?this.renderedSourceLength:this.renderedSourceLength=this.renderedSource.length()}getVariableExportName(e){if(this.graph.preserveModules&&e instanceof xo)return"*";for(const t of Object.keys(this.exportNames))if(this.exportNames[t]===e)return t;throw new Error(`Internal Error: Could not find export name for variable ${e.name}.`)}link(){const e=new Set,t=new Set;for(const n of this.orderedModules)this.addDependenciesToChunk(n.getTransitiveDependencies(),e),this.addDependenciesToChunk(n.dynamicDependencies,t),this.setUpChunkImportsAndExportsForModule(n);this.dependencies=Array.from(e),this.dynamicDependencies=Array.from(t)}merge(e,t,n,i){if(null!==this.facadeModule||null!==e.facadeModule)throw new Error("Internal error: Code splitting chunk merges not supported for facades");for(const t of e.orderedModules)t.chunk=this,this.orderedModules.push(t);for(const t of e.imports)this.imports.has(t)||t.module.chunk===this||this.imports.add(t);for(const t of e.exports)this.exports.has(t)||this.exports.add(t);const r=this.exportNames;this.generateInternalExports(n);const s=(e,t)=>{if(e.imports)for(const n of e.imports)n.imported=this.getVariableExportName(t[n.imported]);if(e.reexports)for(const n of e.reexports)n.imported=this.getVariableExportName(t[n.imported])},o=(e,t)=>{t.imports&&(e.imports?e.imports=e.imports.concat(t.imports):e.imports=t.imports),t.reexports&&(e.reexports?e.reexports=e.reexports.concat(t.reexports):e.reexports=t.reexports),!e.exportsNames&&t.exportsNames&&(e.exportsNames=!0),!e.exportsDefault&&t.exportsDefault&&(e.exportsDefault=!0),e.name=this.variableName};for(const n of t){let t=void 0;for(let i=0;i<n.dependencies.length;i++){const a=n.dependencies[i];if(a!==e&&a!==this||!t)a===e?(n.dependencies[i]=this,s(t=n.renderedDeclarations.dependencies[i],e.exportNames)):a===this&&s(t=n.renderedDeclarations.dependencies[i],r);else{const h=n.renderedDeclarations.dependencies[i];s(h,a===e?e.exportNames:r),o(t,h),n.renderedDeclarations.dependencies.splice(i,1),n.dependencies.splice(i--,1)}}}this.preRender(n,i)}preRender(e,t){lh("render modules",3);const n=new q({separator:e.compact?"":"\n\n"});this.usedModules=[],this.indentString=e.compact?"":function(e,t){if(!0!==t.indent)return t.indent||"";for(let t=0;t<e.length;t++){const n=$h(e[t].originalCode);if(null!==n)return n}return"\t"}(this.orderedModules,e);const i=e.compact?"":"\n",r=e.compact?"":" ",s={compact:e.compact,dynamicImportFunction:e.dynamicImportFunction,format:e.format,freeze:!1!==e.freeze,indent:this.indentString,namespaceToStringTag:!0===e.namespaceToStringTag,varOrConst:e.preferConst?"const":"var"};for(const{module:e}of this.imports){const t=e instanceof xh?e.chunk:e;-1===this.dependencies.indexOf(t)&&this.dependencies.push(t)}if(!this.graph.preserveModules&&null!==this.facadeModule)for(const e of this.dependencies)e instanceof Vh&&this.inlineChunkDependencies(e,!0);for(let e=0;e<this.dependencies.length;e++){const t=this.dependencies[e];t instanceof Vh&&t.isEmpty&&(this.dependencies.splice(e--,1),this.inlineChunkDependencies(t,!1))}kh(this.dependencies),this.prepareDynamicImports(),this.setIdentifierRenderResolutions(e);let o="";const a=this.renderedModules=Object.create(null);for(const t of this.orderedModules){let r=0;if(t.isIncluded()){const a=t.render(s).trim();e.compact&&-1!==a.lastLine().indexOf("//")&&a.append("\n");const h=t.getOrCreateNamespace();if((h.included||a.length()>0)&&(r=a.length(),this.renderedModuleSources.set(t,a),n.addSource(a),this.usedModules.push(t),h.included&&!this.graph.preserveModules)){const e=h.renderBlock(s);h.renderFirst()?o+=i+e:n.addSource(new G(e))}}const{renderedExports:h,removedExports:u}=t.getRenderedExports();a[t.id]={originalLength:t.originalCode.length,removedExports:u,renderedExports:h,renderedLength:r}}o&&n.prepend(o+i+i),this.needsExportsShim&&n.prepend(`${i}${s.varOrConst} ${mo}${r}=${r}void 0;${i}${i}`),e.compact?this.renderedSource=n:this.renderedSource=n.trim(),this.renderedSourceLength=void 0,this.renderedHash=void 0,0===this.getExportNames().length&&0===this.getImportIds().length&&this.isEmpty&&this.graph.warn({code:"EMPTY_BUNDLE",message:"Generated an empty bundle"}),this.setExternalRenderPaths(e,t),this.renderedDeclarations={dependencies:this.getChunkDependencyDeclarations(e),exports:"none"===this.exportMode?[]:this.getChunkExportDeclarations()},ph("render modules",3)}render(e,t,n){if(lh("render format",3),!this.renderedSource)throw new Error("Internal error: Chunk render called before preRender");const i=e.format,r=Zo[i];r||Mo({code:"INVALID_OPTION",message:`Invalid format: ${i} - valid options are ${Object.keys(Zo).join(", ")}.`}),e.dynamicImportFunction&&"es"!==i&&this.graph.warn({code:"INVALID_OPTION",message:'"output.dynamicImportFunction" is ignored for formats other than "esm".'});for(let e=0;e<this.dependencies.length;e++){const t=this.dependencies[e];if(t instanceof yt&&!t.renormalizeRenderPath)continue;const n=this.renderedDeclarations.dependencies[e],i=t instanceof yt?n.id:t.id;t instanceof Vh&&(n.namedExportsMode="default"!==t.exportMode),n.id=this.getRelativePath(i)}this.finaliseDynamicImports(i),this.finaliseImportMetas(i);const s=0!==this.renderedDeclarations.exports.length||this.renderedDeclarations.dependencies.some(e=>e.reexports&&0!==e.reexports.length);let o=!1;const a=new Set;for(const e of this.orderedModules){e.usesTopLevelAwait&&(o=!0);const t=e.scope.accessedGlobalVariablesByFormat,n=t&&t.get(i);if(n)for(const e of n)a.add(e)}o&&"es"!==i&&"system"!==i&&Mo({code:"INVALID_TLA_FORMAT",message:`Module format ${i} does not support top-level await. Use the "es" or "system" output formats rather.`});const h=r(this.renderedSource,{accessedGlobals:a,dependencies:this.renderedDeclarations.dependencies,exports:this.renderedDeclarations.exports,hasExports:s,indentString:this.indentString,intro:t.intro,isEntryModuleFacade:null!==this.facadeModule&&this.facadeModule.isEntryPoint,namedExportsMode:"default"!==this.exportMode,outro:t.outro,usesTopLevelAwait:o,varOrConst:e.preferConst?"const":"var",warn:this.graph.warn.bind(this.graph)},e);t.banner&&h.prepend(t.banner),t.footer&&h.append(t.footer);const u=h.toString();ph("render format",3);let c=null;const l=[];return function({graph:e,chunk:t,renderChunk:n,code:i,sourcemapChain:r,options:s}){const o=(e,t,n)=>{if(null==t)return e;if("string"==typeof t&&(t={code:t,map:void 0}),null!==t.map){const e=Rh(t.map);r.push(e||{missing:!0,plugin:n.name})}return t.code};let a=!1,h=!0;return e.pluginDriver.hookReduceArg0("renderChunk",[i,n,s],o).then(n=>(h=!1,e.pluginDriver.hookReduceArg0("transformChunk",[n,s,t],o))).then(n=>(a=!0,e.pluginDriver.hookReduceArg0("transformBundle",[n,s,t],o))).catch(e=>{if(h)throw e;return Mo(e,{code:a?"BAD_BUNDLE_TRANSFORMER":"BAD_CHUNK_TRANSFORMER",message:`Error transforming ${(a?"bundle":"chunk")+(e.plugin?` with '${e.plugin}' plugin`:"")}: ${e.message}`,plugin:e.plugin})})}({chunk:this,code:u,graph:this.graph,options:e,renderChunk:n,sourcemapChain:l}).then(t=>{if(e.sourcemap){let t;lh("sourcemap",3),t=e.file?gt(e.sourcemapFile||e.file):e.dir?gt(e.dir,this.id):gt(this.id);const n=h.generateDecodedMap({});(c=function(e,t,n,i,r,s){const o=bh(e.graph),a=i.filter(e=>!e.excludeFromSourcemap).map(e=>Sh(e.id,e.originalCode,e.originalSourcemap,e.sourcemapChain,o));let h=new _h(n,a);h=r.reduce(o,h);let{sources:u,sourcesContent:c,names:l,mappings:p}=h.traceMappings();if(t){const e=dt(t);u=u.map(t=>mt(e,t)),t=pt(t)}return new L({file:t,sources:u,sourcesContent:c=s?null:c,names:l,mappings:p})}(this,t,n,this.usedModules,l,e.sourcemapExcludeSources)).sources=c.sources.map(t=>lt(e.sourcemapPathTransform?e.sourcemapPathTransform(t):t)),ph("sourcemap",3)}return!0!==e.compact&&"\n"!==t[t.length-1]&&(t+="\n"),{code:t,map:c}})}visitDependencies(e){const t=[this],n=new Set;for(const i of t)if(e(i),!(i instanceof yt))for(const e of i.dependencies.concat(i.dynamicDependencies))n.has(e)||(n.add(e),t.push(e))}visitStaticDependenciesUntilCondition(e){const t=new Set;return function n(i){if(!t.has(i)){if(t.add(i),i instanceof Vh)for(const e of i.dependencies)if(n(e))return!0;return!0===e(i)}}(this)}addDependenciesToChunk(e,t){for(const n of e){if(n.chunk===this)continue;let e;if(n instanceof xh)e=n.chunk;else{if(!n.used&&!n.moduleSideEffects)continue;e=n}t.add(e)}}assignFacadeName({fileName:e,name:t},n){e?this.fileName=e:this.name=$o(t||n.chunkName||Ro(n.id))}calculateHashAugmentation(){const e=this.facadeModule,t=this.getChunkName.bind(this),n={dynamicImports:this.getDynamicImportIds(),exports:this.getExportNames(),facadeModuleId:e&&e.id,imports:this.getImportIds(),isDynamicEntry:null!==e&&e.dynamicallyImportedBy.length>0,isEntry:null!==e&&e.isEntryPoint,modules:this.renderedModules,get name(){return t()}};return this.graph.pluginDriver.hookReduceValueSync("augmentChunkHash","",[n],(e,t)=>(t&&(e+=t),e))}computeContentHashWithDependencies(e,t,n){const i=k();return i.update([e.intro,e.outro,e.banner,e.footer].map(e=>e||"").join(":")),i.update(t.format),this.visitDependencies(r=>{r instanceof yt?i.update(":"+r.renderPath):(i.update(r.getRenderedHash()),i.update(r.generateId(e,t,n,!1)))}),i.digest("hex").substr(0,8)}finaliseDynamicImports(e){for(const[t,n]of this.renderedModuleSources)for(const{node:i,resolution:r}of t.dynamicImports)if(r)if(r instanceof xh){if(r.chunk!==this&&Dh(r.chunk)){const t=r.facadeChunk||r.chunk;i.renderFinalResolution(n,`'${this.getRelativePath(t.id)}'`,e)}}else i.renderFinalResolution(n,r instanceof yt?`'${r.renormalizeRenderPath?this.getRelativePath(r.renderPath):r.id}'`:r,e)}finaliseImportMetas(e){for(const[t,n]of this.renderedModuleSources)for(const i of t.importMetas)i.renderFinalMechanism(n,this.id,e,this.graph.pluginDriver)}getChunkDependencyDeclarations(e){const t=new Map;for(let n of this.getExportNames()){let i,r,s=!1;if("*"===n[0])s=!1!==e.externalLiveBindings,i=this.graph.moduleById.get(n.substr(1)),r=n="*";else{const t=this.exportNames[n],o=t.module;if(!o||o.chunk===this)continue;o instanceof xh?(r=(i=o.chunk).getVariableExportName(t),s=t.isReassigned):(i=o,r=t.name,s=!1!==e.externalLiveBindings)}let o=t.get(i);o||t.set(i,o=[]),o.push({imported:r,reexported:n,needsLiveBinding:s})}const n=new Set,i=[];for(const r of this.dependencies){const s=[];for(const e of this.imports){const t=e instanceof fo?e.getOriginalVariable():e;(e.module instanceof xh?e.module.chunk!==r:e.module!==r)||n.has(t)||(n.add(t),s.push({imported:e.module instanceof yt?e.name:e.module.chunk.getVariableExportName(e),local:e.getName()}))}const o=t.get(r);let a,h,u=!0;r instanceof yt?(a=r.exportsNames||r.exportsNamespace,h="default"in r.declarations):(a=!0,h=!1,u="default"!==r.exportMode);let c=void 0,l=void 0;r instanceof yt&&(c=r.renderPath,"umd"!==e.format&&"iife"!==e.format||(l=Lh(r,e.globals,this.graph,a||h))),i.push({exportsDefault:h,exportsNames:a,globalName:l,id:c,imports:s.length>0?s:null,isChunk:r instanceof Vh,name:r.variableName,namedExportsMode:u,reexports:o})}return i}getChunkExportDeclarations(){const e=[];for(const t of this.getExportNames()){if("*"===t[0])continue;const n=this.exportNames[t],i=n.module;if(i&&i.chunk!==this)continue;let r=!1,s=!1;if(n instanceof Et){n.init===Pe&&(s=!0);for(const e of n.declarations)if(e.parent instanceof co||e instanceof po&&e.declaration instanceof co){r=!0;break}}else n instanceof oo&&(r=!0);const o=n.getName();e.push({exported:"*"===t?o:t,hoisted:r,local:o,uninitialized:s})}return e}getFallbackChunkName(){return this.manualChunkAlias?this.manualChunkAlias:this.fileName?Ro(this.fileName):Ro(this.orderedModules[this.orderedModules.length-1].id)}getRelativePath(e){const t=lt(K(dt(this.id),e));return t.startsWith("../")?t:"./"+t}inlineChunkDependencies(e,t){for(const n of e.dependencies)if(n instanceof yt)-1===this.dependencies.indexOf(n)&&this.dependencies.push(n);else{if(n===this||-1!==this.dependencies.indexOf(n))continue;n.isEmpty||this.dependencies.push(n),t&&this.inlineChunkDependencies(n,!0)}}prepareDynamicImports(){for(const e of this.orderedModules)for(const{node:t,resolution:n}of e.dynamicImports)if(t.included)if(n instanceof xh)if(n.chunk===this){const e=n.getOrCreateNamespace();t.setResolution("named",e)}else t.setResolution(n.chunk.exportMode);else t.setResolution("auto")}setExternalRenderPaths(e,t){for(const n of this.dependencies.concat(this.dynamicDependencies))n instanceof yt&&n.setRenderPath(e,t)}setIdentifierRenderResolutions(e){for(const t of this.getExportNames()){const n=this.exportNames[t];n&&(n instanceof vo&&(this.needsExportsShim=!0),n.exportName=t,"es"===e.format||"system"===e.format||!n.isReassigned||n.isId||n instanceof fo&&n.hasId?n.setRenderNames(null,null):n.setRenderNames("exports",t))}const t=new Set;this.needsExportsShim&&t.add(mo),"es"!==e.format&&(t.add("exports"),"cjs"===e.format&&t.add(go).add("require").add("module").add("__filename").add("__dirname")),Ch(this.orderedModules,this.dependencies,this.imports,t,e.format,!1!==e.interop,this.graph.preserveModules)}setUpChunkImportsAndExportsForModule(e){for(const t of e.imports)t.module.chunk!==this&&(this.imports.add(t),t.module instanceof xh&&t.module.chunk.exports.add(t));if(e.isEntryPoint||e.dynamicallyImportedBy.some(e=>e.chunk!==this)){const t=e.getExportNamesByVariable();for(const e of t.keys()){this.exports.add(e);const t=e.module;t&&t.chunk&&t.chunk!==this&&t.chunk.exports.add(e)}}if(e.getOrCreateNamespace().included)for(const t of Object.keys(e.reexports)){const n=e.reexports[t],i=n.module.getVariableForExportName(n.localName);i.module.chunk!==this&&(this.imports.add(i),i.module instanceof xh&&i.module.chunk.exports.add(i))}for(const{node:t,resolution:n}of e.dynamicImports)t.included&&n instanceof xh&&n.chunk===this&&n.getOrCreateNamespace().include()}}var Bh={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},zh="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",Wh={5:zh,"5module":zh+" export import",6:zh+" const class extends export import super"},jh=/^in(stanceof)?$/,Fh="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࢠ-ࢴࢶ-ࢽऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿯ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-Ᶎꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭧꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ﬀ-ﬆﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼＡ-Ｚａ-ｚｦ-ﾾￂ-ￇￊ-ￏￒ-ￗￚ-ￜ",Uh="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏０-９＿",Gh=new RegExp("["+Fh+"]"),Hh=new RegExp("["+Fh+Uh+"]");Fh=Uh=null;var qh=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,477,28,11,0,9,21,155,22,13,52,76,44,33,24,27,35,30,0,12,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,0,33,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,0,161,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,270,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,754,9486,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,15,7472,3104,541],Kh=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,525,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,4,9,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,232,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,792487,239];function Yh(e,t){for(var n=65536,i=0;i<t.length;i+=2){if((n+=t[i])>e)return!1;if((n+=t[i+1])>=e)return!0}}function Xh(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Gh.test(String.fromCharCode(e)):!1!==t&&Yh(e,qh)))}function Qh(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Hh.test(String.fromCharCode(e)):!1!==t&&(Yh(e,qh)||Yh(e,Kh)))))}var Jh=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function Zh(e,t){return new Jh(e,{beforeExpr:!0,binop:t})}var eu={beforeExpr:!0},tu={startsExpr:!0},nu={};function iu(e,t){return void 0===t&&(t={}),t.keyword=e,nu[e]=new Jh(e,t)}var ru={num:new Jh("num",tu),regexp:new Jh("regexp",tu),string:new Jh("string",tu),name:new Jh("name",tu),eof:new Jh("eof"),bracketL:new Jh("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new Jh("]"),braceL:new Jh("{",{beforeExpr:!0,startsExpr:!0}),braceR:new Jh("}"),parenL:new Jh("(",{beforeExpr:!0,startsExpr:!0}),parenR:new Jh(")"),comma:new Jh(",",eu),semi:new Jh(";",eu),colon:new Jh(":",eu),dot:new Jh("."),question:new Jh("?",eu),arrow:new Jh("=>",eu),template:new Jh("template"),invalidTemplate:new Jh("invalidTemplate"),ellipsis:new Jh("...",eu),backQuote:new Jh("`",tu),dollarBraceL:new Jh("${",{beforeExpr:!0,startsExpr:!0}),eq:new Jh("=",{beforeExpr:!0,isAssign:!0}),assign:new Jh("_=",{beforeExpr:!0,isAssign:!0}),incDec:new Jh("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new Jh("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:Zh("||",1),logicalAND:Zh("&&",2),bitwiseOR:Zh("|",3),bitwiseXOR:Zh("^",4),bitwiseAND:Zh("&",5),equality:Zh("==/!=/===/!==",6),relational:Zh("</>/<=/>=",7),bitShift:Zh("<</>>/>>>",8),plusMin:new Jh("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:Zh("%",10),star:Zh("*",10),slash:Zh("/",10),starstar:new Jh("**",{beforeExpr:!0}),_break:iu("break"),_case:iu("case",eu),_catch:iu("catch"),_continue:iu("continue"),_debugger:iu("debugger"),_default:iu("default",eu),_do:iu("do",{isLoop:!0,beforeExpr:!0}),_else:iu("else",eu),_finally:iu("finally"),_for:iu("for",{isLoop:!0}),_function:iu("function",tu),_if:iu("if"),_return:iu("return",eu),_switch:iu("switch"),_throw:iu("throw",eu),_try:iu("try"),_var:iu("var"),_const:iu("const"),_while:iu("while",{isLoop:!0}),_with:iu("with"),_new:iu("new",{beforeExpr:!0,startsExpr:!0}),_this:iu("this",tu),_super:iu("super",tu),_class:iu("class",tu),_extends:iu("extends",eu),_export:iu("export"),_import:iu("import",tu),_null:iu("null",tu),_true:iu("true",tu),_false:iu("false",tu),_in:iu("in",{beforeExpr:!0,binop:7}),_instanceof:iu("instanceof",{beforeExpr:!0,binop:7}),_typeof:iu("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:iu("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:iu("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},su=/\r\n?|\n|\u2028|\u2029/,ou=new RegExp(su.source,"g");function au(e,t){return 10===e||13===e||!t&&(8232===e||8233===e)}var hu=/[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/,uu=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,cu=Object.prototype,lu=cu.hasOwnProperty,pu=cu.toString;function du(e,t){return lu.call(e,t)}var fu=Array.isArray||function(e){return"[object Array]"===pu.call(e)};function mu(e){return new RegExp("^(?:"+e.replace(/ /g,"|")+")$")}var gu=function(e,t){this.line=e,this.column=t};gu.prototype.offset=function(e){return new gu(this.line,this.column+e)};var yu=function(e,t,n){this.start=t,this.end=n,null!==e.sourceFile&&(this.source=e.sourceFile)};function vu(e,t){for(var n=1,i=0;;){ou.lastIndex=i;var r=ou.exec(e);if(!(r&&r.index<t))return new gu(n,t-i);++n,i=r.index+r[0].length}}var xu={ecmaVersion:10,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:!1,allowHashBang:!1,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1};function Eu(e){var t={};for(var n in xu)t[n]=e&&du(e,n)?e[n]:xu[n];if(t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),fu(t.onToken)){var i=t.onToken;t.onToken=function(e){return i.push(e)}}return fu(t.onComment)&&(t.onComment=function(e,t){return function(n,i,r,s,o,a){var h={type:n?"Block":"Line",value:i,start:r,end:s};e.locations&&(h.loc=new yu(this,o,a)),e.ranges&&(h.range=[r,s]),t.push(h)}}(t,t.onComment)),t}var _u=2,bu=1|_u,Su=4,Au=8;function Cu(e,t){return _u|(e?Su:0)|(t?Au:0)}var Iu=function(e,t,n){this.options=e=Eu(e),this.sourceFile=e.sourceFile,this.keywords=mu(Wh[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var i="";if(!0!==e.allowReserved){for(var r=e.ecmaVersion;!(i=Bh[r]);r--);"module"===e.sourceType&&(i+=" await")}this.reservedWords=mu(i);var s=(i?i+" ":"")+Bh.strict;this.reservedWordsStrict=mu(s),this.reservedWordsStrictBind=mu(s+" "+Bh.strictBind),this.input=String(t),this.containsEsc=!1,n?(this.pos=n,this.lineStart=this.input.lastIndexOf("\n",n-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(su).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=ru.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports={},0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(1),this.regexpState=null},wu={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0}};Iu.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},wu.inFunction.get=function(){return(this.currentVarScope().flags&_u)>0},wu.inGenerator.get=function(){return(this.currentVarScope().flags&Au)>0},wu.inAsync.get=function(){return(this.currentVarScope().flags&Su)>0},wu.allowSuper.get=function(){return(64&this.currentThisScope().flags)>0},wu.allowDirectSuper.get=function(){return(128&this.currentThisScope().flags)>0},wu.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},Iu.prototype.inNonArrowFunction=function(){return(this.currentThisScope().flags&_u)>0},Iu.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n=this,i=0;i<e.length;i++)n=e[i](n);return n},Iu.parse=function(e,t){return new this(t,e).parse()},Iu.parseExpressionAt=function(e,t,n){var i=new this(n,e,t);return i.nextToken(),i.parseExpression()},Iu.tokenizer=function(e,t){return new this(t,e)},Object.defineProperties(Iu.prototype,wu);var Pu=Iu.prototype,ku=/^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/;function Nu(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1}Pu.strictDirective=function(e){for(;;){uu.lastIndex=e,e+=uu.exec(this.input)[0].length;var t=ku.exec(this.input.slice(e));if(!t)return!1;if("use strict"===(t[1]||t[2]))return!0;e+=t[0].length,uu.lastIndex=e,e+=uu.exec(this.input)[0].length,";"===this.input[e]&&e++}},Pu.eat=function(e){return this.type===e&&(this.next(),!0)},Pu.isContextual=function(e){return this.type===ru.name&&this.value===e&&!this.containsEsc},Pu.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},Pu.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},Pu.canInsertSemicolon=function(){return this.type===ru.eof||this.type===ru.braceR||su.test(this.input.slice(this.lastTokEnd,this.start))},Pu.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},Pu.semicolon=function(){this.eat(ru.semi)||this.insertSemicolon()||this.unexpected()},Pu.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},Pu.expect=function(e){this.eat(e)||this.unexpected()},Pu.unexpected=function(e){this.raise(null!=e?e:this.start,"Unexpected token")},Pu.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var n=t?e.parenthesizedAssign:e.parenthesizedBind;n>-1&&this.raiseRecoverable(n,"Parenthesized pattern")}},Pu.checkExpressionErrors=function(e,t){if(!e)return!1;var n=e.shorthandAssign,i=e.doubleProto;if(!t)return n>=0||i>=0;n>=0&&this.raise(n,"Shorthand property assignments are valid only in destructuring patterns"),i>=0&&this.raiseRecoverable(i,"Redefinition of __proto__ property")},Pu.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos<this.awaitPos)&&this.raise(this.yieldPos,"Yield expression cannot be a default value"),this.awaitPos&&this.raise(this.awaitPos,"Await expression cannot be a default value")},Pu.isSimpleAssignTarget=function(e){return"ParenthesizedExpression"===e.type?this.isSimpleAssignTarget(e.expression):"Identifier"===e.type||"MemberExpression"===e.type};var $u=Iu.prototype;$u.parseTopLevel=function(e){var t={};for(e.body||(e.body=[]);this.type!==ru.eof;){var n=this.parseStatement(null,!0,t);e.body.push(n)}if(this.inModule)for(var i=0,r=Object.keys(this.undefinedExports);i<r.length;i+=1){var s=r[i];this.raiseRecoverable(this.undefinedExports[s].start,"Export '"+s+"' is not defined")}return this.adaptDirectivePrologue(e.body),this.next(),e.sourceType=this.options.sourceType,this.finishNode(e,"Program")};var Ru={kind:"loop"},Tu={kind:"switch"};$u.isLet=function(e){if(this.options.ecmaVersion<6||!this.isContextual("let"))return!1;uu.lastIndex=this.pos;var t=uu.exec(this.input),n=this.pos+t[0].length,i=this.input.charCodeAt(n);if(91===i)return!0;if(e)return!1;if(123===i)return!0;if(Xh(i,!0)){for(var r=n+1;Qh(this.input.charCodeAt(r),!0);)++r;var s=this.input.slice(n,r);if(!jh.test(s))return!0}return!1},$u.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;uu.lastIndex=this.pos;var e=uu.exec(this.input),t=this.pos+e[0].length;return!(su.test(this.input.slice(this.pos,t))||"function"!==this.input.slice(t,t+8)||t+8!==this.input.length&&Qh(this.input.charAt(t+8)))},$u.parseStatement=function(e,t,n){var i,r=this.type,s=this.startNode();switch(this.isLet(e)&&(r=ru._var,i="let"),r){case ru._break:case ru._continue:return this.parseBreakContinueStatement(s,r.keyword);case ru._debugger:return this.parseDebuggerStatement(s);case ru._do:return this.parseDoStatement(s);case ru._for:return this.parseForStatement(s);case ru._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case ru._class:return e&&this.unexpected(),this.parseClass(s,!0);case ru._if:return this.parseIfStatement(s);case ru._return:return this.parseReturnStatement(s);case ru._switch:return this.parseSwitchStatement(s);case ru._throw:return this.parseThrowStatement(s);case ru._try:return this.parseTryStatement(s);case ru._const:case ru._var:return i=i||this.value,e&&"var"!==i&&this.unexpected(),this.parseVarStatement(s,i);case ru._while:return this.parseWhileStatement(s);case ru._with:return this.parseWithStatement(s);case ru.braceL:return this.parseBlock(!0,s);case ru.semi:return this.parseEmptyStatement(s);case ru._export:case ru._import:if(this.options.ecmaVersion>10&&r===ru._import){uu.lastIndex=this.pos;var o=uu.exec(this.input),a=this.pos+o[0].length;if(40===this.input.charCodeAt(a))return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),r===ru._import?this.parseImport(s):this.parseExport(s,n);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var h=this.value,u=this.parseExpression();return r===ru.name&&"Identifier"===u.type&&this.eat(ru.colon)?this.parseLabeledStatement(s,h,u,e):this.parseExpressionStatement(s,u)}},$u.parseBreakContinueStatement=function(e,t){var n="break"===t;this.next(),this.eat(ru.semi)||this.insertSemicolon()?e.label=null:this.type!==ru.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var i=0;i<this.labels.length;++i){var r=this.labels[i];if(null==e.label||r.name===e.label.name){if(null!=r.kind&&(n||"loop"===r.kind))break;if(e.label&&n)break}}return i===this.labels.length&&this.raise(e.start,"Unsyntactic "+t),this.finishNode(e,n?"BreakStatement":"ContinueStatement")},$u.parseDebuggerStatement=function(e){return this.next(),this.semicolon(),this.finishNode(e,"DebuggerStatement")},$u.parseDoStatement=function(e){return this.next(),this.labels.push(Ru),e.body=this.parseStatement("do"),this.labels.pop(),this.expect(ru._while),e.test=this.parseParenExpression(),this.options.ecmaVersion>=6?this.eat(ru.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},$u.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&(this.inAsync||!this.inFunction&&this.options.allowAwaitOutsideFunction)&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Ru),this.enterScope(0),this.expect(ru.parenL),this.type===ru.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var n=this.isLet();if(this.type===ru._var||this.type===ru._const||n){var i=this.startNode(),r=n?"let":this.value;return this.next(),this.parseVar(i,!0,r),this.finishNode(i,"VariableDeclaration"),(this.type===ru._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===i.declarations.length?(this.options.ecmaVersion>=9&&(this.type===ru._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,i)):(t>-1&&this.unexpected(t),this.parseFor(e,i))}var s=new Nu,o=this.parseExpression(!0,s);return this.type===ru._in||this.options.ecmaVersion>=6&&this.isContextual("of")?(this.options.ecmaVersion>=9&&(this.type===ru._in?t>-1&&this.unexpected(t):e.await=t>-1),this.toAssignable(o,!1,s),this.checkLVal(o),this.parseForIn(e,o)):(this.checkExpressionErrors(s,!0),t>-1&&this.unexpected(t),this.parseFor(e,o))},$u.parseFunctionStatement=function(e,t,n){return this.next(),this.parseFunction(e,Mu|(n?0:Lu),!1,t)},$u.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(ru._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},$u.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(ru.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},$u.parseSwitchStatement=function(e){var t;this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(ru.braceL),this.labels.push(Tu),this.enterScope(0);for(var n=!1;this.type!==ru.braceR;)if(this.type===ru._case||this.type===ru._default){var i=this.type===ru._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),i?t.test=this.parseExpression():(n&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),n=!0,t.test=null),this.expect(ru.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},$u.parseThrowStatement=function(e){return this.next(),su.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Ou=[];$u.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===ru._catch){var t=this.startNode();if(this.next(),this.eat(ru.parenL)){t.param=this.parseBindingAtom();var n="Identifier"===t.param.type;this.enterScope(n?32:0),this.checkLVal(t.param,n?4:2),this.expect(ru.parenR)}else this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0);t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(ru._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},$u.parseVarStatement=function(e,t){return this.next(),this.parseVar(e,!1,t),this.semicolon(),this.finishNode(e,"VariableDeclaration")},$u.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Ru),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},$u.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},$u.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},$u.parseLabeledStatement=function(e,t,n,i){for(var r=0,s=this.labels;r<s.length;r+=1){s[r].name===t&&this.raise(n.start,"Label '"+t+"' is already declared")}for(var o=this.type.isLoop?"loop":this.type===ru._switch?"switch":null,a=this.labels.length-1;a>=0;a--){var h=this.labels[a];if(h.statementStart!==e.start)break;h.statementStart=this.start,h.kind=o}return this.labels.push({name:t,kind:o,statementStart:this.start}),e.body=this.parseStatement(i?-1===i.indexOf("label")?i+"label":i:"label"),this.labels.pop(),e.label=n,this.finishNode(e,"LabeledStatement")},$u.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},$u.parseBlock=function(e,t){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(ru.braceL),e&&this.enterScope(0);!this.eat(ru.braceR);){var n=this.parseStatement(null);t.body.push(n)}return e&&this.exitScope(),this.finishNode(t,"BlockStatement")},$u.parseFor=function(e,t){return e.init=t,this.expect(ru.semi),e.test=this.type===ru.semi?null:this.parseExpression(),this.expect(ru.semi),e.update=this.type===ru.parenR?null:this.parseExpression(),this.expect(ru.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},$u.parseForIn=function(e,t){var n=this.type===ru._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!n||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)?this.raise(t.start,(n?"for-in":"for-of")+" loop variable declaration may not have an initializer"):"AssignmentPattern"===t.type&&this.raise(t.start,"Invalid left-hand side in for-loop"),e.left=t,e.right=n?this.parseExpression():this.parseMaybeAssign(),this.expect(ru.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,n?"ForInStatement":"ForOfStatement")},$u.parseVar=function(e,t,n){for(e.declarations=[],e.kind=n;;){var i=this.startNode();if(this.parseVarId(i,n),this.eat(ru.eq)?i.init=this.parseMaybeAssign(t):"const"!==n||this.type===ru._in||this.options.ecmaVersion>=6&&this.isContextual("of")?"Identifier"===i.id.type||t&&(this.type===ru._in||this.isContextual("of"))?i.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(i,"VariableDeclarator")),!this.eat(ru.comma))break}return e},$u.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLVal(e.id,"var"===t?1:2,!1)};var Mu=1,Lu=2;$u.parseFunction=function(e,t,n,i){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!i)&&(this.type===ru.star&&t&Lu&&this.unexpected(),e.generator=this.eat(ru.star)),this.options.ecmaVersion>=8&&(e.async=!!i),t&Mu&&(e.id=4&t&&this.type!==ru.name?null:this.parseIdent(),!e.id||t&Lu||this.checkLVal(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?1:2:3));var r=this.yieldPos,s=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Cu(e.async,e.generator)),t&Mu||(e.id=this.type===ru.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,n,!1),this.yieldPos=r,this.awaitPos=s,this.awaitIdentPos=o,this.finishNode(e,t&Mu?"FunctionDeclaration":"FunctionExpression")},$u.parseFunctionParams=function(e){this.expect(ru.parenL),e.params=this.parseBindingList(ru.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},$u.parseClass=function(e,t){this.next();var n=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var i=this.startNode(),r=!1;for(i.body=[],this.expect(ru.braceL);!this.eat(ru.braceR);){var s=this.parseClassElement(null!==e.superClass);s&&(i.body.push(s),"MethodDefinition"===s.type&&"constructor"===s.kind&&(r&&this.raise(s.start,"Duplicate constructor in the same class"),r=!0))}return e.body=this.finishNode(i,"ClassBody"),this.strict=n,this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},$u.parseClassElement=function(e){var t=this;if(this.eat(ru.semi))return null;var n=this.startNode(),i=function(e,i){void 0===i&&(i=!1);var r=t.start,s=t.startLoc;return!!t.eatContextual(e)&&(!(t.type===ru.parenL||i&&t.canInsertSemicolon())||(n.key&&t.unexpected(),n.computed=!1,n.key=t.startNodeAt(r,s),n.key.name=e,t.finishNode(n.key,"Identifier"),!1))};n.kind="method",n.static=i("static");var r=this.eat(ru.star),s=!1;r||(this.options.ecmaVersion>=8&&i("async",!0)?(s=!0,r=this.options.ecmaVersion>=9&&this.eat(ru.star)):i("get")?n.kind="get":i("set")&&(n.kind="set")),n.key||this.parsePropertyName(n);var o=n.key,a=!1;return n.computed||n.static||!("Identifier"===o.type&&"constructor"===o.name||"Literal"===o.type&&"constructor"===o.value)?n.static&&"Identifier"===o.type&&"prototype"===o.name&&this.raise(o.start,"Classes may not have a static property named prototype"):("method"!==n.kind&&this.raise(o.start,"Constructor can't have get/set modifier"),r&&this.raise(o.start,"Constructor can't be a generator"),s&&this.raise(o.start,"Constructor can't be an async method"),n.kind="constructor",a=e),this.parseClassMethod(n,r,s,a),"get"===n.kind&&0!==n.value.params.length&&this.raiseRecoverable(n.value.start,"getter should have no params"),"set"===n.kind&&1!==n.value.params.length&&this.raiseRecoverable(n.value.start,"setter should have exactly one param"),"set"===n.kind&&"RestElement"===n.value.params[0].type&&this.raiseRecoverable(n.value.params[0].start,"Setter cannot use rest params"),n},$u.parseClassMethod=function(e,t,n,i){return e.value=this.parseMethod(t,n,i),this.finishNode(e,"MethodDefinition")},$u.parseClassId=function(e,t){this.type===ru.name?(e.id=this.parseIdent(),t&&this.checkLVal(e.id,2,!1)):(!0===t&&this.unexpected(),e.id=null)},$u.parseClassSuper=function(e){e.superClass=this.eat(ru._extends)?this.parseExprSubscripts():null},$u.parseExport=function(e,t){if(this.next(),this.eat(ru.star))return this.expectContextual("from"),this.type!==ru.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration");if(this.eat(ru._default)){var n;if(this.checkExport(t,"default",this.lastTokStart),this.type===ru._function||(n=this.isAsyncFunction())){var i=this.startNode();this.next(),n&&this.next(),e.declaration=this.parseFunction(i,4|Mu,!1,n)}else if(this.type===ru._class){var r=this.startNode();e.declaration=this.parseClass(r,"nullableID")}else e.declaration=this.parseMaybeAssign(),this.semicolon();return this.finishNode(e,"ExportDefaultDeclaration")}if(this.shouldParseExportStatement())e.declaration=this.parseStatement(null),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id.name,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==ru.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var s=0,o=e.specifiers;s<o.length;s+=1){var a=o[s];this.checkUnreserved(a.local),this.checkLocalExport(a.local)}e.source=null}this.semicolon()}return this.finishNode(e,"ExportNamedDeclaration")},$u.checkExport=function(e,t,n){e&&(du(e,t)&&this.raiseRecoverable(n,"Duplicate export '"+t+"'"),e[t]=!0)},$u.checkPatternExport=function(e,t){var n=t.type;if("Identifier"===n)this.checkExport(e,t.name,t.start);else if("ObjectPattern"===n)for(var i=0,r=t.properties;i<r.length;i+=1){var s=r[i];this.checkPatternExport(e,s)}else if("ArrayPattern"===n)for(var o=0,a=t.elements;o<a.length;o+=1){var h=a[o];h&&this.checkPatternExport(e,h)}else"Property"===n?this.checkPatternExport(e,t.value):"AssignmentPattern"===n?this.checkPatternExport(e,t.left):"RestElement"===n?this.checkPatternExport(e,t.argument):"ParenthesizedExpression"===n&&this.checkPatternExport(e,t.expression)},$u.checkVariableExport=function(e,t){if(e)for(var n=0,i=t;n<i.length;n+=1){var r=i[n];this.checkPatternExport(e,r.id)}},$u.shouldParseExportStatement=function(){return"var"===this.type.keyword||"const"===this.type.keyword||"class"===this.type.keyword||"function"===this.type.keyword||this.isLet()||this.isAsyncFunction()},$u.parseExportSpecifiers=function(e){var t=[],n=!0;for(this.expect(ru.braceL);!this.eat(ru.braceR);){if(n)n=!1;else if(this.expect(ru.comma),this.afterTrailingComma(ru.braceR))break;var i=this.startNode();i.local=this.parseIdent(!0),i.exported=this.eatContextual("as")?this.parseIdent(!0):i.local,this.checkExport(e,i.exported.name,i.exported.start),t.push(this.finishNode(i,"ExportSpecifier"))}return t},$u.parseImport=function(e){return this.next(),this.type===ru.string?(e.specifiers=Ou,e.source=this.parseExprAtom()):(e.specifiers=this.parseImportSpecifiers(),this.expectContextual("from"),e.source=this.type===ru.string?this.parseExprAtom():this.unexpected()),this.semicolon(),this.finishNode(e,"ImportDeclaration")},$u.parseImportSpecifiers=function(){var e=[],t=!0;if(this.type===ru.name){var n=this.startNode();if(n.local=this.parseIdent(),this.checkLVal(n.local,2),e.push(this.finishNode(n,"ImportDefaultSpecifier")),!this.eat(ru.comma))return e}if(this.type===ru.star){var i=this.startNode();return this.next(),this.expectContextual("as"),i.local=this.parseIdent(),this.checkLVal(i.local,2),e.push(this.finishNode(i,"ImportNamespaceSpecifier")),e}for(this.expect(ru.braceL);!this.eat(ru.braceR);){if(t)t=!1;else if(this.expect(ru.comma),this.afterTrailingComma(ru.braceR))break;var r=this.startNode();r.imported=this.parseIdent(!0),this.eatContextual("as")?r.local=this.parseIdent():(this.checkUnreserved(r.imported),r.local=r.imported),this.checkLVal(r.local,2),e.push(this.finishNode(r,"ImportSpecifier"))}return e},$u.adaptDirectivePrologue=function(e){for(var t=0;t<e.length&&this.isDirectiveCandidate(e[t]);++t)e[t].directive=e[t].expression.raw.slice(1,-1)},$u.isDirectiveCandidate=function(e){return"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var Du=Iu.prototype;Du.toAssignable=function(e,t,n){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",n&&this.checkPatternErrors(n,!0);for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];this.toAssignable(s,t),"RestElement"!==s.type||"ArrayPattern"!==s.argument.type&&"ObjectPattern"!==s.argument.type||this.raise(s.argument.start,"Unexpected token")}break;case"Property":"init"!==e.kind&&this.raise(e.key.start,"Object pattern can't contain getter or setter"),this.toAssignable(e.value,t);break;case"ArrayExpression":e.type="ArrayPattern",n&&this.checkPatternErrors(n,!0),this.toAssignableList(e.elements,t);break;case"SpreadElement":e.type="RestElement",this.toAssignable(e.argument,t),"AssignmentPattern"===e.argument.type&&this.raise(e.argument.start,"Rest elements cannot have a default value");break;case"AssignmentExpression":"="!==e.operator&&this.raise(e.left.end,"Only '=' operator can be used for specifying default value."),e.type="AssignmentPattern",delete e.operator,this.toAssignable(e.left,t);case"AssignmentPattern":break;case"ParenthesizedExpression":this.toAssignable(e.expression,t,n);break;case"MemberExpression":if(!t)break;default:this.raise(e.start,"Assigning to rvalue")}else n&&this.checkPatternErrors(n,!0);return e},Du.toAssignableList=function(e,t){for(var n=e.length,i=0;i<n;i++){var r=e[i];r&&this.toAssignable(r,t)}if(n){var s=e[n-1];6===this.options.ecmaVersion&&t&&s&&"RestElement"===s.type&&"Identifier"!==s.argument.type&&this.unexpected(s.argument.start)}return e},Du.parseSpread=function(e){var t=this.startNode();return this.next(),t.argument=this.parseMaybeAssign(!1,e),this.finishNode(t,"SpreadElement")},Du.parseRestBinding=function(){var e=this.startNode();return this.next(),6===this.options.ecmaVersion&&this.type!==ru.name&&this.unexpected(),e.argument=this.parseBindingAtom(),this.finishNode(e,"RestElement")},Du.parseBindingAtom=function(){if(this.options.ecmaVersion>=6)switch(this.type){case ru.bracketL:var e=this.startNode();return this.next(),e.elements=this.parseBindingList(ru.bracketR,!0,!0),this.finishNode(e,"ArrayPattern");case ru.braceL:return this.parseObj(!0)}return this.parseIdent()},Du.parseBindingList=function(e,t,n){for(var i=[],r=!0;!this.eat(e);)if(r?r=!1:this.expect(ru.comma),t&&this.type===ru.comma)i.push(null);else{if(n&&this.afterTrailingComma(e))break;if(this.type===ru.ellipsis){var s=this.parseRestBinding();this.parseBindingListItem(s),i.push(s),this.type===ru.comma&&this.raise(this.start,"Comma is not permitted after the rest element"),this.expect(e);break}var o=this.parseMaybeDefault(this.start,this.startLoc);this.parseBindingListItem(o),i.push(o)}return i},Du.parseBindingListItem=function(e){return e},Du.parseMaybeDefault=function(e,t,n){if(n=n||this.parseBindingAtom(),this.options.ecmaVersion<6||!this.eat(ru.eq))return n;var i=this.startNodeAt(e,t);return i.left=n,i.right=this.parseMaybeAssign(),this.finishNode(i,"AssignmentPattern")},Du.checkLVal=function(e,t,n){switch(void 0===t&&(t=0),e.type){case"Identifier":2===t&&"let"===e.name&&this.raiseRecoverable(e.start,"let is disallowed as a lexically bound name"),this.strict&&this.reservedWordsStrictBind.test(e.name)&&this.raiseRecoverable(e.start,(t?"Binding ":"Assigning to ")+e.name+" in strict mode"),n&&(du(n,e.name)&&this.raiseRecoverable(e.start,"Argument name clash"),n[e.name]=!0),0!==t&&5!==t&&this.declareName(e.name,t,e.start);break;case"MemberExpression":t&&this.raiseRecoverable(e.start,"Binding member expression");break;case"ObjectPattern":for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];this.checkLVal(s,t,n)}break;case"Property":this.checkLVal(e.value,t,n);break;case"ArrayPattern":for(var o=0,a=e.elements;o<a.length;o+=1){var h=a[o];h&&this.checkLVal(h,t,n)}break;case"AssignmentPattern":this.checkLVal(e.left,t,n);break;case"RestElement":this.checkLVal(e.argument,t,n);break;case"ParenthesizedExpression":this.checkLVal(e.expression,t,n);break;default:this.raise(e.start,(t?"Binding":"Assigning to")+" rvalue")}};var Vu=Iu.prototype;Vu.checkPropClash=function(e,t,n){if(!(this.options.ecmaVersion>=9&&"SpreadElement"===e.type||this.options.ecmaVersion>=6&&(e.computed||e.method||e.shorthand))){var i,r=e.key;switch(r.type){case"Identifier":i=r.name;break;case"Literal":i=String(r.value);break;default:return}var s=e.kind;if(this.options.ecmaVersion>=6)"__proto__"===i&&"init"===s&&(t.proto&&(n&&n.doubleProto<0?n.doubleProto=r.start:this.raiseRecoverable(r.start,"Redefinition of __proto__ property")),t.proto=!0);else{var o=t[i="$"+i];if(o)("init"===s?this.strict&&o.init||o.get||o.set:o.init||o[s])&&this.raiseRecoverable(r.start,"Redefinition of property");else o=t[i]={init:!1,get:!1,set:!1};o[s]=!0}}},Vu.parseExpression=function(e,t){var n=this.start,i=this.startLoc,r=this.parseMaybeAssign(e,t);if(this.type===ru.comma){var s=this.startNodeAt(n,i);for(s.expressions=[r];this.eat(ru.comma);)s.expressions.push(this.parseMaybeAssign(e,t));return this.finishNode(s,"SequenceExpression")}return r},Vu.parseMaybeAssign=function(e,t,n){if(this.isContextual("yield")){if(this.inGenerator)return this.parseYield(e);this.exprAllowed=!1}var i=!1,r=-1,s=-1,o=-1;t?(r=t.parenthesizedAssign,s=t.trailingComma,o=t.shorthandAssign,t.parenthesizedAssign=t.trailingComma=t.shorthandAssign=-1):(t=new Nu,i=!0);var a=this.start,h=this.startLoc;this.type!==ru.parenL&&this.type!==ru.name||(this.potentialArrowAt=this.start);var u=this.parseMaybeConditional(e,t);if(n&&(u=n.call(this,u,a,h)),this.type.isAssign){var c=this.startNodeAt(a,h);return c.operator=this.value,c.left=this.type===ru.eq?this.toAssignable(u,!1,t):u,i||Nu.call(t),t.shorthandAssign=-1,this.checkLVal(u),this.next(),c.right=this.parseMaybeAssign(e),this.finishNode(c,"AssignmentExpression")}return i&&this.checkExpressionErrors(t,!0),r>-1&&(t.parenthesizedAssign=r),s>-1&&(t.trailingComma=s),o>-1&&(t.shorthandAssign=o),u},Vu.parseMaybeConditional=function(e,t){var n=this.start,i=this.startLoc,r=this.parseExprOps(e,t);if(this.checkExpressionErrors(t))return r;if(this.eat(ru.question)){var s=this.startNodeAt(n,i);return s.test=r,s.consequent=this.parseMaybeAssign(),this.expect(ru.colon),s.alternate=this.parseMaybeAssign(e),this.finishNode(s,"ConditionalExpression")}return r},Vu.parseExprOps=function(e,t){var n=this.start,i=this.startLoc,r=this.parseMaybeUnary(t,!1);return this.checkExpressionErrors(t)?r:r.start===n&&"ArrowFunctionExpression"===r.type?r:this.parseExprOp(r,n,i,-1,e)},Vu.parseExprOp=function(e,t,n,i,r){var s=this.type.binop;if(null!=s&&(!r||this.type!==ru._in)&&s>i){var o=this.type===ru.logicalOR||this.type===ru.logicalAND,a=this.value;this.next();var h=this.start,u=this.startLoc,c=this.parseExprOp(this.parseMaybeUnary(null,!1),h,u,s,r),l=this.buildBinary(t,n,e,c,a,o);return this.parseExprOp(l,t,n,i,r)}return e},Vu.buildBinary=function(e,t,n,i,r,s){var o=this.startNodeAt(e,t);return o.left=n,o.operator=r,o.right=i,this.finishNode(o,s?"LogicalExpression":"BinaryExpression")},Vu.parseMaybeUnary=function(e,t){var n,i=this.start,r=this.startLoc;if(this.isContextual("await")&&(this.inAsync||!this.inFunction&&this.options.allowAwaitOutsideFunction))n=this.parseAwait(),t=!0;else if(this.type.prefix){var s=this.startNode(),o=this.type===ru.incDec;s.operator=this.value,s.prefix=!0,this.next(),s.argument=this.parseMaybeUnary(null,!0),this.checkExpressionErrors(e,!0),o?this.checkLVal(s.argument):this.strict&&"delete"===s.operator&&"Identifier"===s.argument.type?this.raiseRecoverable(s.start,"Deleting local variable in strict mode"):t=!0,n=this.finishNode(s,o?"UpdateExpression":"UnaryExpression")}else{if(n=this.parseExprSubscripts(e),this.checkExpressionErrors(e))return n;for(;this.type.postfix&&!this.canInsertSemicolon();){var a=this.startNodeAt(i,r);a.operator=this.value,a.prefix=!1,a.argument=n,this.checkLVal(n),this.next(),n=this.finishNode(a,"UpdateExpression")}}return!t&&this.eat(ru.starstar)?this.buildBinary(i,r,n,this.parseMaybeUnary(null,!1),"**",!1):n},Vu.parseExprSubscripts=function(e){var t=this.start,n=this.startLoc,i=this.parseExprAtom(e),r="ArrowFunctionExpression"===i.type&&")"!==this.input.slice(this.lastTokStart,this.lastTokEnd);if(this.checkExpressionErrors(e)||r)return i;var s=this.parseSubscripts(i,t,n);return e&&"MemberExpression"===s.type&&(e.parenthesizedAssign>=s.start&&(e.parenthesizedAssign=-1),e.parenthesizedBind>=s.start&&(e.parenthesizedBind=-1)),s},Vu.parseSubscripts=function(e,t,n,i){for(var r=this.options.ecmaVersion>=8&&"Identifier"===e.type&&"async"===e.name&&this.lastTokEnd===e.end&&!this.canInsertSemicolon()&&"async"===this.input.slice(e.start,e.end);;){var s=this.parseSubscript(e,t,n,i,r);if(s===e||"ArrowFunctionExpression"===s.type)return s;e=s}},Vu.parseSubscript=function(e,t,n,i,r){var s=this.eat(ru.bracketL);if(s||this.eat(ru.dot)){var o=this.startNodeAt(t,n);o.object=e,o.property=s?this.parseExpression():this.parseIdent("never"!==this.options.allowReserved),o.computed=!!s,s&&this.expect(ru.bracketR),e=this.finishNode(o,"MemberExpression")}else if(!i&&this.eat(ru.parenL)){var a=new Nu,h=this.yieldPos,u=this.awaitPos,c=this.awaitIdentPos;this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0;var l=this.parseExprList(ru.parenR,this.options.ecmaVersion>=8,!1,a);if(r&&!this.canInsertSemicolon()&&this.eat(ru.arrow))return this.checkPatternErrors(a,!1),this.checkYieldAwaitInDefaultParams(),this.awaitIdentPos>0&&this.raise(this.awaitIdentPos,"Cannot use 'await' as identifier inside an async function"),this.yieldPos=h,this.awaitPos=u,this.awaitIdentPos=c,this.parseArrowExpression(this.startNodeAt(t,n),l,!0);this.checkExpressionErrors(a,!0),this.yieldPos=h||this.yieldPos,this.awaitPos=u||this.awaitPos,this.awaitIdentPos=c||this.awaitIdentPos;var p=this.startNodeAt(t,n);p.callee=e,p.arguments=l,e=this.finishNode(p,"CallExpression")}else if(this.type===ru.backQuote){var d=this.startNodeAt(t,n);d.tag=e,d.quasi=this.parseTemplate({isTagged:!0}),e=this.finishNode(d,"TaggedTemplateExpression")}return e},Vu.parseExprAtom=function(e){this.type===ru.slash&&this.readRegexp();var t,n=this.potentialArrowAt===this.start;switch(this.type){case ru._super:return this.allowSuper||this.raise(this.start,"'super' keyword outside a method"),t=this.startNode(),this.next(),this.type!==ru.parenL||this.allowDirectSuper||this.raise(t.start,"super() call outside constructor of a subclass"),this.type!==ru.dot&&this.type!==ru.bracketL&&this.type!==ru.parenL&&this.unexpected(),this.finishNode(t,"Super");case ru._this:return t=this.startNode(),this.next(),this.finishNode(t,"ThisExpression");case ru.name:var i=this.start,r=this.startLoc,s=this.containsEsc,o=this.parseIdent(!1);if(this.options.ecmaVersion>=8&&!s&&"async"===o.name&&!this.canInsertSemicolon()&&this.eat(ru._function))return this.parseFunction(this.startNodeAt(i,r),0,!1,!0);if(n&&!this.canInsertSemicolon()){if(this.eat(ru.arrow))return this.parseArrowExpression(this.startNodeAt(i,r),[o],!1);if(this.options.ecmaVersion>=8&&"async"===o.name&&this.type===ru.name&&!s)return o=this.parseIdent(!1),!this.canInsertSemicolon()&&this.eat(ru.arrow)||this.unexpected(),this.parseArrowExpression(this.startNodeAt(i,r),[o],!0)}return o;case ru.regexp:var a=this.value;return(t=this.parseLiteral(a.value)).regex={pattern:a.pattern,flags:a.flags},t;case ru.num:case ru.string:return this.parseLiteral(this.value);case ru._null:case ru._true:case ru._false:return(t=this.startNode()).value=this.type===ru._null?null:this.type===ru._true,t.raw=this.type.keyword,this.next(),this.finishNode(t,"Literal");case ru.parenL:var h=this.start,u=this.parseParenAndDistinguishExpression(n);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(u)&&(e.parenthesizedAssign=h),e.parenthesizedBind<0&&(e.parenthesizedBind=h)),u;case ru.bracketL:return t=this.startNode(),this.next(),t.elements=this.parseExprList(ru.bracketR,!0,!0,e),this.finishNode(t,"ArrayExpression");case ru.braceL:return this.parseObj(!1,e);case ru._function:return t=this.startNode(),this.next(),this.parseFunction(t,0);case ru._class:return this.parseClass(this.startNode(),!1);case ru._new:return this.parseNew();case ru.backQuote:return this.parseTemplate();case ru._import:return this.options.ecmaVersion>=11?this.parseExprImport():this.unexpected();default:this.unexpected()}},Vu.parseExprImport=function(){var e=this.startNode();switch(this.next(),this.type){case ru.parenL:return this.parseDynamicImport(e);default:this.unexpected()}},Vu.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(ru.parenR)){var t=this.start;this.eat(ru.comma)&&this.eat(ru.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},Vu.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1)),this.next(),this.finishNode(t,"Literal")},Vu.parseParenExpression=function(){this.expect(ru.parenL);var e=this.parseExpression();return this.expect(ru.parenR),e},Vu.parseParenAndDistinguishExpression=function(e){var t,n=this.start,i=this.startLoc,r=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var s,o=this.start,a=this.startLoc,h=[],u=!0,c=!1,l=new Nu,p=this.yieldPos,d=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==ru.parenR;){if(u?u=!1:this.expect(ru.comma),r&&this.afterTrailingComma(ru.parenR,!0)){c=!0;break}if(this.type===ru.ellipsis){s=this.start,h.push(this.parseParenItem(this.parseRestBinding())),this.type===ru.comma&&this.raise(this.start,"Comma is not permitted after the rest element");break}h.push(this.parseMaybeAssign(!1,l,this.parseParenItem))}var f=this.start,m=this.startLoc;if(this.expect(ru.parenR),e&&!this.canInsertSemicolon()&&this.eat(ru.arrow))return this.checkPatternErrors(l,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=p,this.awaitPos=d,this.parseParenArrowList(n,i,h);h.length&&!c||this.unexpected(this.lastTokStart),s&&this.unexpected(s),this.checkExpressionErrors(l,!0),this.yieldPos=p||this.yieldPos,this.awaitPos=d||this.awaitPos,h.length>1?((t=this.startNodeAt(o,a)).expressions=h,this.finishNodeAt(t,"SequenceExpression",f,m)):t=h[0]}else t=this.parseParenExpression();if(this.options.preserveParens){var g=this.startNodeAt(n,i);return g.expression=t,this.finishNode(g,"ParenthesizedExpression")}return t},Vu.parseParenItem=function(e){return e},Vu.parseParenArrowList=function(e,t,n){return this.parseArrowExpression(this.startNodeAt(e,t),n)};var Bu=[];Vu.parseNew=function(){var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(ru.dot)){e.meta=t;var n=this.containsEsc;return e.property=this.parseIdent(!0),("target"!==e.property.name||n)&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is new.target"),this.inNonArrowFunction()||this.raiseRecoverable(e.start,"new.target can only be used in functions"),this.finishNode(e,"MetaProperty")}var i=this.start,r=this.startLoc,s=this.type===ru._import;return e.callee=this.parseSubscripts(this.parseExprAtom(),i,r,!0),s&&"ImportExpression"===e.callee.type&&this.raise(i,"Cannot use new with import()"),this.eat(ru.parenL)?e.arguments=this.parseExprList(ru.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Bu,this.finishNode(e,"NewExpression")},Vu.parseTemplateElement=function(e){var t=e.isTagged,n=this.startNode();return this.type===ru.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),n.value={raw:this.value,cooked:null}):n.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),n.tail=this.type===ru.backQuote,this.finishNode(n,"TemplateElement")},Vu.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var n=this.startNode();this.next(),n.expressions=[];var i=this.parseTemplateElement({isTagged:t});for(n.quasis=[i];!i.tail;)this.type===ru.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(ru.dollarBraceL),n.expressions.push(this.parseExpression()),this.expect(ru.braceR),n.quasis.push(i=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(n,"TemplateLiteral")},Vu.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===ru.name||this.type===ru.num||this.type===ru.string||this.type===ru.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===ru.star)&&!su.test(this.input.slice(this.lastTokEnd,this.start))},Vu.parseObj=function(e,t){var n=this.startNode(),i=!0,r={};for(n.properties=[],this.next();!this.eat(ru.braceR);){if(i)i=!1;else if(this.expect(ru.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(ru.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,r,t),n.properties.push(s)}return this.finishNode(n,e?"ObjectPattern":"ObjectExpression")},Vu.parseProperty=function(e,t){var n,i,r,s,o=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(ru.ellipsis))return e?(o.argument=this.parseIdent(!1),this.type===ru.comma&&this.raise(this.start,"Comma is not permitted after the rest element"),this.finishNode(o,"RestElement")):(this.type===ru.parenL&&t&&(t.parenthesizedAssign<0&&(t.parenthesizedAssign=this.start),t.parenthesizedBind<0&&(t.parenthesizedBind=this.start)),o.argument=this.parseMaybeAssign(!1,t),this.type===ru.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(o,"SpreadElement"));this.options.ecmaVersion>=6&&(o.method=!1,o.shorthand=!1,(e||t)&&(r=this.start,s=this.startLoc),e||(n=this.eat(ru.star)));var a=this.containsEsc;return this.parsePropertyName(o),!e&&!a&&this.options.ecmaVersion>=8&&!n&&this.isAsyncProp(o)?(i=!0,n=this.options.ecmaVersion>=9&&this.eat(ru.star),this.parsePropertyName(o,t)):i=!1,this.parsePropertyValue(o,e,n,i,r,s,t,a),this.finishNode(o,"Property")},Vu.parsePropertyValue=function(e,t,n,i,r,s,o,a){if((n||i)&&this.type===ru.colon&&this.unexpected(),this.eat(ru.colon))e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,o),e.kind="init";else if(this.options.ecmaVersion>=6&&this.type===ru.parenL)t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(n,i);else if(t||a||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===ru.comma||this.type===ru.braceR)this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((n||i)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=r),e.kind="init",t?e.value=this.parseMaybeDefault(r,s,e.key):this.type===ru.eq&&o?(o.shorthandAssign<0&&(o.shorthandAssign=this.start),e.value=this.parseMaybeDefault(r,s,e.key)):e.value=e.key,e.shorthand=!0):this.unexpected();else{(n||i)&&this.unexpected(),e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var h="get"===e.kind?0:1;if(e.value.params.length!==h){var u=e.value.start;"get"===e.kind?this.raiseRecoverable(u,"getter should have no params"):this.raiseRecoverable(u,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")}},Vu.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(ru.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(ru.bracketR),e.key;e.computed=!1}return e.key=this.type===ru.num||this.type===ru.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},Vu.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},Vu.parseMethod=function(e,t,n){var i=this.startNode(),r=this.yieldPos,s=this.awaitPos,o=this.awaitIdentPos;return this.initFunction(i),this.options.ecmaVersion>=6&&(i.generator=e),this.options.ecmaVersion>=8&&(i.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(64|Cu(t,i.generator)|(n?128:0)),this.expect(ru.parenL),i.params=this.parseBindingList(ru.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(i,!1,!0),this.yieldPos=r,this.awaitPos=s,this.awaitIdentPos=o,this.finishNode(i,"FunctionExpression")},Vu.parseArrowExpression=function(e,t,n){var i=this.yieldPos,r=this.awaitPos,s=this.awaitIdentPos;return this.enterScope(16|Cu(n,!1)),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!n),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1),this.yieldPos=i,this.awaitPos=r,this.awaitIdentPos=s,this.finishNode(e,"ArrowFunctionExpression")},Vu.parseFunctionBody=function(e,t,n){var i=t&&this.type!==ru.braceL,r=this.strict,s=!1;if(i)e.body=this.parseMaybeAssign(),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);r&&!o||(s=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var a=this.labels;this.labels=[],s&&(this.strict=!0),this.checkParams(e,!r&&!s&&!t&&!n&&this.isSimpleParamList(e.params)),e.body=this.parseBlock(!1),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=a}this.exitScope(),this.strict&&e.id&&this.checkLVal(e.id,5),this.strict=r},Vu.isSimpleParamList=function(e){for(var t=0,n=e;t<n.length;t+=1){if("Identifier"!==n[t].type)return!1}return!0},Vu.checkParams=function(e,t){for(var n={},i=0,r=e.params;i<r.length;i+=1){var s=r[i];this.checkLVal(s,1,t?null:n)}},Vu.parseExprList=function(e,t,n,i){for(var r=[],s=!0;!this.eat(e);){if(s)s=!1;else if(this.expect(ru.comma),t&&this.afterTrailingComma(e))break;var o=void 0;n&&this.type===ru.comma?o=null:this.type===ru.ellipsis?(o=this.parseSpread(i),i&&this.type===ru.comma&&i.trailingComma<0&&(i.trailingComma=this.start)):o=this.parseMaybeAssign(!1,i),r.push(o)}return r},Vu.checkUnreserved=function(e){var t=e.start,n=e.end,i=e.name;(this.inGenerator&&"yield"===i&&this.raiseRecoverable(t,"Cannot use 'yield' as identifier inside a generator"),this.inAsync&&"await"===i&&this.raiseRecoverable(t,"Cannot use 'await' as identifier inside an async function"),this.keywords.test(i)&&this.raise(t,"Unexpected keyword '"+i+"'"),this.options.ecmaVersion<6&&-1!==this.input.slice(t,n).indexOf("\\"))||(this.strict?this.reservedWordsStrict:this.reservedWords).test(i)&&(this.inAsync||"await"!==i||this.raiseRecoverable(t,"Cannot use keyword 'await' outside an async function"),this.raiseRecoverable(t,"The keyword '"+i+"' is reserved"))},Vu.parseIdent=function(e,t){var n=this.startNode();return this.type===ru.name?n.name=this.value:this.type.keyword?(n.name=this.type.keyword,"class"!==n.name&&"function"!==n.name||this.lastTokEnd===this.lastTokStart+1&&46===this.input.charCodeAt(this.lastTokStart)||this.context.pop()):this.unexpected(),this.next(),this.finishNode(n,"Identifier"),e||(this.checkUnreserved(n),"await"!==n.name||this.awaitIdentPos||(this.awaitIdentPos=n.start)),n},Vu.parseYield=function(e){this.yieldPos||(this.yieldPos=this.start);var t=this.startNode();return this.next(),this.type===ru.semi||this.canInsertSemicolon()||this.type!==ru.star&&!this.type.startsExpr?(t.delegate=!1,t.argument=null):(t.delegate=this.eat(ru.star),t.argument=this.parseMaybeAssign(e)),this.finishNode(t,"YieldExpression")},Vu.parseAwait=function(){this.awaitPos||(this.awaitPos=this.start);var e=this.startNode();return this.next(),e.argument=this.parseMaybeUnary(null,!0),this.finishNode(e,"AwaitExpression")};var zu=Iu.prototype;zu.raise=function(e,t){var n=vu(this.input,e);t+=" ("+n.line+":"+n.column+")";var i=new SyntaxError(t);throw i.pos=e,i.loc=n,i.raisedAt=this.pos,i},zu.raiseRecoverable=zu.raise,zu.curPosition=function(){if(this.options.locations)return new gu(this.curLine,this.pos-this.lineStart)};var Wu=Iu.prototype,ju=function(e){this.flags=e,this.var=[],this.lexical=[],this.functions=[]};Wu.enterScope=function(e){this.scopeStack.push(new ju(e))},Wu.exitScope=function(){this.scopeStack.pop()},Wu.treatFunctionsAsVarInScope=function(e){return e.flags&_u||!this.inModule&&1&e.flags},Wu.declareName=function(e,t,n){var i=!1;if(2===t){var r=this.currentScope();i=r.lexical.indexOf(e)>-1||r.functions.indexOf(e)>-1||r.var.indexOf(e)>-1,r.lexical.push(e),this.inModule&&1&r.flags&&delete this.undefinedExports[e]}else if(4===t){this.currentScope().lexical.push(e)}else if(3===t){var s=this.currentScope();i=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var o=this.scopeStack.length-1;o>=0;--o){var a=this.scopeStack[o];if(a.lexical.indexOf(e)>-1&&!(32&a.flags&&a.lexical[0]===e)||!this.treatFunctionsAsVarInScope(a)&&a.functions.indexOf(e)>-1){i=!0;break}if(a.var.push(e),this.inModule&&1&a.flags&&delete this.undefinedExports[e],a.flags&bu)break}i&&this.raiseRecoverable(n,"Identifier '"+e+"' has already been declared")},Wu.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},Wu.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},Wu.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&bu)return t}},Wu.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&bu&&!(16&t.flags))return t}};var Fu=function(e,t,n){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new yu(e,n)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Uu=Iu.prototype;function Gu(e,t,n,i){return e.type=t,e.end=n,this.options.locations&&(e.loc.end=i),this.options.ranges&&(e.range[1]=n),e}Uu.startNode=function(){return new Fu(this,this.start,this.startLoc)},Uu.startNodeAt=function(e,t){return new Fu(this,e,t)},Uu.finishNode=function(e,t){return Gu.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Uu.finishNodeAt=function(e,t,n,i){return Gu.call(this,e,t,n,i)};var Hu=function(e,t,n,i,r){this.token=e,this.isExpr=!!t,this.preserveSpace=!!n,this.override=i,this.generator=!!r},qu={b_stat:new Hu("{",!1),b_expr:new Hu("{",!0),b_tmpl:new Hu("${",!1),p_stat:new Hu("(",!1),p_expr:new Hu("(",!0),q_tmpl:new Hu("`",!0,!0,(function(e){return e.tryReadTemplateToken()})),f_stat:new Hu("function",!1),f_expr:new Hu("function",!0),f_expr_gen:new Hu("function",!0,!1,null,!0),f_gen:new Hu("function",!1,!1,null,!0)},Ku=Iu.prototype;Ku.initialContext=function(){return[qu.b_stat]},Ku.braceIsBlock=function(e){var t=this.curContext();return t===qu.f_expr||t===qu.f_stat||(e!==ru.colon||t!==qu.b_stat&&t!==qu.b_expr?e===ru._return||e===ru.name&&this.exprAllowed?su.test(this.input.slice(this.lastTokEnd,this.start)):e===ru._else||e===ru.semi||e===ru.eof||e===ru.parenR||e===ru.arrow||(e===ru.braceL?t===qu.b_stat:e!==ru._var&&e!==ru._const&&e!==ru.name&&!this.exprAllowed):!t.isExpr)},Ku.inGeneratorContext=function(){for(var e=this.context.length-1;e>=1;e--){var t=this.context[e];if("function"===t.token)return t.generator}return!1},Ku.updateContext=function(e){var t,n=this.type;n.keyword&&e===ru.dot?this.exprAllowed=!1:(t=n.updateContext)?t.call(this,e):this.exprAllowed=n.beforeExpr},ru.parenR.updateContext=ru.braceR.updateContext=function(){if(1!==this.context.length){var e=this.context.pop();e===qu.b_stat&&"function"===this.curContext().token&&(e=this.context.pop()),this.exprAllowed=!e.isExpr}else this.exprAllowed=!0},ru.braceL.updateContext=function(e){this.context.push(this.braceIsBlock(e)?qu.b_stat:qu.b_expr),this.exprAllowed=!0},ru.dollarBraceL.updateContext=function(){this.context.push(qu.b_tmpl),this.exprAllowed=!0},ru.parenL.updateContext=function(e){var t=e===ru._if||e===ru._for||e===ru._with||e===ru._while;this.context.push(t?qu.p_stat:qu.p_expr),this.exprAllowed=!0},ru.incDec.updateContext=function(){},ru._function.updateContext=ru._class.updateContext=function(e){!e.beforeExpr||e===ru.semi||e===ru._else||e===ru._return&&su.test(this.input.slice(this.lastTokEnd,this.start))||(e===ru.colon||e===ru.braceL)&&this.curContext()===qu.b_stat?this.context.push(qu.f_stat):this.context.push(qu.f_expr),this.exprAllowed=!1},ru.backQuote.updateContext=function(){this.curContext()===qu.q_tmpl?this.context.pop():this.context.push(qu.q_tmpl),this.exprAllowed=!1},ru.star.updateContext=function(e){if(e===ru._function){var t=this.context.length-1;this.context[t]===qu.f_expr?this.context[t]=qu.f_expr_gen:this.context[t]=qu.f_gen}this.exprAllowed=!0},ru.name.updateContext=function(e){var t=!1;this.options.ecmaVersion>=6&&e!==ru.dot&&("of"===this.value&&!this.exprAllowed||"yield"===this.value&&this.inGeneratorContext())&&(t=!0),this.exprAllowed=t};var Yu="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Xu=Yu+" Extended_Pictographic",Qu={9:Yu,10:Xu,11:"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS Extended_Pictographic"},Ju="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",Zu="Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",ec=Zu+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",tc={9:Zu,10:ec,11:"Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"},nc={};function ic(e){var t=nc[e]={binary:mu(Qu[e]+" "+Ju),nonBinary:{General_Category:mu(Ju),Script:mu(tc[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}ic(9),ic(10),ic(11);var rc=Iu.prototype,sc=function(e){this.parser=e,this.validFlags="gim"+(e.options.ecmaVersion>=6?"uy":"")+(e.options.ecmaVersion>=9?"s":""),this.unicodeProperties=nc[e.options.ecmaVersion>=11?11:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function oc(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}function ac(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function hc(e){return e>=65&&e<=90||e>=97&&e<=122}function uc(e){return hc(e)||95===e}function cc(e){return uc(e)||lc(e)}function lc(e){return e>=48&&e<=57}function pc(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function dc(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function fc(e){return e>=48&&e<=55}sc.prototype.reset=function(e,t,n){var i=-1!==n.indexOf("u");this.start=0|e,this.source=t+"",this.flags=n,this.switchU=i&&this.parser.options.ecmaVersion>=6,this.switchN=i&&this.parser.options.ecmaVersion>=9},sc.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},sc.prototype.at=function(e){var t=this.source,n=t.length;if(e>=n)return-1;var i=t.charCodeAt(e);return!this.switchU||i<=55295||i>=57344||e+1>=n?i:(i<<10)+t.charCodeAt(e+1)-56613888},sc.prototype.nextIndex=function(e){var t=this.source,n=t.length;if(e>=n)return n;var i=t.charCodeAt(e);return!this.switchU||i<=55295||i>=57344||e+1>=n?e+1:e+2},sc.prototype.current=function(){return this.at(this.pos)},sc.prototype.lookahead=function(){return this.at(this.nextIndex(this.pos))},sc.prototype.advance=function(){this.pos=this.nextIndex(this.pos)},sc.prototype.eat=function(e){return this.current()===e&&(this.advance(),!0)},rc.validateRegExpFlags=function(e){for(var t=e.validFlags,n=e.flags,i=0;i<n.length;i++){var r=n.charAt(i);-1===t.indexOf(r)&&this.raise(e.start,"Invalid regular expression flag"),n.indexOf(r,i+1)>-1&&this.raise(e.start,"Duplicate regular expression flag")}},rc.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},rc.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,n=e.backReferenceNames;t<n.length;t+=1){var i=n[t];-1===e.groupNames.indexOf(i)&&e.raise("Invalid named capture referenced")}},rc.regexp_disjunction=function(e){for(this.regexp_alternative(e);e.eat(124);)this.regexp_alternative(e);this.regexp_eatQuantifier(e,!0)&&e.raise("Nothing to repeat"),e.eat(123)&&e.raise("Lone quantifier brackets")},rc.regexp_alternative=function(e){for(;e.pos<e.source.length&&this.regexp_eatTerm(e););},rc.regexp_eatTerm=function(e){return this.regexp_eatAssertion(e)?(e.lastAssertionIsQuantifiable&&this.regexp_eatQuantifier(e)&&e.switchU&&e.raise("Invalid quantifier"),!0):!(e.switchU?!this.regexp_eatAtom(e):!this.regexp_eatExtendedAtom(e))&&(this.regexp_eatQuantifier(e),!0)},rc.regexp_eatAssertion=function(e){var t=e.pos;if(e.lastAssertionIsQuantifiable=!1,e.eat(94)||e.eat(36))return!0;if(e.eat(92)){if(e.eat(66)||e.eat(98))return!0;e.pos=t}if(e.eat(40)&&e.eat(63)){var n=!1;if(this.options.ecmaVersion>=9&&(n=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!n,!0}return e.pos=t,!1},rc.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},rc.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},rc.regexp_eatBracedQuantifier=function(e,t){var n=e.pos;if(e.eat(123)){var i=0,r=-1;if(this.regexp_eatDecimalDigits(e)&&(i=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue),e.eat(125)))return-1!==r&&r<i&&!t&&e.raise("numbers out of order in {} quantifier"),!0;e.switchU&&!t&&e.raise("Incomplete quantifier"),e.pos=n}return!1},rc.regexp_eatAtom=function(e){return this.regexp_eatPatternCharacters(e)||e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)},rc.regexp_eatReverseSolidusAtomEscape=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatAtomEscape(e))return!0;e.pos=t}return!1},rc.regexp_eatUncapturingGroup=function(e){var t=e.pos;if(e.eat(40)){if(e.eat(63)&&e.eat(58)){if(this.regexp_disjunction(e),e.eat(41))return!0;e.raise("Unterminated group")}e.pos=t}return!1},rc.regexp_eatCapturingGroup=function(e){if(e.eat(40)){if(this.options.ecmaVersion>=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},rc.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},rc.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},rc.regexp_eatSyntaxCharacter=function(e){var t=e.current();return!!ac(t)&&(e.lastIntValue=t,e.advance(),!0)},rc.regexp_eatPatternCharacters=function(e){for(var t=e.pos,n=0;-1!==(n=e.current())&&!ac(n);)e.advance();return e.pos!==t},rc.regexp_eatExtendedPatternCharacter=function(e){var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t)&&(e.advance(),!0)},rc.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},rc.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},rc.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=oc(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=oc(e.lastIntValue);return!0}return!1},rc.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return Xh(e,!0)||36===e||95===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},rc.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return Qh(e,!0)||36===e||95===e||8204===e||8205===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},rc.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},rc.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var n=e.lastIntValue;if(e.switchU)return n>e.maxBackReference&&(e.maxBackReference=n),!0;if(n<=e.numCapturingParens)return!0;e.pos=t}return!1},rc.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},rc.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},rc.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},rc.regexp_eatZero=function(e){return 48===e.current()&&!lc(e.lookahead())&&(e.lastIntValue=0,e.advance(),!0)},rc.regexp_eatControlEscape=function(e){var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},rc.regexp_eatControlLetter=function(e){var t=e.current();return!!hc(t)&&(e.lastIntValue=t%32,e.advance(),!0)},rc.regexp_eatRegExpUnicodeEscapeSequence=function(e){var t,n=e.pos;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var i=e.lastIntValue;if(e.switchU&&i>=55296&&i<=56319){var r=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var s=e.lastIntValue;if(s>=56320&&s<=57343)return e.lastIntValue=1024*(i-55296)+(s-56320)+65536,!0}e.pos=r,e.lastIntValue=i}return!0}if(e.switchU&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&((t=e.lastIntValue)>=0&&t<=1114111))return!0;e.switchU&&e.raise("Invalid unicode escape"),e.pos=n}return!1},rc.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t)&&(e.lastIntValue=t,e.advance(),!0)},rc.regexp_eatDecimalEscape=function(e){e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1},rc.regexp_eatCharacterClassEscape=function(e){var t=e.current();if(function(e){return 100===e||68===e||115===e||83===e||119===e||87===e}(t))return e.lastIntValue=-1,e.advance(),!0;if(e.switchU&&this.options.ecmaVersion>=9&&(80===t||112===t)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&this.regexp_eatUnicodePropertyValueExpression(e)&&e.eat(125))return!0;e.raise("Invalid property name")}return!1},rc.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var n=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var i=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,n,i),!0}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,r),!0}return!1},rc.regexp_validateUnicodePropertyNameAndValue=function(e,t,n){du(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(n)||e.raise("Invalid property value")},rc.regexp_validateUnicodePropertyNameOrValue=function(e,t){e.unicodeProperties.binary.test(t)||e.raise("Invalid property name")},rc.regexp_eatUnicodePropertyName=function(e){var t=0;for(e.lastStringValue="";uc(t=e.current());)e.lastStringValue+=oc(t),e.advance();return""!==e.lastStringValue},rc.regexp_eatUnicodePropertyValue=function(e){var t=0;for(e.lastStringValue="";cc(t=e.current());)e.lastStringValue+=oc(t),e.advance();return""!==e.lastStringValue},rc.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},rc.regexp_eatCharacterClass=function(e){if(e.eat(91)){if(e.eat(94),this.regexp_classRanges(e),e.eat(93))return!0;e.raise("Unterminated character class")}return!1},rc.regexp_classRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var n=e.lastIntValue;!e.switchU||-1!==t&&-1!==n||e.raise("Invalid character class"),-1!==t&&-1!==n&&t>n&&e.raise("Range out of order in character class")}}},rc.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var n=e.current();(99===n||fc(n))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var i=e.current();return 93!==i&&(e.lastIntValue=i,e.advance(),!0)},rc.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},rc.regexp_eatClassControlLetter=function(e){var t=e.current();return!(!lc(t)&&95!==t)&&(e.lastIntValue=t%32,e.advance(),!0)},rc.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},rc.regexp_eatDecimalDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;lc(n=e.current());)e.lastIntValue=10*e.lastIntValue+(n-48),e.advance();return e.pos!==t},rc.regexp_eatHexDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;pc(n=e.current());)e.lastIntValue=16*e.lastIntValue+dc(n),e.advance();return e.pos!==t},rc.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var n=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*n+e.lastIntValue:e.lastIntValue=8*t+n}else e.lastIntValue=t;return!0}return!1},rc.regexp_eatOctalDigit=function(e){var t=e.current();return fc(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},rc.regexp_eatFixedHexDigits=function(e,t){var n=e.pos;e.lastIntValue=0;for(var i=0;i<t;++i){var r=e.current();if(!pc(r))return e.pos=n,!1;e.lastIntValue=16*e.lastIntValue+dc(r),e.advance()}return!0};var mc=function(e){this.type=e.type,this.value=e.value,this.start=e.start,this.end=e.end,e.options.locations&&(this.loc=new yu(e,e.startLoc,e.endLoc)),e.options.ranges&&(this.range=[e.start,e.end])},gc=Iu.prototype;function yc(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}gc.next=function(){this.options.onToken&&this.options.onToken(new mc(this)),this.lastTokEnd=this.end,this.lastTokStart=this.start,this.lastTokEndLoc=this.endLoc,this.lastTokStartLoc=this.startLoc,this.nextToken()},gc.getToken=function(){return this.next(),new mc(this)},"undefined"!=typeof Symbol&&(gc[Symbol.iterator]=function(){var e=this;return{next:function(){var t=e.getToken();return{done:t.type===ru.eof,value:t}}}}),gc.curContext=function(){return this.context[this.context.length-1]},gc.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(ru.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},gc.readToken=function(e){return Xh(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},gc.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);return e<=55295||e>=57344?e:(e<<10)+this.input.charCodeAt(this.pos+1)-56613888},gc.skipBlockComment=function(){var e,t=this.options.onComment&&this.curPosition(),n=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(ou.lastIndex=n;(e=ou.exec(this.input))&&e.index<this.pos;)++this.curLine,this.lineStart=e.index+e[0].length;this.options.onComment&&this.options.onComment(!0,this.input.slice(n+2,i),n,this.pos,t,this.curPosition())},gc.skipLineComment=function(e){for(var t=this.pos,n=this.options.onComment&&this.curPosition(),i=this.input.charCodeAt(this.pos+=e);this.pos<this.input.length&&!au(i);)i=this.input.charCodeAt(++this.pos);this.options.onComment&&this.options.onComment(!1,this.input.slice(t+e,this.pos),t,this.pos,n,this.curPosition())},gc.skipSpace=function(){e:for(;this.pos<this.input.length;){var e=this.input.charCodeAt(this.pos);switch(e){case 32:case 160:++this.pos;break;case 13:10===this.input.charCodeAt(this.pos+1)&&++this.pos;case 10:case 8232:case 8233:++this.pos,this.options.locations&&(++this.curLine,this.lineStart=this.pos);break;case 47:switch(this.input.charCodeAt(this.pos+1)){case 42:this.skipBlockComment();break;case 47:this.skipLineComment(2);break;default:break e}break;default:if(!(e>8&&e<14||e>=5760&&hu.test(String.fromCharCode(e))))break e;++this.pos}}},gc.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var n=this.type;this.type=e,this.value=t,this.updateContext(n)},gc.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(ru.ellipsis)):(++this.pos,this.finishToken(ru.dot))},gc.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(ru.assign,2):this.finishOp(ru.slash,1)},gc.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),n=1,i=42===e?ru.star:ru.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++n,i=ru.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(ru.assign,n+1):this.finishOp(i,n)},gc.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.finishOp(124===e?ru.logicalOR:ru.logicalAND,2):61===t?this.finishOp(ru.assign,2):this.finishOp(124===e?ru.bitwiseOR:ru.bitwiseAND,1)},gc.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(ru.assign,2):this.finishOp(ru.bitwiseXOR,1)},gc.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!su.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(ru.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(ru.assign,2):this.finishOp(ru.plusMin,1)},gc.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),n=1;return t===e?(n=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+n)?this.finishOp(ru.assign,n+1):this.finishOp(ru.bitShift,n)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(n=2),this.finishOp(ru.relational,n)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},gc.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(ru.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(ru.arrow)):this.finishOp(61===e?ru.eq:ru.prefix,1)},gc.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(ru.parenL);case 41:return++this.pos,this.finishToken(ru.parenR);case 59:return++this.pos,this.finishToken(ru.semi);case 44:return++this.pos,this.finishToken(ru.comma);case 91:return++this.pos,this.finishToken(ru.bracketL);case 93:return++this.pos,this.finishToken(ru.bracketR);case 123:return++this.pos,this.finishToken(ru.braceL);case 125:return++this.pos,this.finishToken(ru.braceR);case 58:return++this.pos,this.finishToken(ru.colon);case 63:return++this.pos,this.finishToken(ru.question);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(ru.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 126:return this.finishOp(ru.prefix,1)}this.raise(this.pos,"Unexpected character '"+yc(e)+"'")},gc.finishOp=function(e,t){var n=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,n)},gc.readRegexp=function(){for(var e,t,n=this.pos;;){this.pos>=this.input.length&&this.raise(n,"Unterminated regular expression");var i=this.input.charAt(this.pos);if(su.test(i)&&this.raise(n,"Unterminated regular expression"),e)e=!1;else{if("["===i)t=!0;else if("]"===i&&t)t=!1;else if("/"===i&&!t)break;e="\\"===i}++this.pos}var r=this.input.slice(n,this.pos);++this.pos;var s=this.pos,o=this.readWord1();this.containsEsc&&this.unexpected(s);var a=this.regexpState||(this.regexpState=new sc(this));a.reset(n,r,o),this.validateRegExpFlags(a),this.validateRegExpPattern(a);var h=null;try{h=new RegExp(r,o)}catch(e){}return this.finishToken(ru.regexp,{pattern:r,flags:o,value:h})},gc.readInt=function(e,t){for(var n=this.pos,i=0,r=0,s=null==t?1/0:t;r<s;++r){var o=this.input.charCodeAt(this.pos),a=void 0;if((a=o>=97?o-97+10:o>=65?o-65+10:o>=48&&o<=57?o-48:1/0)>=e)break;++this.pos,i=i*e+a}return this.pos===n||null!=t&&this.pos-n!==t?null:i},gc.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var n=this.readInt(e);return null==n&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(n="undefined"!=typeof BigInt?BigInt(this.input.slice(t,this.pos)):null,++this.pos):Xh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(ru.num,n)},gc.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10)||this.raise(t,"Invalid number");var n=this.pos-t>=2&&48===this.input.charCodeAt(t);n&&this.strict&&this.raise(t,"Invalid number"),n&&/[89]/.test(this.input.slice(t,this.pos))&&(n=!1);var i=this.input.charCodeAt(this.pos);if(!n&&!e&&this.options.ecmaVersion>=11&&110===i){var r=this.input.slice(t,this.pos),s="undefined"!=typeof BigInt?BigInt(r):null;return++this.pos,Xh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(ru.num,s)}46!==i||n||(++this.pos,this.readInt(10),i=this.input.charCodeAt(this.pos)),69!==i&&101!==i||n||(43!==(i=this.input.charCodeAt(++this.pos))&&45!==i||++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),Xh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var o=this.input.slice(t,this.pos),a=n?parseInt(o,8):parseFloat(o);return this.finishToken(ru.num,a)},gc.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},gc.readString=function(e){for(var t="",n=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var i=this.input.charCodeAt(this.pos);if(i===e)break;92===i?(t+=this.input.slice(n,this.pos),t+=this.readEscapedChar(!1),n=this.pos):(au(i,this.options.ecmaVersion>=10)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(n,this.pos++),this.finishToken(ru.string,t)};var vc={};gc.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==vc)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},gc.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw vc;this.raise(e,t)},gc.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var n=this.input.charCodeAt(this.pos);if(96===n||36===n&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==ru.template&&this.type!==ru.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(ru.template,e)):36===n?(this.pos+=2,this.finishToken(ru.dollarBraceL)):(++this.pos,this.finishToken(ru.backQuote));if(92===n)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(au(n)){switch(e+=this.input.slice(t,this.pos),++this.pos,n){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(n)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},gc.readInvalidTemplateToken=function(){for(;this.pos<this.input.length;this.pos++)switch(this.input[this.pos]){case"\\":++this.pos;break;case"$":if("{"!==this.input[this.pos+1])break;case"`":return this.finishToken(ru.invalidTemplate,this.input.slice(this.start,this.pos))}this.raise(this.start,"Unterminated template")},gc.readEscapedChar=function(e){var t=this.input.charCodeAt(++this.pos);switch(++this.pos,t){case 110:return"\n";case 114:return"\r";case 120:return String.fromCharCode(this.readHexChar(2));case 117:return yc(this.readCodePoint());case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:return this.options.locations&&(this.lineStart=this.pos,++this.curLine),"";default:if(t>=48&&t<=55){var n=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],i=parseInt(n,8);return i>255&&(n=n.slice(0,-1),i=parseInt(n,8)),this.pos+=n.length-1,t=this.input.charCodeAt(this.pos),"0"===n&&56!==t&&57!==t||!this.strict&&!e||this.invalidStringToken(this.pos-1-n.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(i)}return au(t)?"":String.fromCharCode(t)}},gc.readHexChar=function(e){var t=this.pos,n=this.readInt(16,e);return null===n&&this.invalidStringToken(t,"Bad character escape sequence"),n},gc.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,n=this.pos,i=this.options.ecmaVersion>=6;this.pos<this.input.length;){var r=this.fullCharCodeAtPos();if(Qh(r,i))this.pos+=r<=65535?1:2;else{if(92!==r)break;this.containsEsc=!0,e+=this.input.slice(n,this.pos);var s=this.pos;117!==this.input.charCodeAt(++this.pos)&&this.invalidStringToken(this.pos,"Expecting Unicode escape sequence \\uXXXX"),++this.pos;var o=this.readCodePoint();(t?Xh:Qh)(o,i)||this.invalidStringToken(s,"Invalid Unicode escape"),e+=yc(o),n=this.pos}t=!1}return e+this.input.slice(n,this.pos)},gc.readWord=function(){var e=this.readWord1(),t=ru.name;return this.keywords.test(e)&&(this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword "+e),t=nu[e]),this.finishToken(t,e)};Iu.acorn={Parser:Iu,version:"7.1.0",defaultOptions:xu,Position:gu,SourceLocation:yu,getLineInfo:vu,Node:Fu,TokenType:Jh,tokTypes:ru,keywordTypes:nu,TokContext:Hu,tokContexts:qu,isIdentifierChar:Qh,isIdentifierStart:Xh,Token:mc,isNewLine:au,lineBreak:su,lineBreakG:ou,nonASCIIwhitespace:hu};const xc=function(e){return e&&e.default||e}(Object.freeze({__proto__:null,Node:Fu,Parser:Iu,Position:gu,SourceLocation:yu,TokContext:Hu,Token:mc,TokenType:Jh,defaultOptions:xu,getLineInfo:vu,isIdentifierChar:Qh,isIdentifierStart:Xh,isNewLine:au,keywordTypes:nu,lineBreak:su,lineBreakG:ou,nonASCIIwhitespace:hu,parse:function(e,t){return Iu.parse(e,t)},parseExpressionAt:function(e,t,n){return Iu.parseExpressionAt(e,t,n)},tokContexts:qu,tokTypes:ru,tokenizer:function(e,t){return Iu.tokenizer(e,t)},version:"7.1.0"})).tokTypes,Ec=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,_c=e=>{Ec.lastIndex=e.pos;let t=Ec.exec(e.input),n=e.pos+t[0].length;return"."===e.input.slice(n,n+1)};var bc=function(e){return class extends e{parseExprAtom(e){if(this.type!==xc._import||!_c(this))return super.parseExprAtom(e);this.options.allowImportExportEverywhere||this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'");let t=this.startNode();return t.meta=this.parseIdent(!0),this.expect(xc.dot),t.property=this.parseIdent(!0),"meta"!==t.property.name&&this.raiseRecoverable(t.property.start,"The only valid meta property for import is import.meta"),this.containsEsc&&this.raiseRecoverable(t.property.start,'"meta" in import.meta must not contain escape sequences'),this.finishNode(t,"MetaProperty")}parseStatement(e,t,n){if(this.type!==xc._import||!_c(this))return super.parseStatement(e,t,n);let i=this.startNode(),r=this.parseExpression();return this.parseExpressionStatement(i,r)}}};class Sc extends Ze{constructor(){super("undefined")}getLiteralValueAtPath(){}}class Ac extends _t{constructor(){super(),this.variables.set("undefined",new Sc)}findVariable(e){let t=this.variables.get(e);return t||(t=new oo(e),this.variables.set(e,t)),t}}const Cc=()=>({paths:Object.create(null),tracked:!1,unknownPath:null});class Ic{constructor(){this.entityPaths=new Map}track(e,t){let n=this.entityPaths.get(e);n||(n=Cc(),this.entityPaths.set(e,n));let i,r=0;for(;r<t.length;){const e=t[r];"string"==typeof e?(i=n.paths[e])||(i=Cc(),n.paths[e]=i):(i=n.unknownPath)||(i=Cc(),n.unknownPath=i),n=i,r++}const s=n.tracked;return n.tracked=!0,s}}var wc;function Pc(e,t){if(e in t)return Mo(function(e){return{code:Do.FILE_NAME_CONFLICT,message:`Could not emit file "${e}" as it conflicts with an already emitted file.`}}(e));t[e]=kc}!function(e){e[e.LOAD_AND_PARSE=0]="LOAD_AND_PARSE",e[e.ANALYSE=1]="ANALYSE",e[e.GENERATE=2]="GENERATE"}(wc||(wc={}));const kc={type:"placeholder"};function Nc(e,t,n){if("string"!=typeof e&&!Buffer.isBuffer(e)){const e=t.fileName||t.name||n;return Mo(zo(`Could not set source for ${"string"==typeof e?`asset "${e}"`:"unnamed asset"}, asset source needs to be a string of Buffer.`))}return e}function $c(e,t){return"string"!=typeof e.fileName?Mo((n=e.name||t,{code:Do.ASSET_NOT_FINALISED,message:`Plugin error - Unable to get file name for asset "${n}". Ensure that the source is set and that generate is called first.`})):e.fileName;var n}function Rc(e){const t=e.fileName||e.module&&e.module.facadeChunk.id;return t||Mo((n=e.fileName||e.name,{code:Do.CHUNK_NOT_GENERATED,message:`Plugin error - Unable to get file name for chunk "${n}". Ensure that generate is called first.`}));var n}class Tc{constructor(e){this.filesByReferenceId=new Map,this.buildFilesByReferenceId=this.filesByReferenceId,this.output=null,this.emitFile=e=>(function(e){return e&&("asset"===e.type||"chunk"===e.type)})(e)?function(e){const t=e.fileName||e.name;return!t||"string"==typeof t&&Oo(t)}(e)?"chunk"===e.type?this.emitChunk(e):this.emitAsset(e):Mo(zo(`The "fileName" or "name" properties of emitted files must be strings that are neither absolute nor relative paths and do not contain invalid characters, received "${e.fileName||e.name}".`)):Mo(zo(`Emitted files must be of type "asset" or "chunk", received "${e&&e.type}".`)),this.getFileName=e=>{const t=this.filesByReferenceId.get(e);return t?"chunk"===t.type?Rc(t):$c(t,e):Mo(function(e){return{code:Do.FILE_NOT_FOUND,message:`Plugin error - Unable to get file name for unknown file "${e}".`}}(e))},this.setAssetSource=(e,t)=>{const n=this.filesByReferenceId.get(e);if(!n)return Mo(function(e){return{code:Do.ASSET_NOT_FOUND,message:`Plugin error - Unable to set the source for unknown asset "${e}".`}}(e));if("asset"!==n.type)return Mo(zo(`Asset sources can only be set for emitted assets but "${e}" is an emitted chunk.`));if(void 0!==n.source)return Mo(function(e){return{code:Do.ASSET_SOURCE_ALREADY_SET,message:`Unable to set the source for asset "${e}", source already set.`}}(n.name||e));const i=Nc(t,n,e);this.output?this.finalizeAsset(n,i,e,this.output):n.source=i},this.graph=e}startOutput(e,t){this.filesByReferenceId=new Map(this.buildFilesByReferenceId),this.output={assetFileNames:t,bundle:e};for(const e of this.filesByReferenceId.values())e.fileName&&Pc(e.fileName,this.output.bundle);for(const[e,t]of this.filesByReferenceId.entries())"asset"===t.type&&void 0!==t.source&&this.finalizeAsset(t,t.source,e,this.output)}assertAssetsFinalized(){for(const[t,n]of this.filesByReferenceId.entries())"asset"===n.type&&"string"!=typeof n.fileName&&Mo((e=n.name||t,{code:Do.ASSET_SOURCE_MISSING,message:`Plugin error creating asset "${e}" - no asset source set.`}));var e}emitAsset(e){const t=void 0!==e.source?Nc(e.source,e,null):void 0,n={fileName:e.fileName,name:e.name,source:t,type:"asset"},i=this.assignReferenceId(n,e.fileName||e.name||e.type);return this.output&&(e.fileName&&Pc(e.fileName,this.output.bundle),void 0!==t&&this.finalizeAsset(n,t,i,this.output)),i}emitChunk(e){if(this.graph.phase>wc.LOAD_AND_PARSE&&Mo({code:Do.INVALID_ROLLUP_PHASE,message:"Cannot emit chunks after module loading has finished."}),"string"!=typeof e.id)return Mo(zo(`Emitted chunks need to have a valid string id, received "${e.id}"`));const t={fileName:e.fileName,module:null,name:e.name||e.id,type:"chunk"};return this.graph.moduleLoader.addEntryModules([{fileName:e.fileName||null,id:e.id,name:e.name||null}],!1).then(({newEntryModules:[e]})=>{t.module=e}).catch(()=>{}),this.assignReferenceId(t,e.id)}assignReferenceId(e,t){let n;do{const e=k();n?e.update(n):e.update(t),n=e.digest("hex").substr(0,8)}while(this.filesByReferenceId.has(n));return this.filesByReferenceId.set(n,e),n}finalizeAsset(e,t,n,i){const r=e.fileName||this.findExistingAssetFileNameWithSource(i.bundle,t)||function(e,t,n){const i=e||"asset";return Oh(Th(n.assetFileNames,"output.assetFileNames",{hash(){const e=k();return e.update(i),e.update(":"),e.update(t),e.digest("hex").substr(0,8)},ext:()=>ft(i).substr(1),extname:()=>ft(i),name:()=>i.substr(0,i.length-ft(i).length)}),n.bundle)}(e.name,t,i),s=Object.assign(Object.assign({},e),{source:t,fileName:r});this.filesByReferenceId.set(n,s);const o=this.graph;i.bundle[r]={fileName:r,get isAsset(){return o.warnDeprecation('Accessing "isAsset" on files in the bundle is deprecated, please use "type === \'asset\'" instead',!1),!0},source:t,type:"asset"}}findExistingAssetFileNameWithSource(e,t){for(const n of Object.keys(e)){const i=e[n];if("asset"===i.type&&(Buffer.isBuffer(t)&&Buffer.isBuffer(i.source)?t.equals(i.source):t===i.source))return n}return null}}const Oc="at position ",Mc=[{active:!0,deprecated:"ongenerate",replacement:"generateBundle"},{active:!0,deprecated:"onwrite",replacement:"generateBundle/writeBundle"},{active:!0,deprecated:"transformBundle",replacement:"renderChunk"},{active:!0,deprecated:"transformChunk",replacement:"renderChunk"},{active:!1,deprecated:"resolveAssetUrl",replacement:"resolveFileUrl"}];function Lc(e,t,{hook:n,id:i}={}){return"string"==typeof e&&(e={message:e}),e.code&&e.code!==Do.PLUGIN_ERROR&&(e.pluginCode=e.code),e.code=Do.PLUGIN_ERROR,e.plugin=t,n&&(e.hook=n),i&&(e.id=i),Mo(e)}function Dc(e,n,i,r){function s(t,n,i,r,s){let o=!1;return(...a)=>(o||(o=!0,e.warnDeprecation({message:`The "this.${n}" plugin context function used by plugin ${r} is deprecated. The "this.${i}" plugin context function should be used instead.`,plugin:r},s)),t(...a))}!function(e,t){for(const{active:n,deprecated:i,replacement:r}of Mc)for(const s of e)i in s&&t.warnDeprecation({message:`The "${i}" hook used by plugin ${s.name} is deprecated. The "${r}" hook should be used instead.`,plugin:s.name},n)}(n.plugins,e);const o=[...n.plugins,(a=n.preserveSymlinks,{name:"Rollup Core",resolveId:wa(a),load:e=>Sa(e),resolveFileUrl:({relativePath:e,format:t})=>Ta[t](e),resolveImportMeta(e,{chunkId:t,format:n}){const i=$a[n]&&$a[n](e,t);if(i)return i}})];var a;const h=new Tc(e),u=new Set,c=o.map((n,o)=>{let a,c=!0;if("string"!=typeof n.cacheKey&&(n.name.startsWith(Oc)||u.has(n.name)?c=!1:u.add(n.name)),i)if(c){const e=n.cacheKey||n.name;a=function(e){return{has(t){const n=e[t];return!!n&&(n[0]=0,!0)},get(t){const n=e[t];if(n)return n[0]=0,n[1]},set(t,n){e[t]=[0,n]},delete:t=>delete e[t]}}(i[e]||(i[e]=Object.create(null)))}else a=zc(n.name);else a=Vc;const l={addWatchFile(t){e.phase>=wc.GENERATE&&this.error({code:Do.INVALID_ROLLUP_PHASE,message:"Cannot call addWatchFile after the build has finished."}),e.watchFiles[t]=!0},cache:a,emitAsset:s((e,t)=>h.emitFile({type:"asset",name:e,source:t}),"emitAsset","emitFile",n.name,!1),emitChunk:s((e,t)=>h.emitFile({type:"chunk",id:e,name:t&&t.name}),"emitChunk","emitFile",n.name,!1),emitFile:h.emitFile,error:e=>Lc(e,n.name),getAssetFileName:s(h.getFileName,"getAssetFileName","getFileName",n.name,!1),getChunkFileName:s(h.getFileName,"getChunkFileName","getFileName",n.name,!1),getFileName:h.getFileName,getModuleInfo(t){const n=e.moduleById.get(t);if(null==n)throw new Error(`Unable to find module ${t}`);return{hasModuleSideEffects:n.moduleSideEffects,id:n.id,importedIds:n instanceof yt?[]:n.sources.map(e=>n.resolvedIds[e].id),isEntry:n instanceof xh&&n.isEntryPoint,isExternal:n instanceof yt}},isExternal:s((t,n,i=!1)=>e.moduleLoader.isExternal(t,n,i),"isExternal","resolve",n.name,!1),meta:{rollupVersion:t},get moduleIds(){return e.moduleById.keys()},parse:e.contextParse,resolve:(t,n,i)=>e.moduleLoader.resolveId(t,n,i&&i.skipSelf?o:null),resolveId:s((t,n)=>e.moduleLoader.resolveId(t,n).then(e=>e&&e.id),"resolveId","resolve",n.name,!1),setAssetSource:h.setAssetSource,warn(t){"string"==typeof t&&(t={message:t}),t.code&&(t.pluginCode=t.code),t.code="PLUGIN_WARNING",t.plugin=n.name,e.warn(t)},watcher:r?(()=>{let e=!1;function t(t,n){return e||(l.warn({code:"PLUGIN_WATCHER_DEPRECATED",message:"this.watcher usage is deprecated in plugins. Use the watchChange plugin hook and this.addWatchFile() instead."}),e=!0),r.on(t,n)}return Object.assign(Object.assign({},r),{addListener:t,on:t})})():void 0};return l});function l(e,t,n,i=!1,r){const s=o[n];let a=c[n];const h=s[e];if(h){if(r&&(!(a=r(a,s))||a===c[n]))throw new Error("Internal Rollup error: hookContext must return a new context object.");try{if("function"!=typeof h){if(i)return h;Mo({code:"INVALID_PLUGIN_HOOK",message:`Error running plugin hook ${e} for ${s.name}, expected a function hook.`})}return h.apply(a,t)}catch(t){return Lc(t,s.name,{hook:e})}}}function p(e,t,n,i=!1,r){const s=o[n];let a=c[n];const h=s[e];if(h){if(r&&(!(a=r(a,s))||a===c[n]))throw new Error("Internal Rollup error: hookContext must return a new context object.");return Promise.resolve().then(()=>{if("function"!=typeof h){if(i)return h;Mo({code:"INVALID_PLUGIN_HOOK",message:`Error running plugin hook ${e} for ${s.name}, expected a function hook.`})}return h.apply(a,t)}).catch(t=>Lc(t,s.name,{hook:e}))}}return{emitFile:h.emitFile,finaliseAssets(){h.assertAssetsFinalized()},getFileName:h.getFileName,hookSeq(e,t,n){let i=Promise.resolve();for(let r=0;r<o.length;r++)i=i.then(()=>p(e,t,r,!1,n));return i},hookSeqSync(e,t,n){for(let i=0;i<o.length;i++)l(e,t,i,!1,n)},hookFirst(e,t,n,i){let r=Promise.resolve();for(let s=0;s<o.length;s++)i!==s&&(r=r.then(i=>null!=i?i:p(e,t,s,!1,n)));return r},hookFirstSync(e,t,n){for(let i=0;i<o.length;i++){const r=l(e,t,i,!1,n);if(null!=r)return r}return null},hookParallel(e,t,n){const i=[];for(let r=0;r<o.length;r++){const s=p(e,t,r,!1,n);s&&i.push(s)}return Promise.all(i).then(()=>{})},hookReduceArg0(e,[t,...n],i,r){let s=Promise.resolve(t);for(let t=0;t<o.length;t++)s=s.then(s=>{const a=p(e,[s,...n],t,!1,r);return a?a.then(e=>i.call(c[t],s,e,o[t])):s});return s},hookReduceArg0Sync(e,[t,...n],i,r){for(let s=0;s<o.length;s++){const a=l(e,[t,...n],s,!1,r);t=i.call(c[s],t,a,o[s])}return t},hookReduceValue(e,t,n,i,r){let s=Promise.resolve(t);for(let t=0;t<o.length;t++)s=s.then(s=>{const a=p(e,n,t,!0,r);return a?a.then(e=>i.call(c[t],s,e,o[t])):s});return s},hookReduceValueSync(e,t,n,i,r){let s=t;for(let t=0;t<o.length;t++){const a=l(e,n,t,!0,r);s=i.call(c[t],s,a,o[t])}return s},startOutput(e,t){h.startOutput(e,t)}}}const Vc={has:()=>!1,get(){},set(){},delete:()=>!1};function Bc(e){e.startsWith(Oc)?Mo({code:"ANONYMOUS_PLUGIN_CACHE",message:"A plugin is trying to use the Rollup cache but is not declaring a plugin name or cacheKey."}):Mo({code:"DUPLICATE_PLUGIN_NAME",message:`The plugin name ${e} is being used twice in the same build. Plugin names must be distinct or provide a cacheKey (please post an issue to the plugin if you are a plugin user).`})}const zc=e=>({has:()=>(Bc(e),!1),get(){Bc(e)},set(){Bc(e)},delete:()=>(Bc(e),!1)});function Wc(e,t,n){const i=n.id,r=[];let s=null===t.map?null:Rh(t.map);const o=t.code;let a=t.ast;const h=[],u=[];let c,l,p=!1,d=null;const f=t.code;let m;return e.pluginDriver.hookReduceArg0("transform",[f,i],(function(t,s,o){if(!p&&c.used&&(p=!0),p){if(s&&"object"==typeof s&&Array.isArray(s.dependencies))for(const t of s.dependencies)e.watchFiles[gt(dt(i),t)]=!0}else if(u.length&&(n.transformFiles=u),s&&"object"==typeof s&&Array.isArray(s.dependencies)){l.warnedTransformDependencies||e.warnDeprecation(`Returning "dependencies" from the "transform" hook as done by plugin ${o.name} is deprecated. The "this.addWatchFile" plugin context function should be used instead.`,!0),l.warnedTransformDependencies=!0;for(const e of s.dependencies)h.push(gt(dt(i),e))}if("string"==typeof s)s={ast:void 0,code:s,map:void 0};else{if(!s||"object"!=typeof s)return t;"string"==typeof s.map&&(s.map=JSON.parse(s.map)),"boolean"==typeof s.moduleSideEffects&&(d=s.moduleSideEffects)}if(null!==s.map){const e=Rh(s.map);r.push(e||{missing:!0,plugin:o.name})}return a=s.ast,s.code}),(t,n)=>((l=n).cacheKey?p=!0:c=function(e){const t={used:!1,cache:void 0};return t.cache={has:n=>(t.used=!0,e.has(n)),get:n=>(t.used=!0,e.get(n)),set:(n,i)=>(t.used=!0,e.set(n,i)),delete:n=>(t.used=!0,e.delete(n))},t}(t.cache),Object.assign(Object.assign({},t),{cache:c?c.cache:t.cache,warn(e,n){"string"==typeof e&&(e={message:e}),n&&Lo(e,n,f,i),e.id=i,e.hook="transform",t.warn(e)},error:(e,n)=>("string"==typeof e&&(e={message:e}),n&&Lo(e,n,f,i),e.id=i,e.hook="transform",t.error(e)),emitAsset(t,n){const i={type:"asset",name:t,source:n};return u.push(Object.assign({},i)),e.pluginDriver.emitFile(i)},emitChunk(t,n){const i={type:"chunk",id:t,name:n&&n.name};return u.push(Object.assign({},i)),e.pluginDriver.emitFile(i)},emitFile:t=>(u.push(t),e.pluginDriver.emitFile(t)),addWatchFile(e){h.push(e),t.addWatchFile(e)},setAssetSource(e,n){if(t.setAssetSource(e,n),!p&&!m)try{this.error({code:"INVALID_SETASSETSOURCE",message:"setAssetSource cannot be called in transform for caching reasons. Use emitFile with a source, or call setAssetSource in another hook."})}catch(e){m=e}},getCombinedSourcemap(){const t=function(e,t,n,i,r){if(!r.length)return i;const s=Sh(t,n,i,r,bh(e)).traceMappings();return Object.assign({version:3},s)}(e,i,o,s,r);if(!t){return new G(o).generateMap({includeContent:!0,hires:!0,source:i})}return s!==t&&(s=t,r.length=0),new L(Object.assign(Object.assign({},t),{file:null,sourcesContent:t.sourcesContent}))}}))).catch(e=>Lc(e,l.name,{hook:"transform",id:i})).then(e=>{if(!p&&m)throw m;return{ast:a,code:e,customTransformCache:p,moduleSideEffects:d,originalCode:o,originalSourcemap:s,sourcemapChain:r,transformDependencies:h}})}function jc(e,t){return ct(t)?gt(e,"..",t):t}function Fc(e){if(!0===e)return()=>!0;if("function"==typeof e)return(t,...n)=>!t.startsWith("\0")&&e(t,...n)||!1;if(e){const t=new Set(Array.isArray(e)?e:e?[e]:[]);return e=>t.has(e)}return()=>!1}function Uc(e,t,n){if("boolean"==typeof e)return()=>e;if("no-external"===e)return(e,t)=>!t;if("function"==typeof e)return(t,n)=>!!t.startsWith("\0")||!1!==e(t,n);if(Array.isArray(e)){const t=new Set(e);return e=>t.has(e)}var i,r;e&&n.warn((i="treeshake.moduleSideEffects",r='please use one of false, "no-external", a function or an array',{code:Do.INVALID_OPTION,message:`Invalid value for option "${i}" - ${r}.`}));const s=Fc(t);return(e,t)=>!(t&&s(e))}class Gc{constructor(e,t,n,i,r,s,o){this.indexedEntryModules=[],this.latestLoadModulesPromise=Promise.resolve(),this.manualChunkModules={},this.nextEntryModuleIndex=0,this.loadEntryModule=(e,t)=>this.pluginDriver.hookFirst("resolveId",[e,void 0]).then(n=>{if(!1===n||n&&"object"==typeof n&&n.external)return Mo(function(e){return{code:Do.UNRESOLVED_ENTRY,message:`Entry module cannot be external (${To(e)}).`}}(e));const i=n&&"object"==typeof n?n.id:n;return"string"==typeof i?this.fetchModule(i,void 0,!0,t):Mo(function(e){return{code:Do.UNRESOLVED_ENTRY,message:`Could not resolve entry module (${To(e)}).`}}(e))}),this.graph=e,this.modulesById=t,this.pluginDriver=n,this.isExternal=Fc(i),this.hasModuleSideEffects=Uc(s,o,e),this.getManualChunk="function"==typeof r?r:()=>null}addEntryModules(e,t){const n=this.nextEntryModuleIndex;this.nextEntryModuleIndex+=e.length;const i=Promise.all(e.map(({fileName:e,id:n,name:i})=>this.loadEntryModule(n,!0).then(n=>(null!==e?n.chunkFileNames.add(e):null!==i&&(null===n.chunkName&&(n.chunkName=i),t&&n.userChunkNames.add(i)),n)))).then(e=>{let i=n;for(const n of e){n.isUserDefinedEntryPoint=n.isUserDefinedEntryPoint||t;const e=this.indexedEntryModules.find(e=>e.module.id===n.id);e?e.index=Math.min(e.index,i):this.indexedEntryModules.push({module:n,index:i}),i++}return this.indexedEntryModules.sort(({index:e},{index:t})=>e>t?1:-1),e});return this.awaitLoadModulesPromise(i).then(e=>({entryModules:this.indexedEntryModules.map(({module:e})=>e),manualChunkModulesByAlias:this.manualChunkModules,newEntryModules:e}))}addManualChunks(e){const t=[];for(const n of Object.keys(e)){const i=e[n];for(const e of i)t.push({id:e,alias:n})}const n=Promise.all(t.map(({id:e})=>this.loadEntryModule(e,!1))).then(e=>{for(let n=0;n<e.length;n++)this.addModuleToManualChunk(t[n].alias,e[n])});return this.awaitLoadModulesPromise(n)}resolveId(t,n,i){return e(this,void 0,void 0,(function*(){return this.normalizeResolveIdResult(!this.isExternal(t,n,!1)&&(yield this.pluginDriver.hookFirst("resolveId",[t,n],null,i)),n,t)}))}addModuleToManualChunk(e,t){var n,i,r;null!==t.manualChunkAlias&&t.manualChunkAlias!==e&&Mo((n=t.id,i=e,r=t.manualChunkAlias,{code:Do.INVALID_CHUNK,message:`Cannot assign ${To(n)} to the "${i}" chunk as it is already in the "${r}" chunk.`})),t.manualChunkAlias=e,this.manualChunkModules[e]||(this.manualChunkModules[e]=[]),this.manualChunkModules[e].push(t)}awaitLoadModulesPromise(e){this.latestLoadModulesPromise=Promise.all([e,this.latestLoadModulesPromise]);const t=()=>{const e=this.latestLoadModulesPromise;return e.then(()=>{if(this.latestLoadModulesPromise!==e)return t()})};return t().then(()=>e)}fetchAllDependencies(e){const t=Promise.all(e.getDynamicImportExpressions().map((t,n)=>this.resolveDynamicImport(e,t,e.id).then(t=>{if(null===t)return;const i=e.dynamicImports[n];if("string"!=typeof t)return this.fetchResolvedDependency(To(t.id),e.id,t).then(e=>{i.resolution=e});i.resolution=t})));return t.catch(()=>{}),Promise.all(e.sources.map(t=>this.resolveAndFetchDependency(e,t))).then(()=>t)}fetchModule(e,t,n,i){const r=this.modulesById.get(e);if(r){if(r instanceof yt)throw new Error(`Cannot fetch external module ${e}`);return r.isEntryPoint=r.isEntryPoint||i,Promise.resolve(r)}const s=new xh(this.graph,e,n,i);this.modulesById.set(e,s),this.graph.watchFiles[e]=!0;const o=this.getManualChunk(e);return"string"==typeof o&&this.addModuleToManualChunk(o,s),lh("load modules",3),Promise.resolve(this.pluginDriver.hookFirst("load",[e])).catch(n=>{ph("load modules",3);let i=`Could not load ${e}`;throw t&&(i+=` (imported by ${t})`),i+=`: ${n.message}`,n.message=i,n}).then(t=>(ph("load modules",3),"string"==typeof t?{code:t}:t&&"object"==typeof t&&"string"==typeof t.code?t:Mo(function(e){return{code:Do.BAD_LOADER,message:`Error loading ${To(e)}: plugin load hook should return a string, a { code, map } object, or nothing/null`}}(e)))).then(t=>{const n=this.graph.cachedModules.get(e);if(n&&!n.customTransformCache&&n.originalCode===t.code){if(n.transformFiles)for(const e of n.transformFiles)this.pluginDriver.emitFile(e);return n}return"boolean"==typeof t.moduleSideEffects&&(s.moduleSideEffects=t.moduleSideEffects),Wc(this.graph,t,s)}).then(t=>(s.setSource(t),this.modulesById.set(e,s),this.fetchAllDependencies(s).then(()=>{for(const e in s.exports)"default"!==e&&(s.exportsAll[e]=s.id);return s.exportAllSources.forEach(e=>{const t=s.resolvedIds[e].id,n=this.modulesById.get(t);if(!(n instanceof yt))for(const e in n.exportsAll)e in s.exportsAll?this.graph.warn(Bo(e,s,n)):s.exportsAll[e]=n.exportsAll[e]}),s})))}fetchResolvedDependency(e,t,n){if(n.external){this.modulesById.has(n.id)||this.modulesById.set(n.id,new yt(this.graph,n.id,n.moduleSideEffects));const i=this.modulesById.get(n.id);return i instanceof yt?Promise.resolve(i):Mo(function(e,t){return{code:Do.INVALID_EXTERNAL_ID,message:`'${e}' is imported as an external by ${To(t)}, but is already an existing non-external module id.`}}(e,t))}return this.fetchModule(n.id,t,n.moduleSideEffects,!1)}handleMissingImports(e,t,n){return null===e?(ct(t)&&Mo(function(e,t){return{code:Do.UNRESOLVED_IMPORT,message:`Could not resolve '${e}' from ${To(t)}`}}(t,n)),this.graph.warn(function(e,t){return{code:Do.UNRESOLVED_IMPORT,importer:To(t),message:`'${e}' is imported by ${To(t)}, but could not be resolved – treating it as an external dependency`,source:e,url:"https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency"}}(t,n)),{external:!0,id:t,moduleSideEffects:this.hasModuleSideEffects(t,!0)}):e}normalizeResolveIdResult(e,t,n){let i="",r=!1,s=null;if(e)"object"==typeof e?(i=e.id,e.external&&(r=!0),"boolean"==typeof e.moduleSideEffects&&(s=e.moduleSideEffects)):(this.isExternal(e,t,!0)&&(r=!0),i=r?jc(t,e):e);else{if(i=jc(t,n),!1!==e&&!this.isExternal(i,t,!0))return null;r=!0}return{external:r,id:i,moduleSideEffects:"boolean"==typeof s?s:this.hasModuleSideEffects(i,r)}}resolveAndFetchDependency(t,n){return e(this,void 0,void 0,(function*(){return this.fetchResolvedDependency(n,t.id,t.resolvedIds[n]=t.resolvedIds[n]||this.handleMissingImports(yield this.resolveId(n,t.id),n,t.id))}))}resolveDynamicImport(t,n,i){return e(this,void 0,void 0,(function*(){const e=yield this.pluginDriver.hookFirst("resolveDynamicImport",[n,i]);return"string"!=typeof n?"string"==typeof e?e:e?Object.assign({external:!1,moduleSideEffects:!0},e):null:null==e?t.resolvedIds[n]=t.resolvedIds[n]||this.handleMissingImports(yield this.resolveId(n,t.id),n,t.id):this.handleMissingImports(this.normalizeResolveIdResult(e,i,n),n,i)}))}}const Hc=97,qc=48;function Kc(e){return e<10?String.fromCharCode(qc+e):String.fromCharCode(Hc+(e-10))}function Yc(e){let t="";for(let n=0;n<e.length;n++){const i=e[n];t+=Kc(i>>4),t+=Kc(15&i)}return t}function Xc(e){const t=new Uint8Array(e);for(let e=0;e<t.length;e++)t[e]=512*Math.random();return t}function Qc(e){return"string"==typeof e?[{fileName:null,name:null,id:e}]:Array.isArray(e)?e.map(e=>({fileName:null,name:null,id:e})):Object.keys(e).map(t=>({fileName:null,id:e[t],name:t}))}class Jc{constructor(e,t){if(this.moduleById=new Map,this.needsTreeshakingPass=!1,this.phase=wc.LOAD_AND_PARSE,this.watchFiles=Object.create(null),this.externalModules=[],this.modules=[],this.onwarn=e.onwarn||function(){const e=Object.create(null);return t=>{const n=t.toString();n in e||(console.error(n),e[n]=!0)}}(),this.deoptimizationTracker=new Ic,this.cachedModules=new Map,e.cache&&e.cache.modules)for(const t of e.cache.modules)this.cachedModules.set(t.id,t);if(!1!==e.cache){this.pluginCache=e.cache&&e.cache.plugins||Object.create(null);for(const e in this.pluginCache){const t=this.pluginCache[e];for(const e of Object.keys(t))t[e][0]++}}if(this.preserveModules=e.preserveModules,this.strictDeprecations=e.strictDeprecations,this.cacheExpiry=e.experimentalCacheExpiry,!1!==e.treeshake&&(this.treeshakingOptions=e.treeshake?{annotations:!1!==e.treeshake.annotations,moduleSideEffects:e.treeshake.moduleSideEffects,propertyReadSideEffects:!1!==e.treeshake.propertyReadSideEffects,pureExternalModules:e.treeshake.pureExternalModules,tryCatchDeoptimization:!1!==e.treeshake.tryCatchDeoptimization,unknownGlobalSideEffects:!1!==e.treeshake.unknownGlobalSideEffects}:{annotations:!0,moduleSideEffects:!0,propertyReadSideEffects:!0,tryCatchDeoptimization:!0,unknownGlobalSideEffects:!0},void 0!==this.treeshakingOptions.pureExternalModules&&this.warnDeprecation('The "treeshake.pureExternalModules" option is deprecated. The "treeshake.moduleSideEffects" option should be used instead. "treeshake.pureExternalModules: true" is equivalent to "treeshake.moduleSideEffects: \'no-external\'"',!1)),this.contextParse=(e,t={})=>this.acornParser.parse(e,Object.assign(Object.assign(Object.assign({},gh),t),this.acornOptions)),this.pluginDriver=Dc(this,e,this.pluginCache,t),t){const e=e=>this.pluginDriver.hookSeqSync("watchChange",[e]);t.on("change",e),t.once("restart",()=>{t.removeListener("change",e)})}this.shimMissingExports=e.shimMissingExports,this.scope=new Ac,this.context=String(e.context);const n=e.moduleContext;if("function"==typeof n)this.getModuleContext=e=>n(e)||this.context;else if("object"==typeof n){const e=new Map;for(const t in n)e.set(gt(t),n[t]);this.getModuleContext=t=>e.get(t)||this.context}else this.getModuleContext=()=>this.context;this.acornOptions=e.acorn?Object.assign({},e.acorn):{};const i=[];i.push(bc),e.experimentalTopLevelAwait&&(this.acornOptions.allowAwaitOutsideFunction=!0);const r=e.acornInjectPlugins;i.push(...Array.isArray(r)?r:r?[r]:[]),this.acornParser=Iu.extend(...i),this.moduleLoader=new Gc(this,this.moduleById,this.pluginDriver,e.external,"function"==typeof e.manualChunks&&e.manualChunks,this.treeshakingOptions?this.treeshakingOptions.moduleSideEffects:null,!!this.treeshakingOptions&&this.treeshakingOptions.pureExternalModules)}build(e,t,n){return lh("parse modules",2),Promise.all([this.moduleLoader.addEntryModules(Qc(e),!0),t&&"object"==typeof t&&this.moduleLoader.addManualChunks(t)]).then(([{entryModules:e,manualChunkModulesByAlias:t}])=>{if(0===e.length)throw new Error("You must supply options.input to rollup");for(const e of this.moduleById.values())e instanceof xh?this.modules.push(e):this.externalModules.push(e);if(ph("parse modules",2),this.phase=wc.ANALYSE,lh("analyse dependency graph",2),this.link(e),ph("analyse dependency graph",2),lh("mark included statements",2),n&&e.length>1)throw new Error("Internal Error: can only inline dynamic imports for single-file builds.");for(const t of e)t.includeAllExports();this.includeMarked(this.modules);for(const e of this.externalModules)e.warnUnusedImports();ph("mark included statements",2),lh("generate chunks",2),this.preserveModules||n||function(e,t){let n,i,r;const s=new Set,o=[],a=e=>{n.manualChunkAlias?(e.manualChunkAlias=n.manualChunkAlias,e.entryPointsHash=i):function(e,t){for(let n=0;n<e.length;n++)e[n]=e[n]^t[n]}(e.entryPointsHash,i);for(const t of e.dependencies)t instanceof yt||r.has(t.id)||(r.add(t.id),s.has(t.id)||t.manualChunkAlias||a(t));for(const{resolution:t}of e.dynamicImports)t instanceof xh&&t.dynamicallyImportedBy.length>0&&!t.manualChunkAlias&&o.push(t)};if(t)for(const e of Object.keys(t))for(n of(i=Xc(10),t[e]))r=new Set(n.id),a(n);for(n of e)s.add(n.id),i=Xc(10),r=new Set(n.id),n.manualChunkAlias||a(n);for(n of o)s.has(n.id)||(s.add(n.id),i=Xc(10),r=new Set(n.id),a(n))}(e,t);let i=[];if(this.preserveModules)for(const e of this.modules){const t=new Vh(this,[e]);!e.isEntryPoint&&t.isEmpty||(t.entryModules=[e]),i.push(t)}else{const e={};for(const t of this.modules){const n=Yc(t.entryPointsHash),i=e[n];i?i.push(t):e[n]=[t]}for(const t in e){const n=e[t];kh(n);const r=new Vh(this,n);i.push(r)}}for(const e of i)e.link();i=i.filter(Dh);const r=[];for(const e of i)r.push(...e.generateFacades());return ph("generate chunks",2),this.phase=wc.GENERATE,i.concat(r)})}getCache(){for(const e in this.pluginCache){const t=this.pluginCache[e];let n=!0;for(const e of Object.keys(t))t[e][0]>=this.cacheExpiry?delete t[e]:n=!1;n&&delete this.pluginCache[e]}return{modules:this.modules.map(e=>e.toJSON()),plugins:this.pluginCache}}includeMarked(e){if(this.treeshakingOptions){let t=1;do{lh(`treeshaking pass ${t}`,3),this.needsTreeshakingPass=!1;for(const t of e)t.isExecuted&&t.include();ph(`treeshaking pass ${t++}`,3)}while(this.needsTreeshakingPass)}else for(const t of e)t.includeAllInBundle()}warn(e){e.toString=()=>{let t="";return e.plugin&&(t+=`(${e.plugin} plugin) `),e.loc&&(t+=`${To(e.loc.file)} (${e.loc.line}:${e.loc.column}) `),t+=e.message},this.onwarn(e)}warnDeprecation(e,t){if(t||this.strictDeprecations){const t=Vo(e);if(this.strictDeprecations)return Mo(t);this.warn(t)}}link(e){for(const e of this.modules)e.linkDependencies();const{orderedModules:t,cyclePaths:n}=function(e){let t=0;const n=[],i={},r=[],s=[],o={},a=e=>{if(!i[e.id]){if(e instanceof yt)return e.execIndex=t++,void(i[e.id]=!0);for(const t of e.dependencies)t.id in o?i[t.id]||n.push(Nh(t.id,e.id,o)):(o[t.id]=e.id,a(t));for(const{resolution:t}of e.dynamicImports)t instanceof xh&&-1===s.indexOf(t)&&s.push(t);e.execIndex=t++,i[e.id]=!0,r.push(e)}};for(const t of e)o[t.id]||(o[t.id]=null,a(t));for(const e of s)o[e.id]||(o[e.id]=null,a(e));return{orderedModules:r,cyclePaths:n}}(e);for(const e of n)this.warn({code:"CIRCULAR_DEPENDENCY",importer:e[0],message:`Circular dependency: ${e.join(" -> ")}`});this.modules=t;for(const e of this.modules)e.bindReferences();this.warnForMissingExports()}warnForMissingExports(){for(const e of this.modules)for(const t of Object.keys(e.importDescriptions)){const n=e.importDescriptions[t];"*"===n.name||n.module.getVariableForExportName(n.name)||e.warn({code:"NON_EXISTENT_EXPORT",message:`Non-existent export '${n.name}' is imported from ${To(n.module.id)}`,name:n.name,source:n.module.id},n.start)}}}function Zc(e){switch(typeof e){case"function":return e();case"string":return e;default:return""}}const el=(e,t)=>t?`${e}\n${t}`:e,tl=(e,t)=>t?`${e}\n\n${t}`:e;function nl(e,t){Mo({code:"INVALID_EXPORT_OPTION",message:`'${e}' was specified for output.exports, but entry module has following exports: ${t.join(", ")}`})}function il(e,{exports:t,name:n,format:i}){const r=e.getExportNames();return"default"===t?1===r.length&&"default"===r[0]||nl("default",r):"none"===t&&r.length&&nl("none",r),t&&"auto"!==t||(0===r.length?t="none":1===r.length&&"default"===r[0]?t="default":(null!==e.facadeModule&&e.facadeModule.isEntryPoint&&"es"!==i&&-1!==r.indexOf("default")&&e.graph.warn({code:"MIXED_EXPORTS",message:`Using named and default exports together. Consumers of your bundle will have to use ${n||"bundle"}['default'] to access the default export, which may not be what you want. Use \`output.exports: 'named'\` to disable this warning`,url:"https://rollupjs.org/guide/en/#output-exports"}),t="named")),/(?:default|named|none)/.test(t)||Mo({code:"INVALID_EXPORT_OPTION",message:"output.exports must be 'default', 'named', 'none', 'auto', or left unspecified (defaults to 'auto')",url:"https://rollupjs.org/guide/en/#output-exports"}),t}const rl=(e,t)=>(n,i)=>void 0!==t[n]?t[n]:void 0!==e[n]?e[n]:i,sl=e=>e&&"object"!=typeof e?{}:e,ol=(e,t,n)=>{const i=sl(t[n]),r=sl(e[n]);return void 0!==i?i&&r?Object.assign(Object.assign({},r),i):i:r},al=e=>{"string"==typeof e?console.warn(e):console.warn(e.message)},hl=(e,t=al)=>e.onwarn?n=>e.onwarn(n,t):t,ul=(e,t)=>{const n=e.external;return"function"==typeof n?(e,...i)=>n(e,...i)||-1!==t.external.indexOf(e):("string"==typeof e.external?[n]:Array.isArray(n)?n:[]).concat(t.external)},cl={c:"config",d:"dir",e:"external",f:"format",g:"globals",h:"help",i:"input",m:"sourcemap",n:"name",o:"file",v:"version",w:"watch"};function ll({config:e={},command:t={},defaultOnWarnHandler:n}){const i=function(e){const t=e.external&&"string"==typeof e.external?e.external.split(","):[];return Object.assign(Object.assign({},e),{external:t,globals:"string"==typeof e.globals?e.globals.split(",").reduce((e,n)=>{const[i,r]=n.split(":");return e[i]=r,-1===t.indexOf(i)&&t.push(i),e},Object.create(null)):void 0})}(t),r=function(e,t={external:[],globals:void 0},n){const i=rl(e,t),r={acorn:e.acorn,acornInjectPlugins:e.acornInjectPlugins,cache:i("cache"),chunkGroupingSize:i("chunkGroupingSize",5e3),context:i("context"),experimentalCacheExpiry:i("experimentalCacheExpiry",10),experimentalOptimizeChunks:i("experimentalOptimizeChunks"),experimentalTopLevelAwait:i("experimentalTopLevelAwait"),external:ul(e,t),inlineDynamicImports:i("inlineDynamicImports",!1),input:i("input",[]),manualChunks:i("manualChunks"),moduleContext:e.moduleContext,onwarn:hl(e,n),perf:i("perf",!1),plugins:e.plugins,preserveModules:i("preserveModules"),preserveSymlinks:i("preserveSymlinks"),shimMissingExports:i("shimMissingExports"),strictDeprecations:i("strictDeprecations",!1),treeshake:ol(e,t,"treeshake"),watch:e.watch};r.cache&&r.cache.cache&&(r.cache=r.cache.cache);return r}(e,i,n);i.output&&Object.assign(i,i.output);const s=e.output,o=Array.isArray(s)?s:s?[s]:[];0===o.length&&o.push({});const a=o.map(e=>(function(e,t={}){const n=rl(e,t);let i=n("format");switch(i){case"esm":case"module":i="es";break;case"commonjs":i="cjs"}return{amd:Object.assign(Object.assign({},e.amd),t.amd),assetFileNames:n("assetFileNames"),banner:n("banner"),chunkFileNames:n("chunkFileNames"),compact:n("compact",!1),dir:n("dir"),dynamicImportFunction:n("dynamicImportFunction"),entryFileNames:n("entryFileNames"),esModule:n("esModule",!0),exports:n("exports"),extend:n("extend"),externalLiveBindings:n("externalLiveBindings",!0),file:n("file"),footer:n("footer"),format:"esm"===i?"es":i,freeze:n("freeze",!0),globals:n("globals"),indent:n("indent",!0),interop:n("interop",!0),intro:n("intro"),name:n("name"),namespaceToStringTag:n("namespaceToStringTag",!1),noConflict:n("noConflict"),outro:n("outro"),paths:n("paths"),preferConst:n("preferConst"),sourcemap:n("sourcemap"),sourcemapExcludeSources:n("sourcemapExcludeSources"),sourcemapFile:n("sourcemapFile"),sourcemapPathTransform:n("sourcemapPathTransform"),strict:n("strict",!0)}})(e,i)),h=[],u=Object.keys(r);pl(h,Object.keys(e),u,"input option",/^output$/);const c=Object.keys(a[0]);pl(h,a.reduce((e,t)=>e.concat(Object.keys(t)),[]),c,"output option");const l=c.filter(e=>"sourcemapPathTransform"!==e);return pl(h,Object.keys(i),u.concat(l,Object.keys(cl),"config","environment","silent"),"CLI flag",/^_|output|(config.*)$/),{inputOptions:r,optionError:h.length>0?h.join("\n"):null,outputOptions:a}}function pl(e,t,n,i,r=/$./){const s=t.filter(e=>-1===n.indexOf(e)&&!r.test(e));s.length>0&&e.push(`Unknown ${i}: ${s.join(", ")}. Allowed options: ${n.sort().join(", ")}`)}const dl={get(){throw new Error("bundle.generate(...) now returns a Promise instead of a { code, map } object")}};function fl(e,n){return n.options&&n.options.call({meta:{rollupVersion:t}},e)||e}function ml(e){return Array.isArray(e)?e.filter(Boolean):e?[e]:[]}let gl;function yl(t){return e(this,void 0,void 0,(function*(){const n=function(e){if(!e)throw new Error("You must supply an options object to rollup");let{inputOptions:t,optionError:n}=ll({config:e});n&&t.onwarn({message:n,code:"UNKNOWN_OPTION"}),(t=ml(t.plugins).reduce(fl,t)).plugins=ml(t.plugins);for(let e=0;e<t.plugins.length;e++){const n=t.plugins[e];n.name||(n.name=`${Oc}${e+1}`)}return t.inlineDynamicImports?(t.preserveModules&&Mo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "inlineDynamicImports" option.'}),t.manualChunks&&Mo({code:"INVALID_OPTION",message:'"manualChunks" option is not supported for "inlineDynamicImports".'}),t.experimentalOptimizeChunks&&Mo({code:"INVALID_OPTION",message:'"experimentalOptimizeChunks" option is not supported for "inlineDynamicImports".'}),(t.input instanceof Array&&t.input.length>1||"object"==typeof t.input&&Object.keys(t.input).length>1)&&Mo({code:"INVALID_OPTION",message:'Multiple inputs are not supported for "inlineDynamicImports".'})):t.preserveModules&&(t.manualChunks&&Mo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "manualChunks" option.'}),t.experimentalOptimizeChunks&&Mo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "experimentalOptimizeChunks" option.'})),t}(t);mh(n);const i=new Jc(n,gl);gl=void 0;const r=!1!==t.cache;let s;delete n.cache,delete t.cache,lh("BUILD",1);try{yield i.pluginDriver.hookParallel("buildStart",[n]),s=yield i.build(n.input,n.manualChunks,n.inlineDynamicImports)}catch(e){throw yield i.pluginDriver.hookParallel("buildEnd",[e]),e}yield i.pluginDriver.hookParallel("buildEnd",[]),ph("BUILD",1);let o=!1;function a(e){return function(e,t,n,i){if(!t)throw new Error("You must supply an options object");const r=ll({config:{output:Object.assign(Object.assign(Object.assign({},t),t.output),e.output)}});if(r.optionError)throw new Error(r.optionError);const s=r.outputOptions[0],o=i.hookReduceArg0Sync("outputOptions",[s],(e,t)=>t||e,e=>{const t=()=>e.error({code:Do.CANNOT_EMIT_FROM_OPTIONS_HOOK,message:'Cannot emit files or set asset sources in the "outputOptions" hook, use the "renderStart" hook instead.'});return Object.assign(Object.assign({},e),{emitFile:t,setAssetSource:t})});a=o,"es6"===a.format&&Mo(Vo({message:'The "es6" output format is deprecated – use "esm" instead',url:"https://rollupjs.org/guide/en/#output-format"})),void(["amd","cjs","system","es","iife","umd"].indexOf(a.format)<0&&Mo({message:'You must specify "output.format", which can be one of "amd", "cjs", "system", "esm", "iife" or "umd".',url:"https://rollupjs.org/guide/en/#output-format"})),"string"==typeof o.file&&("string"==typeof o.dir&&Mo({code:"INVALID_OPTION",message:'You must set either "output.file" for a single-file build or "output.dir" when generating multiple chunks.'}),e.preserveModules&&Mo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when using the "preserveModules" option.'}),"object"!=typeof e.input||Array.isArray(e.input)||Mo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when providing named inputs.'}));var a;n&&("umd"!==o.format&&"iife"!==o.format||Mo({code:"INVALID_OPTION",message:"UMD and IIFE output formats are not supported for code-splitting builds."}),"string"==typeof o.file&&Mo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when generating multiple chunks.'}));return o}(n,e,s.length>1,i.pluginDriver)}function h(t,r){return e(this,void 0,void 0,(function*(){lh("GENERATE",1);const e=t.assetFileNames||"assets/[name]-[hash][extname]",a=Object.create(null);let h;const u=function(e){if(0===e.length)return"/";if(1===e.length)return dt(e[0]);const t=e.slice(1).reduce((e,t)=>{const n=t.split(/\/+|\\+/);let i;for(i=0;e[i]===n[i]&&i<Math.min(e.length,n.length);i++);return e.slice(0,i)},e[0].split(/\/+|\\+/));return t.length>1?t.join("/"):"/"}(function(e){const t=[];for(const n of e)for(const e of n.entryModules)ut(e.id)&&t.push(e.id);return t}(s));i.pluginDriver.startOutput(a,e);try{yield i.pluginDriver.hookParallel("renderStart",[]);const e=yield function(e,t){const n=e.pluginDriver;return Promise.all([n.hookReduceValue("banner",Zc(t.banner),[],el),n.hookReduceValue("footer",Zc(t.footer),[],el),n.hookReduceValue("intro",Zc(t.intro),[],tl),n.hookReduceValue("outro",Zc(t.outro),[],tl)]).then(([e,t,n,i])=>(n&&(n+="\n\n"),i&&(i=`\n\n${i}`),e.length&&(e+="\n"),t.length&&(t="\n"+t),{intro:n,outro:i,banner:e,footer:t})).catch(e=>{Mo({code:"ADDON_ERROR",message:`Could not retrieve ${e.hook}. Check configuration of plugin ${e.plugin}.\n\tError Message: ${e.message}`})})}(i,t);for(const e of s)n.preserveModules||e.generateInternalExports(t),e.facadeModule&&e.facadeModule.isEntryPoint&&(e.exportMode=il(e,t));for(const e of s)e.preRender(t,u);!o&&n.experimentalOptimizeChunks&&(!function(e,t,n,i){for(let r=0;r<e.length;r++){const s=e[r],o=[];if(s.visitStaticDependenciesUntilCondition(e=>{e instanceof Vh&&o.push(e)}),o.length<2)continue;let a=1,h=!0,u=void 0,c=o[0],l=o[1];const p=e=>null===e.facadeModule&&null===e.manualChunkAlias&&(!(!l||null!==l.facadeModule)&&!(e.getRenderedSourceLength()>n));do{if(h){p(c)&&(h=!1);continue}let s=n-u.getRenderedSourceLength()-c.getRenderedSourceLength();if(s<=0){p(c)||(h=!0);continue}const d=new Set;c.visitStaticDependenciesUntilCondition(e=>d.add(e));const f=new Set([c,u]);if(u.visitStaticDependenciesUntilCondition(e=>e!==c&&e!==u&&(!d.has(e)&&(e instanceof yt||((s-=e.getRenderedSourceLength())<=0||void f.add(e)))))){p(c)||(h=!0);continue}if(c.visitStaticDependenciesUntilCondition(e=>!f.has(e)&&(e instanceof yt||((s-=e.getRenderedSourceLength())<=0||void 0)))){p(c)||(h=!0);continue}const m=e.indexOf(c);m<=r&&r--,e.splice(m,1),u.merge(c,e,t,i),o.splice(--a,1),c=u,l&&!p(l)&&(h=!0)}while(u=c,c=l,l=o[++a],c)}}(s,t,n.chunkGroupingSize,u),o=!0),function(e,t,n,i,r,s){const o=[],a=[];for(const t of e)(t.facadeModule&&t.facadeModule.isUserDefinedEntryPoint?o:a).push(t);const h=o.concat(a);for(const e of h)n.file?e.id=pt(n.file):t.preserveModules?e.id=e.generateIdPreserveModules(i,n,s):e.id=e.generateId(r,n,s,!0),s[e.id]=kc}(s,n,t,u,e,a),h=function(e,t){for(let n=0;n<e.length;n++){const i=e[n],r=i.facadeModule;t[i.id]={code:void 0,dynamicImports:i.getDynamicImportIds(),exports:i.getExportNames(),facadeModuleId:r&&r.id,fileName:i.id,imports:i.getImportIds(),isDynamicEntry:null!==r&&r.dynamicallyImportedBy.length>0,isEntry:null!==r&&r.isEntryPoint,map:void 0,modules:i.renderedModules,get name(){return i.getChunkName()},type:"chunk"}}return t}(s,a),yield Promise.all(s.map(n=>{const r=a[n.id];return n.render(t,e,r).then(e=>(r.code=e.code,r.map=e.map,i.pluginDriver.hookParallel("ongenerate",[Object.assign({bundle:r},t),r])))}))}catch(e){throw yield i.pluginDriver.hookParallel("renderError",[e]),e}yield i.pluginDriver.hookSeq("generateBundle",[t,h,r]);for(const e of Object.keys(h)){const t=h[e];t.type||(i.warnDeprecation('A plugin is directly adding properties to the bundle object in the "generateBundle" hook. This is deprecated and will be removed in a future Rollup version, please use "this.emitFile" instead.',!1),t.type="asset")}return i.pluginDriver.finaliseAssets(),ph("GENERATE",1),h}))}const u={cache:r?i.getCache():void 0,generate:e=>{const t=h(a(e),!1).then(e=>El(e));return Object.defineProperty(t,"code",dl),Object.defineProperty(t,"map",dl),t},watchFiles:Object.keys(i.watchFiles),write:t=>{const r=a(t);return r.dir||r.file||Mo({code:"MISSING_OPTION",message:'You must specify "output.file" or "output.dir" for the build.'}),h(r,!0).then(t=>e(this,void 0,void 0,(function*(){let e=0;for(const n of Object.keys(t)){if("asset"!==t[n].type&&++e>1)break}return e>1&&(r.sourcemapFile&&Mo({code:"INVALID_OPTION",message:'"output.sourcemapFile" is only supported for single-file builds.'}),"string"==typeof r.file&&Mo({code:"INVALID_OPTION",message:'When building multiple chunks, the "output.dir" option must be used, not "output.file".'+("string"!=typeof n.input||!0===n.inlineDynamicImports?"":' To inline dynamic imports, set the "inlineDynamicImports" option.')})),yield Promise.all(Object.keys(t).map(e=>(function(e,t,n,i){const r=gt(i.dir||dt(i.file),n.fileName);let s,o;if("asset"===n.type)o=n.source;else if(o=n.code,i.sourcemap&&n.map){let e;"inline"===i.sourcemap?e=n.map.toUrl():(e=`${pt(n.fileName)}.map`,s=Ca(`${r}.map`,n.map.toString())),"hidden"!==i.sourcemap&&(o+=`//# ${Za}=${e}\n`)}return Ca(r,o).then(()=>s).then(()=>"chunk"===n.type&&e.pluginDriver.hookSeq("onwrite",[Object.assign({bundle:t},i),n])).then(()=>{})})(i,u,t[e],r))),yield i.pluginDriver.hookParallel("writeBundle",[t]),El(t)})))}};return!0===n.perf&&(u.getTimings=ch),u}))}var vl;function xl(e){return"asset"===e.type?vl.ASSET:e.isEntry?vl.ENTRY_CHUNK:vl.SECONDARY_CHUNK}function El(e){return{output:Object.keys(e).map(t=>e[t]).filter(e=>Object.keys(e).length>0).sort((e,t)=>{const n=xl(e),i=xl(t);return n===i?0:n<i?-1:1})}}!function(e){e[e.ENTRY_CHUNK=0]="ENTRY_CHUNK",e[e.SECONDARY_CHUNK=1]="SECONDARY_CHUNK",e[e.ASSET=2]="ASSET"}(vl||(vl={}));export{t as VERSION,yl as rollup};
